n8n-workflow 2.28.1 → 2.29.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/cjs/build.tsbuildinfo +1 -1
- package/dist/cjs/common/index.d.ts +1 -0
- package/dist/cjs/common/index.d.ts.map +1 -1
- package/dist/cjs/common/index.js +2 -1
- package/dist/cjs/common/index.js.map +1 -1
- package/dist/cjs/common/resolve-variables.d.ts +25 -0
- package/dist/cjs/common/resolve-variables.d.ts.map +1 -0
- package/dist/cjs/common/resolve-variables.js +39 -0
- package/dist/cjs/common/resolve-variables.js.map +1 -0
- package/dist/cjs/errors/abstract/execution-base.error.d.ts +3 -3
- package/dist/cjs/errors/abstract/execution-base.error.d.ts.map +1 -1
- package/dist/cjs/errors/abstract/execution-base.error.js +3 -4
- package/dist/cjs/errors/abstract/execution-base.error.js.map +1 -1
- package/dist/cjs/errors/db-connection-timeout-error.d.ts +2 -2
- package/dist/cjs/errors/db-connection-timeout-error.d.ts.map +1 -1
- package/dist/cjs/errors/db-connection-timeout-error.js +3 -3
- package/dist/cjs/errors/db-connection-timeout-error.js.map +1 -1
- package/dist/cjs/errors/trigger-close.error.d.ts +3 -3
- package/dist/cjs/errors/trigger-close.error.d.ts.map +1 -1
- package/dist/cjs/errors/trigger-close.error.js +4 -5
- package/dist/cjs/errors/trigger-close.error.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +6 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces.d.ts +46 -1
- package/dist/cjs/interfaces.d.ts.map +1 -1
- package/dist/cjs/interfaces.js.map +1 -1
- package/dist/cjs/jmespath-query.d.ts +12 -0
- package/dist/cjs/jmespath-query.d.ts.map +1 -0
- package/dist/cjs/jmespath-query.js +72 -0
- package/dist/cjs/jmespath-query.js.map +1 -0
- package/dist/cjs/node-parameters/filter-parameter.d.ts +2 -2
- package/dist/cjs/node-parameters/filter-parameter.d.ts.map +1 -1
- package/dist/cjs/node-parameters/filter-parameter.js +4 -4
- package/dist/cjs/node-parameters/filter-parameter.js.map +1 -1
- package/dist/cjs/run-execution-data/run-execution-data.v0.d.ts +1 -1
- package/dist/cjs/run-execution-data/run-execution-data.v0.d.ts.map +1 -1
- package/dist/cjs/run-execution-data/run-execution-data.v1.d.ts +1 -9
- package/dist/cjs/run-execution-data/run-execution-data.v1.d.ts.map +1 -1
- package/dist/cjs/run-execution-data/run-execution-data.v1.js.map +1 -1
- package/dist/cjs/trigger-identity.d.ts +24 -0
- package/dist/cjs/trigger-identity.d.ts.map +1 -0
- package/dist/cjs/trigger-identity.js +55 -0
- package/dist/cjs/trigger-identity.js.map +1 -0
- package/dist/cjs/workflow-data-proxy.d.ts.map +1 -1
- package/dist/cjs/workflow-data-proxy.js +13 -2
- package/dist/cjs/workflow-data-proxy.js.map +1 -1
- package/dist/esm/common/index.d.ts +1 -0
- package/dist/esm/common/index.d.ts.map +1 -1
- package/dist/esm/common/index.js +1 -0
- package/dist/esm/common/index.js.map +1 -1
- package/dist/esm/common/resolve-variables.d.ts +25 -0
- package/dist/esm/common/resolve-variables.d.ts.map +1 -0
- package/dist/esm/common/resolve-variables.js +26 -0
- package/dist/esm/common/resolve-variables.js.map +1 -0
- package/dist/esm/errors/abstract/execution-base.error.d.ts +3 -3
- package/dist/esm/errors/abstract/execution-base.error.d.ts.map +1 -1
- package/dist/esm/errors/abstract/execution-base.error.js +2 -3
- package/dist/esm/errors/abstract/execution-base.error.js.map +1 -1
- package/dist/esm/errors/db-connection-timeout-error.d.ts +2 -2
- package/dist/esm/errors/db-connection-timeout-error.d.ts.map +1 -1
- package/dist/esm/errors/db-connection-timeout-error.js +2 -2
- package/dist/esm/errors/db-connection-timeout-error.js.map +1 -1
- package/dist/esm/errors/trigger-close.error.d.ts +3 -3
- package/dist/esm/errors/trigger-close.error.d.ts.map +1 -1
- package/dist/esm/errors/trigger-close.error.js +3 -4
- package/dist/esm/errors/trigger-close.error.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interfaces.d.ts +46 -1
- package/dist/esm/interfaces.d.ts.map +1 -1
- package/dist/esm/interfaces.js.map +1 -1
- package/dist/esm/jmespath-query.d.ts +12 -0
- package/dist/esm/jmespath-query.d.ts.map +1 -0
- package/dist/esm/jmespath-query.js +24 -0
- package/dist/esm/jmespath-query.js.map +1 -0
- package/dist/esm/node-parameters/filter-parameter.d.ts +2 -2
- package/dist/esm/node-parameters/filter-parameter.d.ts.map +1 -1
- package/dist/esm/node-parameters/filter-parameter.js +3 -3
- package/dist/esm/node-parameters/filter-parameter.js.map +1 -1
- package/dist/esm/run-execution-data/run-execution-data.v0.d.ts +1 -1
- package/dist/esm/run-execution-data/run-execution-data.v0.d.ts.map +1 -1
- package/dist/esm/run-execution-data/run-execution-data.v1.d.ts +1 -9
- package/dist/esm/run-execution-data/run-execution-data.v1.d.ts.map +1 -1
- package/dist/esm/run-execution-data/run-execution-data.v1.js.map +1 -1
- package/dist/esm/trigger-identity.d.ts +24 -0
- package/dist/esm/trigger-identity.d.ts.map +1 -0
- package/dist/esm/trigger-identity.js +42 -0
- package/dist/esm/trigger-identity.js.map +1 -0
- package/dist/esm/typecheck.tsbuildinfo +1 -1
- package/dist/esm/workflow-data-proxy.d.ts.map +1 -1
- package/dist/esm/workflow-data-proxy.js +12 -1
- package/dist/esm/workflow-data-proxy.js.map +1 -1
- package/package.json +18 -9
|
@@ -24,14 +24,6 @@ export interface IRunExecutionDataV1 {
|
|
|
24
24
|
pinData?: IPinData;
|
|
25
25
|
lastNodeExecuted?: string;
|
|
26
26
|
metadata?: Record<string, string>;
|
|
27
|
-
/**
|
|
28
|
-
* Nodes whose output was simulated (mocked via per-execution pin data)
|
|
29
|
-
* instead of executed, keyed by node name. Set for AI-driven workflow
|
|
30
|
-
* verification runs so the editor can label simulated outputs.
|
|
31
|
-
*/
|
|
32
|
-
simulation?: Record<string, {
|
|
33
|
-
reason: string;
|
|
34
|
-
}>;
|
|
35
27
|
};
|
|
36
28
|
executionData?: {
|
|
37
29
|
contextData: IExecuteContextData;
|
|
@@ -52,7 +44,7 @@ export interface IRunExecutionDataV1 {
|
|
|
52
44
|
waitTill?: Date;
|
|
53
45
|
pushRef?: string;
|
|
54
46
|
/** Data needed for a worker to run a manual execution. */
|
|
55
|
-
manualData?: Pick<IWorkflowExecutionDataProcess, 'dirtyNodeNames' | 'triggerToStartFrom' | 'userId'>;
|
|
47
|
+
manualData?: Pick<IWorkflowExecutionDataProcess, 'dirtyNodeNames' | 'triggerToStartFrom' | 'userId' | 'evaluationRunId'>;
|
|
56
48
|
/** Metadata about whether and how this execution's data was redacted. */
|
|
57
49
|
redactionInfo?: RedactionInfo;
|
|
58
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-execution-data.v1.d.ts","sourceRoot":"","sources":["../../../src/run-execution-data/run-execution-data.v1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,aAAa,EACb,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;QAC7B,eAAe,CAAC,EAAE,gBAAgB,CAAC;QACnC,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;QAC3C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,UAAU,EAAE;QACX,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB;;;WAGG;QACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;QACnC,OAAO,EAAE,QAAQ,CAAC;QAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"run-execution-data.v1.d.ts","sourceRoot":"","sources":["../../../src/run-execution-data/run-execution-data.v1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,EACjB,QAAQ,EACR,kBAAkB,EAClB,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,6BAA6B,EAC7B,gBAAgB,EAChB,aAAa,EACb,MAAM,IAAI,CAAC;AACZ,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;QAC7B,eAAe,CAAC,EAAE,gBAAgB,CAAC;QACnC,uBAAuB,CAAC,EAAE,gBAAgB,CAAC;QAC3C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,UAAU,EAAE;QACX,KAAK,CAAC,EAAE,cAAc,CAAC;QACvB;;;WAGG;QACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;QACnC,OAAO,EAAE,QAAQ,CAAC;QAClB,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;IACF,aAAa,CAAC,EAAE;QACf,WAAW,EAAE,mBAAmB,CAAC;QACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,kBAAkB,EAAE,YAAY,EAAE,CAAC;QACnC,QAAQ,EAAE;YAET,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;SAC/B,CAAC;QACF,gBAAgB,EAAE,oBAAoB,CAAC;QACvC,sBAAsB,EAAE,0BAA0B,GAAG,IAAI,CAAC;KAC1D,CAAC;IACF,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,IAAI,CAChB,6BAA6B,EAC7B,gBAAgB,GAAG,oBAAoB,GAAG,QAAQ,GAAG,iBAAiB,CACtE,CAAC;IAEF,yEAAyE;IACzE,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,CAuBrF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-execution-data.v1.js","sourceRoot":"","sources":["../../../src/run-execution-data/run-execution-data.v1.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-execution-data.v1.js","sourceRoot":"","sources":["../../../src/run-execution-data/run-execution-data.v1.ts"],"names":[],"mappings":"AA2EA,MAAM,UAAU,sBAAsB,CAAC,IAAyB;IAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;IAC1D,MAAM,yBAAyB,GAAG,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAE1E,OAAO;QACN,GAAG,IAAI;QACP,OAAO,EAAE,CAAC;QACV,SAAS,EAAE;YACV,GAAG,IAAI,CAAC,SAAS;YACjB,eAAe,EAAE,iBAAiB;gBACjC,CAAC,CAAC;oBACA,QAAQ,EAAE,iBAAiB;oBAC3B,IAAI,EAAE,WAAW;iBACjB;gBACF,CAAC,CAAC,SAAS;YACZ,uBAAuB,EAAE,yBAAyB;gBACjD,CAAC,CAAC;oBACA,QAAQ,EAAE,yBAAyB;oBACnC,IAAI,EAAE,WAAW;iBACjB;gBACF,CAAC,CAAC,SAAS;SACZ;KACD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { INodeParameters } from './interfaces';
|
|
2
|
+
/**
|
|
3
|
+
* The identity families a trigger can establish at runtime, used to gate dynamic
|
|
4
|
+
* (resolvable) credentials:
|
|
5
|
+
* - `providesN8nIdentity`: the n8n user identity, keyed on by the system resolver
|
|
6
|
+
* (private credentials).
|
|
7
|
+
* - `providesExternalIdentity`: an identity extracted from the trigger data, keyed
|
|
8
|
+
* on by custom resolvers (OAuth, Slack, …).
|
|
9
|
+
*/
|
|
10
|
+
export interface TriggerIdentityCapabilities {
|
|
11
|
+
providesN8nIdentity: boolean;
|
|
12
|
+
providesExternalIdentity: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Classifies a single trigger node by the identity it can establish at runtime.
|
|
16
|
+
*
|
|
17
|
+
* Shared by the backend publish-time validation (`WorkflowValidationService`) and
|
|
18
|
+
* the editor's trigger-compatibility warning so the two can't drift. Keep it in
|
|
19
|
+
* sync with how the engine establishes identity (`execution-context.ts`,
|
|
20
|
+
* manual/parent inheritance) and the resolvers' identifiers (e.g. `N8NIdentifier`):
|
|
21
|
+
* when a new trigger or identity source is added there, reflect it here too.
|
|
22
|
+
*/
|
|
23
|
+
export declare function classifyTriggerIdentity(nodeType: string, parameters: INodeParameters | undefined): TriggerIdentityCapabilities;
|
|
24
|
+
//# sourceMappingURL=trigger-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-identity.d.ts","sourceRoot":"","sources":["../../src/trigger-identity.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B;IAC3C,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wBAAwB,EAAE,OAAO,CAAC;CAClC;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,eAAe,GAAG,SAAS,GACrC,2BAA2B,CAuB7B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CHAT_TRIGGER_NODE_TYPE, EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE, MANUAL_TRIGGER_NODE_TYPES, MCP_TRIGGER_NODE_TYPE, } from './constants';
|
|
2
|
+
import { toExecutionContextEstablishmentHookParameter } from './execution-context-establishment-hooks';
|
|
3
|
+
const NO_IDENTITY = {
|
|
4
|
+
providesN8nIdentity: false,
|
|
5
|
+
providesExternalIdentity: false,
|
|
6
|
+
};
|
|
7
|
+
/** Whether a trigger's parameters declare at least one context establishment hook. */
|
|
8
|
+
function hasContextEstablishmentHook(parameters) {
|
|
9
|
+
const hookParams = toExecutionContextEstablishmentHookParameter(parameters);
|
|
10
|
+
return (hookParams !== null &&
|
|
11
|
+
hookParams.success &&
|
|
12
|
+
hookParams.data.contextEstablishmentHooks.hooks.length > 0);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Classifies a single trigger node by the identity it can establish at runtime.
|
|
16
|
+
*
|
|
17
|
+
* Shared by the backend publish-time validation (`WorkflowValidationService`) and
|
|
18
|
+
* the editor's trigger-compatibility warning so the two can't drift. Keep it in
|
|
19
|
+
* sync with how the engine establishes identity (`execution-context.ts`,
|
|
20
|
+
* manual/parent inheritance) and the resolvers' identifiers (e.g. `N8NIdentifier`):
|
|
21
|
+
* when a new trigger or identity source is added there, reflect it here too.
|
|
22
|
+
*/
|
|
23
|
+
export function classifyTriggerIdentity(nodeType, parameters) {
|
|
24
|
+
// Sub-workflows inherit identity from the parent; Chat Hub and MCP-over-n8nOAuth2
|
|
25
|
+
// inject it. All provide both identity families.
|
|
26
|
+
const isSubWorkflowTrigger = nodeType === EXECUTE_WORKFLOW_TRIGGER_NODE_TYPE;
|
|
27
|
+
const isChatHubTrigger = nodeType === CHAT_TRIGGER_NODE_TYPE && parameters?.availableInChat === true;
|
|
28
|
+
const isMcpTrigger = nodeType === MCP_TRIGGER_NODE_TYPE && parameters?.authentication === 'n8nOAuth2';
|
|
29
|
+
if (isSubWorkflowTrigger || isChatHubTrigger || isMcpTrigger) {
|
|
30
|
+
return { providesN8nIdentity: true, providesExternalIdentity: true };
|
|
31
|
+
}
|
|
32
|
+
// Manual/chat/MCP triggers run with the n8n user identity.
|
|
33
|
+
if (MANUAL_TRIGGER_NODE_TYPES.includes(nodeType)) {
|
|
34
|
+
return { providesN8nIdentity: true, providesExternalIdentity: false };
|
|
35
|
+
}
|
|
36
|
+
// Any other trigger with a context establishment hook provides an external identity.
|
|
37
|
+
if (hasContextEstablishmentHook(parameters)) {
|
|
38
|
+
return { providesN8nIdentity: false, providesExternalIdentity: true };
|
|
39
|
+
}
|
|
40
|
+
return NO_IDENTITY;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=trigger-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigger-identity.js","sourceRoot":"","sources":["../../src/trigger-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,sBAAsB,EACtB,kCAAkC,EAClC,yBAAyB,EACzB,qBAAqB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,4CAA4C,EAAE,MAAM,yCAAyC,CAAC;AAgBvG,MAAM,WAAW,GAAgC;IAChD,mBAAmB,EAAE,KAAK;IAC1B,wBAAwB,EAAE,KAAK;CAC/B,CAAC;AAEF,sFAAsF;AACtF,SAAS,2BAA2B,CAAC,UAAuC;IAC3E,MAAM,UAAU,GAAG,4CAA4C,CAAC,UAAU,CAAC,CAAC;IAC5E,OAAO,CACN,UAAU,KAAK,IAAI;QACnB,UAAU,CAAC,OAAO;QAClB,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAC1D,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACtC,QAAgB,EAChB,UAAuC;IAEvC,kFAAkF;IAClF,iDAAiD;IACjD,MAAM,oBAAoB,GAAG,QAAQ,KAAK,kCAAkC,CAAC;IAC7E,MAAM,gBAAgB,GACrB,QAAQ,KAAK,sBAAsB,IAAI,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7E,MAAM,YAAY,GACjB,QAAQ,KAAK,qBAAqB,IAAI,UAAU,EAAE,cAAc,KAAK,WAAW,CAAC;IAClF,IAAI,oBAAoB,IAAI,gBAAgB,IAAI,YAAY,EAAE,CAAC;QAC9D,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC;IACtE,CAAC;IAED,2DAA2D;IAC3D,IAAI,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,CAAC;IACvE,CAAC;IAED,qFAAqF;IACrF,IAAI,2BAA2B,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC"}
|