envware 1.2.9 → 1.3.1
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 +20 -34
- package/dist/app.module.js +8 -4
- package/dist/app.module.js.map +1 -1
- package/dist/commands/approve.command.d.ts +11 -0
- package/dist/commands/approve.command.js +78 -0
- package/dist/commands/approve.command.js.map +1 -0
- package/dist/commands/request.command.d.ts +16 -0
- package/dist/commands/request.command.js +86 -0
- package/dist/commands/request.command.js.map +1 -0
- package/dist/commands/status.command.js +41 -24
- package/dist/commands/status.command.js.map +1 -1
- package/dist/commands/{accept.command.d.ts → sync-access.command.d.ts} +1 -1
- package/dist/commands/sync-access.command.js +61 -0
- package/dist/commands/sync-access.command.js.map +1 -0
- package/dist/commands/{share.command.d.ts → team-invite.command.d.ts} +5 -3
- package/dist/commands/team-invite.command.js +123 -0
- package/dist/commands/team-invite.command.js.map +1 -0
- package/dist/services/api.service.js +3 -0
- package/dist/services/api.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/commands/accept.command.js +0 -75
- package/dist/commands/accept.command.js.map +0 -1
- package/dist/commands/share.command.js +0 -108
- package/dist/commands/share.command.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.AcceptCommand = void 0;
|
|
16
|
-
const nest_commander_1 = require("nest-commander");
|
|
17
|
-
const api_service_1 = require("../services/api.service");
|
|
18
|
-
const config_service_1 = require("../services/config.service");
|
|
19
|
-
const encryption_service_1 = require("../services/encryption.service");
|
|
20
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
21
|
-
let AcceptCommand = class AcceptCommand extends nest_commander_1.CommandRunner {
|
|
22
|
-
apiService;
|
|
23
|
-
encryptionService;
|
|
24
|
-
configService;
|
|
25
|
-
constructor(apiService, encryptionService, configService) {
|
|
26
|
-
super();
|
|
27
|
-
this.apiService = apiService;
|
|
28
|
-
this.encryptionService = encryptionService;
|
|
29
|
-
this.configService = configService;
|
|
30
|
-
}
|
|
31
|
-
async run(passedParams) {
|
|
32
|
-
const activeProjectId = this.configService.getLocalProject();
|
|
33
|
-
if (activeProjectId) {
|
|
34
|
-
console.log(chalk_1.default.cyan(`Current project: ${activeProjectId}\n`));
|
|
35
|
-
}
|
|
36
|
-
const [inviteCode] = passedParams;
|
|
37
|
-
if (!inviteCode) {
|
|
38
|
-
console.log(chalk_1.default.red('Usage: envw accept <inviteCode>'));
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
try {
|
|
42
|
-
console.log(chalk_1.default.blue('Fetching invitation details...'));
|
|
43
|
-
const { data: invitation } = await this.apiService.instance.get(`/projects/invitation/${inviteCode}`);
|
|
44
|
-
console.log(chalk_1.default.blue('Decrypting project key...'));
|
|
45
|
-
const projectKey = this.encryptionService.decryptSymmetric(invitation.encryptedProjectKey, inviteCode);
|
|
46
|
-
console.log(chalk_1.default.blue('Securing project key with your identity...'));
|
|
47
|
-
const publicKey = this.encryptionService.getPublicKey();
|
|
48
|
-
const encryptedForSelf = this.encryptionService.encryptProjectKey(projectKey, publicKey);
|
|
49
|
-
console.log(chalk_1.default.blue('Finalizing collaboration...'));
|
|
50
|
-
await this.apiService.instance.post('/projects/claim-invitation', {
|
|
51
|
-
inviteCode,
|
|
52
|
-
newEncryptedProjectKey: encryptedForSelf,
|
|
53
|
-
publicKey,
|
|
54
|
-
});
|
|
55
|
-
console.log(chalk_1.default.green('Successfully joined the project!'));
|
|
56
|
-
this.configService.setLocalProject(invitation.projectId);
|
|
57
|
-
console.log(chalk_1.default.blue('Project ID saved to .envware'));
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
const message = error.response?.data?.message || error.message;
|
|
61
|
-
console.log(chalk_1.default.red(`Failed to accept invitation: ${message}`));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
exports.AcceptCommand = AcceptCommand;
|
|
66
|
-
exports.AcceptCommand = AcceptCommand = __decorate([
|
|
67
|
-
(0, nest_commander_1.Command)({
|
|
68
|
-
name: 'accept',
|
|
69
|
-
description: 'Accept a project invitation using an invite code',
|
|
70
|
-
}),
|
|
71
|
-
__metadata("design:paramtypes", [api_service_1.ApiService,
|
|
72
|
-
encryption_service_1.EncryptionService,
|
|
73
|
-
config_service_1.ConfigService])
|
|
74
|
-
], AcceptCommand);
|
|
75
|
-
//# sourceMappingURL=accept.command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accept.command.js","sourceRoot":"","sources":["../../src/commands/accept.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mDAAwD;AACxD,yDAAqD;AACrD,+DAA2D;AAC3D,uEAAmE;AACnE,kDAA0B;AAYnB,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,8BAAa;IAEpC;IACA;IACA;IAHV,YACU,UAAsB,EACtB,iBAAoC,EACpC,aAA4B;QAEpC,KAAK,EAAE,CAAC;QAJA,eAAU,GAAV,UAAU,CAAY;QACtB,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,kBAAa,GAAb,aAAa,CAAe;IAGtC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,YAAsB;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;QAC7D,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,eAAe,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAElC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAG1D,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GACxB,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAChC,wBAAwB,UAAU,EAAE,CACrC,CAAC;YAGJ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CACxD,UAAU,CAAC,mBAAmB,EAC9B,UAAU,CACX,CAAC;YAGF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;YACtE,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;YACxD,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAC/D,UAAU,EACV,SAAS,CACV,CAAC;YAGF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACvD,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBAChE,UAAU;gBACV,sBAAsB,EAAE,gBAAgB;gBACxC,SAAS;aACV,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gCAAgC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF,CAAA;AA9DY,sCAAa;wBAAb,aAAa;IAJzB,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,kDAAkD;KAChE,CAAC;qCAGsB,wBAAU;QACH,sCAAiB;QACrB,8BAAa;GAJ3B,aAAa,CA8DzB"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.ShareCommand = void 0;
|
|
16
|
-
const nest_commander_1 = require("nest-commander");
|
|
17
|
-
const api_service_1 = require("../services/api.service");
|
|
18
|
-
const config_service_1 = require("../services/config.service");
|
|
19
|
-
const encryption_service_1 = require("../services/encryption.service");
|
|
20
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
21
|
-
let ShareCommand = class ShareCommand extends nest_commander_1.CommandRunner {
|
|
22
|
-
apiService;
|
|
23
|
-
encryptionService;
|
|
24
|
-
configService;
|
|
25
|
-
constructor(apiService, encryptionService, configService) {
|
|
26
|
-
super();
|
|
27
|
-
this.apiService = apiService;
|
|
28
|
-
this.encryptionService = encryptionService;
|
|
29
|
-
this.configService = configService;
|
|
30
|
-
}
|
|
31
|
-
async run(passedParams, options) {
|
|
32
|
-
const activeProjectId = this.configService.getLocalProject();
|
|
33
|
-
if (activeProjectId) {
|
|
34
|
-
console.log(chalk_1.default.cyan(`Current project: ${activeProjectId}\n`));
|
|
35
|
-
}
|
|
36
|
-
const [projectIdParam, email] = passedParams;
|
|
37
|
-
const projectId = projectIdParam || activeProjectId || process.env.ENVWARE_PROJECT;
|
|
38
|
-
const role = options?.role || 'DEVELOPER';
|
|
39
|
-
if (!projectId || !email) {
|
|
40
|
-
console.log(chalk_1.default.red('Usage: share <projectId|alias> <email> [--role ADMINISTRATOR|DEVELOPER]'));
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
try {
|
|
44
|
-
await this.apiService.instance.post('/projects/share', {
|
|
45
|
-
projectId,
|
|
46
|
-
email,
|
|
47
|
-
role,
|
|
48
|
-
});
|
|
49
|
-
const { data: pullData } = await this.apiService.instance.get('/secrets', {
|
|
50
|
-
params: { projectId },
|
|
51
|
-
});
|
|
52
|
-
if (!pullData.encryptedProjectKey) {
|
|
53
|
-
throw new Error('Project does not have an E2EE key. Push secrets first.');
|
|
54
|
-
}
|
|
55
|
-
const projectKey = this.encryptionService.decryptProjectKey(pullData.encryptedProjectKey);
|
|
56
|
-
const { data: userData } = await this.apiService.instance.get('/secrets/public-key', { params: { email } });
|
|
57
|
-
const recipientKeys = userData.publicKeys || (userData.publicKey ? [userData.publicKey] : []);
|
|
58
|
-
if (recipientKeys.length === 0) {
|
|
59
|
-
console.log(chalk_1.default.yellow(`User ${email} has not registered any SSH keys yet.`));
|
|
60
|
-
}
|
|
61
|
-
for (const pubKey of recipientKeys) {
|
|
62
|
-
console.log(chalk_1.default.blue(`Encrypting for device: ${pubKey.substring(0, 20)}...`));
|
|
63
|
-
const encryptedForRecipient = this.encryptionService.encryptProjectKey(projectKey, pubKey);
|
|
64
|
-
await this.apiService.instance.post('/secrets/project-key', {
|
|
65
|
-
projectId,
|
|
66
|
-
encryptedProjectKey: encryptedForRecipient,
|
|
67
|
-
targetEmail: email,
|
|
68
|
-
}, {
|
|
69
|
-
headers: { 'x-public-key': pubKey }
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
console.log(chalk_1.default.green(`Successfully shared ${role} access with ${email} (${recipientKeys.length} devices)`));
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
const errorMessage = error.response?.data?.message || error.message || String(error);
|
|
76
|
-
console.log(chalk_1.default.red('Share failed: ' + errorMessage));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
parseRole(val) {
|
|
80
|
-
const upper = val.toUpperCase();
|
|
81
|
-
if (upper === 'ADMIN')
|
|
82
|
-
return 'ADMINISTRATOR';
|
|
83
|
-
if (upper === 'DEV')
|
|
84
|
-
return 'DEVELOPER';
|
|
85
|
-
return upper;
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
exports.ShareCommand = ShareCommand;
|
|
89
|
-
__decorate([
|
|
90
|
-
(0, nest_commander_1.Option)({
|
|
91
|
-
flags: '-r, --role [role]',
|
|
92
|
-
description: 'The role to grant (ADMINISTRATOR or DEVELOPER)',
|
|
93
|
-
defaultValue: 'DEVELOPER',
|
|
94
|
-
}),
|
|
95
|
-
__metadata("design:type", Function),
|
|
96
|
-
__metadata("design:paramtypes", [String]),
|
|
97
|
-
__metadata("design:returntype", String)
|
|
98
|
-
], ShareCommand.prototype, "parseRole", null);
|
|
99
|
-
exports.ShareCommand = ShareCommand = __decorate([
|
|
100
|
-
(0, nest_commander_1.Command)({
|
|
101
|
-
name: 'share',
|
|
102
|
-
description: 'Share project access with another user (E2EE)',
|
|
103
|
-
}),
|
|
104
|
-
__metadata("design:paramtypes", [api_service_1.ApiService,
|
|
105
|
-
encryption_service_1.EncryptionService,
|
|
106
|
-
config_service_1.ConfigService])
|
|
107
|
-
], ShareCommand);
|
|
108
|
-
//# sourceMappingURL=share.command.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"share.command.js","sourceRoot":"","sources":["../../src/commands/share.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mDAAgE;AAChE,yDAAqD;AACrD,+DAA2D;AAC3D,uEAAmE;AACnE,kDAA0B;AAoBnB,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,8BAAa;IAEnC;IACA;IACA;IAHV,YACU,UAAsB,EACtB,iBAAoC,EACpC,aAA4B;QAEpC,KAAK,EAAE,CAAC;QAJA,eAAU,GAAV,UAAU,CAAY;QACtB,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,kBAAa,GAAb,aAAa,CAAe;IAGtC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,YAAsB,EAAE,OAAsB;QACtD,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;QAC7D,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oBAAoB,eAAe,IAAI,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,YAAY,CAAC;QAC7C,MAAM,SAAS,GACb,cAAc,IAAI,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,WAAW,CAAC;QAE1C,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CACP,yEAAyE,CAC1E,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YAEH,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBACrD,SAAS;gBACT,KAAK;gBACL,IAAI;aACL,CAAC,CAAC;YAGH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GACtB,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAe,UAAU,EAAE;gBAC3D,MAAM,EAAE,EAAE,SAAS,EAAE;aACtB,CAAC,CAAC;YACL,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CACb,wDAAwD,CACzD,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CACzD,QAAQ,CAAC,mBAAmB,CAC7B,CAAC;YAGF,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GACtB,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAChC,qBAAqB,EACrB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CACtB,CAAC;YAEJ,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAE9F,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,MAAM,CACV,QAAQ,KAAK,uCAAuC,CACrD,CACF,CAAC;YAEJ,CAAC;YAGD,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChF,MAAM,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CACpE,UAAU,EACV,MAAM,CACP,CAAC;gBAGF,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE;oBAC1D,SAAS;oBACT,mBAAmB,EAAE,qBAAqB;oBAC1C,WAAW,EAAE,KAAK;iBACnB,EAAE;oBACD,OAAO,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,uBAAuB,IAAI,gBAAgB,KAAK,KAAK,aAAa,CAAC,MAAM,WAAW,CAAC,CAClG,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,YAAY,GAChB,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAOD,SAAS,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,eAAe,CAAC;QAC9C,IAAI,KAAK,KAAK,KAAK;YAAE,OAAO,WAAW,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AA7GY,oCAAY;AAuGvB;IALC,IAAA,uBAAM,EAAC;QACN,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,gDAAgD;QAC7D,YAAY,EAAE,WAAW;KAC1B,CAAC;;;;6CAMD;uBA5GU,YAAY;IAJxB,IAAA,wBAAO,EAAC;QACP,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,+CAA+C;KAC7D,CAAC;qCAGsB,wBAAU;QACH,sCAAiB;QACrB,8BAAa;GAJ3B,YAAY,CA6GxB"}
|