@horietakehiro/aws-cdk-utul 0.35.6 → 0.40.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.
@@ -1,4 +1,4 @@
1
- import { Template, Match, Matcher } from "aws-cdk-lib/assertions";
1
+ import { Template, Matcher } from "aws-cdk-lib/assertions";
2
2
  import { Condition, InputResource, Mapping, OutputResource, InputParamter, OutputParameter, ReturnValue, InputOutput, OutputOutput, InputResourceWithoutType, IAMPolicyDocument, AlsoMatcher, TypedMatcher } from "./typed-resource";
3
3
  /**
4
4
  * almost same class as `Template` class at "aws-cdk-lib/assertions", but you can use this with proper type definitions
@@ -141,7 +141,7 @@ export interface JoinProps {
141
141
  /**
142
142
  * provides some syntax sugars for `Match` class at `aws-cdk-lib/assertions`
143
143
  */
144
- export declare class ExtraMatch extends Match {
144
+ export declare class ExtraMatch {
145
145
  /**
146
146
  * same function as `Match.objectEquals({ Ref: logicalId })`
147
147
  * @param logicalId
@@ -161,16 +161,6 @@ export declare class ExtraMatch extends Match {
161
161
  * @returns
162
162
  */
163
163
  static getAttArn(logicalId: string): Matcher;
164
- static arrayWith<T extends any[]>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
165
- static arrayEquals<T extends any[]>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
166
- static objectLike<T extends {
167
- [key: string]: any;
168
- }>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
169
- static objectEquals<T extends {
170
- [key: string]: any;
171
- }>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
172
- static not<T>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
173
- static exact<T>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
174
164
  /**
175
165
  * same function as below:
176
166
  *
@@ -183,5 +173,222 @@ export declare class ExtraMatch extends Match {
183
173
  * @returns
184
174
  */
185
175
  static joinLike(props: JoinProps): Matcher;
176
+ /**
177
+ You can define Matcher for IAM Policy Document with type hints.
178
+ ```js
179
+ template.hasResource(
180
+ AWS_IAM_ROLE({
181
+ Properties: {
182
+ AssumeRolePolicyDocument: ExtraMatch.iamPolicyLike({
183
+ Statement: [
184
+ {
185
+ Principal: { Service: "ec2.amazonaws.com" },
186
+ },
187
+ ],
188
+ }),
189
+ },
190
+ })
191
+ );
192
+ ```
193
+ * @param doc
194
+ * @returns
195
+ */
186
196
  static iamPolicyLike(doc: AlsoMatcher<IAMPolicyDocument>): Matcher;
197
+ /**
198
+ Same method as `Match.arrayWith` but provides type hints and validate type match
199
+ ```js
200
+ // this is a right code
201
+ template.hasResource(
202
+ AWS_EC2_EIP({
203
+ Properties: {
204
+ Tags: ExtraMatch.arrayWith<Tag[]>([
205
+ {
206
+ Key: "key2",
207
+ Value: "val2",
208
+ },
209
+ ]),
210
+ },
211
+ })
212
+ );
213
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
214
+ template.hasResource(
215
+ AWS_EC2_EIP({
216
+ Properties: {
217
+ Tags: ExtraMatch.arrayWith<string[]>([
218
+ "hoge", "fuga"
219
+ ]),
220
+ },
221
+ })
222
+ );
223
+ ```
224
+ * @param pattern
225
+ * @returns
226
+ */
227
+ static arrayWith<T extends any[]>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
228
+ /**
229
+ * Same method as `Match.arrayEquals` but provides type hints and validate type match
230
+ ```js
231
+ // this is a right code
232
+ template.hasResource(
233
+ AWS_EC2_EIP({
234
+ Properties: {
235
+ Tags: ExtraMatch.arrayEquals<Tag[]>([
236
+ {
237
+ Key: "key1",
238
+ Value: "val1",
239
+ },
240
+ {
241
+ Key: "key2",
242
+ Value: "val2",
243
+ },
244
+ ]),
245
+ },
246
+ })
247
+ );
248
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
249
+ template.hasResource(
250
+ AWS_EC2_EIP({
251
+ Properties: {
252
+ Tags: ExtraMatch.arrayEquals<Tag[]>([
253
+ {
254
+ Key: "key1",
255
+ Value: "val1",
256
+ },
257
+ {
258
+ Key: 100,
259
+ Value: 200,
260
+ },
261
+ ]),
262
+ },
263
+ })
264
+ );
265
+ ```
266
+ * @param pattern
267
+ * @returns
268
+ */
269
+ static arrayEquals<T extends any[]>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
270
+ /**
271
+ * Same method as `Match.objectLike` but provides type hints and validate type match
272
+ ```js
273
+ // this is a right code
274
+ template.hasResource(
275
+ AWS_EC2_INSTANCE({
276
+ Properties: {
277
+ BlockDeviceMappings: [
278
+ {
279
+ DeviceName: "test",
280
+ Ebs: ExtraMatch.objectLike<Ebs>({
281
+ VolumeSize: 10,
282
+ }),
283
+ },
284
+ ],
285
+ },
286
+ })
287
+ );
288
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
289
+ template.hasResource(
290
+ AWS_EC2_INSTANCE({
291
+ Properties: {
292
+ BlockDeviceMappings: [
293
+ {
294
+ DeviceName: "test",
295
+ Ebs: ExtraMatch.objectLike<Ebs>({
296
+ VolumeSize: "10",
297
+ }),
298
+ },
299
+ ],
300
+ },
301
+ })
302
+ );
303
+ * @param pattern
304
+ * @returns
305
+ */
306
+ static objectLike<T extends {
307
+ [key: string]: any;
308
+ }>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
309
+ /**
310
+ * Same method as `Match.objectEquals` but provides type hints and validate type match
311
+ ```js
312
+ // this is a right code
313
+ template.hasResource(
314
+ AWS_EC2_EIP({
315
+ Properties: {
316
+ // You can nest TypedMatcher(use TypedMatcher inside TypedMatcher)
317
+ Tags: ExtraMatch.arrayWith<Tag[]>([
318
+ ExtraMatch.objectEquals<Tag>({
319
+ Key: "key1",
320
+ Value: "val1",
321
+ }),
322
+ ]),
323
+ },
324
+ })
325
+ );
326
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
327
+ template.hasResource(
328
+ AWS_EC2_EIP({
329
+ Properties: {
330
+ Tags: ExtraMatch.arrayWith<Tag[]>([
331
+ ExtraMatch.objectEquals<Tag>({
332
+ Key: "key1",
333
+ Value: 100,
334
+ }),
335
+ ]),
336
+ },
337
+ })
338
+ );
339
+ * @param pattern
340
+ * @returns
341
+ */
342
+ static objectEquals<T extends {
343
+ [key: string]: any;
344
+ }>(pattern: AlsoMatcher<T>): TypedMatcher<T>;
345
+ /**
346
+ * Same method as `Match.not` but provides type hints and validate type match
347
+ ```js
348
+ // this is a right code
349
+ template.hasResource(
350
+ AWS_EC2_INSTANCE({
351
+ Properties: {
352
+ ImageId: ExtraMatch.not("ami-12345"),
353
+ },
354
+ })
355
+ );
356
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
357
+ template.hasResource(
358
+ AWS_EC2_INSTANCE({
359
+ Properties: {
360
+ ImageId: ExtraMatch.not(100),
361
+ },
362
+ })
363
+ );
364
+ ```
365
+ * Same method as `Match.not` but provides type hints and validate type match
366
+ * @param pattern
367
+ * @returns
368
+ */
369
+ static not<T>(pattern: AlsoMatcher<T extends never ? never : T>): TypedMatcher<T>;
370
+ /**
371
+ * Same method as `Match.exact` but provides type hints and validate type match
372
+ ```js
373
+ // this is a right code
374
+ template.hasResource(
375
+ AWS_EC2_INSTANCE({
376
+ Properties: {
377
+ InstanceType: ExtraMatch.exact("t2.micro"),
378
+ },
379
+ })
380
+ );
381
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
382
+ template.hasResource(
383
+ AWS_EC2_INSTANCE({
384
+ Properties: {
385
+ InstanceType: ExtraMatch.exact(false),
386
+ },
387
+ })
388
+ );
389
+ ```
390
+ * @param pattern
391
+ * @returns
392
+ */
393
+ static exact<T>(pattern: AlsoMatcher<T extends never ? never : T>): TypedMatcher<T>;
187
394
  }
package/lib/assertions.js CHANGED
@@ -199,7 +199,7 @@ exports.TypedTemplate = TypedTemplate;
199
199
  /**
200
200
  * provides some syntax sugars for `Match` class at `aws-cdk-lib/assertions`
201
201
  */
202
- class ExtraMatch extends assertions_1.Match {
202
+ class ExtraMatch {
203
203
  /**
204
204
  * same function as `Match.objectEquals({ Ref: logicalId })`
205
205
  * @param logicalId
@@ -225,24 +225,6 @@ class ExtraMatch extends assertions_1.Match {
225
225
  static getAttArn(logicalId) {
226
226
  return this.getAtt(logicalId, "Arn");
227
227
  }
228
- static arrayWith(pattern) {
229
- return assertions_1.Match.arrayWith(pattern);
230
- }
231
- static arrayEquals(pattern) {
232
- return assertions_1.Match.arrayEquals(pattern);
233
- }
234
- static objectLike(pattern) {
235
- return assertions_1.Match.objectLike(pattern);
236
- }
237
- static objectEquals(pattern) {
238
- return assertions_1.Match.objectEquals(pattern);
239
- }
240
- static not(pattern) {
241
- return assertions_1.Match.not(pattern);
242
- }
243
- static exact(pattern) {
244
- return assertions_1.Match.exact(pattern);
245
- }
246
228
  /**
247
229
  * same function as below:
248
230
  *
@@ -259,55 +241,235 @@ class ExtraMatch extends assertions_1.Match {
259
241
  "Fn::Join": [props.delimiter ?? "", assertions_1.Match.arrayWith(props.arrayWith)],
260
242
  });
261
243
  }
262
- // /**
263
- // * returns Match instance that matches regional resource ARN like : `arn:aws:logs:ap-northeast-1:123456789012:log-group:/log-group-name:log-stream:log-stream-name`
264
- // * @param elems
265
- // * @returns
266
- // */
267
- // static regionalArnLike(elems: AlsoMatcher<ArnElements>): Matcher {
268
- // return Match.objectEquals({
269
- // "Fn::Join": Match.arrayWith([
270
- // "",
271
- // Match.arrayWith([
272
- // "arn:",
273
- // elems.partition ?? { Ref: "AWS::Partition" },
274
- // Match.stringLikeRegexp(`:${elems.service ?? "*"}:`),
275
- // elems.region ?? { Ref: "AWS::Region" },
276
- // elems.account ?? { Ref: "AWS::AccountId" },
277
- // ...(elems.rest instanceof Matcher
278
- // ? [elems.rest]
279
- // : (elems.rest ?? [])),
280
- // ]),
281
- // ]),
282
- // });
283
- // }
284
- // /**
285
- // * returns Match instance that matches global resource ARN like : `arn:aws:iam::123456789012:role/role-name`
286
- // * @param elems
287
- // * @returns
288
- // */
289
- // static globalArn(
290
- // elems: Omit<ArnElements, "region">,
291
- // delimiter: string = ""
292
- // ): Matcher {
293
- // return Match.objectEquals({
294
- // "Fn::Join": Match.arrayEquals([
295
- // delimiter,
296
- // Match.arrayWith([
297
- // "arn:",
298
- // elems.partition ?? { Ref: "AWS::Partition" },
299
- // Match.stringLikeRegexp(`:${elems.service ?? "*"}::`),
300
- // elems.account ?? { Ref: "AWS::AccountId" },
301
- // ...(elems.rest instanceof Matcher
302
- // ? [elems.rest]
303
- // : (elems.rest ?? [])),
304
- // ]),
305
- // ]),
306
- // });
307
- // }
244
+ /**
245
+ You can define Matcher for IAM Policy Document with type hints.
246
+ ```js
247
+ template.hasResource(
248
+ AWS_IAM_ROLE({
249
+ Properties: {
250
+ AssumeRolePolicyDocument: ExtraMatch.iamPolicyLike({
251
+ Statement: [
252
+ {
253
+ Principal: { Service: "ec2.amazonaws.com" },
254
+ },
255
+ ],
256
+ }),
257
+ },
258
+ })
259
+ );
260
+ ```
261
+ * @param doc
262
+ * @returns
263
+ */
308
264
  static iamPolicyLike(doc) {
309
265
  return assertions_1.Match.objectLike(doc);
310
266
  }
267
+ /**
268
+ Same method as `Match.arrayWith` but provides type hints and validate type match
269
+ ```js
270
+ // this is a right code
271
+ template.hasResource(
272
+ AWS_EC2_EIP({
273
+ Properties: {
274
+ Tags: ExtraMatch.arrayWith<Tag[]>([
275
+ {
276
+ Key: "key2",
277
+ Value: "val2",
278
+ },
279
+ ]),
280
+ },
281
+ })
282
+ );
283
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
284
+ template.hasResource(
285
+ AWS_EC2_EIP({
286
+ Properties: {
287
+ Tags: ExtraMatch.arrayWith<string[]>([
288
+ "hoge", "fuga"
289
+ ]),
290
+ },
291
+ })
292
+ );
293
+ ```
294
+ * @param pattern
295
+ * @returns
296
+ */
297
+ static arrayWith(pattern) {
298
+ return assertions_1.Match.arrayWith(pattern);
299
+ }
300
+ /**
301
+ * Same method as `Match.arrayEquals` but provides type hints and validate type match
302
+ ```js
303
+ // this is a right code
304
+ template.hasResource(
305
+ AWS_EC2_EIP({
306
+ Properties: {
307
+ Tags: ExtraMatch.arrayEquals<Tag[]>([
308
+ {
309
+ Key: "key1",
310
+ Value: "val1",
311
+ },
312
+ {
313
+ Key: "key2",
314
+ Value: "val2",
315
+ },
316
+ ]),
317
+ },
318
+ })
319
+ );
320
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
321
+ template.hasResource(
322
+ AWS_EC2_EIP({
323
+ Properties: {
324
+ Tags: ExtraMatch.arrayEquals<Tag[]>([
325
+ {
326
+ Key: "key1",
327
+ Value: "val1",
328
+ },
329
+ {
330
+ Key: 100,
331
+ Value: 200,
332
+ },
333
+ ]),
334
+ },
335
+ })
336
+ );
337
+ ```
338
+ * @param pattern
339
+ * @returns
340
+ */
341
+ static arrayEquals(pattern) {
342
+ return assertions_1.Match.arrayEquals(pattern);
343
+ }
344
+ /**
345
+ * Same method as `Match.objectLike` but provides type hints and validate type match
346
+ ```js
347
+ // this is a right code
348
+ template.hasResource(
349
+ AWS_EC2_INSTANCE({
350
+ Properties: {
351
+ BlockDeviceMappings: [
352
+ {
353
+ DeviceName: "test",
354
+ Ebs: ExtraMatch.objectLike<Ebs>({
355
+ VolumeSize: 10,
356
+ }),
357
+ },
358
+ ],
359
+ },
360
+ })
361
+ );
362
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
363
+ template.hasResource(
364
+ AWS_EC2_INSTANCE({
365
+ Properties: {
366
+ BlockDeviceMappings: [
367
+ {
368
+ DeviceName: "test",
369
+ Ebs: ExtraMatch.objectLike<Ebs>({
370
+ VolumeSize: "10",
371
+ }),
372
+ },
373
+ ],
374
+ },
375
+ })
376
+ );
377
+ * @param pattern
378
+ * @returns
379
+ */
380
+ static objectLike(pattern) {
381
+ return assertions_1.Match.objectLike(pattern);
382
+ }
383
+ /**
384
+ * Same method as `Match.objectEquals` but provides type hints and validate type match
385
+ ```js
386
+ // this is a right code
387
+ template.hasResource(
388
+ AWS_EC2_EIP({
389
+ Properties: {
390
+ // You can nest TypedMatcher(use TypedMatcher inside TypedMatcher)
391
+ Tags: ExtraMatch.arrayWith<Tag[]>([
392
+ ExtraMatch.objectEquals<Tag>({
393
+ Key: "key1",
394
+ Value: "val1",
395
+ }),
396
+ ]),
397
+ },
398
+ })
399
+ );
400
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
401
+ template.hasResource(
402
+ AWS_EC2_EIP({
403
+ Properties: {
404
+ Tags: ExtraMatch.arrayWith<Tag[]>([
405
+ ExtraMatch.objectEquals<Tag>({
406
+ Key: "key1",
407
+ Value: 100,
408
+ }),
409
+ ]),
410
+ },
411
+ })
412
+ );
413
+ * @param pattern
414
+ * @returns
415
+ */
416
+ static objectEquals(pattern) {
417
+ return assertions_1.Match.objectEquals(pattern);
418
+ }
419
+ /**
420
+ * Same method as `Match.not` but provides type hints and validate type match
421
+ ```js
422
+ // this is a right code
423
+ template.hasResource(
424
+ AWS_EC2_INSTANCE({
425
+ Properties: {
426
+ ImageId: ExtraMatch.not("ami-12345"),
427
+ },
428
+ })
429
+ );
430
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
431
+ template.hasResource(
432
+ AWS_EC2_INSTANCE({
433
+ Properties: {
434
+ ImageId: ExtraMatch.not(100),
435
+ },
436
+ })
437
+ );
438
+ ```
439
+ * Same method as `Match.not` but provides type hints and validate type match
440
+ * @param pattern
441
+ * @returns
442
+ */
443
+ // TODO: why this expression `T extends never ? never : T` is required but this is required
444
+ static not(pattern) {
445
+ return assertions_1.Match.not(pattern);
446
+ }
447
+ /**
448
+ * Same method as `Match.exact` but provides type hints and validate type match
449
+ ```js
450
+ // this is a right code
451
+ template.hasResource(
452
+ AWS_EC2_INSTANCE({
453
+ Properties: {
454
+ InstanceType: ExtraMatch.exact("t2.micro"),
455
+ },
456
+ })
457
+ );
458
+ // this is a wrong code(type mismatch will be detected and ts-error will be raised)
459
+ template.hasResource(
460
+ AWS_EC2_INSTANCE({
461
+ Properties: {
462
+ InstanceType: ExtraMatch.exact(false),
463
+ },
464
+ })
465
+ );
466
+ ```
467
+ * @param pattern
468
+ * @returns
469
+ */
470
+ static exact(pattern) {
471
+ return assertions_1.Match.exact(pattern);
472
+ }
311
473
  }
312
474
  exports.ExtraMatch = ExtraMatch;
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFzc2VydGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQWtFO0FBaUJsRTs7R0FFRztBQUNILE1BQWEsYUFBYTtJQUV4QixZQUFvQixRQUFrQjtRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sR0FBRyxDQUFJLElBQVksRUFBRSxHQUFRLEVBQUUsS0FBVTtRQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLGdDQUFnQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxDQUNULFlBQVksSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FDZCxHQUFHLElBQTJDO1FBRTlDLE9BQU8sSUFBSSxhQUFhLENBQUMscUJBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FDYixHQUFHLElBQTBDO1FBRTdDLE9BQU8sSUFBSSxhQUFhLENBQUMscUJBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixHQUFHLElBQTRDO1FBRS9DLE9BQU8s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K0dBQStHO0lBQy9HLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsTUFBTTtJQUNOLG9CQUFvQjtJQUNwQix3Q0FBd0M7SUFDeEMsMkJBQTJCO0lBQzNCLGVBQWU7SUFDZixnQ0FBZ0M7SUFDaEMsc0NBQXNDO0lBQ3RDLG1CQUFtQjtJQUNuQiwwQkFBMEI7SUFDMUIsa0JBQWtCO0lBQ2xCLHdEQUF3RDtJQUN4RCxnRUFBZ0U7SUFDaEUsc0RBQXNEO0lBQ3RELDRDQUE0QztJQUM1QywyQkFBMkI7SUFDM0IsbUNBQW1DO0lBQ25DLFlBQVk7SUFDWixVQUFVO0lBQ1YsUUFBUTtJQUNSLElBQUk7SUFFSixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQW1DO1FBQ3RELE9BQU8sa0JBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBeEhELGdDQXdIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbXBsYXRlLCBNYXRjaCwgTWF0Y2hlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQge1xuICBDb25kaXRpb24sXG4gIElucHV0UmVzb3VyY2UsXG4gIE1hcHBpbmcsXG4gIE91dHB1dFJlc291cmNlLFxuICBJbnB1dFBhcmFtdGVyLFxuICBPdXRwdXRQYXJhbWV0ZXIsXG4gIFJldHVyblZhbHVlLFxuICBJbnB1dE91dHB1dCxcbiAgT3V0cHV0T3V0cHV0LFxuICBJbnB1dFJlc291cmNlV2l0aG91dFR5cGUsXG4gIElBTVBvbGljeURvY3VtZW50LFxuICBBbHNvTWF0Y2hlcixcbiAgVHlwZWRNYXRjaGVyLFxufSBmcm9tIFwiLi90eXBlZC1yZXNvdXJjZVwiO1xuXG4vKipcbiAqIGFsbW9zdCBzYW1lIGNsYXNzIGFzIGBUZW1wbGF0ZWAgY2xhc3MgYXQgXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCIsIGJ1dCB5b3UgY2FuIHVzZSB0aGlzIHdpdGggcHJvcGVyIHR5cGUgZGVmaW5pdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVkVGVtcGxhdGUge1xuICB0ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHByaXZhdGUgY29uc3RydWN0b3IodGVtcGxhdGU6IFRlbXBsYXRlKSB7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQ8VD4odHlwZTogc3RyaW5nLCBkZWY6IGFueSwgYXJyYXk6IFRbXSk6IFQge1xuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IEVycm9yKGAke3R5cGV9IG5vdCBmb3VuZCB3aXRoIGRlZmluaXRpb24gOiAke0pTT04uc3RyaW5naWZ5KGRlZil9YCk7XG4gICAgfVxuICAgIGlmIChhcnJheS5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYG11bHRpcGxlICR7dHlwZX0gZm91bmQgd2l0aCBkZWZpbml0aW9uIDogJHtKU09OLnN0cmluZ2lmeShkZWYpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhcnJheVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5mcm9tU3RhY2tgIGJ1dCByZXR1cm5zIGBUeXBlZFRlbXBsYXRlYFxuICAgKiBAcGFyYW0gYXJnc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21TdGFjayhcbiAgICAuLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBUZW1wbGF0ZS5mcm9tU3RhY2s+XG4gICk6IFR5cGVkVGVtcGxhdGUge1xuICAgIHJldHVybiBuZXcgVHlwZWRUZW1wbGF0ZShUZW1wbGF0ZS5mcm9tU3RhY2soLi4uYXJncykpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5mcm9tSlNPTmAgYnV0IHJldHVybnMgYFR5cGVkVGVtcGxhdGVgXG4gICAqIEBwYXJhbSBhcmdzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgVGVtcGxhdGUuZnJvbUpTT04+XG4gICk6IFR5cGVkVGVtcGxhdGUge1xuICAgIHJldHVybiBuZXcgVHlwZWRUZW1wbGF0ZShUZW1wbGF0ZS5mcm9tSlNPTiguLi5hcmdzKSk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmZyb21TdHJpbmdgIGJ1dCByZXR1cm5zIGBUeXBlZFRlbXBsYXRlYFxuICAgKiBAcGFyYW0gYXJnc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21TdHJpbmcoXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgVGVtcGxhdGUuZnJvbVN0cmluZz5cbiAgKTogVHlwZWRUZW1wbGF0ZSB7XG4gICAgcmV0dXJuIG5ldyBUeXBlZFRlbXBsYXRlKFRlbXBsYXRlLmZyb21TdHJpbmcoLi4uYXJncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLnJlc291cmNlQ291bnRJc2BcbiAgICpcbiAgICogdXNlIHRoaXMgbWV0aG9kIGxpa2UgYmVsb3c6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIHRlbXBsYXRlLnJlc291cmNlQ291bnRJcyhBV1NfRUMyX1NVQk5FVCwgMylcbiAgICogYGBgXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSBjb3VudFxuICAgKi9cbiAgcmVzb3VyY2VDb3VudElzPFQ+KFxuICAgIHR5cGU6IChyZXNvdXJjZT86IElucHV0UmVzb3VyY2VXaXRob3V0VHlwZTxUPikgPT4gSW5wdXRSZXNvdXJjZTxUPixcbiAgICBjb3VudDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUucmVzb3VyY2VDb3VudElzKHR5cGUoKS5UeXBlLCBjb3VudCk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLnJlc291cmNlUHJvcGVydGllc0NvdW50SXNgXG4gICAqIEBwYXJhbSByXG4gICAqIEBwYXJhbSBjb3VudFxuICAgKi9cbiAgcmVzb3VyY2VQcm9wZXJ0aWVzQ291bnRJczxUPihyOiBJbnB1dFJlc291cmNlPFQ+LCBjb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5yZXNvdXJjZVByb3BlcnRpZXNDb3VudElzKHIuVHlwZSwgci5Qcm9wZXJ0aWVzLCBjb3VudCk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllc2BcbiAgICogQHBhcmFtIHJcbiAgICovXG4gIGhhc1Jlc291cmNlUHJvcGVydGllczxUPihyOiBJbnB1dFJlc291cmNlPFQ+KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoci5UeXBlLCByLlByb3BlcnRpZXMpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5oYXNSZXNvdXJjZWBcbiAgICogQHBhcmFtIHJcbiAgICovXG4gIGhhc1Jlc291cmNlPFQ+KHI6IElucHV0UmVzb3VyY2U8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlLmhhc1Jlc291cmNlKHIuVHlwZSwgcik7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmZpbmRSZXNvdXJjZXNgXG4gICAqIEBwYXJhbSByXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmaW5kUmVzb3VyY2VzPFQ+KHI6IElucHV0UmVzb3VyY2U8VD4pOiBSZXR1cm5WYWx1ZTxPdXRwdXRSZXNvdXJjZTxUPj5bXSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy50ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKHIuVHlwZSwgcikgYXMge1xuICAgICAgW2lkIGluIHN0cmluZ106IE91dHB1dFJlc291cmNlPFQ+O1xuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykubWFwKChbaWQsIHJlc291cmNlXSkgPT4ge1xuICAgICAgcmV0dXJuIHsgaWQ6IGlkLCBkZWY6IHJlc291cmNlIH07XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmFsbFJlc291cmNlc2BcbiAgICogQHBhcmFtIHJcbiAgICovXG4gIGFsbFJlc291cmNlczxUPihyOiBJbnB1dFJlc291cmNlPFQ+KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5hbGxSZXNvdXJjZXMoci5UeXBlLCByKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuYWxsUmVzb3VyY2VQcm9wZXJ0aWVzYFxuICAgKiBAcGFyYW0gclxuICAgKi9cbiAgYWxsUmVzb3VyY2VzUHJvcGVydGllczxUPihyOiBJbnB1dFJlc291cmNlPFQ+KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5hbGxSZXNvdXJjZXNQcm9wZXJ0aWVzKHIuVHlwZSwgci5Qcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuaGFzUGFyYW1ldGVyYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKi9cbiAgaGFzUGFyYW1ldGVyKGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wczogSW5wdXRQYXJhbXRlcik6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuaGFzUGFyYW1ldGVyKGxvZ2ljYWxJZCwgcHJvcHMpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5maW5kUGFyYW1ldGVyc2BcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZpbmRQYXJhbWV0ZXJzKFxuICAgIGxvZ2ljYWxJZDogc3RyaW5nLFxuICAgIHByb3BzPzogSW5wdXRQYXJhbXRlclxuICApOiBSZXR1cm5WYWx1ZTxPdXRwdXRQYXJhbWV0ZXI+W10ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB0aGlzLnRlbXBsYXRlLmZpbmRQYXJhbWV0ZXJzKGxvZ2ljYWxJZCwgcHJvcHMpO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwYXJhbWV0ZXJzKS5tYXAoKFtpZCwgcGFyYW1ldGVyXSkgPT4ge1xuICAgICAgcmV0dXJuIHsgaWQ6IGlkLCBkZWY6IHBhcmFtZXRlciBhcyBPdXRwdXRQYXJhbWV0ZXIgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5oYXNPdXRwdXRgXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIHByb3BzXG4gICAqL1xuICBoYXNPdXRwdXQobG9naWNhbElkOiBzdHJpbmcsIHByb3BzOiBJbnB1dE91dHB1dCk6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuaGFzT3V0cHV0KGxvZ2ljYWxJZCwgcHJvcHMpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5maW5kT3V0cHV0c2BcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZpbmRPdXRwdXRzKFxuICAgIGxvZ2ljYWxJZDogc3RyaW5nLFxuICAgIHByb3BzPzogSW5wdXRPdXRwdXRcbiAgKTogUmV0dXJuVmFsdWU8T3V0cHV0T3V0cHV0PltdIHtcbiAgICBjb25zdCBvdXRwdXRzID0gdGhpcy50ZW1wbGF0ZS5maW5kT3V0cHV0cyhsb2dpY2FsSWQsIHByb3BzKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob3V0cHV0cykubWFwKChbaWQsIG91dHB1dF0pID0+IHtcbiAgICAgIHJldHVybiB7IGlkOiBpZCwgZGVmOiBvdXRwdXQgYXMgT3V0cHV0T3V0cHV0IH07XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmhhc01hcHBpbmdgXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIHByb3BzXG4gICAqL1xuICBoYXNNYXBwaW5nKGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wczogYW55KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5oYXNNYXBwaW5nKGxvZ2ljYWxJZCwgcHJvcHMpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5maW5kTWFwcGluZ3NgXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIHByb3BzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmaW5kTWFwcGluZ3MobG9naWNhbElkOiBzdHJpbmcsIHByb3BzPzogYW55KTogUmV0dXJuVmFsdWU8TWFwcGluZz5bXSB7XG4gICAgY29uc3QgbWFwcGluZ3MgPSB0aGlzLnRlbXBsYXRlLmZpbmRNYXBwaW5ncyhsb2dpY2FsSWQsIHByb3BzKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGluZ3MpLm1hcCgoW2lkLCBtYXBwaW5nXSkgPT4ge1xuICAgICAgcmV0dXJuIHsgaWQ6IGlkLCBkZWY6IG1hcHBpbmcgfTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuaGFzQ29uZGl0aW9uYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKi9cbiAgaGFzQ29uZGl0aW9uKGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wczogYW55KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5oYXNDb25kaXRpb24obG9naWNhbElkLCBwcm9wcyk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmZpbmRDb25kaXRpb25zYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZmluZENvbmRpdGlvbnMobG9naWNhbElkOiBzdHJpbmcsIHByb3BzPzogYW55KTogUmV0dXJuVmFsdWU8Q29uZGl0aW9uPltdIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy50ZW1wbGF0ZS5maW5kQ29uZGl0aW9ucyhsb2dpY2FsSWQsIHByb3BzKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZGl0aW9ucykubWFwKChbaWQsIGNvbmRpdGlvbl0pID0+IHtcbiAgICAgIHJldHVybiB7IGlkOiBpZCwgZGVmOiBjb25kaXRpb24gfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBzaW5nbGUgcmVzb3VyY2UgZm9yIHNwZWNpZmllZCB0eXBlIGFuZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiAtIGlmIG5vIHJlc291cmNlIG1hdGNoZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGRlZmluaXRpb24sIHJhaXNlIEVycm9yLlxuICAgKiAtIGlmIG11bHRpcGxlIHJlc291cmNlcyBtYXRjaGVkLCByYWlzZSBFcnJvclxuICAgKiBAcGFyYW0gYXJnc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0UmVzb3VyY2U8VD4oXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgdGhpcy5maW5kUmVzb3VyY2VzPFQ+PlxuICApOiBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmZpbmRSZXNvdXJjZXM8VD4+IGV4dGVuZHMgKGluZmVyIFUpW10gPyBVIDogbmV2ZXIge1xuICAgIHJldHVybiB0aGlzLmdldChcInJlc291cmNlXCIsIGFyZ3NbMF0sIHRoaXMuZmluZFJlc291cmNlcyhhcmdzWzBdKSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBKb2luUHJvcHMge1xuICAvKipcbiAgICogQGRlZmF1bHQgXCJcIlxuICAgKi9cbiAgZGVsaW1pdGVyPzogc3RyaW5nO1xuICBhcnJheVdpdGg6IGFueVtdO1xufVxuLyoqXG4gKiBwcm92aWRlcyBzb21lIHN5bnRheCBzdWdhcnMgZm9yIGBNYXRjaGAgY2xhc3MgYXQgYGF3cy1jZGstbGliL2Fzc2VydGlvbnNgXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRyYU1hdGNoIGV4dGVuZHMgTWF0Y2gge1xuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgTWF0Y2gub2JqZWN0RXF1YWxzKHsgUmVmOiBsb2dpY2FsSWQgfSlgXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyByZWYobG9naWNhbElkOiBzdHJpbmcpOiBNYXRjaGVyIHtcbiAgICByZXR1cm4gTWF0Y2gub2JqZWN0RXF1YWxzKHsgUmVmOiBsb2dpY2FsSWQgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYE1hdGNoLm9iamVjdEVxdWFscyh7XCJGbjo6R2V0QXR0XCI6IFtsb2dpY2FsSWQsIGF0dHJpYnV0ZV19KWBcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcGFyYW0gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZ2V0QXR0KGxvZ2ljYWxJZDogc3RyaW5nLCBhdHRyaWJ1dGU6IHN0cmluZyk6IE1hdGNoZXIge1xuICAgIHJldHVybiBNYXRjaC5vYmplY3RFcXVhbHMoeyBcIkZuOjpHZXRBdHRcIjogW2xvZ2ljYWxJZCwgYXR0cmlidXRlXSB9KTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgTWF0Y2gub2JqZWN0RXF1YWxzKHtcIkZuOjpHZXRBdHRcIjogW2xvZ2ljYWxJZCwgXCJBcm5cIl19KWBcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGdldEF0dEFybihsb2dpY2FsSWQ6IHN0cmluZyk6IE1hdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmdldEF0dChsb2dpY2FsSWQsIFwiQXJuXCIpO1xuICB9XG5cbiAgc3RhdGljIGFycmF5V2l0aDxUIGV4dGVuZHMgYW55W10+KHBhdHRlcm46IEFsc29NYXRjaGVyPFQ+KTogVHlwZWRNYXRjaGVyPFQ+IHtcbiAgICByZXR1cm4gTWF0Y2guYXJyYXlXaXRoKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBhcnJheUVxdWFsczxUIGV4dGVuZHMgYW55W10+KFxuICAgIHBhdHRlcm46IEFsc29NYXRjaGVyPFQ+XG4gICk6IFR5cGVkTWF0Y2hlcjxUPiB7XG4gICAgcmV0dXJuIE1hdGNoLmFycmF5RXF1YWxzKHBhdHRlcm4pO1xuICB9XG4gIHN0YXRpYyBvYmplY3RMaWtlPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICBwYXR0ZXJuOiBBbHNvTWF0Y2hlcjxUPlxuICApOiBUeXBlZE1hdGNoZXI8VD4ge1xuICAgIHJldHVybiBNYXRjaC5vYmplY3RMaWtlKHBhdHRlcm4pIGFzIFR5cGVkTWF0Y2hlcjxUPjtcbiAgfVxuICBzdGF0aWMgb2JqZWN0RXF1YWxzPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICBwYXR0ZXJuOiBBbHNvTWF0Y2hlcjxUPlxuICApOiBUeXBlZE1hdGNoZXI8VD4ge1xuICAgIHJldHVybiBNYXRjaC5vYmplY3RFcXVhbHMocGF0dGVybik7XG4gIH1cbiAgc3RhdGljIG5vdDxUPihwYXR0ZXJuOiBBbHNvTWF0Y2hlcjxUPik6IFR5cGVkTWF0Y2hlcjxUPiB7XG4gICAgcmV0dXJuIE1hdGNoLm5vdChwYXR0ZXJuKTtcbiAgfVxuICBzdGF0aWMgZXhhY3Q8VD4ocGF0dGVybjogQWxzb01hdGNoZXI8VD4pOiBUeXBlZE1hdGNoZXI8VD4ge1xuICAgIHJldHVybiBNYXRjaC5leGFjdChwYXR0ZXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGJlbG93OlxuICAgKiBcbiAgICogYGBganNcbiAgICogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAqICBcIkZuOjpKb2luXCI6IFtwcm9wcy5kZWxpbWl0ZXIgPz8gXCJcIiwgTWF0Y2guYXJyYXlXaXRoKHByb3BzLmFycmF5V2l0aCldLFxuICAgIH0pO1xuICAgKiBgYGBcbiAgICogQHBhcmFtIHByb3BzIFxuICAgKiBAcmV0dXJucyBcbiAgICovXG4gIHN0YXRpYyBqb2luTGlrZShwcm9wczogSm9pblByb3BzKTogTWF0Y2hlciB7XG4gICAgcmV0dXJuIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgXCJGbjo6Sm9pblwiOiBbcHJvcHMuZGVsaW1pdGVyID8/IFwiXCIsIE1hdGNoLmFycmF5V2l0aChwcm9wcy5hcnJheVdpdGgpXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC8qKlxuICAvLyAgKiByZXR1cm5zIE1hdGNoIGluc3RhbmNlIHRoYXQgbWF0Y2hlcyByZWdpb25hbCByZXNvdXJjZSBBUk4gbGlrZSA6IGBhcm46YXdzOmxvZ3M6YXAtbm9ydGhlYXN0LTE6MTIzNDU2Nzg5MDEyOmxvZy1ncm91cDovbG9nLWdyb3VwLW5hbWU6bG9nLXN0cmVhbTpsb2ctc3RyZWFtLW5hbWVgXG4gIC8vICAqIEBwYXJhbSBlbGVtc1xuICAvLyAgKiBAcmV0dXJuc1xuICAvLyAgKi9cbiAgLy8gc3RhdGljIHJlZ2lvbmFsQXJuTGlrZShlbGVtczogQWxzb01hdGNoZXI8QXJuRWxlbWVudHM+KTogTWF0Y2hlciB7XG4gIC8vICAgcmV0dXJuIE1hdGNoLm9iamVjdEVxdWFscyh7XG4gIC8vICAgICBcIkZuOjpKb2luXCI6IE1hdGNoLmFycmF5V2l0aChbXG4gIC8vICAgICAgIFwiXCIsXG4gIC8vICAgICAgIE1hdGNoLmFycmF5V2l0aChbXG4gIC8vICAgICAgICAgXCJhcm46XCIsXG4gIC8vICAgICAgICAgZWxlbXMucGFydGl0aW9uID8/IHsgUmVmOiBcIkFXUzo6UGFydGl0aW9uXCIgfSxcbiAgLy8gICAgICAgICBNYXRjaC5zdHJpbmdMaWtlUmVnZXhwKGA6JHtlbGVtcy5zZXJ2aWNlID8/IFwiKlwifTpgKSxcbiAgLy8gICAgICAgICBlbGVtcy5yZWdpb24gPz8geyBSZWY6IFwiQVdTOjpSZWdpb25cIiB9LFxuICAvLyAgICAgICAgIGVsZW1zLmFjY291bnQgPz8geyBSZWY6IFwiQVdTOjpBY2NvdW50SWRcIiB9LFxuICAvLyAgICAgICAgIC4uLihlbGVtcy5yZXN0IGluc3RhbmNlb2YgTWF0Y2hlclxuICAvLyAgICAgICAgICAgPyBbZWxlbXMucmVzdF1cbiAgLy8gICAgICAgICAgIDogKGVsZW1zLnJlc3QgPz8gW10pKSxcbiAgLy8gICAgICAgXSksXG4gIC8vICAgICBdKSxcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8vIC8qKlxuICAvLyAgKiByZXR1cm5zIE1hdGNoIGluc3RhbmNlIHRoYXQgbWF0Y2hlcyBnbG9iYWwgcmVzb3VyY2UgQVJOIGxpa2UgOiBgYXJuOmF3czppYW06OjEyMzQ1Njc4OTAxMjpyb2xlL3JvbGUtbmFtZWBcbiAgLy8gICogQHBhcmFtIGVsZW1zXG4gIC8vICAqIEByZXR1cm5zXG4gIC8vICAqL1xuICAvLyBzdGF0aWMgZ2xvYmFsQXJuKFxuICAvLyAgIGVsZW1zOiBPbWl0PEFybkVsZW1lbnRzLCBcInJlZ2lvblwiPixcbiAgLy8gICBkZWxpbWl0ZXI6IHN0cmluZyA9IFwiXCJcbiAgLy8gKTogTWF0Y2hlciB7XG4gIC8vICAgcmV0dXJuIE1hdGNoLm9iamVjdEVxdWFscyh7XG4gIC8vICAgICBcIkZuOjpKb2luXCI6IE1hdGNoLmFycmF5RXF1YWxzKFtcbiAgLy8gICAgICAgZGVsaW1pdGVyLFxuICAvLyAgICAgICBNYXRjaC5hcnJheVdpdGgoW1xuICAvLyAgICAgICAgIFwiYXJuOlwiLFxuICAvLyAgICAgICAgIGVsZW1zLnBhcnRpdGlvbiA/PyB7IFJlZjogXCJBV1M6OlBhcnRpdGlvblwiIH0sXG4gIC8vICAgICAgICAgTWF0Y2guc3RyaW5nTGlrZVJlZ2V4cChgOiR7ZWxlbXMuc2VydmljZSA/PyBcIipcIn06OmApLFxuICAvLyAgICAgICAgIGVsZW1zLmFjY291bnQgPz8geyBSZWY6IFwiQVdTOjpBY2NvdW50SWRcIiB9LFxuICAvLyAgICAgICAgIC4uLihlbGVtcy5yZXN0IGluc3RhbmNlb2YgTWF0Y2hlclxuICAvLyAgICAgICAgICAgPyBbZWxlbXMucmVzdF1cbiAgLy8gICAgICAgICAgIDogKGVsZW1zLnJlc3QgPz8gW10pKSxcbiAgLy8gICAgICAgXSksXG4gIC8vICAgICBdKSxcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHN0YXRpYyBpYW1Qb2xpY3lMaWtlKGRvYzogQWxzb01hdGNoZXI8SUFNUG9saWN5RG9jdW1lbnQ+KTogTWF0Y2hlciB7XG4gICAgcmV0dXJuIE1hdGNoLm9iamVjdExpa2UoZG9jKTtcbiAgfVxufVxuIl19
475
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFzc2VydGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQWtFO0FBaUJsRTs7R0FFRztBQUNILE1BQWEsYUFBYTtJQUV4QixZQUFvQixRQUFrQjtRQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRU8sR0FBRyxDQUFJLElBQVksRUFBRSxHQUFRLEVBQUUsS0FBVTtRQUMvQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxLQUFLLENBQUMsR0FBRyxJQUFJLGdDQUFnQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sS0FBSyxDQUNULFlBQVksSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FDZCxHQUFHLElBQTJDO1FBRTlDLE9BQU8sSUFBSSxhQUFhLENBQUMscUJBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FDYixHQUFHLElBQTBDO1FBRTdDLE9BQU8sSUFBSSxhQUFhLENBQUMscUJBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixHQUFHLElBQTRDO1FBRS9DLE9BQU8s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TUFBTSxDQUFDLEtBQUssQ0FBSSxPQUFpRDtRQUMvRCxPQUFPLGtCQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQXRSRCxnQ0FzUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUZW1wbGF0ZSwgTWF0Y2gsIE1hdGNoZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXNzZXJ0aW9uc1wiO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBJbnB1dFJlc291cmNlLFxuICBNYXBwaW5nLFxuICBPdXRwdXRSZXNvdXJjZSxcbiAgSW5wdXRQYXJhbXRlcixcbiAgT3V0cHV0UGFyYW1ldGVyLFxuICBSZXR1cm5WYWx1ZSxcbiAgSW5wdXRPdXRwdXQsXG4gIE91dHB1dE91dHB1dCxcbiAgSW5wdXRSZXNvdXJjZVdpdGhvdXRUeXBlLFxuICBJQU1Qb2xpY3lEb2N1bWVudCxcbiAgQWxzb01hdGNoZXIsXG4gIFR5cGVkTWF0Y2hlcixcbn0gZnJvbSBcIi4vdHlwZWQtcmVzb3VyY2VcIjtcblxuLyoqXG4gKiBhbG1vc3Qgc2FtZSBjbGFzcyBhcyBgVGVtcGxhdGVgIGNsYXNzIGF0IFwiYXdzLWNkay1saWIvYXNzZXJ0aW9uc1wiLCBidXQgeW91IGNhbiB1c2UgdGhpcyB3aXRoIHByb3BlciB0eXBlIGRlZmluaXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlZFRlbXBsYXRlIHtcbiAgdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZSkge1xuICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0PFQ+KHR5cGU6IHN0cmluZywgZGVmOiBhbnksIGFycmF5OiBUW10pOiBUIHtcbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHt0eXBlfSBub3QgZm91bmQgd2l0aCBkZWZpbml0aW9uIDogJHtKU09OLnN0cmluZ2lmeShkZWYpfWApO1xuICAgIH1cbiAgICBpZiAoYXJyYXkubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBtdWx0aXBsZSAke3R5cGV9IGZvdW5kIHdpdGggZGVmaW5pdGlvbiA6ICR7SlNPTi5zdHJpbmdpZnkoZGVmKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlbMF07XG4gIH1cblxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuZnJvbVN0YWNrYCBidXQgcmV0dXJucyBgVHlwZWRUZW1wbGF0ZWBcbiAgICogQHBhcmFtIGFyZ3NcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tU3RhY2soXG4gICAgLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgVGVtcGxhdGUuZnJvbVN0YWNrPlxuICApOiBUeXBlZFRlbXBsYXRlIHtcbiAgICByZXR1cm4gbmV3IFR5cGVkVGVtcGxhdGUoVGVtcGxhdGUuZnJvbVN0YWNrKC4uLmFyZ3MpKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuZnJvbUpTT05gIGJ1dCByZXR1cm5zIGBUeXBlZFRlbXBsYXRlYFxuICAgKiBAcGFyYW0gYXJnc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKFxuICAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIFRlbXBsYXRlLmZyb21KU09OPlxuICApOiBUeXBlZFRlbXBsYXRlIHtcbiAgICByZXR1cm4gbmV3IFR5cGVkVGVtcGxhdGUoVGVtcGxhdGUuZnJvbUpTT04oLi4uYXJncykpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5mcm9tU3RyaW5nYCBidXQgcmV0dXJucyBgVHlwZWRUZW1wbGF0ZWBcbiAgICogQHBhcmFtIGFyZ3NcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBmcm9tU3RyaW5nKFxuICAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIFRlbXBsYXRlLmZyb21TdHJpbmc+XG4gICk6IFR5cGVkVGVtcGxhdGUge1xuICAgIHJldHVybiBuZXcgVHlwZWRUZW1wbGF0ZShUZW1wbGF0ZS5mcm9tU3RyaW5nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXNgXG4gICAqXG4gICAqIHVzZSB0aGlzIG1ldGhvZCBsaWtlIGJlbG93OlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiB0ZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoQVdTX0VDMl9TVUJORVQsIDMpXG4gICAqIGBgYFxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gY291bnRcbiAgICovXG4gIHJlc291cmNlQ291bnRJczxUPihcbiAgICB0eXBlOiAocmVzb3VyY2U/OiBJbnB1dFJlc291cmNlV2l0aG91dFR5cGU8VD4pID0+IElucHV0UmVzb3VyY2U8VD4sXG4gICAgY291bnQ6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlLnJlc291cmNlQ291bnRJcyh0eXBlKCkuVHlwZSwgY291bnQpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5yZXNvdXJjZVByb3BlcnRpZXNDb3VudElzYFxuICAgKiBAcGFyYW0gclxuICAgKiBAcGFyYW0gY291bnRcbiAgICovXG4gIHJlc291cmNlUHJvcGVydGllc0NvdW50SXM8VD4ocjogSW5wdXRSZXNvdXJjZTxUPiwgY291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUucmVzb3VyY2VQcm9wZXJ0aWVzQ291bnRJcyhyLlR5cGUsIHIuUHJvcGVydGllcywgY291bnQpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXNgXG4gICAqIEBwYXJhbSByXG4gICAqL1xuICBoYXNSZXNvdXJjZVByb3BlcnRpZXM8VD4ocjogSW5wdXRSZXNvdXJjZTxUPik6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKHIuVHlwZSwgci5Qcm9wZXJ0aWVzKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuaGFzUmVzb3VyY2VgXG4gICAqIEBwYXJhbSByXG4gICAqL1xuICBoYXNSZXNvdXJjZTxUPihyOiBJbnB1dFJlc291cmNlPFQ+KTogdm9pZCB7XG4gICAgdGhpcy50ZW1wbGF0ZS5oYXNSZXNvdXJjZShyLlR5cGUsIHIpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5maW5kUmVzb3VyY2VzYFxuICAgKiBAcGFyYW0gclxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZmluZFJlc291cmNlczxUPihyOiBJbnB1dFJlc291cmNlPFQ+KTogUmV0dXJuVmFsdWU8T3V0cHV0UmVzb3VyY2U8VD4+W10ge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMudGVtcGxhdGUuZmluZFJlc291cmNlcyhyLlR5cGUsIHIpIGFzIHtcbiAgICAgIFtpZCBpbiBzdHJpbmddOiBPdXRwdXRSZXNvdXJjZTxUPjtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpLm1hcCgoW2lkLCByZXNvdXJjZV0pID0+IHtcbiAgICAgIHJldHVybiB7IGlkOiBpZCwgZGVmOiByZXNvdXJjZSB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5hbGxSZXNvdXJjZXNgXG4gICAqIEBwYXJhbSByXG4gICAqL1xuICBhbGxSZXNvdXJjZXM8VD4ocjogSW5wdXRSZXNvdXJjZTxUPik6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuYWxsUmVzb3VyY2VzKHIuVHlwZSwgcik7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmFsbFJlc291cmNlUHJvcGVydGllc2BcbiAgICogQHBhcmFtIHJcbiAgICovXG4gIGFsbFJlc291cmNlc1Byb3BlcnRpZXM8VD4ocjogSW5wdXRSZXNvdXJjZTxUPik6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuYWxsUmVzb3VyY2VzUHJvcGVydGllcyhyLlR5cGUsIHIuUHJvcGVydGllcyk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmhhc1BhcmFtZXRlcmBcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICovXG4gIGhhc1BhcmFtZXRlcihsb2dpY2FsSWQ6IHN0cmluZywgcHJvcHM6IElucHV0UGFyYW10ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlLmhhc1BhcmFtZXRlcihsb2dpY2FsSWQsIHByb3BzKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuZmluZFBhcmFtZXRlcnNgXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIHByb3BzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmaW5kUGFyYW1ldGVycyhcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IElucHV0UGFyYW10ZXJcbiAgKTogUmV0dXJuVmFsdWU8T3V0cHV0UGFyYW1ldGVyPltdIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gdGhpcy50ZW1wbGF0ZS5maW5kUGFyYW1ldGVycyhsb2dpY2FsSWQsIHByb3BzKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocGFyYW1ldGVycykubWFwKChbaWQsIHBhcmFtZXRlcl0pID0+IHtcbiAgICAgIHJldHVybiB7IGlkOiBpZCwgZGVmOiBwYXJhbWV0ZXIgYXMgT3V0cHV0UGFyYW1ldGVyIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuaGFzT3V0cHV0YFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKi9cbiAgaGFzT3V0cHV0KGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wczogSW5wdXRPdXRwdXQpOiB2b2lkIHtcbiAgICB0aGlzLnRlbXBsYXRlLmhhc091dHB1dChsb2dpY2FsSWQsIHByb3BzKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuZmluZE91dHB1dHNgXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIHByb3BzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmaW5kT3V0cHV0cyhcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBwcm9wcz86IElucHV0T3V0cHV0XG4gICk6IFJldHVyblZhbHVlPE91dHB1dE91dHB1dD5bXSB7XG4gICAgY29uc3Qgb3V0cHV0cyA9IHRoaXMudGVtcGxhdGUuZmluZE91dHB1dHMobG9naWNhbElkLCBwcm9wcyk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG91dHB1dHMpLm1hcCgoW2lkLCBvdXRwdXRdKSA9PiB7XG4gICAgICByZXR1cm4geyBpZDogaWQsIGRlZjogb3V0cHV0IGFzIE91dHB1dE91dHB1dCB9O1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5oYXNNYXBwaW5nYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKi9cbiAgaGFzTWFwcGluZyhsb2dpY2FsSWQ6IHN0cmluZywgcHJvcHM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuaGFzTWFwcGluZyhsb2dpY2FsSWQsIHByb3BzKTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgVGVtcGxhdGUuZmluZE1hcHBpbmdzYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBwcm9wc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZmluZE1hcHBpbmdzKGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wcz86IGFueSk6IFJldHVyblZhbHVlPE1hcHBpbmc+W10ge1xuICAgIGNvbnN0IG1hcHBpbmdzID0gdGhpcy50ZW1wbGF0ZS5maW5kTWFwcGluZ3MobG9naWNhbElkLCBwcm9wcyk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG1hcHBpbmdzKS5tYXAoKFtpZCwgbWFwcGluZ10pID0+IHtcbiAgICAgIHJldHVybiB7IGlkOiBpZCwgZGVmOiBtYXBwaW5nIH07XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYFRlbXBsYXRlLmhhc0NvbmRpdGlvbmBcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICovXG4gIGhhc0NvbmRpdGlvbihsb2dpY2FsSWQ6IHN0cmluZywgcHJvcHM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudGVtcGxhdGUuaGFzQ29uZGl0aW9uKGxvZ2ljYWxJZCwgcHJvcHMpO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBUZW1wbGF0ZS5maW5kQ29uZGl0aW9uc2BcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcGFyYW0gcHJvcHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZpbmRDb25kaXRpb25zKGxvZ2ljYWxJZDogc3RyaW5nLCBwcm9wcz86IGFueSk6IFJldHVyblZhbHVlPENvbmRpdGlvbj5bXSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IHRoaXMudGVtcGxhdGUuZmluZENvbmRpdGlvbnMobG9naWNhbElkLCBwcm9wcyk7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpLm1hcCgoW2lkLCBjb25kaXRpb25dKSA9PiB7XG4gICAgICByZXR1cm4geyBpZDogaWQsIGRlZjogY29uZGl0aW9uIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIGEgc2luZ2xlIHJlc291cmNlIGZvciBzcGVjaWZpZWQgdHlwZSBhbmQgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogLSBpZiBubyByZXNvdXJjZSBtYXRjaGVkIHdpdGggdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBkZWZpbml0aW9uLCByYWlzZSBFcnJvci5cbiAgICogLSBpZiBtdWx0aXBsZSByZXNvdXJjZXMgbWF0Y2hlZCwgcmFpc2UgRXJyb3JcbiAgICogQHBhcmFtIGFyZ3NcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFJlc291cmNlPFQ+KFxuICAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHRoaXMuZmluZFJlc291cmNlczxUPj5cbiAgKTogUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5maW5kUmVzb3VyY2VzPFQ+PiBleHRlbmRzIChpbmZlciBVKVtdID8gVSA6IG5ldmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoXCJyZXNvdXJjZVwiLCBhcmdzWzBdLCB0aGlzLmZpbmRSZXNvdXJjZXMoYXJnc1swXSkpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSm9pblByb3BzIHtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IFwiXCJcbiAgICovXG4gIGRlbGltaXRlcj86IHN0cmluZztcbiAgYXJyYXlXaXRoOiBhbnlbXTtcbn1cbi8qKlxuICogcHJvdmlkZXMgc29tZSBzeW50YXggc3VnYXJzIGZvciBgTWF0Y2hgIGNsYXNzIGF0IGBhd3MtY2RrLWxpYi9hc3NlcnRpb25zYFxuICovXG5leHBvcnQgY2xhc3MgRXh0cmFNYXRjaCB7XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBNYXRjaC5vYmplY3RFcXVhbHMoeyBSZWY6IGxvZ2ljYWxJZCB9KWBcbiAgICogQHBhcmFtIGxvZ2ljYWxJZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgc3RhdGljIHJlZihsb2dpY2FsSWQ6IHN0cmluZyk6IE1hdGNoZXIge1xuICAgIHJldHVybiBNYXRjaC5vYmplY3RFcXVhbHMoeyBSZWY6IGxvZ2ljYWxJZCB9KTtcbiAgfVxuICAvKipcbiAgICogc2FtZSBmdW5jdGlvbiBhcyBgTWF0Y2gub2JqZWN0RXF1YWxzKHtcIkZuOjpHZXRBdHRcIjogW2xvZ2ljYWxJZCwgYXR0cmlidXRlXX0pYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEBwYXJhbSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIHN0YXRpYyBnZXRBdHQobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKTogTWF0Y2hlciB7XG4gICAgcmV0dXJuIE1hdGNoLm9iamVjdEVxdWFscyh7IFwiRm46OkdldEF0dFwiOiBbbG9naWNhbElkLCBhdHRyaWJ1dGVdIH0pO1xuICB9XG4gIC8qKlxuICAgKiBzYW1lIGZ1bmN0aW9uIGFzIGBNYXRjaC5vYmplY3RFcXVhbHMoe1wiRm46OkdldEF0dFwiOiBbbG9naWNhbElkLCBcIkFyblwiXX0pYFxuICAgKiBAcGFyYW0gbG9naWNhbElkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgZ2V0QXR0QXJuKGxvZ2ljYWxJZDogc3RyaW5nKTogTWF0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXR0KGxvZ2ljYWxJZCwgXCJBcm5cIik7XG4gIH1cbiAgLyoqXG4gICAqIHNhbWUgZnVuY3Rpb24gYXMgYmVsb3c6XG4gICAqIFxuICAgKiBgYGBqc1xuICAgKiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICogIFwiRm46OkpvaW5cIjogW3Byb3BzLmRlbGltaXRlciA/PyBcIlwiLCBNYXRjaC5hcnJheVdpdGgocHJvcHMuYXJyYXlXaXRoKV0sXG4gICAgfSk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gcHJvcHMgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgc3RhdGljIGpvaW5MaWtlKHByb3BzOiBKb2luUHJvcHMpOiBNYXRjaGVyIHtcbiAgICByZXR1cm4gTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICBcIkZuOjpKb2luXCI6IFtwcm9wcy5kZWxpbWl0ZXIgPz8gXCJcIiwgTWF0Y2guYXJyYXlXaXRoKHByb3BzLmFycmF5V2l0aCldLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICBZb3UgY2FuIGRlZmluZSBNYXRjaGVyIGZvciBJQU0gUG9saWN5IERvY3VtZW50IHdpdGggdHlwZSBoaW50cy5cbiAgIGBgYGpzXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2UoXG4gICAgICBBV1NfSUFNX1JPTEUoe1xuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OiBFeHRyYU1hdGNoLmlhbVBvbGljeUxpa2Uoe1xuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBQcmluY2lwYWw6IHsgU2VydmljZTogXCJlYzIuYW1hem9uYXdzLmNvbVwiIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgYGBgXG4gICAqIEBwYXJhbSBkb2MgXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgc3RhdGljIGlhbVBvbGljeUxpa2UoZG9jOiBBbHNvTWF0Y2hlcjxJQU1Qb2xpY3lEb2N1bWVudD4pOiBNYXRjaGVyIHtcbiAgICByZXR1cm4gTWF0Y2gub2JqZWN0TGlrZShkb2MpO1xuICB9XG4gIC8qKlxuICAgU2FtZSBtZXRob2QgYXMgYE1hdGNoLmFycmF5V2l0aGAgYnV0IHByb3ZpZGVzIHR5cGUgaGludHMgYW5kIHZhbGlkYXRlIHR5cGUgbWF0Y2ggXG4gICBgYGBqc1xuICAgIC8vIHRoaXMgaXMgYSByaWdodCBjb2RlXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2UoXG4gICAgICBBV1NfRUMyX0VJUCh7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBUYWdzOiBFeHRyYU1hdGNoLmFycmF5V2l0aDxUYWdbXT4oW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBLZXk6IFwia2V5MlwiLFxuICAgICAgICAgICAgICBWYWx1ZTogXCJ2YWwyXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIC8vIHRoaXMgaXMgYSB3cm9uZyBjb2RlKHR5cGUgbWlzbWF0Y2ggd2lsbCBiZSBkZXRlY3RlZCBhbmQgdHMtZXJyb3Igd2lsbCBiZSByYWlzZWQpXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2UoXG4gICAgICBBV1NfRUMyX0VJUCh7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBUYWdzOiBFeHRyYU1hdGNoLmFycmF5V2l0aDxzdHJpbmdbXT4oW1xuICAgICAgICAgICAgXCJob2dlXCIsIFwiZnVnYVwiXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICBgYGBcbiAgICogQHBhcmFtIHBhdHRlcm4gXG4gICAqIEByZXR1cm5zIFxuICAgKi9cbiAgc3RhdGljIGFycmF5V2l0aDxUIGV4dGVuZHMgYW55W10+KHBhdHRlcm46IEFsc29NYXRjaGVyPFQ+KTogVHlwZWRNYXRjaGVyPFQ+IHtcbiAgICByZXR1cm4gTWF0Y2guYXJyYXlXaXRoKHBhdHRlcm4pIGFzIHVua25vd24gYXMgVHlwZWRNYXRjaGVyPFQ+O1xuICB9XG4gIC8qKlxuICAgKiBTYW1lIG1ldGhvZCBhcyBgTWF0Y2guYXJyYXlFcXVhbHNgIGJ1dCBwcm92aWRlcyB0eXBlIGhpbnRzIGFuZCB2YWxpZGF0ZSB0eXBlIG1hdGNoIFxuICAgYGBganNcbiAgICAvLyB0aGlzIGlzIGEgcmlnaHQgY29kZVxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlKFxuICAgICAgQVdTX0VDMl9FSVAoe1xuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgVGFnczogRXh0cmFNYXRjaC5hcnJheUVxdWFsczxUYWdbXT4oW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBLZXk6IFwia2V5MVwiLFxuICAgICAgICAgICAgICBWYWx1ZTogXCJ2YWwxXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBLZXk6IFwia2V5MlwiLFxuICAgICAgICAgICAgICBWYWx1ZTogXCJ2YWwyXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIC8vIHRoaXMgaXMgYSB3cm9uZyBjb2RlKHR5cGUgbWlzbWF0Y2ggd2lsbCBiZSBkZXRlY3RlZCBhbmQgdHMtZXJyb3Igd2lsbCBiZSByYWlzZWQpXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2UoXG4gICAgICBBV1NfRUMyX0VJUCh7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBUYWdzOiBFeHRyYU1hdGNoLmFycmF5RXF1YWxzPFRhZ1tdPihbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEtleTogXCJrZXkxXCIsXG4gICAgICAgICAgICAgIFZhbHVlOiBcInZhbDFcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIEtleTogMTAwLFxuICAgICAgICAgICAgICBWYWx1ZTogMjAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgIGBgYFxuICAgKiBAcGFyYW0gcGF0dGVybiBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGF0aWMgYXJyYXlFcXVhbHM8VCBleHRlbmRzIGFueVtdPihcbiAgICBwYXR0ZXJuOiBBbHNvTWF0Y2hlcjxUPlxuICApOiBUeXBlZE1hdGNoZXI8VD4ge1xuICAgIHJldHVybiBNYXRjaC5hcnJheUVxdWFscyhwYXR0ZXJuKTtcbiAgfVxuICAvKipcbiAgICogU2FtZSBtZXRob2QgYXMgYE1hdGNoLm9iamVjdExpa2VgIGJ1dCBwcm92aWRlcyB0eXBlIGhpbnRzIGFuZCB2YWxpZGF0ZSB0eXBlIG1hdGNoIFxuICAgYGBganNcbiAgIC8vIHRoaXMgaXMgYSByaWdodCBjb2RlXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2UoXG4gICAgICBBV1NfRUMyX0lOU1RBTkNFKHtcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIEJsb2NrRGV2aWNlTWFwcGluZ3M6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgRGV2aWNlTmFtZTogXCJ0ZXN0XCIsXG4gICAgICAgICAgICAgIEViczogRXh0cmFNYXRjaC5vYmplY3RMaWtlPEVicz4oe1xuICAgICAgICAgICAgICAgIFZvbHVtZVNpemU6IDEwLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICAvLyB0aGlzIGlzIGEgd3JvbmcgY29kZSh0eXBlIG1pc21hdGNoIHdpbGwgYmUgZGV0ZWN0ZWQgYW5kIHRzLWVycm9yIHdpbGwgYmUgcmFpc2VkKVxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlKFxuICAgICAgQVdTX0VDMl9JTlNUQU5DRSh7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBCbG9ja0RldmljZU1hcHBpbmdzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIERldmljZU5hbWU6IFwidGVzdFwiLFxuICAgICAgICAgICAgICBFYnM6IEV4dHJhTWF0Y2gub2JqZWN0TGlrZTxFYnM+KHtcbiAgICAgICAgICAgICAgICBWb2x1bWVTaXplOiBcIjEwXCIsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgKiBAcGFyYW0gcGF0dGVybiBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGF0aWMgb2JqZWN0TGlrZTxUIGV4dGVuZHMgeyBba2V5OiBzdHJpbmddOiBhbnkgfT4oXG4gICAgcGF0dGVybjogQWxzb01hdGNoZXI8VD5cbiAgKTogVHlwZWRNYXRjaGVyPFQ+IHtcbiAgICByZXR1cm4gTWF0Y2gub2JqZWN0TGlrZShwYXR0ZXJuKTtcbiAgfVxuICAvKipcbiAgICogU2FtZSBtZXRob2QgYXMgYE1hdGNoLm9iamVjdEVxdWFsc2AgYnV0IHByb3ZpZGVzIHR5cGUgaGludHMgYW5kIHZhbGlkYXRlIHR5cGUgbWF0Y2ggXG4gICBgYGBqc1xuICAgLy8gdGhpcyBpcyBhIHJpZ2h0IGNvZGVcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZShcbiAgICAgIEFXU19FQzJfRUlQKHtcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIC8vIFlvdSBjYW4gbmVzdCBUeXBlZE1hdGNoZXIodXNlIFR5cGVkTWF0Y2hlciBpbnNpZGUgVHlwZWRNYXRjaGVyKVxuICAgICAgICAgIFRhZ3M6IEV4dHJhTWF0Y2guYXJyYXlXaXRoPFRhZ1tdPihbXG4gICAgICAgICAgICBFeHRyYU1hdGNoLm9iamVjdEVxdWFsczxUYWc+KHtcbiAgICAgICAgICAgICAgS2V5OiBcImtleTFcIixcbiAgICAgICAgICAgICAgVmFsdWU6IFwidmFsMVwiLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gdGhpcyBpcyBhIHdyb25nIGNvZGUodHlwZSBtaXNtYXRjaCB3aWxsIGJlIGRldGVjdGVkIGFuZCB0cy1lcnJvciB3aWxsIGJlIHJhaXNlZClcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZShcbiAgICAgIEFXU19FQzJfRUlQKHtcbiAgICAgICAgUHJvcGVydGllczoge1xuICAgICAgICAgIFRhZ3M6IEV4dHJhTWF0Y2guYXJyYXlXaXRoPFRhZ1tdPihbXG4gICAgICAgICAgICBFeHRyYU1hdGNoLm9iamVjdEVxdWFsczxUYWc+KHtcbiAgICAgICAgICAgICAgS2V5OiBcImtleTFcIixcbiAgICAgICAgICAgICAgVmFsdWU6IDEwMCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgKiBAcGFyYW0gcGF0dGVybiBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGF0aWMgb2JqZWN0RXF1YWxzPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IGFueSB9PihcbiAgICBwYXR0ZXJuOiBBbHNvTWF0Y2hlcjxUPlxuICApOiBUeXBlZE1hdGNoZXI8VD4ge1xuICAgIHJldHVybiBNYXRjaC5vYmplY3RFcXVhbHMocGF0dGVybik7XG4gIH1cbiAgLyoqXG4gICAqIFNhbWUgbWV0aG9kIGFzIGBNYXRjaC5ub3RgIGJ1dCBwcm92aWRlcyB0eXBlIGhpbnRzIGFuZCB2YWxpZGF0ZSB0eXBlIG1hdGNoIFxuICAgYGBganNcbiAgICAvLyB0aGlzIGlzIGEgcmlnaHQgY29kZVxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlKFxuICAgICAgQVdTX0VDMl9JTlNUQU5DRSh7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBJbWFnZUlkOiBFeHRyYU1hdGNoLm5vdChcImFtaS0xMjM0NVwiKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICAvLyB0aGlzIGlzIGEgd3JvbmcgY29kZSh0eXBlIG1pc21hdGNoIHdpbGwgYmUgZGV0ZWN0ZWQgYW5kIHRzLWVycm9yIHdpbGwgYmUgcmFpc2VkKVxuICAgIHRlbXBsYXRlLmhhc1Jlc291cmNlKFxuICAgICAgQVdTX0VDMl9JTlNUQU5DRSh7XG4gICAgICAgIFByb3BlcnRpZXM6IHtcbiAgICAgICAgICBJbWFnZUlkOiBFeHRyYU1hdGNoLm5vdCgxMDApLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuICAgYGBgXG4gICAqIFNhbWUgbWV0aG9kIGFzIGBNYXRjaC5ub3RgIGJ1dCBwcm92aWRlcyB0eXBlIGhpbnRzIGFuZCB2YWxpZGF0ZSB0eXBlIG1hdGNoIFxuICAgKiBAcGFyYW0gcGF0dGVybiBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICAvLyBUT0RPOiB3aHkgdGhpcyBleHByZXNzaW9uIGBUIGV4dGVuZHMgbmV2ZXIgPyBuZXZlciA6IFRgIGlzIHJlcXVpcmVkIGJ1dCB0aGlzIGlzIHJlcXVpcmVkXG4gIHN0YXRpYyBub3Q8VD4ocGF0dGVybjogQWxzb01hdGNoZXI8VCBleHRlbmRzIG5ldmVyID8gbmV2ZXIgOiBUPik6IFR5cGVkTWF0Y2hlcjxUPiB7XG4gICAgcmV0dXJuIE1hdGNoLm5vdChwYXR0ZXJuKTtcbiAgfVxuICAvKipcbiAgICogU2FtZSBtZXRob2QgYXMgYE1hdGNoLmV4YWN0YCBidXQgcHJvdmlkZXMgdHlwZSBoaW50cyBhbmQgdmFsaWRhdGUgdHlwZSBtYXRjaCBcbiAgIGBgYGpzXG4gICAgLy8gdGhpcyBpcyBhIHJpZ2h0IGNvZGVcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZShcbiAgICAgIEFXU19FQzJfSU5TVEFOQ0Uoe1xuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgSW5zdGFuY2VUeXBlOiBFeHRyYU1hdGNoLmV4YWN0KFwidDIubWljcm9cIiksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gdGhpcyBpcyBhIHdyb25nIGNvZGUodHlwZSBtaXNtYXRjaCB3aWxsIGJlIGRldGVjdGVkIGFuZCB0cy1lcnJvciB3aWxsIGJlIHJhaXNlZClcbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZShcbiAgICAgIEFXU19FQzJfSU5TVEFOQ0Uoe1xuICAgICAgICBQcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgSW5zdGFuY2VUeXBlOiBFeHRyYU1hdGNoLmV4YWN0KGZhbHNlKSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgIGBgYFxuICAgKiBAcGFyYW0gcGF0dGVybiBcbiAgICogQHJldHVybnMgXG4gICAqL1xuICBzdGF0aWMgZXhhY3Q8VD4ocGF0dGVybjogQWxzb01hdGNoZXI8VCBleHRlbmRzIG5ldmVyID8gbmV2ZXIgOiBUPik6IFR5cGVkTWF0Y2hlcjxUPiB7XG4gICAgcmV0dXJuIE1hdGNoLmV4YWN0KHBhdHRlcm4pO1xuICB9XG59XG4iXX0=
@@ -1,6 +1,6 @@
1
1
  import { Matcher } from "aws-cdk-lib/assertions";
2
2
  type Primitives = string | number | boolean | undefined | null | symbol | bigint | string[] | number[] | boolean[] | bigint[];
3
- export type TypedMatcher<T> = Matcher;
3
+ export type TypedMatcher<T> = Matcher | T;
4
4
  /**
5
5
  * make properties of `T` asignable Matcher recirsively and other arbitrary json objects for primitive type fields
6
6
  */