@ashishpandeyone/cdk-lambda-web-function 0.1.7 → 0.1.9

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.
@@ -6,7 +6,7 @@ import type { WebFunctionEndpoint } from './web-function-endpoint';
6
6
  */
7
7
  export declare class WebFunctionGrants {
8
8
  private readonly endpointArns;
9
- private readonly webFunction?;
9
+ private readonly webFunction;
10
10
  /**
11
11
  * @internal
12
12
  */
@@ -16,7 +16,7 @@ export declare class WebFunctionGrants {
16
16
  *
17
17
  * @internal
18
18
  */
19
- static _forEndpointArns(endpointArns: string[]): WebFunctionGrants;
19
+ static _forEndpointArns(endpointArns: string[], webFunction: IWebFunction): WebFunctionGrants;
20
20
  private constructor();
21
21
  /**
22
22
  * Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
@@ -25,7 +25,7 @@ export declare class WebFunctionGrants {
25
25
  * endpoint serves from, including a MULTI_REGION global URL.
26
26
  *
27
27
  * A grantee in the function's account gets an IAM policy statement. Another account or an AWS service also gets
28
- * a statement in the function's resource policy (not for an imported function's endpoints).
28
+ * a statement in the function's resource policy.
29
29
  */
30
30
  invoke(grantee: iam.IGrantable): iam.Grant;
31
31
  }
@@ -42,7 +42,7 @@ const iam = __importStar(require("aws-cdk-lib/aws-iam"));
42
42
  class WebFunctionGrants {
43
43
  endpointArns;
44
44
  webFunction;
45
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.7" };
45
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.9" };
46
46
  /**
47
47
  * @internal
48
48
  */
@@ -54,8 +54,8 @@ class WebFunctionGrants {
54
54
  *
55
55
  * @internal
56
56
  */
57
- static _forEndpointArns(endpointArns) {
58
- return new WebFunctionGrants(() => endpointArns);
57
+ static _forEndpointArns(endpointArns, webFunction) {
58
+ return new WebFunctionGrants(() => endpointArns, webFunction);
59
59
  }
60
60
  constructor(endpointArns, webFunction) {
61
61
  this.endpointArns = endpointArns;
@@ -68,14 +68,13 @@ class WebFunctionGrants {
68
68
  * endpoint serves from, including a MULTI_REGION global URL.
69
69
  *
70
70
  * A grantee in the function's account gets an IAM policy statement. Another account or an AWS service also gets
71
- * a statement in the function's resource policy (not for an imported function's endpoints).
71
+ * a statement in the function's resource policy.
72
72
  */
73
73
  invoke(grantee) {
74
- const options = { grantee, actions: ['lambda:InvokeWebFunctionEndpoint'], resourceArns: this.endpointArns() };
75
- return this.webFunction
76
- ? iam.Grant.addToPrincipalOrResource({ ...options, resource: this.webFunction })
77
- : iam.Grant.addToPrincipal(options);
74
+ return iam.Grant.addToPrincipalOrResource({
75
+ grantee, actions: ['lambda:InvokeWebFunctionEndpoint'], resourceArns: this.endpointArns(), resource: this.webFunction,
76
+ });
78
77
  }
79
78
  }
80
79
  exports.WebFunctionGrants = WebFunctionGrants;
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFJM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQWlCUztJQUErQzs7SUFoQnBGOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUE2QixFQUFFLFdBQXlCO1FBQ2pGLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFzQjtRQUNuRCxPQUFPLElBQUksaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELFlBQXFDLFlBQTRCLEVBQW1CLFdBQTBCO1FBQXpFLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUFtQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtJQUFHLENBQUM7SUFFbEg7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsTUFBTSxPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFDOUcsT0FBTyxJQUFJLENBQUMsV0FBVztZQUNyQixDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEYsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7O0FBakNILDhDQWtDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24pOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBbZW5kcG9pbnQuZW5kcG9pbnRBcm5dLCB3ZWJGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIG9uIGVuZHBvaW50cyBrbm93biBvbmx5IGJ5IEFSTiAoYW4gaW1wb3J0ZWQgZnVuY3Rpb24ncykuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnRBcm5zKGVuZHBvaW50QXJuczogc3RyaW5nW10pOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBlbmRwb2ludEFybnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50QXJuczogKCkgPT4gc3RyaW5nW10sIHByaXZhdGUgcmVhZG9ubHkgd2ViRnVuY3Rpb24/OiBJV2ViRnVuY3Rpb24pIHt9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApLlxuICAgKlxuICAgKiBUaGUgZ3JhbnQgaXMgb24gdGhlIGVuZHBvaW50J3MgaG9tZS1yZWdpb24gQVJOLCB3aGljaCBJQU0gZXZhbHVhdGVzIGZvciBldmVyeSByZWdpb24gdGhlXG4gICAqIGVuZHBvaW50IHNlcnZlcyBmcm9tLCBpbmNsdWRpbmcgYSBNVUxUSV9SRUdJT04gZ2xvYmFsIFVSTC5cbiAgICpcbiAgICogQSBncmFudGVlIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgZ2V0cyBhbiBJQU0gcG9saWN5IHN0YXRlbWVudC4gQW5vdGhlciBhY2NvdW50IG9yIGFuIEFXUyBzZXJ2aWNlIGFsc28gZ2V0c1xuICAgKiBhIHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kgKG5vdCBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24ncyBlbmRwb2ludHMpLlxuICAgKi9cbiAgcHVibGljIGludm9rZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgZ3JhbnRlZSwgYWN0aW9uczogWydsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludCddLCByZXNvdXJjZUFybnM6IHRoaXMuZW5kcG9pbnRBcm5zKCkgfTtcbiAgICByZXR1cm4gdGhpcy53ZWJGdW5jdGlvblxuICAgICAgPyBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHsgLi4ub3B0aW9ucywgcmVzb3VyY2U6IHRoaXMud2ViRnVuY3Rpb24gfSlcbiAgICAgIDogaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKG9wdGlvbnMpO1xuICB9XG59XG4iXX0=
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFJM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQWlCUztJQUErQzs7SUFoQnBGOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUE2QixFQUFFLFdBQXlCO1FBQ2pGLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFzQixFQUFFLFdBQXlCO1FBQzlFLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELFlBQXFDLFlBQTRCLEVBQW1CLFdBQXlCO1FBQXhFLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQUFtQixnQkFBVyxHQUFYLFdBQVcsQ0FBYztJQUFHLENBQUM7SUFFakg7Ozs7Ozs7O09BUUc7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDO1lBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQ3RILENBQUMsQ0FBQztJQUNMLENBQUM7O0FBaENILDhDQWlDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24pOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBbZW5kcG9pbnQuZW5kcG9pbnRBcm5dLCB3ZWJGdW5jdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIG9uIGVuZHBvaW50cyBrbm93biBvbmx5IGJ5IEFSTiAoYW4gaW1wb3J0ZWQgZnVuY3Rpb24ncykuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnRBcm5zKGVuZHBvaW50QXJuczogc3RyaW5nW10sIHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24pOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cygoKSA9PiBlbmRwb2ludEFybnMsIHdlYkZ1bmN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbmRwb2ludEFybnM6ICgpID0+IHN0cmluZ1tdLCBwcml2YXRlIHJlYWRvbmx5IHdlYkZ1bmN0aW9uOiBJV2ViRnVuY3Rpb24pIHt9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApLlxuICAgKlxuICAgKiBUaGUgZ3JhbnQgaXMgb24gdGhlIGVuZHBvaW50J3MgaG9tZS1yZWdpb24gQVJOLCB3aGljaCBJQU0gZXZhbHVhdGVzIGZvciBldmVyeSByZWdpb24gdGhlXG4gICAqIGVuZHBvaW50IHNlcnZlcyBmcm9tLCBpbmNsdWRpbmcgYSBNVUxUSV9SRUdJT04gZ2xvYmFsIFVSTC5cbiAgICpcbiAgICogQSBncmFudGVlIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQgZ2V0cyBhbiBJQU0gcG9saWN5IHN0YXRlbWVudC4gQW5vdGhlciBhY2NvdW50IG9yIGFuIEFXUyBzZXJ2aWNlIGFsc28gZ2V0c1xuICAgKiBhIHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24ncyByZXNvdXJjZSBwb2xpY3kuXG4gICAqL1xuICBwdWJsaWMgaW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICBncmFudGVlLCBhY3Rpb25zOiBbJ2xhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50J10sIHJlc291cmNlQXJuczogdGhpcy5lbmRwb2ludEFybnMoKSwgcmVzb3VyY2U6IHRoaXMud2ViRnVuY3Rpb24sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -57,7 +57,7 @@ export declare class WebFunctionOrigin extends cloudfront.OriginBase {
57
57
  * (`always-amz-auth`, which keeps the viewer's `Authorization` header for your application), and the function's
58
58
  * resource policy allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only.
59
59
  *
60
- * The distribution must be in the function's stack.
60
+ * The distribution can be in another stack than the function, in the same account.
61
61
  */
62
62
  static withOriginAccessControl(endpoint: WebFunctionEndpoint, props?: WebFunctionOriginWithOacProps): cloudfront.IOrigin;
63
63
  private readonly props;
@@ -54,13 +54,13 @@ const OPT_IN_REGIONS = [
54
54
  * and only your distribution may call the endpoint. `new WebFunctionOrigin(endpoint)` is for a public (`NONE`) endpoint.
55
55
  */
56
56
  class WebFunctionOrigin extends cloudfront.OriginBase {
57
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionOrigin", version: "0.1.7" };
57
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionOrigin", version: "0.1.9" };
58
58
  /**
59
59
  * An origin for an `AWS_IAM` endpoint, with origin access control: CloudFront signs every request to the endpoint
60
60
  * (`always-amz-auth`, which keeps the viewer's `Authorization` header for your application), and the function's
61
61
  * resource policy allows `cloudfront.amazonaws.com` to call this endpoint on behalf of this distribution only.
62
62
  *
63
- * The distribution must be in the function's stack.
63
+ * The distribution can be in another stack than the function, in the same account.
64
64
  */
65
65
  static withOriginAccessControl(endpoint, props = {}) {
66
66
  if (endpoint.authType !== enums_1.WebFunctionAuthType.AWS_IAM) {
@@ -107,15 +107,13 @@ class WebFunctionOriginWithOac extends cloudfront.OriginBase {
107
107
  bind(scope, options) {
108
108
  const config = super.bind(scope, options);
109
109
  const stack = aws_cdk_lib_1.Stack.of(scope);
110
- if (stack !== aws_cdk_lib_1.Stack.of(this.endpoint)) {
111
- // The resource policy names the distribution, and the distribution names the endpoint: a reference cycle.
112
- throw new Error(`${scope.node.path}: a distribution with a WebFunctionOrigin must be in the function's stack (${aws_cdk_lib_1.Stack.of(this.endpoint).stackName})`);
113
- }
114
110
  if (options.distributionId === undefined) {
115
111
  throw new Error(`${scope.node.path}: a WebFunctionOrigin with origin access control must be used by a cloudfront.Distribution (its ID scopes the resource policy)`);
116
112
  }
117
113
  const oac = this.props.originAccessControl ?? this.sharedOriginAccessControl(stack);
118
- const result = this.endpoint.webFunction.addToResourcePolicy(new iam.PolicyStatement({
114
+ // Written from the distribution's stack: the statement names the distribution, which names the endpoint, so a
115
+ // statement in the function's stack would make a reference cycle when the distribution is in another stack.
116
+ const result = this.endpoint.webFunction._addToResourcePolicyFrom(scope, new iam.PolicyStatement({
119
117
  principals: [new iam.ServicePrincipal('cloudfront.amazonaws.com')],
120
118
  actions: ['lambda:InvokeWebFunctionEndpoint'],
121
119
  resources: [this.endpoint.endpointArn],
@@ -126,7 +124,7 @@ class WebFunctionOriginWithOac extends cloudfront.OriginBase {
126
124
  },
127
125
  }));
128
126
  if (!result.statementAdded) {
129
- throw new Error(`${scope.node.path}: could not add CloudFront to the resource policy of ${this.endpoint.webFunction.node.path}`);
127
+ throw new Error(`${scope.node.path}: could not add CloudFront to the resource policy of ${this.endpoint.webFunction.node.path} (the distribution must be in the function's account)`);
130
128
  }
131
129
  return { ...config, originProperty: { ...config.originProperty, originAccessControlId: oac.originAccessControlRef.originAccessControlId } };
132
130
  }
@@ -198,4 +196,4 @@ function customOriginConfig(props) {
198
196
  ipAddressType: props.ipAddressType,
199
197
  };
200
198
  }
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLW9yaWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tb3JpZ2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBa0U7QUFDbEUsdUVBQXlEO0FBQ3pELHlEQUEyQztBQUUzQyxtQ0FBdUU7QUFHdkU7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUc7SUFDckIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtJQUM1SCxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsY0FBYztDQUN4SSxDQUFDO0FBbURGOzs7OztHQUtHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxVQUFVLENBQUMsVUFBVTs7SUFDMUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLHVCQUF1QixDQUFDLFFBQTZCLEVBQUUsUUFBdUMsRUFBRTtRQUM1RyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssMkJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxrRUFBa0UsUUFBUSxDQUFDLFFBQVEsMkVBQTJFLENBQUMsQ0FBQztRQUN2TSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLCtCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFD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QUUsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFVBQVU7UUFDaEUsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQztRQUN6RCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRTtRQUNqRCxzQkFBc0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFO1FBQzNELGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uLCBMYXp5LCBOYW1lcywgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSwgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB0eXBlIHsgV2ViRnVuY3Rpb25FbmRwb2ludCB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcblxuLyoqXG4gKiBSZWdpb25zIHRoYXQgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuIENsb3VkRnJvbnQgY2FuJ3Qgc2lnbiBhIHJlcXVlc3QgdGhhdCBhIE1VTFRJX1JFR0lPTiBlbmRwb2ludCByb3V0ZXNcbiAqIHRvIG9uZSBvZiB0aGVtLCBzbyB0aGUgb3JpZ2luIHJldHVybnMgNDAzIChDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSwgTGFtYmRhIFdlYiBGdW5jdGlvbiBvcmlnaW5zLCAyMDI2LTEwKS5cbiAqL1xuY29uc3QgT1BUX0lOX1JFR0lPTlMgPSBbXG4gICdhZi1zb3V0aC0xJywgJ2FwLWVhc3QtMScsICdhcC1lYXN0LTInLCAnYXAtc291dGgtMicsICdhcC1zb3V0aGVhc3QtMycsICdhcC1zb3V0aGVhc3QtNCcsICdhcC1zb3V0aGVhc3QtNScsICdhcC1zb3V0aGVhc3QtNicsXG4gICdhcC1zb3V0aGVhc3QtNycsICdjYS13ZXN0LTEnLCAnZXUtY2VudHJhbC0yJywgJ2V1LXNvdXRoLTEnLCAnZXUtc291dGgtMicsICdpbC1jZW50cmFsLTEnLCAnbWUtY2VudHJhbC0xJywgJ21lLXNvdXRoLTEnLCAnbXgtY2VudHJhbC0xJyxcbl07XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBXZWIgRnVuY3Rpb24gZW5kcG9pbnQgb3JpZ2luLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uT3JpZ2luUHJvcHMgZXh0ZW5kcyBjbG91ZGZyb250Lk9yaWdpblByb3BzIHtcbiAgLyoqXG4gICAqIEZvciBhIGBQRVJfUkVHSU9OYCBlbmRwb2ludDogdGhlIHJlZ2lvbiB3aG9zZSBVUkwgQ2xvdWRGcm9udCBjYWxscy4gT25seSBvbmUgcmVnaW9uIHBlciBvcmlnaW47IHVzZSBhbiBvcmlnaW5cbiAgICogZ3JvdXAgb3Igb25lIG9yaWdpbiBwZXIgYmVoYXZpb3IgZm9yIG1vcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGVuZHBvaW50J3MgaG9tZSByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgQ2xvdWRGcm9udCB3YWl0cyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBvcmlnaW4uIEFib3ZlIDEyMCBzZWNvbmRzIG5lZWRzIGEgQ2xvdWRGcm9udCBxdW90YSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHJlYWRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIENsb3VkRnJvbnQga2VlcHMgaXRzIGNvbm5lY3Rpb24gdG8gdGhlIG9yaWdpbiBvcGVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDUpXG4gICAqL1xuICByZWFkb25seSBrZWVwYWxpdmVUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFdoaWNoIElQIHByb3RvY29sIENsb3VkRnJvbnQgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IE9yaWdpbklwQWRkcmVzc1R5cGUuSVBWNFxuICAgKi9cbiAgcmVhZG9ubHkgaXBBZGRyZXNzVHlwZT86IGNsb3VkZnJvbnQuT3JpZ2luSXBBZGRyZXNzVHlwZTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludCBvcmlnaW4gd2l0aCBvcmlnaW4gYWNjZXNzIGNvbnRyb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViRnVuY3Rpb25PcmlnaW5XaXRoT2FjUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9yaWdpblByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gYWNjZXNzIGNvbnRyb2wuIEl0IG11c3QgaGF2ZSBvcmlnaW4gdHlwZSBgbGFtYmRhYCwgc2lnbmluZyBiZWhhdmlvciBgYWx3YXlzLWFtei1hdXRoYCwgYW5kIHNpZ25pbmdcbiAgICogcHJvdG9jb2wgYHNpZ3Y0YCAoYSByZWdpb25hbCBlbmRwb2ludCkgb3IgYHNpZ3Y0YWAgKGEgYE1VTFRJX1JFR0lPTmAgZW5kcG9pbnQncyBnbG9iYWwgZG9tYWluKS4gQ2hlY2tlZCBhdFxuICAgKiBzeW50aGVzaXMgd2hlbiBpdCdzIGRlZmluZWQgaW4gdGhpcyBhcHAgKENESydzIGBGdW5jdGlvblVybE9yaWdpbkFjY2Vzc0NvbnRyb2xgIHNpZ25zIHdpdGggYGFsd2F5c2AsIHdoaWNoXG4gICAqIENsb3VkRnJvbnQgcmVqZWN0cyBmb3IgV2ViIEZ1bmN0aW9uIG9yaWdpbnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uZSBpcyBjcmVhdGVkIHBlciBzdGFjayBhbmQgc2lnbmluZyBwcm90b2NvbFxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luQWNjZXNzQ29udHJvbD86IGNsb3VkZnJvbnQuSU9yaWdpbkFjY2Vzc0NvbnRyb2xSZWY7XG59XG5cbi8qKlxuICogQSBDbG91ZEZyb250IG9yaWdpbiBmb3IgYSBXZWIgRnVuY3Rpb24gZW5kcG9pbnQuXG4gKlxuICogVXNlIGBXZWJGdW5jdGlvbk9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChlbmRwb2ludClgIGZvciBhbiBgQVdTX0lBTWAgZW5kcG9pbnQ6IENsb3VkRnJvbnQgc2lnbnMgZXZlcnkgcmVxdWVzdCxcbiAqIGFuZCBvbmx5IHlvdXIgZGlzdHJpYnV0aW9uIG1heSBjYWxsIHRoZSBlbmRwb2ludC4gYG5ldyBXZWJGdW5jdGlvbk9yaWdpbihlbmRwb2ludClgIGlzIGZvciBhIHB1YmxpYyAoYE5PTkVgKSBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uT3JpZ2luIGV4dGVuZHMgY2xvdWRmcm9udC5PcmlnaW5CYXNlIHtcbiAgLyoqXG4gICAqIEFuIG9yaWdpbiBmb3IgYW4gYEFXU19JQU1gIGVuZHBvaW50LCB3aXRoIG9yaWdpbiBhY2Nlc3MgY29udHJvbDogQ2xvdWRGcm9udCBzaWducyBldmVyeSByZXF1ZXN0IHRvIHRoZSBlbmRwb2ludFxuICAgKiAoYGFsd2F5cy1hbXotYXV0aGAsIHdoaWNoIGtlZXBzIHRoZSB2aWV3ZXIncyBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciB5b3VyIGFwcGxpY2F0aW9uKSwgYW5kIHRoZSBmdW5jdGlvbidzXG4gICAqIHJlc291cmNlIHBvbGljeSBhbGxvd3MgYGNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbWAgdG8gY2FsbCB0aGlzIGVuZHBvaW50IG9uIGJlaGFsZiBvZiB0aGlzIGRpc3RyaWJ1dGlvbiBvbmx5LlxuICAgKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIG11c3QgYmUgaW4gdGhlIGZ1bmN0aW9uJ3Mgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHdpdGhPcmlnaW5BY2Nlc3NDb250cm9sKGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50LCBwcm9wczogV2ViRnVuY3Rpb25PcmlnaW5XaXRoT2FjUHJvcHMgPSB7fSk6IGNsb3VkZnJvbnQuSU9yaWdpbiB7XG4gICAgaWYgKGVuZHBvaW50LmF1dGhUeXBlICE9PSBXZWJGdW5jdGlvbkF1dGhUeXBlLkFXU19JQU0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbmRwb2ludC5ub2RlLnBhdGh9OiBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgbmVlZHMgYW4gQVdTX0lBTSBlbmRwb2ludCAodGhpcyBvbmUgaXMgJHtlbmRwb2ludC5hdXRoVHlwZX0sIHdoaWNoIExhbWJkYSBkb2Vzbid0IGF1dGhlbnRpY2F0ZSk7IHVzZSBuZXcgV2ViRnVuY3Rpb25PcmlnaW4oZW5kcG9pbnQpYCk7XG4gICAgfVxuICAgIGlmIChlbmRwb2ludC5lbmRwb2ludFR5cGUgPT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLk1VTFRJX1JFR0lPTikge1xuICAgICAgY29uc3Qgb3B0SW4gPSBlbmRwb2ludC5yZWdpb25zLmZpbHRlcigocikgPT4gT1BUX0lOX1JFR0lPTlMuaW5jbHVkZXMocikpO1xuICAgICAgaWYgKG9wdEluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IENsb3VkRnJvbnQgY2FuJ3Qgc2lnbiByZXF1ZXN0cyB0aGF0IGEgTVVMVElfUkVHSU9OIGVuZHBvaW50IHJvdXRlcyB0byBvcHQtaW4gcmVnaW9ucyAoJHtvcHRJbi5qb2luKCcsICcpfSk7IHVzZSBhIFBFUl9SRUdJT04gZW5kcG9pbnQgYW5kIG9uZSBvcmlnaW4gcGVyIHJlZ2lvbmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uT3JpZ2luV2l0aE9hYyhlbmRwb2ludCwgcHJvcHMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wczogV2ViRnVuY3Rpb25PcmlnaW5Qcm9wcztcblxuICBjb25zdHJ1Y3RvcihlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCwgcHJvcHM6IFdlYkZ1bmN0aW9uT3JpZ2luUHJvcHMgPSB7fSkge1xuICAgIGlmIChlbmRwb2ludC5hdXRoVHlwZSA9PT0gV2ViRnVuY3Rpb25BdXRoVHlwZS5BV1NfSUFNKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogQ2xvdWRGcm9udCBjYW4gb25seSBjYWxsIGFuIEFXU19JQU0gZW5kcG9pbnQgd2l0aCBvcmlnaW4gYWNjZXNzIGNvbnRyb2w7IHVzZSBXZWJGdW5jdGlvbk9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChlbmRwb2ludClgKTtcbiAgICB9XG4gICAgc3VwZXIob3JpZ2luRG9tYWluTmFtZShlbmRwb2ludCwgcHJvcHMucmVnaW9uKSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlVGltZW91dHMoZW5kcG9pbnQsIHByb3BzKTtcbiAgICB0aGlzLnZhbGlkYXRlUmVzcG9uc2VDb21wbGV0aW9uVGltZW91dFdpdGhSZWFkVGltZW91dChwcm9wcy5yZXNwb25zZUNvbXBsZXRpb25UaW1lb3V0LCBwcm9wcy5yZWFkVGltZW91dCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlbmRlckN1c3RvbU9yaWdpbkNvbmZpZygpOiBjbG91ZGZyb250LkNmbkRpc3RyaWJ1dGlvbi5DdXN0b21PcmlnaW5Db25maWdQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGN1c3RvbU9yaWdpbkNvbmZpZyh0aGlzLnByb3BzKTtcbiAgfVxufVxuXG5jbGFzcyBXZWJGdW5jdGlvbk9yaWdpbldpdGhPYWMgZXh0ZW5kcyBjbG91ZGZyb250Lk9yaWdpbkJhc2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25pbmdQcm90b2NvbDogJ3NpZ3Y0JyB8ICdzaWd2NGEnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFdlYkZ1bmN0aW9uT3JpZ2luV2l0aE9hY1Byb3BzKSB7XG4gICAgc3VwZXIob3JpZ2luRG9tYWluTmFtZShlbmRwb2ludCwgcHJvcHMucmVnaW9uKSwgcHJvcHMpO1xuICAgIHZhbGlkYXRlVGltZW91dHMoZW5kcG9pbnQsIHByb3BzKTtcbiAgICB0aGlzLnZhbGlkYXRlUmVzcG9uc2VDb21wbGV0aW9uVGltZW91dFdpdGhSZWFkVGltZW91dChwcm9wcy5yZXNwb25zZUNvbXBsZXRpb25UaW1lb3V0LCBwcm9wcy5yZWFkVGltZW91dCk7XG4gICAgLy8gVGhlIGdsb2JhbCBkb21haW4gcm91dGVzIHRvIGFueSBvZiB0aGUgZW5kcG9pbnQncyByZWdpb25zLCBzbyBDbG91ZEZyb250IHNpZ25zIGZvciBhbGwgb2YgdGhlbS5cbiAgICB0aGlzLnNpZ25pbmdQcm90b2NvbCA9IGVuZHBvaW50LmVuZHBvaW50VHlwZSA9PT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuTVVMVElfUkVHSU9OID8gJ3NpZ3Y0YScgOiAnc2lndjQnO1xuICAgIGlmIChwcm9wcy5vcmlnaW5BY2Nlc3NDb250cm9sKSBhc3NlcnRPcmlnaW5BY2Nlc3NDb250cm9sKGVuZHBvaW50LCBwcm9wcy5vcmlnaW5BY2Nlc3NDb250cm9sLCB0aGlzLnNpZ25pbmdQcm90b2NvbCk7XG4gIH1cblxuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0LCBvcHRpb25zOiBjbG91ZGZyb250Lk9yaWdpbkJpbmRPcHRpb25zKTogY2xvdWRmcm9udC5PcmlnaW5CaW5kQ29uZmlnIHtcbiAgICBjb25zdCBjb25maWcgPSBzdXBlci5iaW5kKHNjb3BlLCBvcHRpb25zKTtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHNjb3BlKTtcbiAgICBpZiAoc3RhY2sgIT09IFN0YWNrLm9mKHRoaXMuZW5kcG9pbnQpKSB7XG4gICAgICAvLyBUaGUgcmVzb3VyY2UgcG9saWN5IG5hbWVzIHRoZSBkaXN0cmlidXRpb24sIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIHRoZSBlbmRwb2ludDogYSByZWZlcmVuY2UgY3ljbGUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYSBkaXN0cmlidXRpb24gd2l0aCBhIFdlYkZ1bmN0aW9uT3JpZ2luIG11c3QgYmUgaW4gdGhlIGZ1bmN0aW9uJ3Mgc3RhY2sgKCR7U3RhY2sub2YodGhpcy5lbmRwb2ludCkuc3RhY2tOYW1lfSlgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGlzdHJpYnV0aW9uSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgV2ViRnVuY3Rpb25PcmlnaW4gd2l0aCBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgbXVzdCBiZSB1c2VkIGJ5IGEgY2xvdWRmcm9udC5EaXN0cmlidXRpb24gKGl0cyBJRCBzY29wZXMgdGhlIHJlc291cmNlIHBvbGljeSlgKTtcbiAgICB9XG4gICAgY29uc3Qgb2FjID0gdGhpcy5wcm9wcy5vcmlnaW5BY2Nlc3NDb250cm9sID8/IHRoaXMuc2hhcmVkT3JpZ2luQWNjZXNzQ29udHJvbChzdGFjayk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmVuZHBvaW50LndlYkZ1bmN0aW9uLmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgcHJpbmNpcGFsczogW25ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnY2xvdWRmcm9udC5hbWF6b25hd3MuY29tJyldLFxuICAgICAgYWN0aW9uczogWydsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludCddLFxuICAgICAgcmVzb3VyY2VzOiBbdGhpcy5lbmRwb2ludC5lbmRwb2ludEFybl0sXG4gICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgIFN0cmluZ0VxdWFsczoge1xuICAgICAgICAgICdhd3M6U291cmNlQXJuJzogc3RhY2suZm9ybWF0QXJuKHsgc2VydmljZTogJ2Nsb3VkZnJvbnQnLCByZWdpb246ICcnLCByZXNvdXJjZTogJ2Rpc3RyaWJ1dGlvbicsIHJlc291cmNlTmFtZTogb3B0aW9ucy5kaXN0cmlidXRpb25JZCB9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpO1xuICAgIGlmICghcmVzdWx0LnN0YXRlbWVudEFkZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogY291bGQgbm90IGFkZCBDbG91ZEZyb250IHRvIHRoZSByZXNvdXJjZSBwb2xpY3kgb2YgJHt0aGlzLmVuZHBvaW50LndlYkZ1bmN0aW9uLm5vZGUucGF0aH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAuLi5jb25maWcsIG9yaWdpblByb3BlcnR5OiB7IC4uLmNvbmZpZy5vcmlnaW5Qcm9wZXJ0eSEsIG9yaWdpbkFjY2Vzc0NvbnRyb2xJZDogb2FjLm9yaWdpbkFjY2Vzc0NvbnRyb2xSZWYub3JpZ2luQWNjZXNzQ29udHJvbElkIH0gfTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDdXN0b21PcmlnaW5Db25maWcoKTogY2xvdWRmcm9udC5DZm5EaXN0cmlidXRpb24uQ3VzdG9tT3JpZ2luQ29uZmlnUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjdXN0b21PcmlnaW5Db25maWcodGhpcy5wcm9wcyk7XG4gIH1cblxuICAvKiogT25lIG9yaWdpbiBhY2Nlc3MgY29udHJvbCBwZXIgc3RhY2sgYW5kIHNpZ25pbmcgcHJvdG9jb2wsIHNoYXJlZCBieSB0aGUgc3RhY2sncyBXZWIgRnVuY3Rpb24gb3JpZ2lucy4gKi9cbiAgcHJpdmF0ZSBzaGFyZWRPcmlnaW5BY2Nlc3NDb250cm9sKHNjb3BlOiBTdGFjayk6IGNsb3VkZnJvbnQuSU9yaWdpbkFjY2Vzc0NvbnRyb2xSZWYge1xuICAgIGNvbnN0IGlkID0gYFdlYkZ1bmN0aW9uT3JpZ2luQWNjZXNzQ29udHJvbCR7dGhpcy5zaWduaW5nUHJvdG9jb2wgPT09ICdzaWd2NGEnID8gJ1NpZ1Y0YScgOiAnU2lnVjQnfWA7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzY29wZS5ub2RlLnRyeUZpbmRDaGlsZChpZCkgYXMgY2xvdWRmcm9udC5DZm5PcmlnaW5BY2Nlc3NDb250cm9sIHwgdW5kZWZpbmVkO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IG9hYzogY2xvdWRmcm9udC5DZm5PcmlnaW5BY2Nlc3NDb250cm9sID0gbmV3IGNsb3VkZnJvbnQuQ2ZuT3JpZ2luQWNjZXNzQ29udHJvbChzY29wZSwgaWQsIHtcbiAgICAgIG9yaWdpbkFjY2Vzc0NvbnRyb2xDb25maWc6IHtcbiAgICAgICAgLy8gVW5pcXVlIGluIHRoZSBhY2NvdW50LCBsaWtlIHRoZSBuYW1lcyBDREsgZ2VuZXJhdGVzIGZvciBpdHMgb3duIG9yaWdpbiBhY2Nlc3MgY29udHJvbHMuXG4gICAgICAgIG5hbWU6IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKG9hYywgeyBtYXhMZW5ndGg6IDY0IH0pIH0pLFxuICAgICAgICBkZXNjcmlwdGlvbjogYExhbWJkYSBXZWIgRnVuY3Rpb24gb3JpZ2lucyAoJHt0aGlzLnNpZ25pbmdQcm90b2NvbH0pYCxcbiAgICAgICAgLy8gVGhlIENESyBlbnVtcyBoYXZlIG5laXRoZXIgdmFsdWUgeWV0LiBMYW1iZGEgV2ViIEZ1bmN0aW9uIG9yaWdpbnMgYWNjZXB0IG9ubHkgYWx3YXlzLWFtei1hdXRoLlxuICAgICAgICBvcmlnaW5BY2Nlc3NDb250cm9sT3JpZ2luVHlwZTogJ2xhbWJkYScsXG4gICAgICAgIHNpZ25pbmdCZWhhdmlvcjogJ2Fsd2F5cy1hbXotYXV0aCcsXG4gICAgICAgIHNpZ25pbmdQcm90b2NvbDogdGhpcy5zaWduaW5nUHJvdG9jb2wsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvYWM7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgYSBnaXZlbiBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgd2hlbiBpdHMgY29uZmlndXJhdGlvbiBpcyBrbm93biAob25lIGNyZWF0ZWQgaW4gdGhpcyBhcHAsIG5vdCBpbXBvcnRlZCk6XG4gKiBDbG91ZEZyb250IHJlamVjdHMgb3RoZXIgc2V0dGluZ3MgZm9yIGEgV2ViIEZ1bmN0aW9uIG9yaWdpbiBvbmx5IHdoZW4gdGhlIGRpc3RyaWJ1dGlvbiBkZXBsb3lzLlxuICovXG5mdW5jdGlvbiBhc3NlcnRPcmlnaW5BY2Nlc3NDb250cm9sKGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50LCBvYWM6IGNsb3VkZnJvbnQuSU9yaWdpbkFjY2Vzc0NvbnRyb2xSZWYsIHByb3RvY29sOiBzdHJpbmcpIHtcbiAgY29uc3QgY2ZuID0gb2FjIGluc3RhbmNlb2YgY2xvdWRmcm9udC5DZm5PcmlnaW5BY2Nlc3NDb250cm9sXG4gICAgPyBvYWNcbiAgICA6IG9hYy5ub2RlLmNoaWxkcmVuLmZpbmQoKGMpOiBjIGlzIGNsb3VkZnJvbnQuQ2ZuT3JpZ2luQWNjZXNzQ29udHJvbCA9PiBjIGluc3RhbmNlb2YgY2xvdWRmcm9udC5DZm5PcmlnaW5BY2Nlc3NDb250cm9sKTtcbiAgaWYgKGNmbiA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGNvbnN0IGNvbmZpZyA9IFN0YWNrLm9mKGNmbikucmVzb2x2ZShjZm4ub3JpZ2luQWNjZXNzQ29udHJvbENvbmZpZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGV4cGVjdGVkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBPcmlnaW5BY2Nlc3NDb250cm9sT3JpZ2luVHlwZTogJ2xhbWJkYScsIFNpZ25pbmdCZWhhdmlvcjogJ2Fsd2F5cy1hbXotYXV0aCcsIFNpZ25pbmdQcm90b2NvbDogcHJvdG9jb2wgfTtcbiAgY29uc3Qgd3JvbmcgPSBPYmplY3QuZW50cmllcyhleHBlY3RlZCkuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBhY3R1YWwgPSBjb25maWdba2V5XSA/PyBjb25maWdba2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDEpXTtcbiAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gJ3N0cmluZycgJiYgYWN0dWFsICE9PSB2YWx1ZTtcbiAgfSk7XG4gIGlmICh3cm9uZy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IHRoZSBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgJHtvYWMubm9kZS5wYXRofSBtdXN0IGhhdmUgJHt3cm9uZy5tYXAoKFtrLCB2XSkgPT4gYCR7a30gJyR7dn0nYCkuam9pbignLCAnKX0gZm9yIHRoaXMgZW5kcG9pbnRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvcmlnaW5Eb21haW5OYW1lKGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50LCByZWdpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocmVnaW9uID09PSB1bmRlZmluZWQpIHJldHVybiBlbmRwb2ludC5kb21haW5OYW1lO1xuICBpZiAoZW5kcG9pbnQuZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5QRVJfUkVHSU9OKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IHJlZ2lvbiBpcyBvbmx5IGZvciBQRVJfUkVHSU9OIGVuZHBvaW50cyAodGhpcyBvbmUgaXMgJHtlbmRwb2ludC5lbmRwb2ludFR5cGV9KWApO1xuICB9XG4gIHJldHVybiBlbmRwb2ludC5yZWdpb25hbERvbWFpbk5hbWUocmVnaW9uKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUaW1lb3V0cyhlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCwgcHJvcHM6IFdlYkZ1bmN0aW9uT3JpZ2luUHJvcHMpIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIFtbJ3JlYWRUaW1lb3V0JywgcHJvcHMucmVhZFRpbWVvdXRdLCBbJ2tlZXBhbGl2ZVRpbWVvdXQnLCBwcm9wcy5rZWVwYWxpdmVUaW1lb3V0XV0gYXMgY29uc3QpIHtcbiAgICBjb25zdCBzZWNvbmRzID0gdmFsdWU/LnRvU2Vjb25kcygpO1xuICAgIGlmIChzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChzZWNvbmRzKSAmJiAoIU51bWJlci5pc0ludGVnZXIoc2Vjb25kcykgfHwgc2Vjb25kcyA8IDEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogJHtuYW1lfSBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyIG9mIHNlY29uZHMsIGF0IGxlYXN0IDEsIGdvdCAke3NlY29uZHN9YCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGN1c3RvbU9yaWdpbkNvbmZpZyhwcm9wczogV2ViRnVuY3Rpb25PcmlnaW5Qcm9wcyk6IGNsb3VkZnJvbnQuQ2ZuRGlzdHJpYnV0aW9uLkN1c3RvbU9yaWdpbkNvbmZpZ1Byb3BlcnR5IHtcbiAgcmV0dXJuIHtcbiAgICBvcmlnaW5Qcm90b2NvbFBvbGljeTogY2xvdWRmcm9udC5PcmlnaW5Qcm90b2NvbFBvbGljeS5IVFRQU19PTkxZLFxuICAgIG9yaWdpblNzbFByb3RvY29sczogW2Nsb3VkZnJvbnQuT3JpZ2luU3NsUG9saWN5LlRMU19WMV8yXSxcbiAgICBvcmlnaW5SZWFkVGltZW91dDogcHJvcHMucmVhZFRpbWVvdXQ/LnRvU2Vjb25kcygpLFxuICAgIG9yaWdpbktlZXBhbGl2ZVRpbWVvdXQ6IHByb3BzLmtlZXBhbGl2ZVRpbWVvdXQ/LnRvU2Vjb25kcygpLFxuICAgIGlwQWRkcmVzc1R5cGU6IHByb3BzLmlwQWRkcmVzc1R5cGUsXG4gIH07XG59XG4iXX0=
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLW9yaWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tb3JpZ2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBa0U7QUFDbEUsdUVBQXlEO0FBQ3pELHlEQUEyQztBQUUzQyxtQ0FBdUU7QUFJdkU7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUc7SUFDckIsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQjtJQUM1SCxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsY0FBYztDQUN4SSxDQUFDO0FBbURGOzs7OztHQUtHO0FBQ0gsTUFBYSxpQkFBa0IsU0FBUSxVQUFVLENBQUMsVUFBVTs7SUFDMUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLHVCQUF1QixDQUFDLFFBQTZCLEVBQUUsUUFBdUMsRUFBRTtRQUM1RyxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssMkJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxrRUFBa0UsUUFBUSxDQUFDLFFBQVEsMkVBQTJFLENBQUMsQ0FBQztRQUN2TSxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLCtCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFD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RCxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiwgTGF6eSwgTmFtZXMsIFN0YWNrLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uQXV0aFR5cGUsIFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlIH0gZnJvbSAnLi9lbnVtcyc7XG5pbXBvcnQgdHlwZSB7IFdlYkZ1bmN0aW9uQmFzZSB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uJztcbmltcG9ydCB0eXBlIHsgV2ViRnVuY3Rpb25FbmRwb2ludCB9IGZyb20gJy4vd2ViLWZ1bmN0aW9uLWVuZHBvaW50JztcblxuLyoqXG4gKiBSZWdpb25zIHRoYXQgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuIENsb3VkRnJvbnQgY2FuJ3Qgc2lnbiBhIHJlcXVlc3QgdGhhdCBhIE1VTFRJX1JFR0lPTiBlbmRwb2ludCByb3V0ZXNcbiAqIHRvIG9uZSBvZiB0aGVtLCBzbyB0aGUgb3JpZ2luIHJldHVybnMgNDAzIChDbG91ZEZyb250IERldmVsb3BlciBHdWlkZSwgTGFtYmRhIFdlYiBGdW5jdGlvbiBvcmlnaW5zLCAyMDI2LTEwKS5cbiAqL1xuY29uc3QgT1BUX0lOX1JFR0lPTlMgPSBbXG4gICdhZi1zb3V0aC0xJywgJ2FwLWVhc3QtMScsICdhcC1lYXN0LTInLCAnYXAtc291dGgtMicsICdhcC1zb3V0aGVhc3QtMycsICdhcC1zb3V0aGVhc3QtNCcsICdhcC1zb3V0aGVhc3QtNScsICdhcC1zb3V0aGVhc3QtNicsXG4gICdhcC1zb3V0aGVhc3QtNycsICdjYS13ZXN0LTEnLCAnZXUtY2VudHJhbC0yJywgJ2V1LXNvdXRoLTEnLCAnZXUtc291dGgtMicsICdpbC1jZW50cmFsLTEnLCAnbWUtY2VudHJhbC0xJywgJ21lLXNvdXRoLTEnLCAnbXgtY2VudHJhbC0xJyxcbl07XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBXZWIgRnVuY3Rpb24gZW5kcG9pbnQgb3JpZ2luLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uT3JpZ2luUHJvcHMgZXh0ZW5kcyBjbG91ZGZyb250Lk9yaWdpblByb3BzIHtcbiAgLyoqXG4gICAqIEZvciBhIGBQRVJfUkVHSU9OYCBlbmRwb2ludDogdGhlIHJlZ2lvbiB3aG9zZSBVUkwgQ2xvdWRGcm9udCBjYWxscy4gT25seSBvbmUgcmVnaW9uIHBlciBvcmlnaW47IHVzZSBhbiBvcmlnaW5cbiAgICogZ3JvdXAgb3Igb25lIG9yaWdpbiBwZXIgYmVoYXZpb3IgZm9yIG1vcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGVuZHBvaW50J3MgaG9tZSByZWdpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgQ2xvdWRGcm9udCB3YWl0cyBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBvcmlnaW4uIEFib3ZlIDEyMCBzZWNvbmRzIG5lZWRzIGEgQ2xvdWRGcm9udCBxdW90YSBpbmNyZWFzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHJlYWRUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIENsb3VkRnJvbnQga2VlcHMgaXRzIGNvbm5lY3Rpb24gdG8gdGhlIG9yaWdpbiBvcGVuLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDUpXG4gICAqL1xuICByZWFkb25seSBrZWVwYWxpdmVUaW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFdoaWNoIElQIHByb3RvY29sIENsb3VkRnJvbnQgdXNlcyB0byBjb25uZWN0IHRvIHRoZSBvcmlnaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IE9yaWdpbklwQWRkcmVzc1R5cGUuSVBWNFxuICAgKi9cbiAgcmVhZG9ubHkgaXBBZGRyZXNzVHlwZT86IGNsb3VkZnJvbnQuT3JpZ2luSXBBZGRyZXNzVHlwZTtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludCBvcmlnaW4gd2l0aCBvcmlnaW4gYWNjZXNzIGNvbnRyb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViRnVuY3Rpb25PcmlnaW5XaXRoT2FjUHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbk9yaWdpblByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBvcmlnaW4gYWNjZXNzIGNvbnRyb2wuIEl0IG11c3QgaGF2ZSBvcmlnaW4gdHlwZSBgbGFtYmRhYCwgc2lnbmluZyBiZWhhdmlvciBgYWx3YXlzLWFtei1hdXRoYCwgYW5kIHNpZ25pbmdcbiAgICogcHJvdG9jb2wgYHNpZ3Y0YCAoYSByZWdpb25hbCBlbmRwb2ludCkgb3IgYHNpZ3Y0YWAgKGEgYE1VTFRJX1JFR0lPTmAgZW5kcG9pbnQncyBnbG9iYWwgZG9tYWluKS4gQ2hlY2tlZCBhdFxuICAgKiBzeW50aGVzaXMgd2hlbiBpdCdzIGRlZmluZWQgaW4gdGhpcyBhcHAgKENESydzIGBGdW5jdGlvblVybE9yaWdpbkFjY2Vzc0NvbnRyb2xgIHNpZ25zIHdpdGggYGFsd2F5c2AsIHdoaWNoXG4gICAqIENsb3VkRnJvbnQgcmVqZWN0cyBmb3IgV2ViIEZ1bmN0aW9uIG9yaWdpbnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9uZSBpcyBjcmVhdGVkIHBlciBzdGFjayBhbmQgc2lnbmluZyBwcm90b2NvbFxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luQWNjZXNzQ29udHJvbD86IGNsb3VkZnJvbnQuSU9yaWdpbkFjY2Vzc0NvbnRyb2xSZWY7XG59XG5cbi8qKlxuICogQSBDbG91ZEZyb250IG9yaWdpbiBmb3IgYSBXZWIgRnVuY3Rpb24gZW5kcG9pbnQuXG4gKlxuICogVXNlIGBXZWJGdW5jdGlvbk9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbChlbmRwb2ludClgIGZvciBhbiBgQVdTX0lBTWAgZW5kcG9pbnQ6IENsb3VkRnJvbnQgc2lnbnMgZXZlcnkgcmVxdWVzdCxcbiAqIGFuZCBvbmx5IHlvdXIgZGlzdHJpYnV0aW9uIG1heSBjYWxsIHRoZSBlbmRwb2ludC4gYG5ldyBXZWJGdW5jdGlvbk9yaWdpbihlbmRwb2ludClgIGlzIGZvciBhIHB1YmxpYyAoYE5PTkVgKSBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uT3JpZ2luIGV4dGVuZHMgY2xvdWRmcm9udC5PcmlnaW5CYXNlIHtcbiAgLyoqXG4gICAqIEFuIG9yaWdpbiBmb3IgYW4gYEFXU19JQU1gIGVuZHBvaW50LCB3aXRoIG9yaWdpbiBhY2Nlc3MgY29udHJvbDogQ2xvdWRGcm9udCBzaWducyBldmVyeSByZXF1ZXN0IHRvIHRoZSBlbmRwb2ludFxuICAgKiAoYGFsd2F5cy1hbXotYXV0aGAsIHdoaWNoIGtlZXBzIHRoZSB2aWV3ZXIncyBgQXV0aG9yaXphdGlvbmAgaGVhZGVyIGZvciB5b3VyIGFwcGxpY2F0aW9uKSwgYW5kIHRoZSBmdW5jdGlvbidzXG4gICAqIHJlc291cmNlIHBvbGljeSBhbGxvd3MgYGNsb3VkZnJvbnQuYW1hem9uYXdzLmNvbWAgdG8gY2FsbCB0aGlzIGVuZHBvaW50IG9uIGJlaGFsZiBvZiB0aGlzIGRpc3RyaWJ1dGlvbiBvbmx5LlxuICAgKlxuICAgKiBUaGUgZGlzdHJpYnV0aW9uIGNhbiBiZSBpbiBhbm90aGVyIHN0YWNrIHRoYW4gdGhlIGZ1bmN0aW9uLCBpbiB0aGUgc2FtZSBhY2NvdW50LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3aXRoT3JpZ2luQWNjZXNzQ29udHJvbChlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCwgcHJvcHM6IFdlYkZ1bmN0aW9uT3JpZ2luV2l0aE9hY1Byb3BzID0ge30pOiBjbG91ZGZyb250LklPcmlnaW4ge1xuICAgIGlmIChlbmRwb2ludC5hdXRoVHlwZSAhPT0gV2ViRnVuY3Rpb25BdXRoVHlwZS5BV1NfSUFNKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW5kcG9pbnQubm9kZS5wYXRofTogb3JpZ2luIGFjY2VzcyBjb250cm9sIG5lZWRzIGFuIEFXU19JQU0gZW5kcG9pbnQgKHRoaXMgb25lIGlzICR7ZW5kcG9pbnQuYXV0aFR5cGV9LCB3aGljaCBMYW1iZGEgZG9lc24ndCBhdXRoZW50aWNhdGUpOyB1c2UgbmV3IFdlYkZ1bmN0aW9uT3JpZ2luKGVuZHBvaW50KWApO1xuICAgIH1cbiAgICBpZiAoZW5kcG9pbnQuZW5kcG9pbnRUeXBlID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5NVUxUSV9SRUdJT04pIHtcbiAgICAgIGNvbnN0IG9wdEluID0gZW5kcG9pbnQucmVnaW9ucy5maWx0ZXIoKHIpID0+IE9QVF9JTl9SRUdJT05TLmluY2x1ZGVzKHIpKTtcbiAgICAgIGlmIChvcHRJbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbmRwb2ludC5ub2RlLnBhdGh9OiBDbG91ZEZyb250IGNhbid0IHNpZ24gcmVxdWVzdHMgdGhhdCBhIE1VTFRJX1JFR0lPTiBlbmRwb2ludCByb3V0ZXMgdG8gb3B0LWluIHJlZ2lvbnMgKCR7b3B0SW4uam9pbignLCAnKX0pOyB1c2UgYSBQRVJfUkVHSU9OIGVuZHBvaW50IGFuZCBvbmUgb3JpZ2luIHBlciByZWdpb25gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbk9yaWdpbldpdGhPYWMoZW5kcG9pbnQsIHByb3BzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IFdlYkZ1bmN0aW9uT3JpZ2luUHJvcHM7XG5cbiAgY29uc3RydWN0b3IoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHByb3BzOiBXZWJGdW5jdGlvbk9yaWdpblByb3BzID0ge30pIHtcbiAgICBpZiAoZW5kcG9pbnQuYXV0aFR5cGUgPT09IFdlYkZ1bmN0aW9uQXV0aFR5cGUuQVdTX0lBTSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06IENsb3VkRnJvbnQgY2FuIG9ubHkgY2FsbCBhbiBBV1NfSUFNIGVuZHBvaW50IHdpdGggb3JpZ2luIGFjY2VzcyBjb250cm9sOyB1c2UgV2ViRnVuY3Rpb25PcmlnaW4ud2l0aE9yaWdpbkFjY2Vzc0NvbnRyb2woZW5kcG9pbnQpYCk7XG4gICAgfVxuICAgIHN1cGVyKG9yaWdpbkRvbWFpbk5hbWUoZW5kcG9pbnQsIHByb3BzLnJlZ2lvbiksIHByb3BzKTtcbiAgICB2YWxpZGF0ZVRpbWVvdXRzKGVuZHBvaW50LCBwcm9wcyk7XG4gICAgdGhpcy52YWxpZGF0ZVJlc3BvbnNlQ29tcGxldGlvblRpbWVvdXRXaXRoUmVhZFRpbWVvdXQocHJvcHMucmVzcG9uc2VDb21wbGV0aW9uVGltZW91dCwgcHJvcHMucmVhZFRpbWVvdXQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgfVxuXG4gIHByb3RlY3RlZCByZW5kZXJDdXN0b21PcmlnaW5Db25maWcoKTogY2xvdWRmcm9udC5DZm5EaXN0cmlidXRpb24uQ3VzdG9tT3JpZ2luQ29uZmlnUHJvcGVydHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBjdXN0b21PcmlnaW5Db25maWcodGhpcy5wcm9wcyk7XG4gIH1cbn1cblxuY2xhc3MgV2ViRnVuY3Rpb25PcmlnaW5XaXRoT2FjIGV4dGVuZHMgY2xvdWRmcm9udC5PcmlnaW5CYXNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaWduaW5nUHJvdG9jb2w6ICdzaWd2NCcgfCAnc2lndjRhJztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGVuZHBvaW50OiBXZWJGdW5jdGlvbkVuZHBvaW50LCBwcml2YXRlIHJlYWRvbmx5IHByb3BzOiBXZWJGdW5jdGlvbk9yaWdpbldpdGhPYWNQcm9wcykge1xuICAgIHN1cGVyKG9yaWdpbkRvbWFpbk5hbWUoZW5kcG9pbnQsIHByb3BzLnJlZ2lvbiksIHByb3BzKTtcbiAgICB2YWxpZGF0ZVRpbWVvdXRzKGVuZHBvaW50LCBwcm9wcyk7XG4gICAgdGhpcy52YWxpZGF0ZVJlc3BvbnNlQ29tcGxldGlvblRpbWVvdXRXaXRoUmVhZFRpbWVvdXQocHJvcHMucmVzcG9uc2VDb21wbGV0aW9uVGltZW91dCwgcHJvcHMucmVhZFRpbWVvdXQpO1xuICAgIC8vIFRoZSBnbG9iYWwgZG9tYWluIHJvdXRlcyB0byBhbnkgb2YgdGhlIGVuZHBvaW50J3MgcmVnaW9ucywgc28gQ2xvdWRGcm9udCBzaWducyBmb3IgYWxsIG9mIHRoZW0uXG4gICAgdGhpcy5zaWduaW5nUHJvdG9jb2wgPSBlbmRwb2ludC5lbmRwb2ludFR5cGUgPT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLk1VTFRJX1JFR0lPTiA/ICdzaWd2NGEnIDogJ3NpZ3Y0JztcbiAgICBpZiAocHJvcHMub3JpZ2luQWNjZXNzQ29udHJvbCkgYXNzZXJ0T3JpZ2luQWNjZXNzQ29udHJvbChlbmRwb2ludCwgcHJvcHMub3JpZ2luQWNjZXNzQ29udHJvbCwgdGhpcy5zaWduaW5nUHJvdG9jb2wpO1xuICB9XG5cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgb3B0aW9uczogY2xvdWRmcm9udC5PcmlnaW5CaW5kT3B0aW9ucyk6IGNsb3VkZnJvbnQuT3JpZ2luQmluZENvbmZpZyB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuYmluZChzY29wZSwgb3B0aW9ucyk7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgaWYgKG9wdGlvbnMuZGlzdHJpYnV0aW9uSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgV2ViRnVuY3Rpb25PcmlnaW4gd2l0aCBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgbXVzdCBiZSB1c2VkIGJ5IGEgY2xvdWRmcm9udC5EaXN0cmlidXRpb24gKGl0cyBJRCBzY29wZXMgdGhlIHJlc291cmNlIHBvbGljeSlgKTtcbiAgICB9XG4gICAgY29uc3Qgb2FjID0gdGhpcy5wcm9wcy5vcmlnaW5BY2Nlc3NDb250cm9sID8/IHRoaXMuc2hhcmVkT3JpZ2luQWNjZXNzQ29udHJvbChzdGFjayk7XG5cbiAgICAvLyBXcml0dGVuIGZyb20gdGhlIGRpc3RyaWJ1dGlvbidzIHN0YWNrOiB0aGUgc3RhdGVtZW50IG5hbWVzIHRoZSBkaXN0cmlidXRpb24sIHdoaWNoIG5hbWVzIHRoZSBlbmRwb2ludCwgc28gYVxuICAgIC8vIHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb24ncyBzdGFjayB3b3VsZCBtYWtlIGEgcmVmZXJlbmNlIGN5Y2xlIHdoZW4gdGhlIGRpc3RyaWJ1dGlvbiBpcyBpbiBhbm90aGVyIHN0YWNrLlxuICAgIGNvbnN0IHJlc3VsdCA9ICh0aGlzLmVuZHBvaW50LndlYkZ1bmN0aW9uIGFzIFdlYkZ1bmN0aW9uQmFzZSkuX2FkZFRvUmVzb3VyY2VQb2xpY3lGcm9tKHNjb3BlLCBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBwcmluY2lwYWxzOiBbbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdjbG91ZGZyb250LmFtYXpvbmF3cy5jb20nKV0sXG4gICAgICBhY3Rpb25zOiBbJ2xhbWJkYTpJbnZva2VXZWJGdW5jdGlvbkVuZHBvaW50J10sXG4gICAgICByZXNvdXJjZXM6IFt0aGlzLmVuZHBvaW50LmVuZHBvaW50QXJuXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgJ2F3czpTb3VyY2VBcm4nOiBzdGFjay5mb3JtYXRBcm4oeyBzZXJ2aWNlOiAnY2xvdWRmcm9udCcsIHJlZ2lvbjogJycsIHJlc291cmNlOiAnZGlzdHJpYnV0aW9uJywgcmVzb3VyY2VOYW1lOiBvcHRpb25zLmRpc3RyaWJ1dGlvbklkIH0pLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KSk7XG4gICAgaWYgKCFyZXN1bHQuc3RhdGVtZW50QWRkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBjb3VsZCBub3QgYWRkIENsb3VkRnJvbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBvZiAke3RoaXMuZW5kcG9pbnQud2ViRnVuY3Rpb24ubm9kZS5wYXRofSAodGhlIGRpc3RyaWJ1dGlvbiBtdXN0IGJlIGluIHRoZSBmdW5jdGlvbidzIGFjY291bnQpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4uY29uZmlnLCBvcmlnaW5Qcm9wZXJ0eTogeyAuLi5jb25maWcub3JpZ2luUHJvcGVydHkhLCBvcmlnaW5BY2Nlc3NDb250cm9sSWQ6IG9hYy5vcmlnaW5BY2Nlc3NDb250cm9sUmVmLm9yaWdpbkFjY2Vzc0NvbnRyb2xJZCB9IH07XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVuZGVyQ3VzdG9tT3JpZ2luQ29uZmlnKCk6IGNsb3VkZnJvbnQuQ2ZuRGlzdHJpYnV0aW9uLkN1c3RvbU9yaWdpbkNvbmZpZ1Byb3BlcnR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3VzdG9tT3JpZ2luQ29uZmlnKHRoaXMucHJvcHMpO1xuICB9XG5cbiAgLyoqIE9uZSBvcmlnaW4gYWNjZXNzIGNvbnRyb2wgcGVyIHN0YWNrIGFuZCBzaWduaW5nIHByb3RvY29sLCBzaGFyZWQgYnkgdGhlIHN0YWNrJ3MgV2ViIEZ1bmN0aW9uIG9yaWdpbnMuICovXG4gIHByaXZhdGUgc2hhcmVkT3JpZ2luQWNjZXNzQ29udHJvbChzY29wZTogU3RhY2spOiBjbG91ZGZyb250LklPcmlnaW5BY2Nlc3NDb250cm9sUmVmIHtcbiAgICBjb25zdCBpZCA9IGBXZWJGdW5jdGlvbk9yaWdpbkFjY2Vzc0NvbnRyb2wke3RoaXMuc2lnbmluZ1Byb3RvY29sID09PSAnc2lndjRhJyA/ICdTaWdWNGEnIDogJ1NpZ1Y0J31gO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc2NvcGUubm9kZS50cnlGaW5kQ2hpbGQoaWQpIGFzIGNsb3VkZnJvbnQuQ2ZuT3JpZ2luQWNjZXNzQ29udHJvbCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBjb25zdCBvYWM6IGNsb3VkZnJvbnQuQ2ZuT3JpZ2luQWNjZXNzQ29udHJvbCA9IG5ldyBjbG91ZGZyb250LkNmbk9yaWdpbkFjY2Vzc0NvbnRyb2woc2NvcGUsIGlkLCB7XG4gICAgICBvcmlnaW5BY2Nlc3NDb250cm9sQ29uZmlnOiB7XG4gICAgICAgIC8vIFVuaXF1ZSBpbiB0aGUgYWNjb3VudCwgbGlrZSB0aGUgbmFtZXMgQ0RLIGdlbmVyYXRlcyBmb3IgaXRzIG93biBvcmlnaW4gYWNjZXNzIGNvbnRyb2xzLlxuICAgICAgICBuYW1lOiBMYXp5LnN0cmluZyh7IHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZShvYWMsIHsgbWF4TGVuZ3RoOiA2NCB9KSB9KSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBMYW1iZGEgV2ViIEZ1bmN0aW9uIG9yaWdpbnMgKCR7dGhpcy5zaWduaW5nUHJvdG9jb2x9KWAsXG4gICAgICAgIC8vIFRoZSBDREsgZW51bXMgaGF2ZSBuZWl0aGVyIHZhbHVlIHlldC4gTGFtYmRhIFdlYiBGdW5jdGlvbiBvcmlnaW5zIGFjY2VwdCBvbmx5IGFsd2F5cy1hbXotYXV0aC5cbiAgICAgICAgb3JpZ2luQWNjZXNzQ29udHJvbE9yaWdpblR5cGU6ICdsYW1iZGEnLFxuICAgICAgICBzaWduaW5nQmVoYXZpb3I6ICdhbHdheXMtYW16LWF1dGgnLFxuICAgICAgICBzaWduaW5nUHJvdG9jb2w6IHRoaXMuc2lnbmluZ1Byb3RvY29sLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gb2FjO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgZ2l2ZW4gb3JpZ2luIGFjY2VzcyBjb250cm9sIHdoZW4gaXRzIGNvbmZpZ3VyYXRpb24gaXMga25vd24gKG9uZSBjcmVhdGVkIGluIHRoaXMgYXBwLCBub3QgaW1wb3J0ZWQpOlxuICogQ2xvdWRGcm9udCByZWplY3RzIG90aGVyIHNldHRpbmdzIGZvciBhIFdlYiBGdW5jdGlvbiBvcmlnaW4gb25seSB3aGVuIHRoZSBkaXN0cmlidXRpb24gZGVwbG95cy5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0T3JpZ2luQWNjZXNzQ29udHJvbChlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCwgb2FjOiBjbG91ZGZyb250LklPcmlnaW5BY2Nlc3NDb250cm9sUmVmLCBwcm90b2NvbDogc3RyaW5nKSB7XG4gIGNvbnN0IGNmbiA9IG9hYyBpbnN0YW5jZW9mIGNsb3VkZnJvbnQuQ2ZuT3JpZ2luQWNjZXNzQ29udHJvbFxuICAgID8gb2FjXG4gICAgOiBvYWMubm9kZS5jaGlsZHJlbi5maW5kKChjKTogYyBpcyBjbG91ZGZyb250LkNmbk9yaWdpbkFjY2Vzc0NvbnRyb2wgPT4gYyBpbnN0YW5jZW9mIGNsb3VkZnJvbnQuQ2ZuT3JpZ2luQWNjZXNzQ29udHJvbCk7XG4gIGlmIChjZm4gPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBjb25zdCBjb25maWcgPSBTdGFjay5vZihjZm4pLnJlc29sdmUoY2ZuLm9yaWdpbkFjY2Vzc0NvbnRyb2xDb25maWcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBleHBlY3RlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgT3JpZ2luQWNjZXNzQ29udHJvbE9yaWdpblR5cGU6ICdsYW1iZGEnLCBTaWduaW5nQmVoYXZpb3I6ICdhbHdheXMtYW16LWF1dGgnLCBTaWduaW5nUHJvdG9jb2w6IHByb3RvY29sIH07XG4gIGNvbnN0IHdyb25nID0gT2JqZWN0LmVudHJpZXMoZXhwZWN0ZWQpLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgYWN0dWFsID0gY29uZmlnW2tleV0gPz8gY29uZmlnW2tleS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgxKV07XG4gICAgcmV0dXJuIHR5cGVvZiBhY3R1YWwgPT09ICdzdHJpbmcnICYmIGFjdHVhbCAhPT0gdmFsdWU7XG4gIH0pO1xuICBpZiAod3JvbmcubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtlbmRwb2ludC5ub2RlLnBhdGh9OiB0aGUgb3JpZ2luIGFjY2VzcyBjb250cm9sICR7b2FjLm5vZGUucGF0aH0gbXVzdCBoYXZlICR7d3JvbmcubWFwKChbaywgdl0pID0+IGAke2t9ICcke3Z9J2ApLmpvaW4oJywgJyl9IGZvciB0aGlzIGVuZHBvaW50YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gb3JpZ2luRG9tYWluTmFtZShlbmRwb2ludDogV2ViRnVuY3Rpb25FbmRwb2ludCwgcmVnaW9uPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHJlZ2lvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZW5kcG9pbnQuZG9tYWluTmFtZTtcbiAgaWYgKGVuZHBvaW50LmVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuUEVSX1JFR0lPTikge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtlbmRwb2ludC5ub2RlLnBhdGh9OiByZWdpb24gaXMgb25seSBmb3IgUEVSX1JFR0lPTiBlbmRwb2ludHMgKHRoaXMgb25lIGlzICR7ZW5kcG9pbnQuZW5kcG9pbnRUeXBlfSlgKTtcbiAgfVxuICByZXR1cm4gZW5kcG9pbnQucmVnaW9uYWxEb21haW5OYW1lKHJlZ2lvbik7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGltZW91dHMoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQsIHByb3BzOiBXZWJGdW5jdGlvbk9yaWdpblByb3BzKSB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBbWydyZWFkVGltZW91dCcsIHByb3BzLnJlYWRUaW1lb3V0XSwgWydrZWVwYWxpdmVUaW1lb3V0JywgcHJvcHMua2VlcGFsaXZlVGltZW91dF1dIGFzIGNvbnN0KSB7XG4gICAgY29uc3Qgc2Vjb25kcyA9IHZhbHVlPy50b1NlY29uZHMoKTtcbiAgICBpZiAoc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoc2Vjb25kcykgJiYgKCFOdW1iZXIuaXNJbnRlZ2VyKHNlY29uZHMpIHx8IHNlY29uZHMgPCAxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VuZHBvaW50Lm5vZGUucGF0aH06ICR7bmFtZX0gbXVzdCBiZSBhIHdob2xlIG51bWJlciBvZiBzZWNvbmRzLCBhdCBsZWFzdCAxLCBnb3QgJHtzZWNvbmRzfWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjdXN0b21PcmlnaW5Db25maWcocHJvcHM6IFdlYkZ1bmN0aW9uT3JpZ2luUHJvcHMpOiBjbG91ZGZyb250LkNmbkRpc3RyaWJ1dGlvbi5DdXN0b21PcmlnaW5Db25maWdQcm9wZXJ0eSB7XG4gIHJldHVybiB7XG4gICAgb3JpZ2luUHJvdG9jb2xQb2xpY3k6IGNsb3VkZnJvbnQuT3JpZ2luUHJvdG9jb2xQb2xpY3kuSFRUUFNfT05MWSxcbiAgICBvcmlnaW5Tc2xQcm90b2NvbHM6IFtjbG91ZGZyb250Lk9yaWdpblNzbFBvbGljeS5UTFNfVjFfMl0sXG4gICAgb3JpZ2luUmVhZFRpbWVvdXQ6IHByb3BzLnJlYWRUaW1lb3V0Py50b1NlY29uZHMoKSxcbiAgICBvcmlnaW5LZWVwYWxpdmVUaW1lb3V0OiBwcm9wcy5rZWVwYWxpdmVUaW1lb3V0Py50b1NlY29uZHMoKSxcbiAgICBpcEFkZHJlc3NUeXBlOiBwcm9wcy5pcEFkZHJlc3NUeXBlLFxuICB9O1xufVxuIl19
@@ -11,7 +11,7 @@ const constructs_1 = require("constructs");
11
11
  * only revisions within `revisionRetention`, or that an endpoint routes to, are kept.
12
12
  */
13
13
  class WebFunctionRevision extends constructs_1.Construct {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionRevision", version: "0.1.7" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionRevision", version: "0.1.9" };
15
15
  /**
16
16
  * References an existing revision of `webFunction`, e.g. to pin an endpoint to it or split traffic with it.
17
17
  */
@@ -128,9 +128,9 @@ export interface WebFunctionProps extends WebFunctionOptions {
128
128
  /**
129
129
  * A Lambda Web Function, created in this app (`WebFunction`) or imported (`WebFunction.fromWebFunctionArn`).
130
130
  *
131
- * `addToResourcePolicy` adds to the function's resource policy (who else may call or manage it). A `WebFunction` has
132
- * one, created by its stack on the first statement. An imported function's policy belongs to the stack that created
133
- * it, so the statement isn't added (`statementAdded: false`).
131
+ * `addToResourcePolicy` adds to the function's resource policy (who else may call or manage it). Each stack writes
132
+ * only its own statements into the function's single policy, so any stack in the function's account can add them,
133
+ * including one that imports the function. From another account, nothing is added (`statementAdded: false`).
134
134
  */
135
135
  export interface IWebFunction extends IResource, lambda.IWebFunctionRef, iam.IResourceWithPolicy {
136
136
  /**
@@ -149,9 +149,8 @@ export interface IWebFunction extends IResource, lambda.IWebFunctionRef, iam.IRe
149
149
  * Allows `grantee` to call the function's endpoint (`lambda:InvokeWebFunctionEndpoint`): the default endpoint
150
150
  * of a `WebFunction`; for an imported function, the endpoint named in its attributes, or every endpoint.
151
151
  *
152
- * For a `WebFunction`, a grantee in this account gets an IAM policy statement; another account or an AWS service
153
- * also gets a statement in the function's resource policy. For an imported function, only the grantee's IAM policy
154
- * changes: across accounts, the function's own resource policy must also allow the grantee.
152
+ * A grantee in the function's account gets an IAM policy statement; another account or an AWS service also gets a
153
+ * statement in the function's resource policy (not when the function itself is in another account than this stack).
155
154
  * [disable-awslint:no-grants]
156
155
  */
157
156
  grantInvoke(grantee: iam.IGrantable): iam.Grant;
@@ -177,6 +176,7 @@ export interface WebFunctionAttributes {
177
176
  /**
178
177
  * The function's ARN, e.g. `arn:aws:lambda:us-east-1:111122223333:web-function/orders`. It may be in another
179
178
  * region or account; across accounts, `grantInvoke` also needs the function's resource policy to allow the caller.
179
+ * A token (e.g. from another stack) is taken to be in this stack's account and region.
180
180
  *
181
181
  * @default - built from `webFunctionName`, in this stack's account and region
182
182
  */
@@ -239,9 +239,21 @@ export declare abstract class WebFunctionBase extends Resource implements IWebFu
239
239
  */
240
240
  abstract grantInvoke(grantee: iam.IGrantable): iam.Grant;
241
241
  /**
242
- * Adds a statement to the function's resource policy (not added for an imported function).
242
+ * Adds a statement to the function's resource policy, e.g. to let another account manage the function.
243
+ * For invoking, prefer `addPermission` or `grantInvoke`.
244
+ *
245
+ * The function has a single resource policy. Each stack writes only its own statements into it, through a custom
246
+ * resource that merges them with every other stack's, and with statements added outside CloudFormation. From a
247
+ * stack in another account than the function, nothing is added.
248
+ */
249
+ addToResourcePolicy(statement: iam.PolicyStatement): iam.AddToResourcePolicyResult;
250
+ /**
251
+ * Adds a statement to the function's resource policy from `scope`'s stack, e.g. the stack of a CloudFront
252
+ * distribution that uses the function.
253
+ *
254
+ * @internal
243
255
  */
244
- abstract addToResourcePolicy(statement: iam.PolicyStatement): iam.AddToResourcePolicyResult;
256
+ _addToResourcePolicyFrom(scope: Construct, statement: iam.PolicyStatement): iam.AddToResourcePolicyResult;
245
257
  /**
246
258
  * A metric of this function's execution environments in `AWS/Lambda/Web` (dimension `FunctionName`), across all endpoints.
247
259
  * For request and error counts, use the endpoint's metrics (`fn.endpoint.metricRequests()`).
@@ -323,7 +335,6 @@ export declare class WebFunction extends WebFunctionBase implements iam.IGrantab
323
335
  private readonly resource;
324
336
  private readonly revisionCleanup;
325
337
  private readonly permissionIds;
326
- private resourcePolicy?;
327
338
  constructor(scope: Construct, id: string, props: WebFunctionProps);
328
339
  /**
329
340
  * Adds an endpoint (up to 10 per function), e.g. a public one next to an IAM-only one, or one pinned to an
@@ -352,17 +363,13 @@ export declare class WebFunction extends WebFunctionBase implements iam.IGrantab
352
363
  * @param id the statement ID (`Sid`): letters and digits, unique within the function
353
364
  */
354
365
  addPermission(id: string, permission: WebFunctionPermission): void;
366
+ private createEndpoint;
355
367
  /**
356
- * Adds a statement to the function's resource policy, e.g. to let another account manage the function.
357
- * For invoking, prefer `addPermission` or `grantInvoke`.
358
- *
359
- * The function has one resource policy (`AWS::Lambda::ResourcePolicy`), created on the first statement. This stack
360
- * is its only writer: another stack or template can't also attach one, and changes made outside CloudFormation
361
- * are overwritten by the next update of the policy.
368
+ * The default execution role: write to the function's own log groups only (the home region's and every region's
369
+ * `.local` copy), the minimum AWS documents for Web Functions. Not `AWSLambdaBasicExecutionRole`, whose
370
+ * `logs:CreateLogGroup` on `*` lets environments still shutting down re-create a deleted or renamed group.
362
371
  */
363
- addToResourcePolicy(statement: iam.PolicyStatement): iam.AddToResourcePolicyResult;
364
- private createResourcePolicy;
365
- private createEndpoint;
372
+ private createRole;
366
373
  private createLogGroups;
367
374
  private logGroupIn;
368
375
  }