@hanzo/iam 0.6.1 → 0.7.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/dist/auth.d.ts +1 -1
- package/dist/auth.js +3 -3
- package/dist/auth.js.map +1 -1
- package/dist/betterauth.d.ts +67 -0
- package/dist/betterauth.d.ts.map +1 -0
- package/dist/betterauth.js +64 -0
- package/dist/betterauth.js.map +1 -0
- package/dist/browser.d.ts +87 -4
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +229 -8
- package/dist/browser.js.map +1 -1
- package/dist/client.d.ts +11 -22
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -96
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/nextauth.d.ts +12 -10
- package/dist/nextauth.d.ts.map +1 -1
- package/dist/nextauth.js +12 -11
- package/dist/nextauth.js.map +1 -1
- package/dist/passport.d.ts +44 -0
- package/dist/passport.d.ts.map +1 -0
- package/dist/passport.js +67 -0
- package/dist/passport.js.map +1 -0
- package/dist/pkce.d.ts +2 -2
- package/dist/pkce.js +2 -2
- package/dist/react.d.ts +8 -94
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +23 -454
- package/dist/react.js.map +1 -1
- package/dist/types.d.ts +1 -16
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +16 -7
- package/src/auth.ts +3 -3
- package/src/betterauth.ts +91 -0
- package/src/browser.ts +255 -11
- package/src/client.ts +47 -154
- package/src/index.ts +3 -4
- package/src/nextauth.ts +15 -13
- package/src/passport.ts +97 -0
- package/src/pkce.ts +2 -2
- package/src/react.ts +28 -635
- package/src/types.ts +1 -21
package/dist/passport.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passport.js OAuth2 strategy factory for Hanzo IAM.
|
|
3
|
+
*
|
|
4
|
+
* Creates a pre-configured passport-oauth2 strategy that authenticates
|
|
5
|
+
* against hanzo.id with PKCE and fetches user info on callback.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import passport from "passport";
|
|
10
|
+
* import { createIamPassportStrategy } from "@hanzo/iam/passport";
|
|
11
|
+
*
|
|
12
|
+
* passport.use("iam", createIamPassportStrategy({
|
|
13
|
+
* serverUrl: "https://hanzo.id",
|
|
14
|
+
* clientId: "hanzo-kms-client-id",
|
|
15
|
+
* clientSecret: process.env.IAM_CLIENT_SECRET!,
|
|
16
|
+
* callbackUrl: "https://kms.hanzo.ai/api/v1/sso/oidc/callback",
|
|
17
|
+
* }));
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @packageDocumentation
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Create a Passport OAuth2 strategy for Hanzo IAM.
|
|
24
|
+
*
|
|
25
|
+
* Requires `passport-oauth2` as a peer dependency.
|
|
26
|
+
* Returns an OAuth2Strategy instance ready to pass to `passport.use()`.
|
|
27
|
+
*
|
|
28
|
+
* The verify callback fetches userinfo from the IAM server and passes
|
|
29
|
+
* `{ accessToken, refreshToken, userinfo }` as the user object.
|
|
30
|
+
*/
|
|
31
|
+
export function createIamPassportStrategy(config) {
|
|
32
|
+
// Dynamic import to keep passport-oauth2 as optional peer dep.
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
34
|
+
const { Strategy: OAuth2Strategy } = require("passport-oauth2");
|
|
35
|
+
const baseUrl = config.serverUrl.replace(/\/+$/, "");
|
|
36
|
+
const verify = async (...args) => {
|
|
37
|
+
// passReqToCallback=true: (req, accessToken, refreshToken, profile, done)
|
|
38
|
+
const accessToken = args[1];
|
|
39
|
+
const refreshToken = args[2];
|
|
40
|
+
const done = args[4];
|
|
41
|
+
try {
|
|
42
|
+
const res = await fetch(`${baseUrl}/oauth/userinfo`, {
|
|
43
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
44
|
+
});
|
|
45
|
+
if (!res.ok) {
|
|
46
|
+
return done(new Error(`IAM userinfo failed: ${res.status}`));
|
|
47
|
+
}
|
|
48
|
+
const userinfo = (await res.json());
|
|
49
|
+
done(null, { accessToken, refreshToken, userinfo });
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
done(err instanceof Error ? err : new Error(String(err)));
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
return new OAuth2Strategy({
|
|
56
|
+
authorizationURL: `${baseUrl}/oauth/authorize`,
|
|
57
|
+
tokenURL: `${baseUrl}/oauth/token`,
|
|
58
|
+
clientID: config.clientId,
|
|
59
|
+
clientSecret: config.clientSecret ?? "",
|
|
60
|
+
callbackURL: config.callbackUrl,
|
|
61
|
+
scope: config.scope ?? "openid profile email",
|
|
62
|
+
state: true,
|
|
63
|
+
pkce: true,
|
|
64
|
+
passReqToCallback: true,
|
|
65
|
+
}, verify);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=passport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passport.js","sourceRoot":"","sources":["../src/passport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAiBH;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAyB;IAEzB,+DAA+D;IAC/D,iEAAiE;IACjE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAK7D,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,KAAK,EAClB,GAAG,IAAe,EACH,EAAE;QACjB,0EAA0E;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAuB,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAwD,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iBAAiB,EAAE;gBACnD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE;aACpD,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC/D,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,IAAI,cAAc,CACvB;QACE,gBAAgB,EAAE,GAAG,OAAO,kBAAkB;QAC9C,QAAQ,EAAE,GAAG,OAAO,cAAc;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACvC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,sBAAsB;QAC7C,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,iBAAiB,EAAE,IAAI;KACxB,EACD,MAAM,CACP,CAAC;AACJ,CAAC"}
|
package/dist/pkce.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PKCE (Proof Key for Code Exchange) utilities for browser-side OAuth2 flows.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* PKCE utilities for OAuth2 flows, using native Web Crypto API.
|
|
5
5
|
*/
|
|
6
6
|
/** Generate a PKCE code verifier + challenge pair. */
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function generatePKCEChallenge(): Promise<{
|
|
8
8
|
codeVerifier: string;
|
|
9
9
|
codeChallenge: string;
|
|
10
10
|
}>;
|
package/dist/pkce.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PKCE (Proof Key for Code Exchange) utilities for browser-side OAuth2 flows.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* PKCE utilities for OAuth2 flows, using native Web Crypto API.
|
|
5
5
|
*/
|
|
6
6
|
function generateRandomString(length) {
|
|
7
7
|
const array = new Uint8Array(length);
|
|
@@ -23,7 +23,7 @@ function base64UrlEncode(buffer) {
|
|
|
23
23
|
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
24
24
|
}
|
|
25
25
|
/** Generate a PKCE code verifier + challenge pair. */
|
|
26
|
-
export async function
|
|
26
|
+
export async function generatePKCEChallenge() {
|
|
27
27
|
const codeVerifier = generateRandomString(64);
|
|
28
28
|
const hash = await sha256(codeVerifier);
|
|
29
29
|
const codeChallenge = base64UrlEncode(hash);
|
package/dist/react.d.ts
CHANGED
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
* @packageDocumentation
|
|
33
33
|
*/
|
|
34
34
|
import type { ReactNode } from "react";
|
|
35
|
-
import {
|
|
36
|
-
import type {
|
|
37
|
-
import type { IamUser, IamOrganization,
|
|
35
|
+
import { IAM } from "./browser.js";
|
|
36
|
+
import type { IAMConfig } from "./browser.js";
|
|
37
|
+
import type { IamUser, IamOrganization, IamProject, TokenResponse } from "./types.js";
|
|
38
38
|
export interface IamProviderProps {
|
|
39
39
|
/** Browser IAM SDK configuration. */
|
|
40
|
-
config:
|
|
40
|
+
config: IAMConfig;
|
|
41
41
|
/** Auto-initialize on mount (check stored tokens). Default: true. */
|
|
42
42
|
autoInit?: boolean;
|
|
43
43
|
/** Called when authentication state changes. */
|
|
@@ -45,10 +45,10 @@ export interface IamProviderProps {
|
|
|
45
45
|
children: ReactNode;
|
|
46
46
|
}
|
|
47
47
|
export interface IamContextValue {
|
|
48
|
-
/** The underlying
|
|
49
|
-
sdk:
|
|
48
|
+
/** The underlying IAM instance for advanced use. */
|
|
49
|
+
sdk: IAM;
|
|
50
50
|
/** The IAM configuration. */
|
|
51
|
-
config:
|
|
51
|
+
config: IAMConfig;
|
|
52
52
|
/** Authenticated user (null if not logged in). */
|
|
53
53
|
user: IamUser | null;
|
|
54
54
|
/** Whether the user is currently authenticated. */
|
|
@@ -98,7 +98,7 @@ declare const IamContext: import("react").Context<IamContextValue | null>;
|
|
|
98
98
|
* Root provider for Hanzo IAM in React applications.
|
|
99
99
|
*
|
|
100
100
|
* Wrap your app (or a subtree) with this provider to enable IAM auth.
|
|
101
|
-
* Manages the
|
|
101
|
+
* Manages the IAM instance, token lifecycle, and auth state.
|
|
102
102
|
*/
|
|
103
103
|
export declare function IamProvider(props: IamProviderProps): import("react").FunctionComponentElement<import("react").ProviderProps<IamContextValue | null>>;
|
|
104
104
|
/**
|
|
@@ -123,50 +123,6 @@ export declare function useIamToken(): {
|
|
|
123
123
|
isValid: boolean;
|
|
124
124
|
refresh: () => Promise<string | null>;
|
|
125
125
|
};
|
|
126
|
-
export interface OrgManagementState {
|
|
127
|
-
/** Create a new organization. */
|
|
128
|
-
createOrg: (org: Partial<IamOrganization>) => Promise<void>;
|
|
129
|
-
/** Update an existing organization. */
|
|
130
|
-
updateOrg: (org: Partial<IamOrganization>) => Promise<void>;
|
|
131
|
-
/** Delete an organization by owner and name. */
|
|
132
|
-
deleteOrg: (org: {
|
|
133
|
-
owner: string;
|
|
134
|
-
name: string;
|
|
135
|
-
}) => Promise<void>;
|
|
136
|
-
/** Whether a mutation is in progress. */
|
|
137
|
-
isLoading: boolean;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Manage organization CRUD operations.
|
|
141
|
-
*
|
|
142
|
-
* Provides create, update, and delete methods that call the IAM API
|
|
143
|
-
* using the current user's access token.
|
|
144
|
-
*/
|
|
145
|
-
export declare function useOrgManagement(): OrgManagementState;
|
|
146
|
-
export interface InvitationsState {
|
|
147
|
-
/** All invitations for the organization. */
|
|
148
|
-
invitations: IamInvitation[];
|
|
149
|
-
/** Create a new invitation. */
|
|
150
|
-
createInvite: (invitation: Partial<IamInvitation>) => Promise<void>;
|
|
151
|
-
/** Send an existing invitation. */
|
|
152
|
-
sendInvite: (invitation: {
|
|
153
|
-
owner: string;
|
|
154
|
-
name: string;
|
|
155
|
-
}) => Promise<void>;
|
|
156
|
-
/** Verify an invitation code. */
|
|
157
|
-
verifyInvite: (code: string) => Promise<IamInvitation | null>;
|
|
158
|
-
/** Whether invitations are loading. */
|
|
159
|
-
isLoading: boolean;
|
|
160
|
-
/** Re-fetch the invitations list. */
|
|
161
|
-
refresh: () => Promise<void>;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Manage invitations for an organization.
|
|
165
|
-
*
|
|
166
|
-
* Fetches the invitation list on mount and provides create, send,
|
|
167
|
-
* and verify methods using the current user's access token.
|
|
168
|
-
*/
|
|
169
|
-
export declare function useInvitations(orgName: string): InvitationsState;
|
|
170
126
|
export { IamContext };
|
|
171
127
|
export interface OrgProjectSwitcherProps {
|
|
172
128
|
organizations: Array<{
|
|
@@ -205,46 +161,4 @@ export interface OrgProjectSwitcherProps {
|
|
|
205
161
|
export declare function OrgProjectSwitcher({ organizations, currentOrgId, switchOrg, projects, currentProjectId, switchProject, onTenantChange, environment, className, alwaysShow, }: OrgProjectSwitcherProps): import("react").DetailedReactHTMLElement<{
|
|
206
162
|
className: string;
|
|
207
163
|
}, HTMLElement> | null;
|
|
208
|
-
export interface UserOrgMenuProps {
|
|
209
|
-
/** Additional CSS class for the outer container. */
|
|
210
|
-
className?: string;
|
|
211
|
-
/** Called when org changes. Use to sync external state (e.g., tenantStore). */
|
|
212
|
-
onOrgChange?: (orgId: string) => void;
|
|
213
|
-
/** Called when user clicks logout. */
|
|
214
|
-
onLogout?: () => void;
|
|
215
|
-
/** Whether to show the "Create Organization" option. Defaults to true. */
|
|
216
|
-
showCreateOrg?: boolean;
|
|
217
|
-
/** Optional endpoint for org creation (defaults to IAM's /api/add-organization). */
|
|
218
|
-
createOrgEndpoint?: string;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Shared user menu + organization switcher for all Hanzo apps.
|
|
222
|
-
*
|
|
223
|
-
* Shows current user info (name, email, avatar), a dropdown with org list,
|
|
224
|
-
* "Create Organization" option, and logout button. Uses only `@hanzo/iam`
|
|
225
|
-
* hooks — no external UI library required.
|
|
226
|
-
*
|
|
227
|
-
* @example
|
|
228
|
-
* ```tsx
|
|
229
|
-
* import { UserOrgMenu } from '@hanzo/iam/react'
|
|
230
|
-
*
|
|
231
|
-
* function TopBar() {
|
|
232
|
-
* return (
|
|
233
|
-
* <nav>
|
|
234
|
-
* <UserOrgMenu
|
|
235
|
-
* onOrgChange={(orgId) => myStore.setOrg(orgId)}
|
|
236
|
-
* onLogout={() => router.push('/login')}
|
|
237
|
-
* />
|
|
238
|
-
* </nav>
|
|
239
|
-
* )
|
|
240
|
-
* }
|
|
241
|
-
* ```
|
|
242
|
-
*/
|
|
243
|
-
export declare function UserOrgMenu({ className, onOrgChange, onLogout, showCreateOrg, createOrgEndpoint, }: UserOrgMenuProps): import("react").DetailedReactHTMLElement<{
|
|
244
|
-
ref: import("react").RefObject<HTMLDivElement | null>;
|
|
245
|
-
className: string;
|
|
246
|
-
style: {
|
|
247
|
-
position: "relative";
|
|
248
|
-
};
|
|
249
|
-
}, HTMLDivElement> | null;
|
|
250
164
|
//# sourceMappingURL=react.d.ts.map
|
package/dist/react.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAYH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAYH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMtF,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,MAAM,EAAE,SAAS,CAAC;IAClB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,GAAG,EAAE,GAAG,CAAC;IACT,6BAA6B;IAC7B,MAAM,EAAE,SAAS,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,mDAAmD;IACnD,eAAe,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,kCAAkC;IAClC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,iCAAiC;IACjC,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,iEAAiE;IACjE,cAAc,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,oCAAoC;IACpC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,+BAA+B;IAC/B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,uCAAuC;IACvC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,iCAAiC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0CAA0C;IAC1C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,iDAAiD;IACjD,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,kCAAkC;IAClC,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,oDAAoD;IACpD,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,qDAAqD;IACrD,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAClD,yCAAyC;IACzC,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD,QAAA,MAAM,UAAU,iDAA8C,CAAC;AAY/D;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,mGAiNlD;AAMD;;;GAGG;AACH,wBAAgB,MAAM,IAAI,eAAe,CAMxC;AAMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CA6L3C;AAMD;;;GAGG;AACH,wBAAgB,WAAW,IAAI;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACvC,CAgBA;AAGD,OAAO,EAAE,UAAU,EAAE,CAAC;AAMtB,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACrG,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,aAAa,EACb,YAAY,EACZ,SAAS,EACT,QAAa,EACb,gBAAuB,EACvB,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAc,EACd,UAAkB,GACnB,EAAE,uBAAuB;;uBAmFzB"}
|