@memberjunction/ai-engine-base 5.40.1 → 5.40.2

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-engine-base",
3
3
  "type": "module",
4
- "version": "5.40.1",
4
+ "version": "5.40.2",
5
5
  "description": "MemberJunction: Base AI Engine Package - does extended types and data caching, can be used anywhere.",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -17,12 +17,12 @@
17
17
  "author": "MemberJunction.com",
18
18
  "license": "ISC",
19
19
  "dependencies": {
20
- "@memberjunction/core": "5.40.1",
21
- "@memberjunction/global": "5.40.1",
22
- "@memberjunction/core-entities": "5.40.1",
23
- "@memberjunction/ai": "5.40.1",
24
- "@memberjunction/ai-core-plus": "5.40.1",
25
- "@memberjunction/templates-base-types": "5.40.1",
20
+ "@memberjunction/core": "5.40.2",
21
+ "@memberjunction/global": "5.40.2",
22
+ "@memberjunction/core-entities": "5.40.2",
23
+ "@memberjunction/ai": "5.40.2",
24
+ "@memberjunction/ai-core-plus": "5.40.2",
25
+ "@memberjunction/templates-base-types": "5.40.2",
26
26
  "dotenv": "^17.2.4",
27
27
  "rxjs": "^7.8.2"
28
28
  },
@@ -1,49 +0,0 @@
1
- import { ValidationResult } from '@memberjunction/core';
2
- import { AICredentialBindingEntity } from '@memberjunction/core-entities';
3
- /**
4
- * Extended AICredentialBindingEntity class that validates credential types match vendor expectations.
5
- * When a credential is bound, this validates that the credential's CredentialTypeID matches the
6
- * CredentialTypeID expected by the vendor (as declared on the AIVendor record).
7
- */
8
- export declare class AICredentialBindingEntityExtended extends AICredentialBindingEntity {
9
- /**
10
- * Async validation that checks credential type compatibility.
11
- * Uses AIEngineBase.Instance for cached AI entity data and RunView for credentials.
12
- */
13
- ValidateAsync(): Promise<ValidationResult>;
14
- /**
15
- * Turn on async validation
16
- */
17
- get DefaultSkipAsyncValidation(): boolean;
18
- /**
19
- * Validates that the bound credential's type matches the vendor's expected credential type.
20
- * The vendor is determined based on the binding type:
21
- * - Vendor binding: directly references the vendor
22
- * - ModelVendor binding: gets vendor from the ModelVendor record
23
- * - PromptModel binding: gets vendor from the PromptModel -> ModelVendor -> Vendor chain
24
- */
25
- private validateCredentialTypeMatch;
26
- /**
27
- * Gets the expected CredentialTypeID from the vendor based on the binding type.
28
- * Uses AIEngineBase cached data for lookups.
29
- */
30
- private getExpectedCredentialTypeId;
31
- /**
32
- * Gets the expected credential type name for error messages.
33
- */
34
- private getExpectedCredentialTypeName;
35
- /**
36
- * Gets the vendor name for error messages based on the binding type.
37
- */
38
- private getVendorNameForError;
39
- /**
40
- * Loads the credential using RunView.
41
- * Credentials are not cached in AIEngineBase, so we need to query them.
42
- */
43
- private loadCredential;
44
- }
45
- /**
46
- * Tree-shaking prevention function - must be called from index.ts
47
- */
48
- export declare function LoadAICredentialBindingEntityExtended(): void;
49
- //# sourceMappingURL=AICredentialBindingEntityExtended.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AICredentialBindingEntityExtended.d.ts","sourceRoot":"","sources":["../src/AICredentialBindingEntityExtended.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,gBAAgB,EAA4C,MAAM,sBAAsB,CAAC;AACvH,OAAO,EAAE,yBAAyB,EAAoB,MAAM,+BAA+B,CAAC;AAG5F;;;;GAIG;AACH,qBACa,iCAAkC,SAAQ,yBAAyB;IAE5E;;;OAGG;IACmB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAYhE;;OAEG;IACH,IAAa,0BAA0B,IAAI,OAAO,CAEjD;IAED;;;;;;OAMG;YACW,2BAA2B;IAmCzC;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAgCnC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA6BrC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA6B7B;;;OAGG;YACW,cAAc;CAkB/B;AAED;;GAEG;AACH,wBAAgB,qCAAqC,SAGpD"}
@@ -1,188 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { RegisterClass } from '@memberjunction/global';
8
- import { BaseEntity, RunView, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/core';
9
- import { AICredentialBindingEntity } from '@memberjunction/core-entities';
10
- import { AIEngineBase } from './BaseAIEngine.js';
11
- /**
12
- * Extended AICredentialBindingEntity class that validates credential types match vendor expectations.
13
- * When a credential is bound, this validates that the credential's CredentialTypeID matches the
14
- * CredentialTypeID expected by the vendor (as declared on the AIVendor record).
15
- */
16
- let AICredentialBindingEntityExtended = class AICredentialBindingEntityExtended extends AICredentialBindingEntity {
17
- /**
18
- * Async validation that checks credential type compatibility.
19
- * Uses AIEngineBase.Instance for cached AI entity data and RunView for credentials.
20
- */
21
- async ValidateAsync() {
22
- // Start with base validation (including synchronous validation)
23
- const result = await super.ValidateAsync();
24
- // Only validate credential type if we have both a credential and can determine the vendor
25
- if (this.CredentialID) {
26
- await this.validateCredentialTypeMatch(result);
27
- }
28
- return result;
29
- }
30
- /**
31
- * Turn on async validation
32
- */
33
- get DefaultSkipAsyncValidation() {
34
- return false; // don't skip async validation
35
- }
36
- /**
37
- * Validates that the bound credential's type matches the vendor's expected credential type.
38
- * The vendor is determined based on the binding type:
39
- * - Vendor binding: directly references the vendor
40
- * - ModelVendor binding: gets vendor from the ModelVendor record
41
- * - PromptModel binding: gets vendor from the PromptModel -> ModelVendor -> Vendor chain
42
- */
43
- async validateCredentialTypeMatch(result) {
44
- // Get the expected credential type from the vendor
45
- const vendorCredentialTypeId = this.getExpectedCredentialTypeId();
46
- // If the vendor doesn't have a credential type requirement, skip validation
47
- if (!vendorCredentialTypeId) {
48
- return;
49
- }
50
- // Load the credential to get its type
51
- const credential = await this.loadCredential();
52
- if (!credential) {
53
- result.Errors.push(new ValidationErrorInfo('CredentialID', `Could not load credential with ID '${this.CredentialID}' to validate type compatibility.`, this.CredentialID, ValidationErrorType.Warning));
54
- return;
55
- }
56
- // Compare credential types
57
- if (credential.CredentialTypeID !== vendorCredentialTypeId) {
58
- const vendorName = this.getVendorNameForError();
59
- const expectedTypeName = this.getExpectedCredentialTypeName();
60
- result.Errors.push(new ValidationErrorInfo('CredentialID', `Credential type mismatch: The credential '${credential.Name}' has type '${credential.CredentialType || credential.CredentialTypeID}' but vendor '${vendorName}' expects type '${expectedTypeName || vendorCredentialTypeId}'.`, this.CredentialID, ValidationErrorType.Failure));
61
- }
62
- }
63
- /**
64
- * Gets the expected CredentialTypeID from the vendor based on the binding type.
65
- * Uses AIEngineBase cached data for lookups.
66
- */
67
- getExpectedCredentialTypeId() {
68
- const engine = AIEngineBase.Instance;
69
- switch (this.BindingType) {
70
- case 'Vendor': {
71
- // Direct vendor binding - get type from the vendor
72
- const vendor = engine.Vendors.find(v => v.ID === this.AIVendorID);
73
- return vendor?.CredentialTypeID ?? null;
74
- }
75
- case 'ModelVendor': {
76
- // ModelVendor binding - get vendor from ModelVendor, then get type
77
- const modelVendor = engine.ModelVendors.find(mv => mv.ID === this.AIModelVendorID);
78
- if (modelVendor) {
79
- const vendor = engine.Vendors.find(v => v.ID === modelVendor.VendorID);
80
- return vendor?.CredentialTypeID ?? null;
81
- }
82
- return null;
83
- }
84
- case 'PromptModel': {
85
- // PromptModel binding - get vendor from PromptModel's VendorID
86
- const promptModel = engine.PromptModels.find(pm => pm.ID === this.AIPromptModelID);
87
- if (promptModel && promptModel.VendorID) {
88
- const vendor = engine.Vendors.find(v => v.ID === promptModel.VendorID);
89
- return vendor?.CredentialTypeID ?? null;
90
- }
91
- return null;
92
- }
93
- default:
94
- return null;
95
- }
96
- }
97
- /**
98
- * Gets the expected credential type name for error messages.
99
- */
100
- getExpectedCredentialTypeName() {
101
- const engine = AIEngineBase.Instance;
102
- switch (this.BindingType) {
103
- case 'Vendor': {
104
- const vendor = engine.Vendors.find(v => v.ID === this.AIVendorID);
105
- return vendor?.CredentialType ?? null;
106
- }
107
- case 'ModelVendor': {
108
- const modelVendor = engine.ModelVendors.find(mv => mv.ID === this.AIModelVendorID);
109
- if (modelVendor) {
110
- const vendor = engine.Vendors.find(v => v.ID === modelVendor.VendorID);
111
- return vendor?.CredentialType ?? null;
112
- }
113
- return null;
114
- }
115
- case 'PromptModel': {
116
- const promptModel = engine.PromptModels.find(pm => pm.ID === this.AIPromptModelID);
117
- if (promptModel && promptModel.VendorID) {
118
- const vendor = engine.Vendors.find(v => v.ID === promptModel.VendorID);
119
- return vendor?.CredentialType ?? null;
120
- }
121
- return null;
122
- }
123
- default:
124
- return null;
125
- }
126
- }
127
- /**
128
- * Gets the vendor name for error messages based on the binding type.
129
- */
130
- getVendorNameForError() {
131
- const engine = AIEngineBase.Instance;
132
- switch (this.BindingType) {
133
- case 'Vendor': {
134
- const vendor = engine.Vendors.find(v => v.ID === this.AIVendorID);
135
- return vendor?.Name ?? this.AIVendorID ?? 'Unknown';
136
- }
137
- case 'ModelVendor': {
138
- const modelVendor = engine.ModelVendors.find(mv => mv.ID === this.AIModelVendorID);
139
- if (modelVendor) {
140
- const vendor = engine.Vendors.find(v => v.ID === modelVendor.VendorID);
141
- return vendor?.Name ?? modelVendor.Vendor ?? 'Unknown';
142
- }
143
- return this.AIModelVendorID ?? 'Unknown';
144
- }
145
- case 'PromptModel': {
146
- const promptModel = engine.PromptModels.find(pm => pm.ID === this.AIPromptModelID);
147
- if (promptModel && promptModel.VendorID) {
148
- const vendor = engine.Vendors.find(v => v.ID === promptModel.VendorID);
149
- return vendor?.Name ?? promptModel.Vendor ?? 'Unknown';
150
- }
151
- return this.AIPromptModelID ?? 'Unknown';
152
- }
153
- default:
154
- return 'Unknown';
155
- }
156
- }
157
- /**
158
- * Loads the credential using RunView.
159
- * Credentials are not cached in AIEngineBase, so we need to query them.
160
- */
161
- async loadCredential() {
162
- if (!this.CredentialID) {
163
- return null;
164
- }
165
- const rv = new RunView();
166
- const result = await rv.RunView({
167
- EntityName: 'MJ: Credentials',
168
- ResultType: 'entity_object',
169
- CacheLocal: true // load all records and use cache for speed, filter client side below
170
- }, this.ContextCurrentUser);
171
- if (result.Success && result.Results && result.Results.length > 0) {
172
- return result.Results.find(c => c.ID === this.CredentialID);
173
- }
174
- return null;
175
- }
176
- };
177
- AICredentialBindingEntityExtended = __decorate([
178
- RegisterClass(BaseEntity, 'MJ: AI Credential Bindings')
179
- ], AICredentialBindingEntityExtended);
180
- export { AICredentialBindingEntityExtended };
181
- /**
182
- * Tree-shaking prevention function - must be called from index.ts
183
- */
184
- export function LoadAICredentialBindingEntityExtended() {
185
- // This function ensures the extended class is included in the bundle
186
- // The @RegisterClass decorator handles the actual registration
187
- }
188
- //# sourceMappingURL=AICredentialBindingEntityExtended.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AICredentialBindingEntityExtended.js","sourceRoot":"","sources":["../src/AICredentialBindingEntityExtended.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAoB,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACvH,OAAO,EAAE,yBAAyB,EAAoB,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;;GAIG;AAEI,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,yBAAyB;IAE5E;;;OAGG;IACa,KAAK,CAAC,aAAa;QAC/B,gEAAgE;QAChE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,EAAE,CAAC;QAE3C,0FAA0F;QAC1F,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,IAAa,0BAA0B;QACnC,OAAO,KAAK,CAAC,CAAC,8BAA8B;IAChD,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,2BAA2B,CAAC,MAAwB;QAC9D,mDAAmD;QACnD,MAAM,sBAAsB,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAElE,4EAA4E;QAC5E,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC1B,OAAO;QACX,CAAC;QAED,sCAAsC;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,cAAc,EACd,sCAAsC,IAAI,CAAC,YAAY,mCAAmC,EAC1F,IAAI,CAAC,YAAY,EACjB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,2BAA2B;QAC3B,IAAI,UAAU,CAAC,gBAAgB,KAAK,sBAAsB,EAAE,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChD,MAAM,gBAAgB,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,cAAc,EACd,6CAA6C,UAAU,CAAC,IAAI,eAAe,UAAU,CAAC,cAAc,IAAI,UAAU,CAAC,gBAAgB,iBAAiB,UAAU,mBAAmB,gBAAgB,IAAI,sBAAsB,IAAI,EAC/N,IAAI,CAAC,YAAY,EACjB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,2BAA2B;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;QAErC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACZ,mDAAmD;gBACnD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClE,OAAO,MAAM,EAAE,gBAAgB,IAAI,IAAI,CAAC;YAC5C,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,mEAAmE;gBACnE,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACvE,OAAO,MAAM,EAAE,gBAAgB,IAAI,IAAI,CAAC;gBAC5C,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,+DAA+D;gBAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACvE,OAAO,MAAM,EAAE,gBAAgB,IAAI,IAAI,CAAC;gBAC5C,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC;YACD;gBACI,OAAO,IAAI,CAAC;QACpB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,6BAA6B;QACjC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;QAErC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClE,OAAO,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC;YAC1C,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACvE,OAAO,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC;gBAC1C,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACvE,OAAO,MAAM,EAAE,cAAc,IAAI,IAAI,CAAC;gBAC1C,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC;YACD;gBACI,OAAO,IAAI,CAAC;QACpB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB;QACzB,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC;QAErC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClE,OAAO,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC;YACxD,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACvE,OAAO,MAAM,EAAE,IAAI,IAAI,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC;gBAC3D,CAAC;gBACD,OAAO,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;YAC7C,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC;gBACnF,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACvE,OAAO,MAAM,EAAE,IAAI,IAAI,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC;gBAC3D,CAAC;gBACD,OAAO,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC;YAC7C,CAAC;YACD;gBACI,OAAO,SAAS,CAAC;QACzB,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAmB;YAC9C,UAAU,EAAE,iBAAiB;YAC7B,UAAU,EAAE,eAAe;YAC3B,UAAU,EAAE,IAAI,CAAC,qEAAqE;SACzF,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE5B,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,CAAA;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ,CAAA;AA7LY,iCAAiC;IAD7C,aAAa,CAAC,UAAU,EAAE,4BAA4B,CAAC;GAC3C,iCAAiC,CA6L7C;;AAED;;GAEG;AACH,MAAM,UAAU,qCAAqC;IACjD,qEAAqE;IACrE,+DAA+D;AACnE,CAAC"}