@decaf-ts/decorator-validation 1.7.13 → 1.7.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/decorator-validation.cjs +69 -46
  2. package/dist/decorator-validation.esm.cjs +69 -46
  3. package/lib/esm/index.d.ts +1 -1
  4. package/lib/esm/index.js +1 -1
  5. package/lib/esm/model/Model.js +6 -4
  6. package/lib/esm/model/validation.js +5 -4
  7. package/lib/esm/validation/Validators/DiffValidator.js +2 -2
  8. package/lib/esm/validation/Validators/EqualsValidator.js +2 -2
  9. package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js +2 -2
  10. package/lib/esm/validation/Validators/GreaterThanValidator.js +2 -2
  11. package/lib/esm/validation/Validators/LessThanOrEqualValidator.js +2 -2
  12. package/lib/esm/validation/Validators/LessThanValidator.js +2 -2
  13. package/lib/esm/validation/Validators/TypeValidator.js +3 -3
  14. package/lib/esm/validation/decorators.d.ts +25 -13
  15. package/lib/esm/validation/decorators.js +51 -31
  16. package/lib/esm/validation/types.d.ts +11 -8
  17. package/lib/esm/validation/types.js +1 -1
  18. package/lib/index.cjs +1 -1
  19. package/lib/index.d.ts +1 -1
  20. package/lib/model/Model.cjs +6 -4
  21. package/lib/model/validation.cjs +5 -4
  22. package/lib/validation/Validators/DiffValidator.cjs +2 -2
  23. package/lib/validation/Validators/EqualsValidator.cjs +2 -2
  24. package/lib/validation/Validators/GreaterThanOrEqualValidator.cjs +2 -2
  25. package/lib/validation/Validators/GreaterThanValidator.cjs +2 -2
  26. package/lib/validation/Validators/LessThanOrEqualValidator.cjs +2 -2
  27. package/lib/validation/Validators/LessThanValidator.cjs +2 -2
  28. package/lib/validation/Validators/TypeValidator.cjs +3 -3
  29. package/lib/validation/decorators.cjs +51 -31
  30. package/lib/validation/decorators.d.ts +25 -13
  31. package/lib/validation/types.cjs +1 -1
  32. package/lib/validation/types.d.ts +11 -8
  33. package/package.json +1 -1
@@ -441,41 +441,49 @@ export function set(clazz, message = DEFAULT_ERROR_MESSAGES.LIST) {
441
441
  * @description Applies the {@link ValidationKeys.EQUALS} validator to ensure the decorated value matches the value of the given property.
442
442
  *
443
443
  * @param {string} propertyToCompare - The name of the property to compare equality against.
444
- * @param {string} [message=DEFAULT_ERROR_MESSAGES.EQUALS] - Custom error message to return if validation fails.
444
+ * @param {ComparisonValidatorOptions} options - Options for the validator.
445
+ * @param {string} [options.label] - The label text displayed in the error message.
446
+ * @param {string} [options.message=DEFAULT_ERROR_MESSAGES.EQUALS] - Custom error message to be returned if validation fails.
445
447
  *
446
448
  * @returns {PropertyDecorator} A property decorator used to register the equality validation metadata.
447
449
  *
448
450
  * @function eq
449
451
  * @category Property Decorators
450
452
  */
451
- export function eq(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.EQUALS) {
452
- const options = {
453
- message: message,
453
+ export function eq(propertyToCompare, options
454
+ // message: string = DEFAULT_ERROR_MESSAGES.EQUALS
455
+ ) {
456
+ const equalsOptions = {
457
+ label: options?.label || propertyToCompare,
458
+ message: options?.message || DEFAULT_ERROR_MESSAGES.EQUALS,
454
459
  [ValidationKeys.EQUALS]: propertyToCompare,
455
460
  description: `defines attribute as equal to ${propertyToCompare}`,
456
461
  };
457
- return validationMetadata(eq, Validation.key(ValidationKeys.EQUALS), { ...options, async: false });
462
+ return validationMetadata(eq, Validation.key(ValidationKeys.EQUALS), { ...equalsOptions, async: false });
458
463
  }
459
464
  /**
460
465
  * @summary Declares that the decorated property must be different from another specified property.
461
466
  * @description Applies the {@link ValidationKeys.DIFF} validator to ensure the decorated value is different from the value of the given property.
462
467
  *
463
468
  * @param {string} propertyToCompare - The name of the property to compare difference against.
464
- * @param {string} [message=DEFAULT_ERROR_MESSAGES.DIFF] - Custom error message to return if validation fails.
469
+ * @param {ComparisonValidatorOptions} options - Options for the validator.
470
+ * @param {string} [options.label] - The label text displayed in the error message.
471
+ * @param {string} [options.message=DEFAULT_ERROR_MESSAGES.DIFF] - Custom error message to be returned if validation fails.
465
472
  *
466
473
  * @returns {PropertyDecorator} A property decorator used to register the difference validation metadata.
467
474
  *
468
475
  * @function diff
469
476
  * @category Property Decorators
470
477
  */
471
- export function diff(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.DIFF) {
472
- const options = {
473
- message: message,
478
+ export function diff(propertyToCompare, options) {
479
+ const diffOptions = {
480
+ label: options?.label || propertyToCompare,
481
+ message: options?.message || DEFAULT_ERROR_MESSAGES.DIFF,
474
482
  [ValidationKeys.DIFF]: propertyToCompare,
475
483
  description: `defines attribute as different to ${propertyToCompare}`,
476
484
  };
477
485
  return validationMetadata(diff, Validation.key(ValidationKeys.DIFF), {
478
- ...options,
486
+ ...diffOptions,
479
487
  async: false,
480
488
  });
481
489
  }
@@ -484,79 +492,91 @@ export function diff(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.DIFF) {
484
492
  * @description Applies the {@link ValidationKeys.LESS_THAN} validator to ensure the decorated value is less than the value of the given property.
485
493
  *
486
494
  * @param {string} propertyToCompare - The name of the property to compare against.
487
- * @param {string} [message=DEFAULT_ERROR_MESSAGES.LESS_THAN] - Custom error message to return if validation fails.
495
+ * @param {ComparisonValidatorOptions} options - Options for the validator.
496
+ * @param {string} [options.label] - The label text displayed in the error message.
497
+ * @param {string} [options.message=DEFAULT_ERROR_MESSAGES.LESS_THAN] - Custom error message to be returned if validation fails.
488
498
  *
489
499
  * @returns {PropertyDecorator} A property decorator used to register the less than validation metadata.
490
500
  *
491
501
  * @function lt
492
502
  * @category Property Decorators
493
503
  */
494
- export function lt(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.LESS_THAN) {
495
- const options = {
496
- message: message,
504
+ export function lt(propertyToCompare, options) {
505
+ const ltOptions = {
506
+ label: options?.label || propertyToCompare,
507
+ message: options?.message || DEFAULT_ERROR_MESSAGES.LESS_THAN,
497
508
  [ValidationKeys.LESS_THAN]: propertyToCompare,
498
509
  description: `defines attribute as less than to ${propertyToCompare}`,
499
510
  };
500
- return validationMetadata(lt, Validation.key(ValidationKeys.LESS_THAN), { ...options, async: false });
511
+ return validationMetadata(lt, Validation.key(ValidationKeys.LESS_THAN), { ...ltOptions, async: false });
501
512
  }
502
513
  /**
503
514
  * @summary Declares that the decorated property must be equal or less than another specified property.
504
515
  * @description Applies the {@link ValidationKeys.LESS_THAN_OR_EQUAL} validator to ensure the decorated value is equal or less than the value of the given property.
505
516
  *
506
517
  * @param {string} propertyToCompare - The name of the property to compare against.
507
- * @param {string} [message=DEFAULT_ERROR_MESSAGES.LESS_THAN_OR_EQUAL] - Custom error message to return if validation fails.
518
+ * @param {ComparisonValidatorOptions} options - Options for the validator.
519
+ * @param {string} [options.label] - The label text displayed in the error message.
520
+ * @param {string} [options.message=DEFAULT_ERROR_MESSAGES.LESS_THAN_OR_EQUAL] - Custom error message to be returned if validation fails.
508
521
  *
509
522
  * @returns {PropertyDecorator} A property decorator used to register the less than or equal validation metadata.
510
523
  *
511
524
  * @function lte
512
525
  * @category Property Decorators
513
526
  */
514
- export function lte(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.LESS_THAN_OR_EQUAL) {
515
- const options = {
516
- message: message,
527
+ export function lte(propertyToCompare, options) {
528
+ const lteOptions = {
529
+ label: options?.label || propertyToCompare,
530
+ message: options?.message || DEFAULT_ERROR_MESSAGES.LESS_THAN_OR_EQUAL,
517
531
  [ValidationKeys.LESS_THAN_OR_EQUAL]: propertyToCompare,
518
532
  description: `defines attribute as less or equal to ${propertyToCompare}`,
519
533
  };
520
- return validationMetadata(lte, Validation.key(ValidationKeys.LESS_THAN_OR_EQUAL), { ...options, async: false });
534
+ return validationMetadata(lte, Validation.key(ValidationKeys.LESS_THAN_OR_EQUAL), { ...lteOptions, async: false });
521
535
  }
522
536
  /**
523
537
  * @summary Declares that the decorated property must be greater than another specified property.
524
538
  * @description Applies the {@link ValidationKeys.GREATER_THAN} validator to ensure the decorated value is greater than the value of the given property.
525
539
  *
526
540
  * @param {string} propertyToCompare - The name of the property to compare against.
527
- * @param {string} [message=DEFAULT_ERROR_MESSAGES.GREATER_THAN] - Custom error message to return if validation fails.
541
+ * @param {ComparisonValidatorOptions} options - Options for the validator.
542
+ * @param {string} [options.label] - The label text displayed in the error message.
543
+ * @param {string} [options.message=DEFAULT_ERROR_MESSAGES.GREATER_THAN] - Custom error message to be returned if validation fails.
528
544
  *
529
545
  * @returns {PropertyDecorator} A property decorator used to register the greater than validation metadata.
530
546
  *
531
547
  * @function gt
532
548
  * @category Property Decorators
533
549
  */
534
- export function gt(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.GREATER_THAN) {
535
- const options = {
536
- message: message,
550
+ export function gt(propertyToCompare, options) {
551
+ const gtOptions = {
552
+ label: options?.label || propertyToCompare,
553
+ message: options?.message || DEFAULT_ERROR_MESSAGES.GREATER_THAN,
537
554
  [ValidationKeys.GREATER_THAN]: propertyToCompare,
538
555
  description: `defines attribute as greater than ${propertyToCompare}`,
539
556
  };
540
- return validationMetadata(gt, Validation.key(ValidationKeys.GREATER_THAN), { ...options, async: false });
557
+ return validationMetadata(gt, Validation.key(ValidationKeys.GREATER_THAN), { ...gtOptions, async: false });
541
558
  }
542
559
  /**
543
560
  * @summary Declares that the decorated property must be equal or greater than another specified property.
544
561
  * @description Applies the {@link ValidationKeys.GREATER_THAN_OR_EQUAL} validator to ensure the decorated value is equal or greater than the value of the given property.
545
562
  *
546
563
  * @param {string} propertyToCompare - The name of the property to compare against.
547
- * @param {string} [message=DEFAULT_ERROR_MESSAGES.GREATER_THAN_OR_EQUAL] - Custom error message to return if validation fails.
564
+ * @param {ComparisonValidatorOptions} options - Options for the validator.
565
+ * @param {string} [options.label] - The label text displayed in the error message.
566
+ * @param {string} [options.message=DEFAULT_ERROR_MESSAGES.GREATER_THAN_OR_EQUAL] - Custom error message to be returned if validation fails.
548
567
  *
549
568
  * @returns {PropertyDecorator} A property decorator used to register the greater than or equal validation metadata.
550
569
  *
551
570
  * @function gte
552
571
  * @category Property Decorators
553
572
  */
554
- export function gte(propertyToCompare, message = DEFAULT_ERROR_MESSAGES.GREATER_THAN_OR_EQUAL) {
555
- const options = {
556
- message: message,
573
+ export function gte(propertyToCompare, options) {
574
+ const gteOptions = {
575
+ label: options?.label || propertyToCompare,
576
+ message: options?.message || DEFAULT_ERROR_MESSAGES.GREATER_THAN_OR_EQUAL,
557
577
  [ValidationKeys.GREATER_THAN_OR_EQUAL]: propertyToCompare,
558
578
  description: `defines attribute as greater or equal to ${propertyToCompare}`,
559
579
  };
560
- return validationMetadata(gte, Validation.key(ValidationKeys.GREATER_THAN_OR_EQUAL), { ...options, async: false });
580
+ return validationMetadata(gte, Validation.key(ValidationKeys.GREATER_THAN_OR_EQUAL), { ...gteOptions, async: false });
561
581
  }
562
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQW1CMUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNmLGtDQUErQjtBQUNoQyxPQUFPLEVBQUUsRUFBRSxFQUFFLDhCQUF5QjtBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLDRCQUF1QjtBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlDQUE0QjtBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUFxQjtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGlDQUE0QjtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQ0FBcUI7QUFFOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUksU0FBYyxFQUFFLEdBQVcsRUFBRSxLQUFRO0lBQ3pFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSztJQUNuQixPQUFPLENBQUMsS0FBYSxFQUFRLEVBQUU7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDO1lBQzdELEtBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxV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QUNILE1BQU0sVUFBVSxHQUFHLENBQ2pCLGlCQUF5QixFQUN6QixVQUFrQixzQkFBc0IsQ0FBQyxxQkFBcUI7SUFFOUQsTUFBTSxPQUFPLEdBQXVDO1FBQ2xELE9BQU8sRUFBRSxPQUFPO1FBQ2hCLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsaUJBQWlCO1FBQ3pELFdBQVcsRUFBRSw0Q0FBNEMsaUJBQWlCLEVBQUU7S0FDN0UsQ0FBQztJQUVGLE9BQU8sa0JBQWtCLENBQ3ZCLEdBQUcsRUFDSCxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUNwRCxFQUFFLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXdCLENBQ25ELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgRGF0ZVZhbGlkYXRvck9wdGlvbnMsXG4gIERpZmZWYWxpZGF0b3JPcHRpb25zLFxuICBFcXVhbHNWYWxpZGF0b3JPcHRpb25zLFxuICBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gIExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgTGlzdFZhbGlkYXRvck9wdGlvbnMsXG4gIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMsXG4gIE1heFZhbGlkYXRvck9wdGlvbnMsXG4gIE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMsXG4gIE1pblZhbGlkYXRvck9wdGlvbnMsXG4gIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zLFxuICBTdGVwVmFsaWRhdG9yT3B0aW9ucyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSBcIi4uL3V0aWxzL2RhdGVzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvRGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEFTWU5DX01FVEFfS0VZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21iaW5lZCBwcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbWV0YWRhdGEgYW5kIGF0dHJpYnV0ZSBtYXJraW5nXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgYm90aCBtYXJrcyBhIHByb3BlcnR5IGFzIGEgbW9kZWwgYXR0cmlidXRlIGFuZCBhc3NpZ25zIG1ldGFkYXRhIHRvIGl0XG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7UHJvcGVydHlEZWNvcmF0b3J9IGRlY29yYXRvciAtIFRoZSBtZXRhZGF0YSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbWV0YWRhdGEga2V5XG4gKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybiB7RnVuY3Rpb259IC0gQ29tYmluZWQgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGlvbk1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGlvbk1ldGFkYXRhPFY+KGRlY29yYXRvcjogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IFYpIHtcbiAgVmFsaWRhdGlvbi5yZWdpc3RlckRlY29yYXRvcihrZXksIGRlY29yYXRvcik7XG4gIHJldHVybiBhcHBseShwcm9wTWV0YWRhdGE8Vj4oa2V5LCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bmMoKSB7XG4gIHJldHVybiAobW9kZWw6IG9iamVjdCk6IHZvaWQgPT4ge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBBU1lOQ19NRVRBX0tFWSkpXG4gICAgICAobW9kZWwgYXMgYW55KVtBU1lOQ19NRVRBX0tFWV0gPSB0cnVlO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGZpZWxkIGFzIHJlcXVpcmVkXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVxdWlyZWQsIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIG51bGwsIG9yIGVtcHR5LlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFUVVJUkVEfS5cbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGNvbW1vbmx5IHVzZWQgYXMgdGhlIGZpcnN0IHZhbGlkYXRpb24gc3RlcCBmb3IgaW1wb3J0YW50IGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1JFUVVJUkVEfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiByZXF1aXJlZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoXCJFbWFpbCBhZGRyZXNzIGlzIG1hbmRhdG9yeVwiKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgY29uc3QgbWV0YTogVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIHJlcXVpcmVkYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtyZXF1aXJlZCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBlbmZvcmNlcyBhIG1pbmltdW0gdmFsdWUgY29uc3RyYWludFxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSwgY2F1c2luZyB2YWxpZGF0aW9uIHRvIGZhaWwgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIG1pbmltdW0uXG4gKiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOfS5cbiAqIFRoaXMgZGVjb3JhdG9yIHdvcmtzIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIGRhdGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkLiBGb3IgZGF0ZXMsIGNhbiBiZSBhIERhdGUgb2JqZWN0IG9yIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiBtaW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAbWluKDApXG4gKiAgIHByaWNlOiBudW1iZXI7XG4gKlxuICogICBAbWluKG5ldyBEYXRlKDIwMjMsIDAsIDEpLCBcIkRhdGUgbXVzdCBiZSBhZnRlciBKYW51YXJ5IDEsIDIwMjNcIilcbiAqICAgcmVsZWFzZURhdGU6IERhdGU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOKTtcbiAgY29uc3QgbWV0YTogTWluVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUlOXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lLCBEYXRlLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gbnVtYmVycyBvciBEYXRlcylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPE1pblZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW21pbiwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4KFxuICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVgpO1xuICBjb25zdCBtZXRhOiBNYXhWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtYXggdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBudW1iZXJzIG9yIERhdGVzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWF4VmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWF4LCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIHN0ZXAgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNTVEVQfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjU1RFUH1cbiAqXG4gKiBAZnVuY3Rpb24gc3RlcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZXAoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuU1RFUFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlNURVApO1xuICBjb25zdCBtZXRhOiBTdGVwVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuU1RFUF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBzdGVwIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX1gLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFN0ZXBWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtzdGVwLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1pbmxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbmxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5fTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCk7XG4gIGNvbnN0IG1ldGE6IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1pbiBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBzdHJpbmdzIG9yIGxpc3RzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWlubGVuZ3RoLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1heGltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWF9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1heGxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heGxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCk7XG4gIGNvbnN0IG1ldGE6IE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBzdHJpbmdzIG9yIGxpc3RzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWF4bGVuZ3RoLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIFJlZ0V4cCBwYXR0ZXJuIHRoZSBwcm9wZXJ0eSBtdXN0IHJlc3BlY3RcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFUVEVSTn1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBVFRFUk59XG4gKlxuICogQGZ1bmN0aW9uIHBhdHRlcm5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXR0ZXJuKFxuICB2YWx1ZTogUmVnRXhwIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlBBVFRFUk5cbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5QQVRURVJOKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBhc3NpZ25zIHRoZSAke3ZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpfSBwYXR0ZXJuIHRvIHRoZSBhdHRyaWJ1dGVgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtwYXR0ZXJuLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gZW1haWxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjRU1BSUx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRU1BSUx9XG4gKlxuICogQGZ1bmN0aW9uIGVtYWlsXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW1haWwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FTUFJTCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5FTUFJTCk7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogREVGQVVMVF9QQVRURVJOUy5FTUFJTC50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IFwibWFya3MgdGhlIGF0dHJpYnV0ZSBhcyBhbiBlbWFpbFwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtlbWFpbCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIFVSTFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNVUkx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBmdW5jdGlvbiB1cmxcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVVJMKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLlVSTC50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IFwibWFya3MgdGhlIGF0dHJpYnV0ZSBhcyBhbiB1cmxcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbdXJsLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZU1ldGFkYXRhIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIGN1c3RvbVR5cGVzOiAoc3RyaW5nIHwgKCgpID0+IHN0cmluZykpW10gfCBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBFbmZvcmNlcyB0eXBlIHZlcmlmaWNhdGlvblxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNUWVBFfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmd9IHR5cGVzIGFjY2VwdGVkIHR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNUWVBFfVxuICpcbiAqIEBmdW5jdGlvbiB0eXBlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZShcbiAgdHlwZXM6IChzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSlbXSB8IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEVcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5UWVBFKTtcbiAgY29uc3QgbWV0YTogVHlwZU1ldGFkYXRhID0ge1xuICAgIGN1c3RvbVR5cGVzOiB0eXBlcyxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGRlc2NyaXB0aW9uOiBcImRlZmluZXMgdGhlIGFjY2VwdGVkIHR5cGVzIGZvciB0aGUgYXR0cmlidXRlXCIsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8VHlwZU1ldGFkYXRhPixcbiAgICAgIGFyZ3M6IFt0eXBlLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZU1ldGFkYXRhIGV4dGVuZHMgRGF0ZVZhbGlkYXRvck9wdGlvbnMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBIYW5kbGVyIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNEQVRFfVxuICpcbiAqIFdpbGwgZW5mb3JjZSBzZXJpYWxpemF0aW9uIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgZm9ybWF0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBhY2NlcHRlZCBmb3JtYXQgYWNjb3JkaW5nIHRvIHtAbGluayBmb3JtYXREYXRlfVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqXG4gKiBAZnVuY3Rpb24gZGF0ZVxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlKFxuICBmb3JtYXQ6IHN0cmluZyA9IFwiZGQvTU0veXl5eVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRBVEVcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5EQVRFKTtcbiAgY29uc3QgbWV0YTogRGF0ZU1ldGFkYXRhID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdOiBmb3JtYXQsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW0RhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgYSBkYXRlIHdpdGggdGhlIGZvcm1hdCAke2Zvcm1hdH1gLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgZnVuY3Rpb24gZGF0ZURlYyh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByb3BlcnR5S2V5PzogYW55KTogYW55IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgc2V0KHRoaXM6IGFueSwgbmV3VmFsdWU6IHN0cmluZyB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgcHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci5jb25maWd1cmFibGUpXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gdmFsdWVzLmdldCh0aGlzKSxcbiAgICAgICAgICAgIHNldDogKG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWw6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFsID0gcGFyc2VEYXRlKGZvcm1hdCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgdmFsKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihzZihcIkZhaWxlZCB0byBwYXJzZSBkYXRlOiB7MH1cIiwgZS5tZXNzYWdlIHx8IGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpc1twcm9wZXJ0eUtleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhKGRhdGUsIGtleSwgbWV0YSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSkuZGVmaW5lKGRhdGVEZWMpLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUGFzc3dvcmQgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFTU1dPUkR9XG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IFtwYXR0ZXJuXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9QQVRURVJOUyNDSEFSOF9PTkVfT0ZfRUFDSH1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBU1NXT1JEfVxuICpcbiAqIEBmdW5jdGlvbiBwYXNzd29yZFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXNzd29yZChcbiAgcGF0dGVybjogUmVnRXhwID0gREVGQVVMVF9QQVRURVJOUy5QQVNTV09SRC5DSEFSOF9PTkVfT0ZfRUFDSCxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBwYXR0ZXJuLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGF0dHJpYnV0ZSBhcyBhIHBhc3N3b3JkYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YSxcbiAgICAgIGFyZ3M6IFtwYXNzd29yZCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RNZXRhZGF0YSBleHRlbmRzIExpc3RWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZTogXCJBcnJheVwiIHwgXCJTZXRcIjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBMaXN0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIEFsc28gc2V0cyB0aGUge0BsaW5rIHR5cGV9IHRvIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xsZWN0aW9uXSBUaGUgY29sbGVjdGlvbiBiZWluZyB1c2VkLiBkZWZhdWx0cyB0byBBcnJheVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBmdW5jdGlvbiBsaXN0XG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNsYXp6OlxuICAgIHwgQ29uc3RydWN0b3I8YW55PlxuICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgfCAoQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSlbXSxcbiAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCk7XG4gIGNvbnN0IG1ldGE6IExpc3RNZXRhZGF0YSA9IHtcbiAgICBjbGF6ejogKEFycmF5LmlzQXJyYXkoY2xhenopXG4gICAgICA/IGNsYXp6Lm1hcCgoYykgPT4gKGMubmFtZSA/IGMubmFtZSA6IGMpKVxuICAgICAgOiBbY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6el0pIGFzIChcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgIClbXSxcbiAgICB0eXBlOiBjb2xsZWN0aW9uLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIGEgJHtjb2xsZWN0aW9ufSBvZiAkeyhjbGF6eiBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4pLm5hbWV9YCxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhLFxuICAgICAgYXJnczogW2xpc3QsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXQgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gV3JhcHBlciBmb3Ige0BsaW5rIGxpc3R9IHdpdGggdGhlICdTZXQnIENvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIHNldFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCB0byBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRVFVQUxTfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGVxdWFsaXR5IGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFNdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBlcXVhbGl0eSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBlcVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVxKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU1xuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuRVFVQUxTXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGVxLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkVRVUFMUyksXG4gICAgeyAuLi5vcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRElGRn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgZGlmZmVyZW5jZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGRpZmZlcmVuY2UgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZGlmZlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmYoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRlxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IERpZmZWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkRJRkZdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGRpZmZlcmVudCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGRpZmYsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRElGRiksXG4gICAge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGFzeW5jOiBmYWxzZSxcbiAgICB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlY2xhcmVzIHRoYXQgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IGJlIGxlc3MgdGhhbiBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuTEVTU19USEFOfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5VG9Db21wYXJlIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byByZXR1cm4gaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGxlc3MgdGhhbiB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBsdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx0KFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTlxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5dOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGxlc3MgdGhhbiB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGx0LFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTiksXG4gICAgeyAuLi5vcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBsZXNzIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gbHRlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHRlKFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTFxuKSB7XG4gIGNvbnN0IG9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBsZXNzIG9yIGVxdWFsIHRvICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgbHRlLFxuICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCksXG4gICAgeyAuLi5vcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gKlxuICogQHJldHVybnMge1Byb3BlcnR5RGVjb3JhdG9yfSBBIHByb3BlcnR5IGRlY29yYXRvciB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBncmVhdGVyIHRoYW4gdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZ3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndChcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5cbikge1xuICBjb25zdCBvcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBncmVhdGVyIHRoYW4gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBndCxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4pLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUx9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMXSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHJldHVybiBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGd0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd0ZShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxcbikge1xuICBjb25zdCBvcHRpb25zOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZ3JlYXRlciBvciBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGd0ZSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwpLFxuICAgIHsgLi4ub3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG4iXX0=
582
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2RlY29yYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQW9CMUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixnQkFBZ0IsRUFDaEIsY0FBYyxHQUNmLGtDQUErQjtBQUNoQyxPQUFPLEVBQUUsRUFBRSxFQUFFLDhCQUF5QjtBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLDRCQUF1QjtBQUMzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGlDQUE0QjtBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLHdCQUFxQjtBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGlDQUE0QjtBQUNqRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQ0FBcUI7QUFFOUM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUksU0FBYyxFQUFFLEdBQVcsRUFBRSxLQUFRO0lBQ3pFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFJLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSztJQUNuQixPQUFPLENBQUMsS0FBYSxFQUFRLEVBQUU7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDO1lBQzdELEtBQWEsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxV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QUksaUJBQWlCO1FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLHNCQUFzQixDQUFDLFlBQVk7UUFDaEUsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLEVBQUUsaUJBQWlCO1FBQ2hELFdBQVcsRUFBRSxxQ0FBcUMsaUJBQWlCLEVBQUU7S0FDdEUsQ0FBQztJQUVGLE9BQU8sa0JBQWtCLENBQ3ZCLEVBQUUsRUFDRixVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFDM0MsRUFBRSxHQUFHLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUF3QixDQUNyRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUNqQixpQkFBeUIsRUFDekIsT0FBa0U7SUFFbEUsTUFBTSxVQUFVLEdBQXVDO1FBQ3JELEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLGlCQUFpQjtRQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQyxxQkFBcUI7UUFDekUsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsRUFBRSxpQkFBaUI7UUFDekQsV0FBVyxFQUFFLDRDQUE0QyxpQkFBaUIsRUFBRTtLQUM3RSxDQUFDO0lBRUYsT0FBTyxrQkFBa0IsQ0FDdkIsR0FBRyxFQUNILFVBQVUsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLEVBQ3BELEVBQUUsR0FBRyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBd0IsQ0FDdEQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucyxcbiAgRGF0ZVZhbGlkYXRvck9wdGlvbnMsXG4gIERpZmZWYWxpZGF0b3JPcHRpb25zLFxuICBFcXVhbHNWYWxpZGF0b3JPcHRpb25zLFxuICBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zLFxuICBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMsXG4gIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMsXG4gIExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyxcbiAgTGlzdFZhbGlkYXRvck9wdGlvbnMsXG4gIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMsXG4gIE1heFZhbGlkYXRvck9wdGlvbnMsXG4gIE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMsXG4gIE1pblZhbGlkYXRvck9wdGlvbnMsXG4gIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zLFxuICBTdGVwVmFsaWRhdG9yT3B0aW9ucyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyxcbiAgREVGQVVMVF9QQVRURVJOUyxcbiAgVmFsaWRhdGlvbktleXMsXG59IGZyb20gXCIuL1ZhbGlkYXRvcnMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbC90eXBlc1wiO1xuaW1wb3J0IHsgcGFyc2VEYXRlIH0gZnJvbSBcIi4uL3V0aWxzL2RhdGVzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiLi4vdXRpbHMvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiLi4vdXRpbHMvRGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IEFTWU5DX01FVEFfS0VZIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21iaW5lZCBwcm9wZXJ0eSBkZWNvcmF0b3IgZmFjdG9yeSBmb3IgbWV0YWRhdGEgYW5kIGF0dHJpYnV0ZSBtYXJraW5nXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgZGVjb3JhdG9yIHRoYXQgYm90aCBtYXJrcyBhIHByb3BlcnR5IGFzIGEgbW9kZWwgYXR0cmlidXRlIGFuZCBhc3NpZ25zIG1ldGFkYXRhIHRvIGl0XG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7UHJvcGVydHlEZWNvcmF0b3J9IGRlY29yYXRvciAtIFRoZSBtZXRhZGF0YSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgbWV0YWRhdGEga2V5XG4gKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG1ldGFkYXRhIHZhbHVlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9wZXJ0eVxuICogQHJldHVybiB7RnVuY3Rpb259IC0gQ29tYmluZWQgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKiBAZnVuY3Rpb24gdmFsaWRhdGlvbk1ldGFkYXRhXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGlvbk1ldGFkYXRhPFY+KGRlY29yYXRvcjogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IFYpIHtcbiAgVmFsaWRhdGlvbi5yZWdpc3RlckRlY29yYXRvcihrZXksIGRlY29yYXRvcik7XG4gIHJldHVybiBhcHBseShwcm9wTWV0YWRhdGE8Vj4oa2V5LCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXN5bmMoKSB7XG4gIHJldHVybiAobW9kZWw6IG9iamVjdCk6IHZvaWQgPT4ge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZGVsLCBBU1lOQ19NRVRBX0tFWSkpXG4gICAgICAobW9kZWwgYXMgYW55KVtBU1lOQ19NRVRBX0tFWV0gPSB0cnVlO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGZpZWxkIGFzIHJlcXVpcmVkXG4gKiBAc3VtbWFyeSBNYXJrcyB0aGUgcHJvcGVydHkgYXMgcmVxdWlyZWQsIGNhdXNpbmcgdmFsaWRhdGlvbiB0byBmYWlsIGlmIHRoZSBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsIG51bGwsIG9yIGVtcHR5LlxuICogVmFsaWRhdG9ycyB0byB2YWxpZGF0ZSBhIGRlY29yYXRlZCBwcm9wZXJ0eSBtdXN0IHVzZSBrZXkge0BsaW5rIFZhbGlkYXRpb25LZXlzI1JFUVVJUkVEfS5cbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGNvbW1vbmx5IHVzZWQgYXMgdGhlIGZpcnN0IHZhbGlkYXRpb24gc3RlcCBmb3IgaW1wb3J0YW50IGZpZWxkcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1JFUVVJUkVEfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiByZXF1aXJlZFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciB7XG4gKiAgIEByZXF1aXJlZCgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAcmVxdWlyZWQoXCJFbWFpbCBhZGRyZXNzIGlzIG1hbmRhdG9yeVwiKVxuICogICBlbWFpbDogc3RyaW5nO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlJFUVVJUkVEKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgY29uc3QgbWV0YTogVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIHJlcXVpcmVkYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtyZXF1aXJlZCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBlbmZvcmNlcyBhIG1pbmltdW0gdmFsdWUgY29uc3RyYWludFxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSwgY2F1c2luZyB2YWxpZGF0aW9uIHRvIGZhaWwgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIG1pbmltdW0uXG4gKiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOfS5cbiAqIFRoaXMgZGVjb3JhdG9yIHdvcmtzIHdpdGggbnVtZXJpYyB2YWx1ZXMgYW5kIGRhdGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZSB8IHN0cmluZ30gdmFsdWUgLSBUaGUgbWluaW11bSB2YWx1ZSBhbGxvd2VkLiBGb3IgZGF0ZXMsIGNhbiBiZSBhIERhdGUgb2JqZWN0IG9yIGEgc3RyaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdmFsaWRhdGlvbiBmYWlscy4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjTUlOfVxuICogQHJldHVybiB7UHJvcGVydHlEZWNvcmF0b3J9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gY2xhc3MgcHJvcGVydGllc1xuICpcbiAqIEBmdW5jdGlvbiBtaW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAbWluKDApXG4gKiAgIHByaWNlOiBudW1iZXI7XG4gKlxuICogICBAbWluKG5ldyBEYXRlKDIwMjMsIDAsIDEpLCBcIkRhdGUgbXVzdCBiZSBhZnRlciBKYW51YXJ5IDEsIDIwMjNcIilcbiAqICAgcmVsZWFzZURhdGU6IERhdGU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbihcbiAgdmFsdWU6IG51bWJlciB8IERhdGUgfCBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTUlOXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOKTtcbiAgY29uc3QgbWV0YTogTWluVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuTUlOXTogdmFsdWUsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW051bWJlci5uYW1lLCBEYXRlLm5hbWVdLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX0gKGFwcGxpZXMgdG8gbnVtYmVycyBvciBEYXRlcylgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPE1pblZhbGlkYXRvck9wdGlvbnM+LFxuICAgICAgYXJnczogW21pbiwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyIHwgRGF0ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWH1cbiAqXG4gKiBAZnVuY3Rpb24gbWF4XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4KFxuICB2YWx1ZTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZyxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5NQVgpO1xuICBjb25zdCBtZXRhOiBNYXhWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbTnVtYmVyLm5hbWUsIERhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBtYXggdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBudW1iZXJzIG9yIERhdGVzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWF4VmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWF4LCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIHN0ZXAgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eVxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNTVEVQfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjU1RFUH1cbiAqXG4gKiBAZnVuY3Rpb24gc3RlcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZXAoXG4gIHZhbHVlOiBudW1iZXIsXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuU1RFUFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlNURVApO1xuICBjb25zdCBtZXRhOiBTdGVwVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBbVmFsaWRhdGlvbktleXMuU1RFUF06IHZhbHVlLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtOdW1iZXIubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBzdGVwIG9mIHRoZSBhdHRyaWJ1dGUgYXMgJHt2YWx1ZX1gLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFN0ZXBWYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtzdGVwLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1pbmltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUlOX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01JTl9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1pbmxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1pbmxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NSU5fTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCk7XG4gIGNvbnN0IG1ldGE6IE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1pbiBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBzdHJpbmdzIG9yIGxpc3RzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWlubGVuZ3RoLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIG1heGltdW0gbGVuZ3RoIGZvciB0aGUgcHJvcGVydHlcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjTUFYX0xFTkdUSH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI01BWF9MRU5HVEh9XG4gKlxuICogQGZ1bmN0aW9uIG1heGxlbmd0aFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heGxlbmd0aChcbiAgdmFsdWU6IG51bWJlcixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5NQVhfTEVOR1RIXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCk7XG4gIGNvbnN0IG1ldGE6IE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdOiB2YWx1ZSxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIHR5cGVzOiBbU3RyaW5nLm5hbWUsIEFycmF5Lm5hbWUsIFNldC5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgdGhlIG1heCBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSBhcyAke3ZhbHVlfSAoYXBwbGllcyB0byBzdHJpbmdzIG9yIGxpc3RzKWAsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8TWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbbWF4bGVuZ3RoLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIFJlZ0V4cCBwYXR0ZXJuIHRoZSBwcm9wZXJ0eSBtdXN0IHJlc3BlY3RcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFUVEVSTn1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBVFRFUk59XG4gKlxuICogQGZ1bmN0aW9uIHBhdHRlcm5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXR0ZXJuKFxuICB2YWx1ZTogUmVnRXhwIHwgc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlBBVFRFUk5cbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5QQVRURVJOKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOlxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBhc3NpZ25zIHRoZSAke3ZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpfSBwYXR0ZXJuIHRvIHRoZSBhdHRyaWJ1dGVgLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtwYXR0ZXJuLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgcHJvcGVydHkgYXMgYW4gZW1haWxcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjRU1BSUx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjRU1BSUx9XG4gKlxuICogQGZ1bmN0aW9uIGVtYWlsXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW1haWwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FTUFJTCkge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5FTUFJTCk7XG4gIGNvbnN0IG1ldGE6IFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXTogREVGQVVMVF9QQVRURVJOUy5FTUFJTC50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IFwibWFya3MgdGhlIGF0dHJpYnV0ZSBhcyBhbiBlbWFpbFwiLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhPFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zPixcbiAgICAgIGFyZ3M6IFtlbWFpbCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHByb3BlcnR5IGFzIGFuIFVSTFxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNVUkx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjVVJMfVxuICpcbiAqIEBmdW5jdGlvbiB1cmxcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmwobWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5VUkwpIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuVVJMKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBERUZBVUxUX1BBVFRFUk5TLlVSTC50b1N0cmluZygpLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgdHlwZXM6IFtTdHJpbmcubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IFwibWFya3MgdGhlIGF0dHJpYnV0ZSBhcyBhbiB1cmxcIixcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YTxQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucz4sXG4gICAgICBhcmdzOiBbdXJsLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZU1ldGFkYXRhIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIGN1c3RvbVR5cGVzOiAoc3RyaW5nIHwgKCgpID0+IHN0cmluZykpW10gfCBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBFbmZvcmNlcyB0eXBlIHZlcmlmaWNhdGlvblxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNUWVBFfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW10gfCBzdHJpbmd9IHR5cGVzIGFjY2VwdGVkIHR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIHRoZSBlcnJvciBtZXNzYWdlLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNUWVBFfVxuICpcbiAqIEBmdW5jdGlvbiB0eXBlXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZShcbiAgdHlwZXM6IChzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSlbXSB8IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEVcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5UWVBFKTtcbiAgY29uc3QgbWV0YTogVHlwZU1ldGFkYXRhID0ge1xuICAgIGN1c3RvbVR5cGVzOiB0eXBlcyxcbiAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgIGRlc2NyaXB0aW9uOiBcImRlZmluZXMgdGhlIGFjY2VwdGVkIHR5cGVzIGZvciB0aGUgYXR0cmlidXRlXCIsXG4gICAgYXN5bmM6IGZhbHNlLFxuICB9O1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3Ioa2V5KVxuICAgIC5kZWZpbmUoe1xuICAgICAgZGVjb3JhdG9yOiB2YWxpZGF0aW9uTWV0YWRhdGE8VHlwZU1ldGFkYXRhPixcbiAgICAgIGFyZ3M6IFt0eXBlLCBrZXksIG1ldGFdLFxuICAgIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZU1ldGFkYXRhIGV4dGVuZHMgRGF0ZVZhbGlkYXRvck9wdGlvbnMge1xuICB0eXBlczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBIYW5kbGVyIERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIFZhbGlkYXRvcnMgdG8gdmFsaWRhdGUgYSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCB1c2Uga2V5IHtAbGluayBWYWxpZGF0aW9uS2V5cyNEQVRFfVxuICpcbiAqIFdpbGwgZW5mb3JjZSBzZXJpYWxpemF0aW9uIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgZm9ybWF0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCBhY2NlcHRlZCBmb3JtYXQgYWNjb3JkaW5nIHRvIHtAbGluayBmb3JtYXREYXRlfVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSB0aGUgZXJyb3IgbWVzc2FnZS4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVJST1JfTUVTU0FHRVMjREFURX1cbiAqXG4gKiBAZnVuY3Rpb24gZGF0ZVxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlKFxuICBmb3JtYXQ6IHN0cmluZyA9IFwiZGQvTU0veXl5eVwiLFxuICBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRBVEVcbikge1xuICBjb25zdCBrZXkgPSBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5EQVRFKTtcbiAgY29uc3QgbWV0YTogRGF0ZU1ldGFkYXRhID0ge1xuICAgIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdOiBmb3JtYXQsXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW0RhdGUubmFtZV0sXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIHRoZSBhdHRyaWJ1dGUgYXMgYSBkYXRlIHdpdGggdGhlIGZvcm1hdCAke2Zvcm1hdH1gLFxuICAgIGFzeW5jOiBmYWxzZSxcbiAgfTtcbiAgZnVuY3Rpb24gZGF0ZURlYyh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHByb3BlcnR5S2V5PzogYW55KTogYW55IHtcbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgc2V0KHRoaXM6IGFueSwgbmV3VmFsdWU6IHN0cmluZyB8IERhdGUpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywgcHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAoIWRlc2NyaXB0b3IgfHwgZGVzY3JpcHRvci5jb25maWd1cmFibGUpXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gdmFsdWVzLmdldCh0aGlzKSxcbiAgICAgICAgICAgIHNldDogKG5ld1ZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWw6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFsID0gcGFyc2VEYXRlKGZvcm1hdCwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgdmFsKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihzZihcIkZhaWxlZCB0byBwYXJzZSBkYXRlOiB7MH1cIiwgZS5tZXNzYWdlIHx8IGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpc1twcm9wZXJ0eUtleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH0sXG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhKGRhdGUsIGtleSwgbWV0YSkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gIH1cbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSkuZGVmaW5lKGRhdGVEZWMpLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUGFzc3dvcmQgSGFuZGxlciBEZWNvcmF0b3JcbiAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0b3JzIHRvIHZhbGlkYXRlIGEgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgdXNlIGtleSB7QGxpbmsgVmFsaWRhdGlvbktleXMjUEFTU1dPUkR9XG4gKlxuICogQHBhcmFtIHtSZWdFeHB9IFtwYXR0ZXJuXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9QQVRURVJOUyNDSEFSOF9PTkVfT0ZfRUFDSH1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gdGhlIGVycm9yIG1lc3NhZ2UuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI1BBU1NXT1JEfVxuICpcbiAqIEBmdW5jdGlvbiBwYXNzd29yZFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXNzd29yZChcbiAgcGF0dGVybjogUmVnRXhwID0gREVGQVVMVF9QQVRURVJOUy5QQVNTV09SRC5DSEFSOF9PTkVfT0ZfRUFDSCxcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5QQVNTV09SRFxuKSB7XG4gIGNvbnN0IGtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEKTtcbiAgY29uc3QgbWV0YTogUGF0dGVyblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dOiBwYXR0ZXJuLnRvU3RyaW5nKCksXG4gICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICB0eXBlczogW1N0cmluZy5uYW1lXSxcbiAgICBkZXNjcmlwdGlvbjogYGF0dHJpYnV0ZSBhcyBhIHBhc3N3b3JkYCxcbiAgICBhc3luYzogZmFsc2UsXG4gIH07XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihrZXkpXG4gICAgLmRlZmluZSh7XG4gICAgICBkZWNvcmF0b3I6IHZhbGlkYXRpb25NZXRhZGF0YSxcbiAgICAgIGFyZ3M6IFtwYXNzd29yZCwga2V5LCBtZXRhXSxcbiAgICB9KVxuICAgIC5hcHBseSgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RNZXRhZGF0YSBleHRlbmRzIExpc3RWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZTogXCJBcnJheVwiIHwgXCJTZXRcIjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBMaXN0IERlY29yYXRvclxuICogQGRlc2NyaXB0aW9uIEFsc28gc2V0cyB0aGUge0BsaW5rIHR5cGV9IHRvIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9uXG4gKlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yfSBjbGF6elxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xsZWN0aW9uXSBUaGUgY29sbGVjdGlvbiBiZWluZyB1c2VkLiBkZWZhdWx0cyB0byBBcnJheVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXSBkZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyNMSVNUfVxuICpcbiAqIEBmdW5jdGlvbiBsaXN0XG4gKlxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3QoXG4gIGNsYXp6OlxuICAgIHwgQ29uc3RydWN0b3I8YW55PlxuICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgfCAoQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSlbXSxcbiAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIixcbiAgbWVzc2FnZTogc3RyaW5nID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MSVNUXG4pIHtcbiAgY29uc3Qga2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuTElTVCk7XG4gIGNvbnN0IG1ldGE6IExpc3RNZXRhZGF0YSA9IHtcbiAgICBjbGF6ejogKEFycmF5LmlzQXJyYXkoY2xhenopXG4gICAgICA/IGNsYXp6Lm1hcCgoYykgPT4gKGMubmFtZSA/IGMubmFtZSA6IGMpKVxuICAgICAgOiBbY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6el0pIGFzIChcbiAgICAgIHwgc3RyaW5nXG4gICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgIClbXSxcbiAgICB0eXBlOiBjb2xsZWN0aW9uLFxuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYXN5bmM6IGZhbHNlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyB0aGUgYXR0cmlidXRlIGFzIGEgJHtjb2xsZWN0aW9ufSBvZiAkeyhjbGF6eiBhcyBNb2RlbENvbnN0cnVjdG9yPGFueT4pLm5hbWV9YCxcbiAgfTtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKGtleSlcbiAgICAuZGVmaW5lKHtcbiAgICAgIGRlY29yYXRvcjogdmFsaWRhdGlvbk1ldGFkYXRhLFxuICAgICAgYXJnczogW2xpc3QsIGtleSwgbWV0YV0sXG4gICAgfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBTZXQgRGVjb3JhdG9yXG4gKiBAZGVzY3JpcHRpb24gV3JhcHBlciBmb3Ige0BsaW5rIGxpc3R9IHdpdGggdGhlICdTZXQnIENvbGxlY3Rpb25cbiAqXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3J9IGNsYXp6XG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0xJU1R9XG4gKlxuICogQGZ1bmN0aW9uIHNldFxuICpcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQoXG4gIGNsYXp6OiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuTElTVFxuKSB7XG4gIHJldHVybiBsaXN0KGNsYXp6LCBcIlNldFwiLCBtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCB0byBhbm90aGVyIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBkZXNjcmlwdGlvbiBBcHBsaWVzIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXMuRVFVQUxTfSB2YWxpZGF0b3IgdG8gZW5zdXJlIHRoZSBkZWNvcmF0ZWQgdmFsdWUgbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGVxdWFsaXR5IGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU10gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZXF1YWxpdHkgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAqXG4gKiBAZnVuY3Rpb24gZXFcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9uczogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuICAvLyBtZXNzYWdlOiBzdHJpbmcgPSBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkVRVUFMU1xuKSB7XG4gIGNvbnN0IGVxdWFsc09wdGlvbnM6IEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5FUVVBTFMsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkVRVUFMU106IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBlcSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5FUVVBTFMpLFxuICAgIHsgLi4uZXF1YWxzT3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZGlmZmVyZW50IGZyb20gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkRJRkZ9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGRpZmZlcmVuY2UgYWdhaW5zdC5cbiAqIEBwYXJhbSB7Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgdmFsaWRhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmxhYmVsXSAtIFRoZSBsYWJlbCB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5tZXNzYWdlPURFRkFVTFRfRVJST1JfTUVTU0FHRVMuRElGRl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgZGlmZmVyZW5jZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBkaWZmXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZihcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9uczogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGRpZmZPcHRpb25zOiBEaWZmVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkRJRkYsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkRJRkZdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGRpZmZlcmVudCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGRpZmYsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuRElGRiksXG4gICAge1xuICAgICAgLi4uZGlmZk9wdGlvbnMsXG4gICAgICBhc3luYzogZmFsc2UsXG4gICAgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTn0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgbGVzcyB0aGFuIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGx0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbHQoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBsdE9wdGlvbnM6IExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyA9IHtcbiAgICBsYWJlbDogb3B0aW9ucz8ubGFiZWwgfHwgcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgbWVzc2FnZTogb3B0aW9ucz8ubWVzc2FnZSB8fCBERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTixcbiAgICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXTogcHJvcGVydHlUb0NvbXBhcmUsXG4gICAgZGVzY3JpcHRpb246IGBkZWZpbmVzIGF0dHJpYnV0ZSBhcyBsZXNzIHRoYW4gdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBsdCxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4pLFxuICAgIHsgLi4ubHRPcHRpb25zLCBhc3luYzogZmFsc2UgfSBhcyBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEZWNsYXJlcyB0aGF0IHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYW5vdGhlciBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZGVzY3JpcHRpb24gQXBwbGllcyB0aGUge0BsaW5rIFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTH0gdmFsaWRhdG9yIHRvIGVuc3VyZSB0aGUgZGVjb3JhdGVkIHZhbHVlIGlzIGVxdWFsIG9yIGxlc3MgdGhhbiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eVRvQ29tcGFyZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjb21wYXJlIGFnYWluc3QuXG4gKiBAcGFyYW0ge0NvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zfSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5sYWJlbF0gLSBUaGUgbGFiZWwgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubWVzc2FnZT1ERUZBVUxUX0VSUk9SX01FU1NBR0VTLkxFU1NfVEhBTl9PUl9FUVVBTF0gLSBDdXN0b20gZXJyb3IgbWVzc2FnZSB0byBiZSByZXR1cm5lZCBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9wZXJ0eURlY29yYXRvcn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgdXNlZCB0byByZWdpc3RlciB0aGUgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gKlxuICogQGZ1bmN0aW9uIGx0ZVxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGx0ZShcbiAgcHJvcGVydHlUb0NvbXBhcmU6IHN0cmluZyxcbiAgb3B0aW9uczogT21pdDxDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucywgXCJhc3luY1wiIHwgXCJkZXNjcmlwdGlvblwiPlxuKSB7XG4gIGNvbnN0IGx0ZU9wdGlvbnM6IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gICAgW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgbGVzcyBvciBlcXVhbCB0byAke3Byb3BlcnR5VG9Db21wYXJlfWAsXG4gIH07XG5cbiAgcmV0dXJuIHZhbGlkYXRpb25NZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+KFxuICAgIGx0ZSxcbiAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU5fT1JfRVFVQUwpLFxuICAgIHsgLi4ubHRlT3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU59IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5dIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBndFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGd0KFxuICBwcm9wZXJ0eVRvQ29tcGFyZTogc3RyaW5nLFxuICBvcHRpb25zOiBPbWl0PENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zLCBcImFzeW5jXCIgfCBcImRlc2NyaXB0aW9uXCI+XG4pIHtcbiAgY29uc3QgZ3RPcHRpb25zOiBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgPSB7XG4gICAgbGFiZWw6IG9wdGlvbnM/LmxhYmVsIHx8IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIG1lc3NhZ2U6IG9wdGlvbnM/Lm1lc3NhZ2UgfHwgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU4sXG4gICAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl06IHByb3BlcnR5VG9Db21wYXJlLFxuICAgIGRlc2NyaXB0aW9uOiBgZGVmaW5lcyBhdHRyaWJ1dGUgYXMgZ3JlYXRlciB0aGFuICR7cHJvcGVydHlUb0NvbXBhcmV9YCxcbiAgfTtcblxuICByZXR1cm4gdmFsaWRhdGlvbk1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT4oXG4gICAgZ3QsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOKSxcbiAgICB7IC4uLmd0T3B0aW9ucywgYXN5bmM6IGZhbHNlIH0gYXMgVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGVjbGFyZXMgdGhhdCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIGFub3RoZXIgc3BlY2lmaWVkIHByb3BlcnR5LlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgdGhlIHtAbGluayBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUx9IHZhbGlkYXRvciB0byBlbnN1cmUgdGhlIGRlY29yYXRlZCB2YWx1ZSBpcyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlUb0NvbXBhcmUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICogQHBhcmFtIHtDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGFiZWxdIC0gVGhlIGxhYmVsIHRleHQgZGlzcGxheWVkIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm1lc3NhZ2U9REVGQVVMVF9FUlJPUl9NRVNTQUdFUy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmUgcmV0dXJuZWQgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvcGVydHlEZWNvcmF0b3J9IEEgcHJvcGVydHkgZGVjb3JhdG9yIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICpcbiAqIEBmdW5jdGlvbiBndGVcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBndGUoXG4gIHByb3BlcnR5VG9Db21wYXJlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IE9taXQ8Q29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMsIFwiYXN5bmNcIiB8IFwiZGVzY3JpcHRpb25cIj5cbikge1xuICBjb25zdCBndGVPcHRpb25zOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zID0ge1xuICAgIGxhYmVsOiBvcHRpb25zPy5sYWJlbCB8fCBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBtZXNzYWdlOiBvcHRpb25zPy5tZXNzYWdlIHx8IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxuICAgIFtWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBwcm9wZXJ0eVRvQ29tcGFyZSxcbiAgICBkZXNjcmlwdGlvbjogYGRlZmluZXMgYXR0cmlidXRlIGFzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gJHtwcm9wZXJ0eVRvQ29tcGFyZX1gLFxuICB9O1xuXG4gIHJldHVybiB2YWxpZGF0aW9uTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPihcbiAgICBndGUsXG4gICAgVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMKSxcbiAgICB7IC4uLmd0ZU9wdGlvbnMsIGFzeW5jOiBmYWxzZSB9IGFzIFZhbGlkYXRpb25NZXRhZGF0YVxuICApO1xufVxuIl19
@@ -161,12 +161,12 @@ export interface URLValidatorOptions extends ValidatorOptions {
161
161
  * @description Type validation options interface
162
162
  * @summary Defines options for type validation, specifying allowed types
163
163
  * @interface TypeValidatorOptions
164
- * @property {(string|string[]|{ name: string })} types - Specifies the allowed data types
164
+ * @property {(string|string[]|{ name: string })} type - Specifies the allowed data types
165
165
  * @memberOf module:decorator-validation
166
166
  * @category Validation
167
167
  */
168
168
  export interface TypeValidatorOptions extends ValidatorOptions {
169
- types: string | string[] | {
169
+ type: string | string[] | {
170
170
  name: string;
171
171
  };
172
172
  customTypes?: (string | (() => string))[];
@@ -276,21 +276,24 @@ export interface UniqueValidatorOptions extends ValidatorOptions {
276
276
  export interface DateValidatorOptions extends ValidatorOptions {
277
277
  [ValidationKeys.FORMAT]?: string;
278
278
  }
279
- export interface EqualsValidatorOptions extends ValidatorOptions {
279
+ export interface ComparisonValidatorOptions extends ValidatorOptions {
280
+ label?: string;
281
+ }
282
+ export interface EqualsValidatorOptions extends ComparisonValidatorOptions {
280
283
  [ValidationKeys.EQUALS]: string;
281
284
  }
282
- export interface DiffValidatorOptions extends ValidatorOptions {
285
+ export interface DiffValidatorOptions extends ComparisonValidatorOptions {
283
286
  [ValidationKeys.DIFF]: string;
284
287
  }
285
- export interface LessThanValidatorOptions extends ValidatorOptions {
288
+ export interface LessThanValidatorOptions extends ComparisonValidatorOptions {
286
289
  [ValidationKeys.LESS_THAN]: string;
287
290
  }
288
- export interface LessThanOrEqualValidatorOptions extends ValidatorOptions {
291
+ export interface LessThanOrEqualValidatorOptions extends ComparisonValidatorOptions {
289
292
  [ValidationKeys.LESS_THAN_OR_EQUAL]: string;
290
293
  }
291
- export interface GreaterThanValidatorOptions extends ValidatorOptions {
294
+ export interface GreaterThanValidatorOptions extends ComparisonValidatorOptions {
292
295
  [ValidationKeys.GREATER_THAN]: string;
293
296
  }
294
- export interface GreaterThanOrEqualValidatorOptions extends ValidatorOptions {
297
+ export interface GreaterThanOrEqualValidatorOptions extends ComparisonValidatorOptions {
295
298
  [ValidationKeys.GREATER_THAN_OR_EQUAL]: string;
296
299
  }
@@ -1,2 +1,2 @@
1
1
  import { ValidationKeys } from "./Validators/index.js";
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFhLDhCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMsIFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvcnNcIjtcbmltcG9ydCB7IElSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIG1ldGFkYXRhIHVzZWQgYnkgdmFsaWRhdGlvbiBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gcHJvcGVydGllcyBieSB2YWxpZGF0aW9uIGRlY29yYXRvcnMuXG4gKiBUaGlzIG1ldGFkYXRhIGlzIHVzZWQgZHVyaW5nIHZhbGlkYXRpb24gdG8gZGV0ZXJtaW5lIHZhbGlkYXRpb24gcnVsZXMgYW5kIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55W119IFthcmdzXSAtIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHZhbGlkYXRvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbdHlwZXNdIC0gQXJyYXkgb2YgdHlwZSBuYW1lcyB0aGF0IHRoZSBwcm9wZXJ0eSBjYW4gaGF2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBhc3luYyAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNvcmF0b3IgcGVyZm9ybXMgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gbG9naWMuXG4gKiBVc2UgYHRydWVgIHdoZW4gdGhlIHZhbGlkYXRvciByZXR1cm5zIGEgUHJvbWlzZSwgYW5kIGBmYWxzZWAgd2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBzeW5jaHJvbm91cy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWYWxpZGF0aW9uTWV0YWRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25NZXRhZGF0YSA9IHtcbiAgW2luZGV4ZXI6IHN0cmluZ106IGFueTtcbiAgYXJncz86IGFueVtdO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHR5cGVzPzogc3RyaW5nW107XG4gIGFzeW5jOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBwcm9wZXJ0eS1sZXZlbCB2YWxpZGF0aW9uIGRlY29yYXRvciBjb25maWd1cmF0aW9uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgdGhhdCBhc3NvY2lhdGVzIGEgcHJvcGVydHkgd2l0aCBpdHMgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLlxuICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gdHJhY2sgd2hpY2ggZGVjb3JhdG9ycyBhcmUgYXBwbGllZCB0byBhIHNwZWNpZmljIHByb3BlcnR5IGR1cmluZyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHN5bWJvbH0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9yIHN5bWJvbCB0aGF0IHRoZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIHRvXG4gKiBAcHJvcGVydHkge1ZhbGlkYXRpb25EZWNvcmF0b3JEZWZpbml0aW9uW119IGRlY29yYXRvcnMgLSBBcnJheSBvZiBkZWNvcmF0b3IgZGVmaW5pdGlvbnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uID0ge1xuICBwcm9wOiBzdHJpbmcgfCBzeW1ib2w7XG4gIGRlY29yYXRvcnM6IFZhbGlkYXRpb25EZWNvcmF0b3JEZWZpbml0aW9uW107XG4gIGFzeW5jPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbiBmb3IgaW5kaXZpZHVhbCB2YWxpZGF0aW9uIGRlY29yYXRvciBtZXRhZGF0YVxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBEZWNvcmF0b3JNZXRhZGF0YSB0eXBlIHdpdGggdmFsaWRhdGlvbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgdGhlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB2YWxpZGF0aW9uIGRlY29yYXRvciBhcHBsaWVkIHRvIGEgcHJvcGVydHkuXG4gKlxuICogQHByb3BlcnR5IHtWYWxpZGF0aW9uRWxlbWVudERlZmluaXRpb259IHByb3BzIC0gVGhlIHZhbGlkYXRpb24gZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBjb25maWd1cmF0aW9uXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVmFsaWRhdGlvbkRlY29yYXRvckRlZmluaXRpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25EZWNvcmF0b3JEZWZpbml0aW9uID0gRGVjb3JhdG9yTWV0YWRhdGEgJiB7XG4gIHByb3BzOiBWYWxpZGF0aW9uRWxlbWVudERlZmluaXRpb247XG4gIGFzeW5jPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgVHlwZSBmb3IgYSB2YWxpZGF0b3IgZWxlbWVudCBtZXRhZGF0YVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdGlvbkVsZW1lbnREZWZpbml0aW9uID0ge1xuICBbaW5kZXhlcjogc3RyaW5nXTogYW55O1xuXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHR5cGVzPzogc3RyaW5nW107XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFR5cGUgZm9yIGEgbW9kZWwgZXJyb3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgdHlwZSBNb2RlbEVycm9ycyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgdHlwZSBmb3Ige0BsaW5rIFZhbGlkYXRvcn0gY29uZmlndXJhdGlvblxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdG9yRGVmaW5pdGlvbiA9IHtcbiAgdmFsaWRhdG9yOiBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+O1xuICB2YWxpZGF0aW9uS2V5OiBzdHJpbmc7XG4gIHNhdmU6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIGEgcmVnaXN0cnkgdGhhdCBtYW5hZ2VzIHZhbGlkYXRvciBpbnN0YW5jZXNcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNvbnRyYWN0IGZvciBhIHJlZ2lzdHJ5IHRoYXQgc3RvcmVzIGFuZCByZXRyaWV2ZXMgdmFsaWRhdG9ycy5cbiAqIFRoZSByZWdpc3RyeSBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mIHZhbGlkYXRvcnMgYW5kIHByb3ZpZGluZ1xuICogYWNjZXNzIHRvIHRoZW0gYnkga2V5LlxuICpcbiAqIEBpbnRlcmZhY2UgSVZhbGlkYXRvclJlZ2lzdHJ5XG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHZhbGlkYXRvciwgbXVzdCBleHRlbmQgVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBJUmVnaXN0cnk8VD5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRvclJlZ2lzdHJ5PFQgZXh0ZW5kcyBWYWxpZGF0b3I+IGV4dGVuZHMgSVJlZ2lzdHJ5PFQ+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgY3VzdG9tIHZhbGlkYXRpb24ga2V5cyBkZWZpbmVkIGluIHRoZSByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbWFwcGluZyBvZiBjdXN0b20gdmFsaWRhdGlvbiBrZXlzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhbmRhcmQga2V5cy5cbiAgICogVGhpcyBhbGxvd3MgZm9yIGFsaWFzaW5nIHZhbGlkYXRpb24ga2V5cyBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBPYmplY3QgbWFwcGluZyBjdXN0b20ga2V5cyB0byBzdGFuZGFyZCB2YWxpZGF0aW9uIGtleXNcbiAgICovXG4gIGdldEN1c3RvbUtleXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIHJlZ2lzdGVyZWQgdmFsaWRhdG9yIGtleXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdmFsaWRhdGlvbiBrZXlzIHRoYXQgaGF2ZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiByZWdpc3RlcmVkIHZhbGlkYXRvciBrZXlzXG4gICAqL1xuICBnZXRLZXlzKCk6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgd2l0aCB0aGUgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgQWRkcyB2YWxpZGF0b3JzIHRvIHRoZSByZWdpc3RyeSwgbWFraW5nIHRoZW0gYXZhaWxhYmxlIGZvciB2YWxpZGF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIFZhbGlkYXRvcnMgY2FuIGJlIHByb3ZpZGVkIGFzIGluc3RhbmNlcyBvciBhcyB2YWxpZGF0b3IgZGVmaW5pdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uKFR8VmFsaWRhdG9yRGVmaW5pdGlvbil9IHZhbGlkYXRvciAtIFZhbGlkYXRvciBpbnN0YW5jZXMgb3IgZGVmaW5pdGlvbnMgdG8gcmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFQgfCBWYWxpZGF0b3JEZWZpbml0aW9uKVtdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSB2YWxpZGF0b3IgYnkgaXRzIGtleVxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCBhIHZhbGlkYXRvciBpbiB0aGUgcmVnaXN0cnkgdXNpbmcgaXRzIHZhbGlkYXRpb24ga2V5LlxuICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3IgaWYgZm91bmQsIG9yIHVuZGVmaW5lZCBpZiBubyB2YWxpZGF0b3IgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB2YWxpZGF0aW9uIGtleSB0byBsb29rIHVwLCB0eXBpY2FsbHkgb25lIG9mIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXN9XG4gICAqIEByZXR1cm4ge1R8dW5kZWZpbmVkfSBUaGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIG5vbmUgbWF0Y2hlcyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4oa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIG9wdGlvbnMgdHlwZSBmb3IgYWxsIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgdmFsaWRhdG9yc1xuICogQGludGVyZmFjZSBWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXN5bmMgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVjb3JhdG9yIHBlcmZvcm1zIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGxvZ2ljLlxuICogVXNlIGB0cnVlYCB3aGVuIHRoZSB2YWxpZGF0b3IgcmV0dXJucyBhIFByb21pc2UsIGFuZCBgZmFsc2VgIHdoZW4gdGhlIHZhbGlkYXRpb24gaXMgc3luY2hyb25vdXMuXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvck9wdGlvbnMge1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgYXN5bmM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVUkwgdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBVUkwgdmFsaWRhdGlvbiwgaW5jbHVkaW5nIGFsbG93ZWQgVVJMIHR5cGVzXG4gKiBAaW50ZXJmYWNlIFVSTFZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3xzdHJpbmdbXXx7IG5hbWU6IHN0cmluZyB9KX0gdHlwZXMgLSBTcGVjaWZpZXMgdGhlIGFsbG93ZWQgVVJMIHR5cGVzIG9yIHBhdHRlcm5zXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVSTFZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZXM6IHN0cmluZyB8IHN0cmluZ1tdIHwgeyBuYW1lOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIHR5cGUgdmFsaWRhdGlvbiwgc3BlY2lmeWluZyBhbGxvd2VkIHR5cGVzXG4gKiBAaW50ZXJmYWNlIFR5cGVWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhzdHJpbmd8c3RyaW5nW118eyBuYW1lOiBzdHJpbmcgfSl9IHR5cGVzIC0gU3BlY2lmaWVzIHRoZSBhbGxvd2VkIGRhdGEgdHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZVZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZXM6IHN0cmluZyB8IHN0cmluZ1tdIHwgeyBuYW1lOiBzdHJpbmcgfTtcbiAgY3VzdG9tVHlwZXM/OiAoc3RyaW5nIHwgKCgpID0+IHN0cmluZykpW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0ZXAgdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBzdGVwIHZhbGlkYXRpb24sIHNwZWNpZnlpbmcgdGhlIHN0ZXAgaW5jcmVtZW50XG4gKiBAaW50ZXJmYWNlIFN0ZXBWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhudW1iZXJ8c3RyaW5nKX0gW1ZhbGlkYXRpb25LZXlzLlNURVBdIC0gVGhlIHN0ZXAgdmFsdWUgZm9yIG51bWVyaWNhbCB2YWxpZGF0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5TVEVQXTogbnVtYmVyIHwgc3RyaW5nO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXR0ZXJuIHZhbGlkYXRpb24gb3B0aW9ucyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IERlZmluZXMgb3B0aW9ucyBmb3IgcGF0dGVybiB2YWxpZGF0aW9uIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnNcbiAqIEBpbnRlcmZhY2UgUGF0dGVyblZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFJlZ0V4cHxzdHJpbmcpfSBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0gLSBUaGUgcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXT86IFJlZ0V4cCB8IHN0cmluZztcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWluaW11bSB2YWx1ZSB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIG1pbmltdW0gdmFsdWUgdmFsaWRhdGlvblxuICogQGludGVyZmFjZSBNaW5WYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhudW1iZXJ8RGF0ZXxzdHJpbmcpfSBbVmFsaWRhdGlvbktleXMuTUlOXSAtIFRoZSBtaW5pbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWluVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuTUlOXTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZztcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWluaW11bSBsZW5ndGggdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBtaW5pbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAaW50ZXJmYWNlIE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSF0gLSBUaGUgbWluaW11bSBhbGxvd2VkIGxlbmd0aFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIXTogbnVtYmVyO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXhpbXVtIHZhbHVlIHZhbGlkYXRpb24gb3B0aW9ucyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IERlZmluZXMgb3B0aW9ucyBmb3IgbWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAaW50ZXJmYWNlIE1heFZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KG51bWJlcnxEYXRlfHN0cmluZyl9IFtWYWxpZGF0aW9uS2V5cy5NQVhdIC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXhWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5NQVhdOiBudW1iZXIgfCBEYXRlIHwgc3RyaW5nO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXhpbXVtIGxlbmd0aCB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIG1heGltdW0gbGVuZ3RoIHZhbGlkYXRpb25cbiAqIEBpbnRlcmZhY2UgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXSAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdOiBudW1iZXI7XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExpc3QgdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBsaXN0IHZhbGlkYXRpb25cbiAqIEBpbnRlcmZhY2UgTGlzdFZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNsYXp6IC0gQXJyYXkgb2YgYWxsb3dlZCBjbGFzcyBuYW1lcyBvciB0eXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0VmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBjbGF6ejogKHN0cmluZyB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVW5pcXVlIHZhbGlkYXRpb24gb3B0aW9ucyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IERlZmluZXMgb3B0aW9ucyBmb3IgdW5pcXVlIHZhbGlkYXRpb25cbiAqIEBpbnRlcmZhY2UgVW5pcXVlVmFsaWRhdG9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gdW5pcXVlIC0gQXJyYXkgb2YgYWxsb3dlZCBjbGFzcyBuYW1lcyBvciB0eXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmlxdWVWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5VTklRVUVdOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGF0ZSB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIGRhdGUgdmFsaWRhdGlvblxuICogQGludGVyZmFjZSBEYXRlVmFsaWRhdG9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdIC0gVGhlIGV4cGVjdGVkIGRhdGUgZm9ybWF0IHBhdHRlcm5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLkZPUk1BVF0/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXF1YWxzVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuRVFVQUxTXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpZmZWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5ESUZGXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmVhdGVyVGhhblZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl06IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBzdHJpbmc7XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFhLDhCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi9tb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMsIFZhbGlkYXRvciB9IGZyb20gXCIuL1ZhbGlkYXRvcnNcIjtcbmltcG9ydCB7IElSZWdpc3RyeSB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIGRlZmluaXRpb24gZm9yIG1ldGFkYXRhIHVzZWQgYnkgdmFsaWRhdGlvbiBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gcHJvcGVydGllcyBieSB2YWxpZGF0aW9uIGRlY29yYXRvcnMuXG4gKiBUaGlzIG1ldGFkYXRhIGlzIHVzZWQgZHVyaW5nIHZhbGlkYXRpb24gdG8gZGV0ZXJtaW5lIHZhbGlkYXRpb24gcnVsZXMgYW5kIGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55W119IFthcmdzXSAtIE9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgdGhlIHZhbGlkYXRvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbdHlwZXNdIC0gQXJyYXkgb2YgdHlwZSBuYW1lcyB0aGF0IHRoZSBwcm9wZXJ0eSBjYW4gaGF2ZVxuICogQHByb3BlcnR5IHtib29sZWFufSBhc3luYyAtIEluZGljYXRlcyB3aGV0aGVyIHRoZSB2YWxpZGF0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWNvcmF0b3IgcGVyZm9ybXMgYXN5bmNocm9ub3VzIHZhbGlkYXRpb24gbG9naWMuXG4gKiBVc2UgYHRydWVgIHdoZW4gdGhlIHZhbGlkYXRvciByZXR1cm5zIGEgUHJvbWlzZSwgYW5kIGBmYWxzZWAgd2hlbiB0aGUgdmFsaWRhdGlvbiBpcyBzeW5jaHJvbm91cy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWYWxpZGF0aW9uTWV0YWRhdGFcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25NZXRhZGF0YSA9IHtcbiAgW2luZGV4ZXI6IHN0cmluZ106IGFueTtcbiAgYXJncz86IGFueVtdO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHR5cGVzPzogc3RyaW5nW107XG4gIGFzeW5jOiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSBkZWZpbml0aW9uIGZvciBwcm9wZXJ0eS1sZXZlbCB2YWxpZGF0aW9uIGRlY29yYXRvciBjb25maWd1cmF0aW9uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgdGhhdCBhc3NvY2lhdGVzIGEgcHJvcGVydHkgd2l0aCBpdHMgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLlxuICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gdHJhY2sgd2hpY2ggZGVjb3JhdG9ycyBhcmUgYXBwbGllZCB0byBhIHNwZWNpZmljIHByb3BlcnR5IGR1cmluZyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHN5bWJvbH0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9yIHN5bWJvbCB0aGF0IHRoZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIHRvXG4gKiBAcHJvcGVydHkge1ZhbGlkYXRpb25EZWNvcmF0b3JEZWZpbml0aW9uW119IGRlY29yYXRvcnMgLSBBcnJheSBvZiBkZWNvcmF0b3IgZGVmaW5pdGlvbnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uID0ge1xuICBwcm9wOiBzdHJpbmcgfCBzeW1ib2w7XG4gIGRlY29yYXRvcnM6IFZhbGlkYXRpb25EZWNvcmF0b3JEZWZpbml0aW9uW107XG4gIGFzeW5jPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgZGVmaW5pdGlvbiBmb3IgaW5kaXZpZHVhbCB2YWxpZGF0aW9uIGRlY29yYXRvciBtZXRhZGF0YVxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBEZWNvcmF0b3JNZXRhZGF0YSB0eXBlIHdpdGggdmFsaWRhdGlvbi1zcGVjaWZpYyBwcm9wZXJ0aWVzLlxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgdGhlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB2YWxpZGF0aW9uIGRlY29yYXRvciBhcHBsaWVkIHRvIGEgcHJvcGVydHkuXG4gKlxuICogQHByb3BlcnR5IHtWYWxpZGF0aW9uRWxlbWVudERlZmluaXRpb259IHByb3BzIC0gVGhlIHZhbGlkYXRpb24gZWxlbWVudCBwcm9wZXJ0aWVzIGFuZCBjb25maWd1cmF0aW9uXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVmFsaWRhdGlvbkRlY29yYXRvckRlZmluaXRpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25EZWNvcmF0b3JEZWZpbml0aW9uID0gRGVjb3JhdG9yTWV0YWRhdGEgJiB7XG4gIHByb3BzOiBWYWxpZGF0aW9uRWxlbWVudERlZmluaXRpb247XG4gIGFzeW5jPzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQHN1bW1hcnkgVHlwZSBmb3IgYSB2YWxpZGF0b3IgZWxlbWVudCBtZXRhZGF0YVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdGlvbkVsZW1lbnREZWZpbml0aW9uID0ge1xuICBbaW5kZXhlcjogc3RyaW5nXTogYW55O1xuXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHR5cGVzPzogc3RyaW5nW107XG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFR5cGUgZm9yIGEgbW9kZWwgZXJyb3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgdHlwZSBNb2RlbEVycm9ycyA9IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgdHlwZSBmb3Ige0BsaW5rIFZhbGlkYXRvcn0gY29uZmlndXJhdGlvblxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IHR5cGUgVmFsaWRhdG9yRGVmaW5pdGlvbiA9IHtcbiAgdmFsaWRhdG9yOiBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+O1xuICB2YWxpZGF0aW9uS2V5OiBzdHJpbmc7XG4gIHNhdmU6IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnRlcmZhY2UgZm9yIGEgcmVnaXN0cnkgdGhhdCBtYW5hZ2VzIHZhbGlkYXRvciBpbnN0YW5jZXNcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNvbnRyYWN0IGZvciBhIHJlZ2lzdHJ5IHRoYXQgc3RvcmVzIGFuZCByZXRyaWV2ZXMgdmFsaWRhdG9ycy5cbiAqIFRoZSByZWdpc3RyeSBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mIHZhbGlkYXRvcnMgYW5kIHByb3ZpZGluZ1xuICogYWNjZXNzIHRvIHRoZW0gYnkga2V5LlxuICpcbiAqIEBpbnRlcmZhY2UgSVZhbGlkYXRvclJlZ2lzdHJ5XG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHZhbGlkYXRvciwgbXVzdCBleHRlbmQgVmFsaWRhdG9yXG4gKiBAZXh0ZW5kcyBJUmVnaXN0cnk8VD5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRvclJlZ2lzdHJ5PFQgZXh0ZW5kcyBWYWxpZGF0b3I+IGV4dGVuZHMgSVJlZ2lzdHJ5PFQ+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgY3VzdG9tIHZhbGlkYXRpb24ga2V5cyBkZWZpbmVkIGluIHRoZSByZWdpc3RyeVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbWFwcGluZyBvZiBjdXN0b20gdmFsaWRhdGlvbiBrZXlzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhbmRhcmQga2V5cy5cbiAgICogVGhpcyBhbGxvd3MgZm9yIGFsaWFzaW5nIHZhbGlkYXRpb24ga2V5cyBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBPYmplY3QgbWFwcGluZyBjdXN0b20ga2V5cyB0byBzdGFuZGFyZCB2YWxpZGF0aW9uIGtleXNcbiAgICovXG4gIGdldEN1c3RvbUtleXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYWxsIHJlZ2lzdGVyZWQgdmFsaWRhdG9yIGtleXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdmFsaWRhdGlvbiBrZXlzIHRoYXQgaGF2ZSByZWdpc3RlcmVkIHZhbGlkYXRvcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiByZWdpc3RlcmVkIHZhbGlkYXRvciBrZXlzXG4gICAqL1xuICBnZXRLZXlzKCk6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIG9uZSBvciBtb3JlIHZhbGlkYXRvcnMgd2l0aCB0aGUgcmVnaXN0cnlcbiAgICogQHN1bW1hcnkgQWRkcyB2YWxpZGF0b3JzIHRvIHRoZSByZWdpc3RyeSwgbWFraW5nIHRoZW0gYXZhaWxhYmxlIGZvciB2YWxpZGF0aW9uIG9wZXJhdGlvbnMuXG4gICAqIFZhbGlkYXRvcnMgY2FuIGJlIHByb3ZpZGVkIGFzIGluc3RhbmNlcyBvciBhcyB2YWxpZGF0b3IgZGVmaW5pdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uKFR8VmFsaWRhdG9yRGVmaW5pdGlvbil9IHZhbGlkYXRvciAtIFZhbGlkYXRvciBpbnN0YW5jZXMgb3IgZGVmaW5pdGlvbnMgdG8gcmVnaXN0ZXJcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHJlZ2lzdGVyPFQgZXh0ZW5kcyBWYWxpZGF0b3I+KFxuICAgIC4uLnZhbGlkYXRvcjogKFQgfCBWYWxpZGF0b3JEZWZpbml0aW9uKVtdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSB2YWxpZGF0b3IgYnkgaXRzIGtleVxuICAgKiBAc3VtbWFyeSBMb29rcyB1cCBhIHZhbGlkYXRvciBpbiB0aGUgcmVnaXN0cnkgdXNpbmcgaXRzIHZhbGlkYXRpb24ga2V5LlxuICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3IgaWYgZm91bmQsIG9yIHVuZGVmaW5lZCBpZiBubyB2YWxpZGF0b3IgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlIGtleS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB2YWxpZGF0aW9uIGtleSB0byBsb29rIHVwLCB0eXBpY2FsbHkgb25lIG9mIHRoZSB7QGxpbmsgVmFsaWRhdGlvbktleXN9XG4gICAqIEByZXR1cm4ge1R8dW5kZWZpbmVkfSBUaGUgcmVnaXN0ZXJlZCB2YWxpZGF0b3Igb3IgdW5kZWZpbmVkIGlmIG5vbmUgbWF0Y2hlcyB0aGUgcHJvdmlkZWQga2V5XG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIFZhbGlkYXRvcj4oa2V5OiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCYXNlIG9wdGlvbnMgdHlwZSBmb3IgYWxsIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGNvbW1vbiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgdmFsaWRhdG9yc1xuICogQGludGVyZmFjZSBWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21lc3NhZ2VdIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXN5bmMgLSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVjb3JhdG9yIHBlcmZvcm1zIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGxvZ2ljLlxuICogVXNlIGB0cnVlYCB3aGVuIHRoZSB2YWxpZGF0b3IgcmV0dXJucyBhIFByb21pc2UsIGFuZCBgZmFsc2VgIHdoZW4gdGhlIHZhbGlkYXRpb24gaXMgc3luY2hyb25vdXMuXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvck9wdGlvbnMge1xuICBtZXNzYWdlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgYXN5bmM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVUkwgdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBVUkwgdmFsaWRhdGlvbiwgaW5jbHVkaW5nIGFsbG93ZWQgVVJMIHR5cGVzXG4gKiBAaW50ZXJmYWNlIFVSTFZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3xzdHJpbmdbXXx7IG5hbWU6IHN0cmluZyB9KX0gdHlwZXMgLSBTcGVjaWZpZXMgdGhlIGFsbG93ZWQgVVJMIHR5cGVzIG9yIHBhdHRlcm5zXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVSTFZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgdHlwZXM6IHN0cmluZyB8IHN0cmluZ1tdIHwgeyBuYW1lOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIHR5cGUgdmFsaWRhdGlvbiwgc3BlY2lmeWluZyBhbGxvd2VkIHR5cGVzXG4gKiBAaW50ZXJmYWNlIFR5cGVWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhzdHJpbmd8c3RyaW5nW118eyBuYW1lOiBzdHJpbmcgfSl9IHR5cGUgLSBTcGVjaWZpZXMgdGhlIGFsbG93ZWQgZGF0YSB0eXBlc1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICB0eXBlOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHsgbmFtZTogc3RyaW5nIH07XG4gIGN1c3RvbVR5cGVzPzogKHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGVwIHZhbGlkYXRpb24gb3B0aW9ucyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IERlZmluZXMgb3B0aW9ucyBmb3Igc3RlcCB2YWxpZGF0aW9uLCBzcGVjaWZ5aW5nIHRoZSBzdGVwIGluY3JlbWVudFxuICogQGludGVyZmFjZSBTdGVwVmFsaWRhdG9yT3B0aW9uc1xuICogQHByb3BlcnR5IHsobnVtYmVyfHN0cmluZyl9IFtWYWxpZGF0aW9uS2V5cy5TVEVQXSAtIFRoZSBzdGVwIHZhbHVlIGZvciBudW1lcmljYWwgdmFsaWRhdGlvblxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGVwVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuU1RFUF06IG51bWJlciB8IHN0cmluZztcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGF0dGVybiB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIHBhdHRlcm4gdmFsaWRhdGlvbiB1c2luZyByZWd1bGFyIGV4cHJlc3Npb25zXG4gKiBAaW50ZXJmYWNlIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhSZWdFeHB8c3RyaW5nKX0gW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dIC0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuUEFUVEVSTl0/OiBSZWdFeHAgfCBzdHJpbmc7XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1pbmltdW0gdmFsdWUgdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBtaW5pbXVtIHZhbHVlIHZhbGlkYXRpb25cbiAqIEBpbnRlcmZhY2UgTWluVmFsaWRhdG9yT3B0aW9uc1xuICogQHByb3BlcnR5IHsobnVtYmVyfERhdGV8c3RyaW5nKX0gW1ZhbGlkYXRpb25LZXlzLk1JTl0gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pblZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLk1JTl06IG51bWJlciB8IERhdGUgfCBzdHJpbmc7XG4gIHR5cGVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1pbmltdW0gbGVuZ3RoIHZhbGlkYXRpb24gb3B0aW9ucyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IERlZmluZXMgb3B0aW9ucyBmb3IgbWluaW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQGludGVyZmFjZSBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdIC0gVGhlIG1pbmltdW0gYWxsb3dlZCBsZW5ndGhcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSF06IG51bWJlcjtcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIG1heGltdW0gdmFsdWUgdmFsaWRhdGlvblxuICogQGludGVyZmFjZSBNYXhWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhudW1iZXJ8RGF0ZXxzdHJpbmcpfSBbVmFsaWRhdGlvbktleXMuTUFYXSAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF4VmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuTUFYXTogbnVtYmVyIHwgRGF0ZSB8IHN0cmluZztcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWF4aW11bSBsZW5ndGggdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBtYXhpbXVtIGxlbmd0aCB2YWxpZGF0aW9uXG4gKiBAaW50ZXJmYWNlIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF0gLSBUaGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXTogbnVtYmVyO1xuICB0eXBlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBMaXN0IHZhbGlkYXRpb24gb3B0aW9ucyBpbnRlcmZhY2VcbiAqIEBzdW1tYXJ5IERlZmluZXMgb3B0aW9ucyBmb3IgbGlzdCB2YWxpZGF0aW9uXG4gKiBAaW50ZXJmYWNlIExpc3RWYWxpZGF0b3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBjbGF6eiAtIEFycmF5IG9mIGFsbG93ZWQgY2xhc3MgbmFtZXMgb3IgdHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBWYWxpZGF0b3JPcHRpb25zIHtcbiAgY2xheno6IChzdHJpbmcgfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PikpW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVuaXF1ZSB2YWxpZGF0aW9uIG9wdGlvbnMgaW50ZXJmYWNlXG4gKiBAc3VtbWFyeSBEZWZpbmVzIG9wdGlvbnMgZm9yIHVuaXF1ZSB2YWxpZGF0aW9uXG4gKiBAaW50ZXJmYWNlIFVuaXF1ZVZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IHVuaXF1ZSAtIEFycmF5IG9mIGFsbG93ZWQgY2xhc3MgbmFtZXMgb3IgdHlwZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBWYWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pcXVlVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuVU5JUVVFXTogc3RyaW5nW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERhdGUgdmFsaWRhdGlvbiBvcHRpb25zIGludGVyZmFjZVxuICogQHN1bW1hcnkgRGVmaW5lcyBvcHRpb25zIGZvciBkYXRlIHZhbGlkYXRpb25cbiAqIEBpbnRlcmZhY2UgRGF0ZVZhbGlkYXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbVmFsaWRhdGlvbktleXMuRk9STUFUXSAtIFRoZSBleHBlY3RlZCBkYXRlIGZvcm1hdCBwYXR0ZXJuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVWYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5GT1JNQVRdPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyB7XG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVxdWFsc1ZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5FUVVBTFNdOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlmZlZhbGlkYXRvck9wdGlvbnMgZXh0ZW5kcyBDb21wYXJpc29uVmFsaWRhdG9yT3B0aW9ucyB7XG4gIFtWYWxpZGF0aW9uS2V5cy5ESUZGXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExlc3NUaGFuVmFsaWRhdG9yT3B0aW9ucyBleHRlbmRzIENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl06IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zXG4gIGV4dGVuZHMgQ29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMXTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyZWF0ZXJUaGFuVmFsaWRhdG9yT3B0aW9uc1xuICBleHRlbmRzIENvbXBhcmlzb25WYWxpZGF0b3JPcHRpb25zIHtcbiAgW1ZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTl06IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3JPcHRpb25zXG4gIGV4dGVuZHMgQ29tcGFyaXNvblZhbGlkYXRvck9wdGlvbnMge1xuICBbVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogc3RyaW5nO1xufVxuIl19
package/lib/index.cjs CHANGED
@@ -33,5 +33,5 @@ __exportStar(require("./model/index.cjs"), exports);
33
33
  * @const VERSION
34
34
  * @memberOf module:decorator-validation
35
35
  */
36
- exports.VERSION = "1.7.13";
36
+ exports.VERSION = "1.7.15";
37
37
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7O0dBTUc7QUFDSCx3REFBNEI7QUFDNUIsb0RBQXdCO0FBQ3hCLG9EQUF3QjtBQUN4Qix5REFBNkI7QUFDN0Isb0RBQXdCO0FBRXhCOzs7OztHQUtHO0FBQ1UsUUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAZGVzY3JpcHRpb24gVHlwZVNjcmlwdCBkZWNvcmF0b3ItYmFzZWQgdmFsaWRhdGlvbiBsaWJyYXJ5XG4gKiBAc3VtbWFyeSBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgdXNpbmcgVHlwZVNjcmlwdCBkZWNvcmF0b3JzLlxuICogSXQgZXhwb3NlcyB1dGlsaXR5IGZ1bmN0aW9ucywgdmFsaWRhdGlvbiBkZWNvcmF0b3JzLCBhbmQgbW9kZWwtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IGZvclxuICogaW1wbGVtZW50aW5nIHR5cGUtc2FmZSwgZGVjbGFyYXRpdmUgdmFsaWRhdGlvbiBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVmbGVjdGlvbiBwYWNrYWdlXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -16,4 +16,4 @@ export * from "./model";
16
16
  * @const VERSION
17
17
  * @memberOf module:decorator-validation
18
18
  */
19
- export declare const VERSION = "1.7.13";
19
+ export declare const VERSION = "1.7.15";