sumor 3.0.6 → 3.0.7

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.
@@ -3,6 +3,9 @@
3
3
  * 统一管理 OAuth 权限同步、JWT 用户加载和 OAuth 路由注册
4
4
  */
5
5
  import { Express } from 'express';
6
+ import { loadJwtUserMiddleware } from './middlewares/loadJwtUserMiddleware';
7
+ import { isLoggedMiddleware } from './middlewares/isLoggedMiddleware';
8
+ import { isVerifiedMiddleware } from './middlewares/isVerifiedMiddleware';
6
9
  import type { PermissionConfig } from './types/oauth';
7
10
  /**
8
11
  * 初始化 Sumor OAuth 集成
@@ -12,4 +15,8 @@ import type { PermissionConfig } from './types/oauth';
12
15
  * @param permissionConfig 权限配置 { permissions, permissionLabels }
13
16
  */
14
17
  export default function setupSumor(app: Express, permissionConfig: PermissionConfig): Promise<void>;
18
+ /**
19
+ * 导出中间件供 client 使用
20
+ */
21
+ export { loadJwtUserMiddleware, isLoggedMiddleware, isVerifiedMiddleware };
15
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAKjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAiBrD;;;;;;GAMG;AACH,wBAA8B,UAAU,CACtC,GAAG,EAAE,OAAO,EACZ,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAyBf"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAiBrD;;;;;;GAMG;AACH,wBAA8B,UAAU,CACtC,GAAG,EAAE,OAAO,EACZ,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAA"}
@@ -7,10 +7,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  return (mod && mod.__esModule) ? mod : { "default": mod };
8
8
  };
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.isVerifiedMiddleware = exports.isLoggedMiddleware = exports.loadJwtUserMiddleware = void 0;
10
11
  exports.default = setupSumor;
11
12
  const oauthService_1 = __importDefault(require("./services/oauthService"));
12
13
  const routes_1 = __importDefault(require("./routes"));
13
14
  const loadJwtUserMiddleware_1 = require("./middlewares/loadJwtUserMiddleware");
15
+ Object.defineProperty(exports, "loadJwtUserMiddleware", { enumerable: true, get: function () { return loadJwtUserMiddleware_1.loadJwtUserMiddleware; } });
16
+ const isLoggedMiddleware_1 = require("./middlewares/isLoggedMiddleware");
17
+ Object.defineProperty(exports, "isLoggedMiddleware", { enumerable: true, get: function () { return isLoggedMiddleware_1.isLoggedMiddleware; } });
18
+ const isVerifiedMiddleware_1 = require("./middlewares/isVerifiedMiddleware");
19
+ Object.defineProperty(exports, "isVerifiedMiddleware", { enumerable: true, get: function () { return isVerifiedMiddleware_1.isVerifiedMiddleware; } });
14
20
  const config_1 = require("./utils/config");
15
21
  /**
16
22
  * 初始化 Sumor OAuth 权限同步
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AA+BH,6BA4BC;AAxDD,2EAAkD;AAClD,sDAAkC;AAClC,+EAA2E;AAC3E,2CAAsD;AAGtD;;;GAGG;AACH,KAAK,UAAU,0BAA0B,CAAC,gBAAkC;IAC1E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,sBAAY,EAAE,CAAA;QAEvC,iBAAiB;QACjB,MAAO,YAAoB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IACjE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACY,KAAK,UAAU,UAAU,CACtC,GAAY,EACZ,gBAAkC;IAElC,IAAI,CAAC;QACH,0BAA0B;QAC1B,IAAA,8BAAqB,GAAE,CAGtB;QAAC,GAAW,CAAC,KAAK,GAAG,IAAI,sBAAY,EAAE,CAAA;QAExC,oBAAoB;QACpB,MAAM,0BAA0B,CAAC,gBAAgB,CAAC,CAAA;QAElD,oBAAoB;QACpB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,6CAAqB,CAAC,CAAA;QAEtC,oCAAoC;QACpC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACtC,GAAG,CAAC,KAAK,GAAI,GAAW,CAAC,KAAK,CAAA;YAC9B,IAAI,EAAE,CAAA;QACR,CAAC,CAAC,CAAA;QAEF,iBAAiB;QACjB,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAW,CAAC,CAAA;IACpC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAiCH,6BA4BC;AA1DD,2EAAkD;AAClD,sDAAkC;AAClC,+EAA2E;AA6DlE,sGA7DA,6CAAqB,OA6DA;AA5D9B,yEAAqE;AA4DrC,mGA5DvB,uCAAkB,OA4DuB;AA3DlD,6EAAyE;AA2DrB,qGA3D3C,2CAAoB,OA2D2C;AA1DxE,2CAAsD;AAGtD;;;GAGG;AACH,KAAK,UAAU,0BAA0B,CAAC,gBAAkC;IAC1E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,sBAAY,EAAE,CAAA;QAEvC,iBAAiB;QACjB,MAAO,YAAoB,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IACjE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACY,KAAK,UAAU,UAAU,CACtC,GAAY,EACZ,gBAAkC;IAElC,IAAI,CAAC;QACH,0BAA0B;QAC1B,IAAA,8BAAqB,GAAE,CAGtB;QAAC,GAAW,CAAC,KAAK,GAAG,IAAI,sBAAY,EAAE,CAAA;QAExC,oBAAoB;QACpB,MAAM,0BAA0B,CAAC,gBAAgB,CAAC,CAAA;QAElD,oBAAoB;QACpB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,6CAAqB,CAAC,CAAA;QAEtC,oCAAoC;QACpC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,GAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACtC,GAAG,CAAC,KAAK,GAAI,GAAW,CAAC,KAAK,CAAA;YAC9B,IAAI,EAAE,CAAA;QACR,CAAC,CAAC,CAAA;QAEF,iBAAiB;QACjB,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,gBAAW,CAAC,CAAA;IACpC,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 检查用户登录中间件
3
+ * 检查用户是否已登录 (jwtUser 存在)
4
+ * 如果未登录则返回 401 Unauthorized
5
+ */
6
+ import { Response, NextFunction } from 'express';
7
+ /**
8
+ * 检查用户是否已登录
9
+ * @param req Express Request 对象,应包含 jwtUser(由 loadJwtUserMiddleware 注入)
10
+ * @param res Express Response 对象
11
+ * @param next 下一个中间件或路由处理器
12
+ */
13
+ export declare function isLoggedMiddleware(req: any, res: Response, next: NextFunction): void;
14
+ export default isLoggedMiddleware;
15
+ //# sourceMappingURL=isLoggedMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isLoggedMiddleware.d.ts","sourceRoot":"","sources":["../../../server/middlewares/isLoggedMiddleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAkBpF;AAED,eAAe,kBAAkB,CAAA"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * 检查用户登录中间件
4
+ * 检查用户是否已登录 (jwtUser 存在)
5
+ * 如果未登录则返回 401 Unauthorized
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.isLoggedMiddleware = isLoggedMiddleware;
9
+ /**
10
+ * 检查用户是否已登录
11
+ * @param req Express Request 对象,应包含 jwtUser(由 loadJwtUserMiddleware 注入)
12
+ * @param res Express Response 对象
13
+ * @param next 下一个中间件或路由处理器
14
+ */
15
+ function isLoggedMiddleware(req, res, next) {
16
+ try {
17
+ // 检查用户是否存在
18
+ if (!req.jwtUser || !req.jwtUser.userId) {
19
+ res.status(401).json({
20
+ code: 'UNAUTHORIZED',
21
+ message: '需要登录'
22
+ });
23
+ return;
24
+ }
25
+ next();
26
+ }
27
+ catch (error) {
28
+ res.status(500).json({
29
+ code: 'SERVER_ERROR',
30
+ message: '服务器内部错误'
31
+ });
32
+ }
33
+ }
34
+ exports.default = isLoggedMiddleware;
35
+ //# sourceMappingURL=isLoggedMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isLoggedMiddleware.js","sourceRoot":"","sources":["../../../server/middlewares/isLoggedMiddleware.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAUH,gDAkBC;AAxBD;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,GAAQ,EAAE,GAAa,EAAE,IAAkB;IAC5E,IAAI,CAAC;QACH,WAAW;QACX,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACxC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,SAAS;SACnB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,kBAAe,kBAAkB,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 验证用户身份中间件
3
+ * 检查用户是否已认证 (isVerified === 1)
4
+ * 如果未认证则返回 403 Forbidden
5
+ */
6
+ import { Response, NextFunction } from 'express';
7
+ /**
8
+ * 检查用户是否已通过身份认证
9
+ * 通常需要与 isLoggedMiddleware 一起使用
10
+ * @param req Express Request 对象,应包含 jwtUser(由 loadJwtUserMiddleware 注入)
11
+ * @param res Express Response 对象
12
+ * @param next 下一个中间件或路由处理器
13
+ */
14
+ export declare function isVerifiedMiddleware(req: any, res: Response, next: NextFunction): void;
15
+ export default isVerifiedMiddleware;
16
+ //# sourceMappingURL=isVerifiedMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isVerifiedMiddleware.d.ts","sourceRoot":"","sources":["../../../server/middlewares/isVerifiedMiddleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CA2BtF;AAED,eAAe,oBAAoB,CAAA"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * 验证用户身份中间件
4
+ * 检查用户是否已认证 (isVerified === 1)
5
+ * 如果未认证则返回 403 Forbidden
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.isVerifiedMiddleware = isVerifiedMiddleware;
9
+ /**
10
+ * 检查用户是否已通过身份认证
11
+ * 通常需要与 isLoggedMiddleware 一起使用
12
+ * @param req Express Request 对象,应包含 jwtUser(由 loadJwtUserMiddleware 注入)
13
+ * @param res Express Response 对象
14
+ * @param next 下一个中间件或路由处理器
15
+ */
16
+ function isVerifiedMiddleware(req, res, next) {
17
+ try {
18
+ // 检查用户是否存在
19
+ if (!req.jwtUser) {
20
+ res.status(401).json({
21
+ code: 'UNAUTHORIZED',
22
+ message: '未认证,请先登录'
23
+ });
24
+ return;
25
+ }
26
+ // 检查用户是否已认证
27
+ if (req.jwtUser.isVerified !== 1) {
28
+ res.status(403).json({
29
+ code: 'FORBIDDEN',
30
+ message: '没有权限访问,用户未通过认证'
31
+ });
32
+ return;
33
+ }
34
+ next();
35
+ }
36
+ catch (error) {
37
+ res.status(500).json({
38
+ code: 'SERVER_ERROR',
39
+ message: '服务器内部错误'
40
+ });
41
+ }
42
+ }
43
+ exports.default = isVerifiedMiddleware;
44
+ //# sourceMappingURL=isVerifiedMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isVerifiedMiddleware.js","sourceRoot":"","sources":["../../../server/middlewares/isVerifiedMiddleware.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAWH,oDA2BC;AAlCD;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,GAAQ,EAAE,GAAa,EAAE,IAAkB;IAC9E,IAAI,CAAC;QACH,WAAW;QACX,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,UAAU;aACpB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,YAAY;QACZ,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gBAAgB;aAC1B,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,EAAE,CAAA;IACR,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,SAAS;SACnB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,kBAAe,oBAAoB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sumor",
3
- "version": "3.0.6",
3
+ "version": "3.0.7",
4
4
  "description": "Sumor OAuth framework",
5
5
  "main": "dist/server/index.js",
6
6
  "types": "dist/server/index.d.ts",
@@ -1,9 +0,0 @@
1
- /**
2
- * 获取授权 URL 控制器
3
- * GET /api/oauth/authorize
4
- *
5
- * 返回跳转到 ITS 的授权 URL,前端将用此 URL 进行重定向
6
- */
7
- import { Request, Response } from 'express';
8
- export default function getAuthorizeUrlController(req: Request, res: Response): void;
9
- //# sourceMappingURL=getAuthorizeUrlController.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getAuthorizeUrlController.d.ts","sourceRoot":"","sources":["../../../server/controllers/getAuthorizeUrlController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAgE3C,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAgB5E"}
@@ -1,80 +0,0 @@
1
- "use strict";
2
- /**
3
- * 获取授权 URL 控制器
4
- * GET /api/oauth/authorize
5
- *
6
- * 返回跳转到 ITS 的授权 URL,前端将用此 URL 进行重定向
7
- */
8
- var __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.default = getAuthorizeUrlController;
13
- const crypto_1 = __importDefault(require("crypto"));
14
- const config_1 = require("../utils/config");
15
- /**
16
- * 生成 PKCE code_challenge 和 code_verifier
17
- */
18
- function generateCodeChallenge() {
19
- const codeVerifier = crypto_1.default.randomBytes(32).toString('hex');
20
- const challenge = crypto_1.default
21
- .createHash('sha256')
22
- .update(codeVerifier)
23
- .digest('base64')
24
- .replace(/\+/g, '-')
25
- .replace(/\//g, '_')
26
- .replace(/=/g, '');
27
- return {
28
- codeChallenge: challenge,
29
- codeVerifier: codeVerifier
30
- };
31
- }
32
- /**
33
- * 生成随机 state 参数
34
- */
35
- function generateState() {
36
- return crypto_1.default.randomBytes(32).toString('hex');
37
- }
38
- /**
39
- * 生成授权 URL
40
- * RFC 6749 §4.1.1,支持 PKCE(RFC 7636)用于增强安全性
41
- */
42
- function generateAuthorizationUrl() {
43
- const oauthConfig = (0, config_1.getOAuthConfig)();
44
- const { codeChallenge, codeVerifier } = generateCodeChallenge();
45
- const uri = oauthConfig.redirectUri;
46
- if (!uri || uri.trim() === '') {
47
- throw new Error('redirectUri 为空或未配置,无法生成授权 URL');
48
- }
49
- const randomState = generateState();
50
- const encryptedState = Buffer.from(codeVerifier).toString('base64') + ':' + randomState;
51
- const params = new URLSearchParams({
52
- clientKey: oauthConfig.clientKey,
53
- redirectUri: uri,
54
- responseType: 'code',
55
- scope: 'profile',
56
- state: encryptedState,
57
- codeChallenge: codeChallenge,
58
- codeChallengeMethod: 'S256'
59
- });
60
- const authUrl = `${oauthConfig.baseUrl}/authorize?${params.toString()}`;
61
- return authUrl;
62
- }
63
- function getAuthorizeUrlController(req, res) {
64
- try {
65
- const authUrl = generateAuthorizationUrl();
66
- res.json({
67
- code: 'OK',
68
- data: {
69
- authUrl
70
- }
71
- });
72
- }
73
- catch (error) {
74
- res.status(500).json({
75
- code: 'ERROR',
76
- message: error.message
77
- });
78
- }
79
- }
80
- //# sourceMappingURL=getAuthorizeUrlController.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getAuthorizeUrlController.js","sourceRoot":"","sources":["../../../server/controllers/getAuthorizeUrlController.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAmEH,4CAgBC;AAjFD,oDAA2B;AAE3B,4CAAgD;AAEhD;;GAEG;AACH,SAAS,qBAAqB;IAI5B,MAAM,YAAY,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3D,MAAM,SAAS,GAAG,gBAAM;SACrB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,YAAY,CAAC;SACpB,MAAM,CAAC,QAAQ,CAAC;SAChB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAEpB,OAAO;QACL,aAAa,EAAE,SAAS;QACxB,YAAY,EAAE,YAAY;KAC3B,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa;IACpB,OAAO,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB;IAC/B,MAAM,WAAW,GAAG,IAAA,uBAAc,GAAE,CAAA;IACpC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,qBAAqB,EAAE,CAAA;IAE/D,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,CAAA;IAEnC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,WAAW,GAAG,aAAa,EAAE,CAAA;IACnC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,WAAW,CAAA;IAEvF,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,MAAM;QACpB,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,cAAc;QACrB,aAAa,EAAE,aAAa;QAC5B,mBAAmB,EAAE,MAAM;KAC5B,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,GAAG,WAAW,CAAC,OAAO,cAAc,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;IAEvE,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAwB,yBAAyB,CAAC,GAAY,EAAE,GAAa;IAC3E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAA;QAE1C,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,IAAI;YACV,IAAI,EAAE;gBACJ,OAAO;aACR;SACF,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}