@aws-cdk/aws-bedrock-agentcore-alpha 2.250.0-alpha.0 → 2.252.0-alpha.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.
Files changed (56) hide show
  1. package/.jsii +11883 -7285
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +4 -0
  4. package/README.md +405 -0
  5. package/lib/gateway/gateway-base.js +1 -1
  6. package/lib/gateway/gateway.d.ts +58 -0
  7. package/lib/gateway/gateway.js +46 -3
  8. package/lib/gateway/inbound-auth/authorizer.d.ts +27 -1
  9. package/lib/gateway/inbound-auth/authorizer.js +37 -5
  10. package/lib/gateway/inbound-auth/custom-claim.js +1 -1
  11. package/lib/gateway/interceptor.js +1 -1
  12. package/lib/gateway/outbound-auth/api-key.js +1 -1
  13. package/lib/gateway/outbound-auth/credential-provider.js +1 -1
  14. package/lib/gateway/protocol.js +2 -2
  15. package/lib/gateway/targets/schema/api-schema.js +4 -4
  16. package/lib/gateway/targets/schema/tool-schema.js +4 -4
  17. package/lib/gateway/targets/target-base.js +1 -1
  18. package/lib/gateway/targets/target-configuration.js +6 -6
  19. package/lib/gateway/targets/target.js +1 -1
  20. package/lib/index.d.ts +8 -0
  21. package/lib/index.js +13 -1
  22. package/lib/memory/memory-strategy.js +1 -1
  23. package/lib/memory/memory.js +2 -2
  24. package/lib/memory/strategies/managed-strategy.js +1 -1
  25. package/lib/memory/strategies/self-managed-strategy.js +1 -1
  26. package/lib/network/network-configuration.js +4 -4
  27. package/lib/policy/perms.d.ts +50 -0
  28. package/lib/policy/perms.js +62 -0
  29. package/lib/policy/policy-base.d.ts +194 -0
  30. package/lib/policy/policy-base.js +120 -0
  31. package/lib/policy/policy-engine-base.d.ts +260 -0
  32. package/lib/policy/policy-engine-base.js +193 -0
  33. package/lib/policy/policy-engine.d.ts +150 -0
  34. package/lib/policy/policy-engine.js +290 -0
  35. package/lib/policy/policy-statement.d.ts +518 -0
  36. package/lib/policy/policy-statement.js +927 -0
  37. package/lib/policy/policy-types.d.ts +66 -0
  38. package/lib/policy/policy-types.js +30 -0
  39. package/lib/policy/policy.d.ts +127 -0
  40. package/lib/policy/policy.js +225 -0
  41. package/lib/policy/validation-helpers.d.ts +139 -0
  42. package/lib/policy/validation-helpers.js +276 -0
  43. package/lib/runtime/inbound-auth/custom-claim.js +1 -1
  44. package/lib/runtime/inbound-auth/runtime-authorizer-configuration.js +1 -1
  45. package/lib/runtime/observability.d.ts +105 -0
  46. package/lib/runtime/observability.js +317 -0
  47. package/lib/runtime/runtime-artifact.js +1 -1
  48. package/lib/runtime/runtime-base.js +1 -1
  49. package/lib/runtime/runtime-endpoint-base.js +1 -1
  50. package/lib/runtime/runtime-endpoint.js +1 -1
  51. package/lib/runtime/runtime.d.ts +17 -0
  52. package/lib/runtime/runtime.js +10 -2
  53. package/lib/tools/browser.js +2 -2
  54. package/lib/tools/code-interpreter.js +2 -2
  55. package/package.json +9 -9
  56. package/rosetta/default.ts-fixture +2 -0
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
3
+ var useValue = arguments.length > 2;
4
+ for (var i = 0; i < initializers.length; i++) {
5
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
6
+ }
7
+ return useValue ? value : void 0;
8
+ };
9
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
10
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
11
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
12
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
13
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
14
+ var _, done = false;
15
+ for (var i = decorators.length - 1; i >= 0; i--) {
16
+ var context = {};
17
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
18
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
19
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
20
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
21
+ if (kind === "accessor") {
22
+ if (result === void 0) continue;
23
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
24
+ if (_ = accept(result.get)) descriptor.get = _;
25
+ if (_ = accept(result.set)) descriptor.set = _;
26
+ if (_ = accept(result.init)) initializers.unshift(_);
27
+ }
28
+ else if (_ = accept(result)) {
29
+ if (kind === "field") initializers.unshift(_);
30
+ else descriptor[key] = _;
31
+ }
32
+ }
33
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
34
+ done = true;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.PolicyEngine = void 0;
38
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ /**
41
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
42
+ *
43
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
44
+ * with the License. A copy of the License is located at
45
+ *
46
+ * http://www.apache.org/licenses/LICENSE-2.0
47
+ *
48
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
49
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
50
+ * and limitations under the License.
51
+ */
52
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
53
+ const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
54
+ const iam = require("aws-cdk-lib/aws-iam");
55
+ const kms = require("aws-cdk-lib/aws-kms");
56
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
57
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
58
+ // Internal imports
59
+ const policy_1 = require("./policy");
60
+ const policy_engine_base_1 = require("./policy-engine-base");
61
+ const validation_helpers_1 = require("./validation-helpers");
62
+ /**
63
+ * Container that manages Cedar authorization policies associated with gateways.
64
+ * PolicyEngine enables deterministic authorization control for Bedrock agents,
65
+ * allowing fine-grained access control to tools and actions via Cedar policy language.
66
+ *
67
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/policy-engine.html
68
+ * @resource AWS::BedrockAgentCore::PolicyEngine
69
+ */
70
+ let PolicyEngine = (() => {
71
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
72
+ let _classDescriptor;
73
+ let _classExtraInitializers = [];
74
+ let _classThis;
75
+ let _classSuper = policy_engine_base_1.PolicyEngineBase;
76
+ let _instanceExtraInitializers = [];
77
+ let _addPolicy_decorators;
78
+ var PolicyEngine = class extends _classSuper {
79
+ static { _classThis = this; }
80
+ static {
81
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
82
+ _addPolicy_decorators = [(0, metadata_resource_1.MethodMetadata)()];
83
+ __esDecorate(this, null, _addPolicy_decorators, { kind: "method", name: "addPolicy", static: false, private: false, access: { has: obj => "addPolicy" in obj, get: obj => obj.addPolicy }, metadata: _metadata }, null, _instanceExtraInitializers);
84
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
85
+ PolicyEngine = _classThis = _classDescriptor.value;
86
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
87
+ }
88
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.PolicyEngine", version: "2.252.0-alpha.0" };
89
+ /** Uniquely identifies this class. */
90
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.PolicyEngine';
91
+ /**
92
+ * Creates a PolicyEngine reference from an existing policy engine's attributes.
93
+ *
94
+ * @param scope - The construct scope
95
+ * @param id - Identifier of the construct
96
+ * @param attrs - Attributes of the existing policy engine
97
+ * @returns An IPolicyEngine reference to the existing policy engine
98
+ */
99
+ static fromPolicyEngineAttributes(scope, id, attrs) {
100
+ try {
101
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_PolicyEngineAttributes(attrs);
102
+ }
103
+ catch (error) {
104
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
105
+ Error.captureStackTrace(error, this.fromPolicyEngineAttributes);
106
+ }
107
+ throw error;
108
+ }
109
+ class Import extends policy_engine_base_1.PolicyEngineBase {
110
+ policyEngineArn = attrs.policyEngineArn;
111
+ policyEngineId = aws_cdk_lib_1.Arn.split(attrs.policyEngineArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
112
+ policyEngineName = this.policyEngineId;
113
+ description = undefined;
114
+ kmsKey = attrs.kmsKeyArn
115
+ ? kms.Key.fromKeyArn(scope, `${id}Key`, attrs.kmsKeyArn)
116
+ : undefined;
117
+ grantPrincipal = new iam.UnknownPrincipal({ resource: this });
118
+ constructor(s, i) {
119
+ super(s, i);
120
+ }
121
+ }
122
+ return new Import(scope, id);
123
+ }
124
+ // ------------------------------------------------------
125
+ // Attributes
126
+ // ------------------------------------------------------
127
+ /**
128
+ * The ARN of the policy engine resource.
129
+ * @attribute
130
+ */
131
+ policyEngineArn = __runInitializers(this, _instanceExtraInitializers);
132
+ /**
133
+ * The name of the policy engine.
134
+ *
135
+ * [disable-awslint:attribute-tag]
136
+ */
137
+ policyEngineName;
138
+ /**
139
+ * The ID of the policy engine.
140
+ * @attribute
141
+ */
142
+ policyEngineId;
143
+ /**
144
+ * The description of the policy engine.
145
+ */
146
+ description;
147
+ /**
148
+ * Tags applied to this policy engine resource.
149
+ * @default - No tags applied
150
+ */
151
+ tags;
152
+ /**
153
+ * The principal to grant permissions to.
154
+ */
155
+ grantPrincipal;
156
+ /**
157
+ * The KMS key used to encrypt the policy engine.
158
+ */
159
+ kmsKey;
160
+ /**
161
+ * List of policies added to this policy engine via addPolicy().
162
+ * @internal
163
+ */
164
+ _policies = [];
165
+ /**
166
+ * The last policy added to this engine, used for automatic sequential chaining.
167
+ * @internal
168
+ */
169
+ _lastPolicy;
170
+ /**
171
+ * Get the list of policies added to this policy engine.
172
+ *
173
+ * Returns an array of Policy constructs that were added using addPolicy().
174
+ * This allows you to iterate over all policies associated with this engine.
175
+ *
176
+ * @returns A copy of the policies array
177
+ */
178
+ get policies() {
179
+ return [...this._policies];
180
+ }
181
+ __resource;
182
+ // ------------------------------------------------------
183
+ // CONSTRUCTOR
184
+ // ------------------------------------------------------
185
+ constructor(scope, id, props = {}) {
186
+ super(scope, id, {
187
+ // Maximum name length of 48 characters
188
+ physicalName: props?.policyEngineName ??
189
+ aws_cdk_lib_1.Lazy.string({
190
+ produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 48 }),
191
+ }),
192
+ });
193
+ try {
194
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_PolicyEngineProps(props);
195
+ }
196
+ catch (error) {
197
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
198
+ Error.captureStackTrace(error, PolicyEngine);
199
+ }
200
+ throw error;
201
+ }
202
+ // Enhanced CDK Analytics Telemetry
203
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
204
+ // ------------------------------------------------------
205
+ // Set properties and defaults
206
+ // ------------------------------------------------------
207
+ this.policyEngineName = this.physicalName;
208
+ this.description = props.description;
209
+ this.kmsKey = props.kmsKey;
210
+ this.tags = props.tags;
211
+ this.grantPrincipal = new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com');
212
+ // ------------------------------------------------------
213
+ // Validations
214
+ // ------------------------------------------------------
215
+ (0, validation_helpers_1.throwIfInvalidPolicyEngineName)(this.policyEngineName, this);
216
+ if (this.description) {
217
+ (0, validation_helpers_1.throwIfInvalidDescription)(this.description, this);
218
+ }
219
+ if (this.tags) {
220
+ (0, validation_helpers_1.throwIfInvalidTags)(this.tags, this.policyEngineName, this);
221
+ }
222
+ // ------------------------------------------------------
223
+ // CFN Props
224
+ // ------------------------------------------------------
225
+ const cfnProps = {
226
+ name: this.policyEngineName,
227
+ description: this.description,
228
+ encryptionKeyArn: this.kmsKey?.keyArn,
229
+ tags: this.tags
230
+ ? Object.entries(this.tags).map(([key, value]) => ({
231
+ key,
232
+ value,
233
+ }))
234
+ : undefined,
235
+ };
236
+ this.__resource = new aws_bedrockagentcore_1.CfnPolicyEngine(this, 'Resource', cfnProps);
237
+ this.policyEngineId = this.__resource.attrPolicyEngineId;
238
+ this.policyEngineArn = this.__resource.attrPolicyEngineArn;
239
+ }
240
+ /**
241
+ * Add a policy to this policy engine.
242
+ * Convenience method that creates a Policy construct with this engine as the parent.
243
+ *
244
+ * **Automatic Sequential Chaining**: By default, policies are automatically chained
245
+ * sequentially to prevent concurrent creation issues with the AWS Bedrock AgentCore
246
+ * service. Each new policy will depend on the previous policy added to this engine.
247
+ *
248
+ * This ensures policies are created one at a time, avoiding "Resource stabilization
249
+ * failed" errors that occur with concurrent policy operations.
250
+ *
251
+ * @param id - Unique identifier for the policy construct
252
+ * @param options - Options for creating the policy
253
+ * @returns The created Policy construct
254
+ *
255
+ */
256
+ addPolicy(id, options) {
257
+ try {
258
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_AddPolicyOptions(options);
259
+ }
260
+ catch (error) {
261
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
262
+ Error.captureStackTrace(error, this.addPolicy);
263
+ }
264
+ throw error;
265
+ }
266
+ const policy = new policy_1.Policy(this, id, {
267
+ policyEngine: this,
268
+ policyName: options.policyName,
269
+ definition: options.definition,
270
+ statement: options.statement,
271
+ description: options.description,
272
+ validationMode: options.validationMode,
273
+ });
274
+ // Automatically chain to previous policy if exists
275
+ // This prevents concurrent policy creation which causes service-level failures
276
+ if (this._lastPolicy) {
277
+ policy.node.addDependency(this._lastPolicy);
278
+ }
279
+ this._policies.push(policy);
280
+ this._lastPolicy = policy; // Track for next policy
281
+ return policy;
282
+ }
283
+ static {
284
+ __runInitializers(_classThis, _classExtraInitializers);
285
+ }
286
+ };
287
+ return PolicyEngine = _classThis;
288
+ })();
289
+ exports.PolicyEngine = PolicyEngine;
290
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBvbGljeS1lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCw2Q0FBMEQ7QUFFMUQsMkVBQW1FO0FBQ25FLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MsOEVBQThGO0FBQzlGLDBFQUEwRTtBQUUxRSxtQkFBbUI7QUFDbkIscUNBQWtDO0FBQ2xDLDZEQUF3RDtBQUd4RCw2REFBcUg7QUF5Q3JIOzs7Ozs7O0dBT0c7SUFFVSxZQUFZOzRCQUR4QixvQ0FBa0I7Ozs7c0JBQ2UscUNBQWdCOzs7NEJBQXhCLFNBQVEsV0FBZ0I7Ozs7cUNBc0wvQyxJQUFBLGtDQUFjLEdBQUU7WUFDakIsOEtBQU8sU0FBUyw2REFvQmY7WUEzTUgsNktBNE1DOzs7OztRQTNNQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLG1EQUFtRCxDQUFDO1FBRTNHOzs7Ozs7O1dBT0c7UUFDSSxNQUFNLENBQUMsMEJBQTBCLENBQ3RDLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUE2Qjs7Ozs7Ozs7OztZQUU3QixNQUFNLE1BQU8sU0FBUSxxQ0FBZ0I7Z0JBQ25CLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO2dCQUN4QyxjQUFjLEdBQUcsaUJBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSx1QkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDO2dCQUMvRixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUN2QyxXQUFXLEdBQUcsU0FBUyxDQUFDO2dCQUN4QixNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVM7b0JBQ3RDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxF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Q0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLHdCQUF3QjtZQUVuRCxPQUFPLE1BQU0sQ0FBQztTQUNmOztZQTNNVSx1REFBWTs7Ozs7QUFBWixvQ0FBWSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEFybiwgQXJuRm9ybWF0LCBMYXp5LCBOYW1lcyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgQ2ZuUG9saWN5RW5naW5lUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgeyBDZm5Qb2xpY3lFbmdpbmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbi8vIEludGVybmFsIGltcG9ydHNcbmltcG9ydCB7IFBvbGljeSB9IGZyb20gJy4vcG9saWN5JztcbmltcG9ydCB7IFBvbGljeUVuZ2luZUJhc2UgfSBmcm9tICcuL3BvbGljeS1lbmdpbmUtYmFzZSc7XG5pbXBvcnQgdHlwZSB7IElQb2xpY3lFbmdpbmUsIFBvbGljeUVuZ2luZUF0dHJpYnV0ZXMgfSBmcm9tICcuL3BvbGljeS1lbmdpbmUtYmFzZSc7XG5pbXBvcnQgdHlwZSB7IEFkZFBvbGljeU9wdGlvbnMgfSBmcm9tICcuL3BvbGljeS10eXBlcyc7XG5pbXBvcnQgeyB0aHJvd0lmSW52YWxpZFBvbGljeUVuZ2luZU5hbWUsIHRocm93SWZJbnZhbGlkRGVzY3JpcHRpb24sIHRocm93SWZJbnZhbGlkVGFncyB9IGZyb20gJy4vdmFsaWRhdGlvbi1oZWxwZXJzJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIFBvbGljeUVuZ2luZSByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGljeUVuZ2luZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKiBWYWxpZCBjaGFyYWN0ZXJzOiBhLXosIEEtWiwgMC05LCBfICh1bmRlcnNjb3JlKVxuICAgKiBNdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIsIDEtNDggY2hhcmFjdGVyc1xuICAgKiBQYXR0ZXJuOiBeW0EtWmEtel1bQS1aYS16MC05X10qJFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEF1dG8tZ2VuZXJhdGVkIHVuaXF1ZSBuYW1lXG4gICAqL1xuICByZWFkb25seSBwb2xpY3lFbmdpbmVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXNjcmlwdGlvbiBmb3IgdGhlIHBvbGljeSBlbmdpbmUuXG4gICAqIE1heGltdW0gNCwwOTYgY2hhcmFjdGVycy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBLTVMga2V5IGZvciBlbmNyeXB0aW9uLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50OnByZWZlci1yZWYtaW50ZXJmYWNlXVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEFXUyBvd25lZCBrZXlcbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBUYWdzIGZvciB0aGUgcG9saWN5IGVuZ2luZS5cbiAgICogTWF4aW11bSA1MCB0YWdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnRhaW5lciB0aGF0IG1hbmFnZXMgQ2VkYXIgYXV0aG9yaXphdGlvbiBwb2xpY2llcyBhc3NvY2lhdGVkIHdpdGggZ2F0ZXdheXMuXG4gKiBQb2xpY3lFbmdpbmUgZW5hYmxlcyBkZXRlcm1pbmlzdGljIGF1dGhvcml6YXRpb24gY29udHJvbCBmb3IgQmVkcm9jayBhZ2VudHMsXG4gKiBhbGxvd2luZyBmaW5lLWdyYWluZWQgYWNjZXNzIGNvbnRyb2wgdG8gdG9vbHMgYW5kIGFjdGlvbnMgdmlhIENlZGFyIHBvbGljeSBsYW5ndWFnZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvcG9saWN5LWVuZ2luZS5odG1sXG4gKiBAcmVzb3VyY2UgQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpQb2xpY3lFbmdpbmVcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFBvbGljeUVuZ2luZSBleHRlbmRzIFBvbGljeUVuZ2luZUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1iZWRyb2NrLWFnZW50Y29yZS1hbHBoYS5Qb2xpY3lFbmdpbmUnO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgUG9saWN5RW5naW5lIHJlZmVyZW5jZSBmcm9tIGFuIGV4aXN0aW5nIHBvbGljeSBlbmdpbmUncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCAtIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgLSBBdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBwb2xpY3kgZW5naW5lXG4gICAqIEByZXR1cm5zIEFuIElQb2xpY3lFbmdpbmUgcmVmZXJlbmNlIHRvIHRoZSBleGlzdGluZyBwb2xpY3kgZW5naW5lXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Qb2xpY3lFbmdpbmVBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogUG9saWN5RW5naW5lQXR0cmlidXRlcyxcbiAgKTogSVBvbGljeUVuZ2luZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUG9saWN5RW5naW5lQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RW5naW5lQXJuID0gYXR0cnMucG9saWN5RW5naW5lQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHBvbGljeUVuZ2luZUlkID0gQXJuLnNwbGl0KGF0dHJzLnBvbGljeUVuZ2luZUFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RW5naW5lTmFtZSA9IHRoaXMucG9saWN5RW5naW5lSWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkga21zS2V5ID0gYXR0cnMua21zS2V5QXJuXG4gICAgICAgID8ga21zLktleS5mcm9tS2V5QXJuKHNjb3BlLCBgJHtpZH1LZXlgLCBhdHRycy5rbXNLZXlBcm4pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsID0gbmV3IGlhbS5Vbmtub3duUHJpbmNpcGFsKHsgcmVzb3VyY2U6IHRoaXMgfSk7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQXR0cmlidXRlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgcG9saWN5IGVuZ2luZSByZXNvdXJjZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvbGljeUVuZ2luZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcG9saWN5IGVuZ2luZS5cbiAgICpcbiAgICogW2Rpc2FibGUtYXdzbGludDphdHRyaWJ1dGUtdGFnXVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvbGljeUVuZ2luZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcG9saWN5RW5naW5lSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWdzIGFwcGxpZWQgdG8gdGhpcyBwb2xpY3kgZW5naW5lIHJlc291cmNlLlxuICAgKiBAZGVmYXVsdCAtIE5vIHRhZ3MgYXBwbGllZFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBwb2xpY3kgZW5naW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHBvbGljaWVzIGFkZGVkIHRvIHRoaXMgcG9saWN5IGVuZ2luZSB2aWEgYWRkUG9saWN5KCkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcG9saWNpZXM6IFBvbGljeVtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBsYXN0IHBvbGljeSBhZGRlZCB0byB0aGlzIGVuZ2luZSwgdXNlZCBmb3IgYXV0b21hdGljIHNlcXVlbnRpYWwgY2hhaW5pbmcuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBfbGFzdFBvbGljeT86IFBvbGljeTtcblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIHBvbGljaWVzIGFkZGVkIHRvIHRoaXMgcG9saWN5IGVuZ2luZS5cbiAgICpcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBQb2xpY3kgY29uc3RydWN0cyB0aGF0IHdlcmUgYWRkZWQgdXNpbmcgYWRkUG9saWN5KCkuXG4gICAqIFRoaXMgYWxsb3dzIHlvdSB0byBpdGVyYXRlIG92ZXIgYWxsIHBvbGljaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVuZ2luZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBjb3B5IG9mIHRoZSBwb2xpY2llcyBhcnJheVxuICAgKi9cbiAgcHVibGljIGdldCBwb2xpY2llcygpOiBQb2xpY3lbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9wb2xpY2llc107XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9fcmVzb3VyY2U6IENmblBvbGljeUVuZ2luZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ09OU1RSVUNUT1JcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQb2xpY3lFbmdpbmVQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAvLyBNYXhpbXVtIG5hbWUgbGVuZ3RoIG9mIDQ4IGNoYXJhY3RlcnNcbiAgICAgIHBoeXNpY2FsTmFtZTpcbiAgICAgICAgcHJvcHM/LnBvbGljeUVuZ2luZU5hbWUgPz9cbiAgICAgICAgTGF6eS5zdHJpbmcoe1xuICAgICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7IG1heExlbmd0aDogNDggfSksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTZXQgcHJvcGVydGllcyBhbmQgZGVmYXVsdHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLnBvbGljeUVuZ2luZU5hbWUgPSB0aGlzLnBoeXNpY2FsTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5rbXNLZXkgPSBwcm9wcy5rbXNLZXk7XG4gICAgdGhpcy50YWdzID0gcHJvcHMudGFncztcblxuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIFZhbGlkYXRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICB0aHJvd0lmSW52YWxpZFBvbGljeUVuZ2luZU5hbWUodGhpcy5wb2xpY3lFbmdpbmVOYW1lLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvd0lmSW52YWxpZERlc2NyaXB0aW9uKHRoaXMuZGVzY3JpcHRpb24sIHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhZ3MpIHtcbiAgICAgIHRocm93SWZJbnZhbGlkVGFncyh0aGlzLnRhZ3MsIHRoaXMucG9saWN5RW5naW5lTmFtZSwgdGhpcyk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ0ZOIFByb3BzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3QgY2ZuUHJvcHM6IENmblBvbGljeUVuZ2luZVByb3BzID0ge1xuICAgICAgbmFtZTogdGhpcy5wb2xpY3lFbmdpbmVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBlbmNyeXB0aW9uS2V5QXJuOiB0aGlzLmttc0tleT8ua2V5QXJuLFxuICAgICAgdGFnczogdGhpcy50YWdzXG4gICAgICAgID8gT2JqZWN0LmVudHJpZXModGhpcy50YWdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgdGhpcy5fX3Jlc291cmNlID0gbmV3IENmblBvbGljeUVuZ2luZSh0aGlzLCAnUmVzb3VyY2UnLCBjZm5Qcm9wcyk7XG5cbiAgICB0aGlzLnBvbGljeUVuZ2luZUlkID0gdGhpcy5fX3Jlc291cmNlLmF0dHJQb2xpY3lFbmdpbmVJZDtcbiAgICB0aGlzLnBvbGljeUVuZ2luZUFybiA9IHRoaXMuX19yZXNvdXJjZS5hdHRyUG9saWN5RW5naW5lQXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHBvbGljeSB0byB0aGlzIHBvbGljeSBlbmdpbmUuXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBQb2xpY3kgY29uc3RydWN0IHdpdGggdGhpcyBlbmdpbmUgYXMgdGhlIHBhcmVudC5cbiAgICpcbiAgICogKipBdXRvbWF0aWMgU2VxdWVudGlhbCBDaGFpbmluZyoqOiBCeSBkZWZhdWx0LCBwb2xpY2llcyBhcmUgYXV0b21hdGljYWxseSBjaGFpbmVkXG4gICAqIHNlcXVlbnRpYWxseSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgY3JlYXRpb24gaXNzdWVzIHdpdGggdGhlIEFXUyBCZWRyb2NrIEFnZW50Q29yZVxuICAgKiBzZXJ2aWNlLiBFYWNoIG5ldyBwb2xpY3kgd2lsbCBkZXBlbmQgb24gdGhlIHByZXZpb3VzIHBvbGljeSBhZGRlZCB0byB0aGlzIGVuZ2luZS5cbiAgICpcbiAgICogVGhpcyBlbnN1cmVzIHBvbGljaWVzIGFyZSBjcmVhdGVkIG9uZSBhdCBhIHRpbWUsIGF2b2lkaW5nIFwiUmVzb3VyY2Ugc3RhYmlsaXphdGlvblxuICAgKiBmYWlsZWRcIiBlcnJvcnMgdGhhdCBvY2N1ciB3aXRoIGNvbmN1cnJlbnQgcG9saWN5IG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcG9saWN5IGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBwb2xpY3lcbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgUG9saWN5IGNvbnN0cnVjdFxuICAgKlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZFBvbGljeShpZDogc3RyaW5nLCBvcHRpb25zOiBBZGRQb2xpY3lPcHRpb25zKTogUG9saWN5IHtcbiAgICBjb25zdCBwb2xpY3kgPSBuZXcgUG9saWN5KHRoaXMsIGlkLCB7XG4gICAgICBwb2xpY3lFbmdpbmU6IHRoaXMsXG4gICAgICBwb2xpY3lOYW1lOiBvcHRpb25zLnBvbGljeU5hbWUsXG4gICAgICBkZWZpbml0aW9uOiBvcHRpb25zLmRlZmluaXRpb24sXG4gICAgICBzdGF0ZW1lbnQ6IG9wdGlvbnMuc3RhdGVtZW50LFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2YWxpZGF0aW9uTW9kZTogb3B0aW9ucy52YWxpZGF0aW9uTW9kZSxcbiAgICB9KTtcblxuICAgIC8vIEF1dG9tYXRpY2FsbHkgY2hhaW4gdG8gcHJldmlvdXMgcG9saWN5IGlmIGV4aXN0c1xuICAgIC8vIFRoaXMgcHJldmVudHMgY29uY3VycmVudCBwb2xpY3kgY3JlYXRpb24gd2hpY2ggY2F1c2VzIHNlcnZpY2UtbGV2ZWwgZmFpbHVyZXNcbiAgICBpZiAodGhpcy5fbGFzdFBvbGljeSkge1xuICAgICAgcG9saWN5Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLl9sYXN0UG9saWN5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9wb2xpY2llcy5wdXNoKHBvbGljeSk7XG4gICAgdGhpcy5fbGFzdFBvbGljeSA9IHBvbGljeTsgLy8gVHJhY2sgZm9yIG5leHQgcG9saWN5XG5cbiAgICByZXR1cm4gcG9saWN5O1xuICB9XG59XG5cbiJdfQ==