@decaf-ts/decorator-validation 1.7.6 → 1.7.8

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 (79) hide show
  1. package/dist/decorator-validation.cjs +632 -259
  2. package/dist/decorator-validation.esm.cjs +625 -260
  3. package/lib/constants/validation.cjs +3 -2
  4. package/lib/constants/validation.d.ts +1 -0
  5. package/lib/esm/constants/validation.d.ts +1 -0
  6. package/lib/esm/constants/validation.js +2 -1
  7. package/lib/esm/index.d.ts +1 -1
  8. package/lib/esm/index.js +1 -1
  9. package/lib/esm/mcp/ModelContextProtocol.d.ts +14 -22
  10. package/lib/esm/mcp/ModelContextProtocol.js +55 -51
  11. package/lib/esm/model/Model.d.ts +11 -8
  12. package/lib/esm/model/Model.js +12 -6
  13. package/lib/esm/model/decorators.js +1 -1
  14. package/lib/esm/model/types.d.ts +37 -9
  15. package/lib/esm/model/types.js +1 -1
  16. package/lib/esm/model/utils.d.ts +14 -1
  17. package/lib/esm/model/utils.js +15 -1
  18. package/lib/esm/model/validation.d.ts +107 -5
  19. package/lib/esm/model/validation.js +329 -124
  20. package/lib/esm/types/index.d.ts +1 -0
  21. package/lib/esm/types/index.js +2 -0
  22. package/lib/esm/types/validation.d.ts +25 -0
  23. package/lib/esm/types/validation.js +2 -0
  24. package/lib/esm/utils/Decoration.js +4 -6
  25. package/lib/esm/validation/Validators/AsyncValidator.d.ts +72 -0
  26. package/lib/esm/validation/Validators/AsyncValidator.js +61 -0
  27. package/lib/esm/validation/Validators/BaseValidator.d.ts +118 -0
  28. package/lib/esm/validation/Validators/BaseValidator.js +117 -0
  29. package/lib/esm/validation/Validators/ListValidator.js +2 -2
  30. package/lib/esm/validation/Validators/MinLengthValidator.d.ts +1 -1
  31. package/lib/esm/validation/Validators/MinLengthValidator.js +2 -2
  32. package/lib/esm/validation/Validators/TypeValidator.js +1 -1
  33. package/lib/esm/validation/Validators/Validator.d.ts +28 -68
  34. package/lib/esm/validation/Validators/Validator.js +30 -86
  35. package/lib/esm/validation/Validators/constants.d.ts +12 -11
  36. package/lib/esm/validation/Validators/constants.js +14 -12
  37. package/lib/esm/validation/Validators/index.d.ts +1 -0
  38. package/lib/esm/validation/Validators/index.js +2 -1
  39. package/lib/esm/validation/decorators.d.ts +2 -1
  40. package/lib/esm/validation/decorators.js +31 -8
  41. package/lib/esm/validation/types.d.ts +19 -0
  42. package/lib/esm/validation/types.js +1 -1
  43. package/lib/index.cjs +1 -1
  44. package/lib/index.d.ts +1 -1
  45. package/lib/mcp/ModelContextProtocol.cjs +55 -51
  46. package/lib/mcp/ModelContextProtocol.d.ts +14 -22
  47. package/lib/model/Model.cjs +11 -5
  48. package/lib/model/Model.d.ts +11 -8
  49. package/lib/model/decorators.cjs +1 -1
  50. package/lib/model/types.cjs +1 -1
  51. package/lib/model/types.d.ts +37 -9
  52. package/lib/model/utils.cjs +16 -1
  53. package/lib/model/utils.d.ts +14 -1
  54. package/lib/model/validation.cjs +334 -125
  55. package/lib/model/validation.d.ts +107 -5
  56. package/lib/types/index.cjs +18 -0
  57. package/lib/types/index.d.ts +1 -0
  58. package/lib/types/validation.cjs +3 -0
  59. package/lib/types/validation.d.ts +25 -0
  60. package/lib/utils/Decoration.cjs +4 -6
  61. package/lib/validation/Validators/AsyncValidator.cjs +65 -0
  62. package/lib/validation/Validators/AsyncValidator.d.ts +72 -0
  63. package/lib/validation/Validators/BaseValidator.cjs +121 -0
  64. package/lib/validation/Validators/BaseValidator.d.ts +118 -0
  65. package/lib/validation/Validators/ListValidator.cjs +2 -2
  66. package/lib/validation/Validators/MinLengthValidator.cjs +2 -2
  67. package/lib/validation/Validators/MinLengthValidator.d.ts +1 -1
  68. package/lib/validation/Validators/TypeValidator.cjs +1 -1
  69. package/lib/validation/Validators/Validator.cjs +30 -86
  70. package/lib/validation/Validators/Validator.d.ts +28 -68
  71. package/lib/validation/Validators/constants.cjs +14 -12
  72. package/lib/validation/Validators/constants.d.ts +12 -11
  73. package/lib/validation/Validators/index.cjs +2 -1
  74. package/lib/validation/Validators/index.d.ts +1 -0
  75. package/lib/validation/decorators.cjs +32 -8
  76. package/lib/validation/decorators.d.ts +2 -1
  77. package/lib/validation/types.cjs +1 -1
  78. package/lib/validation/types.d.ts +19 -0
  79. package/package.json +1 -1
@@ -1,14 +1,116 @@
1
1
  import { ModelErrorDefinition } from "./ModelErrorDefinition";
2
2
  import { Model } from "./Model";
3
+ import { ValidationPropertyDecoratorDefinition } from "../validation";
4
+ import { ConditionalAsync, DecoratorMetadataAsync } from "../types";
3
5
  /**
4
- * @summary Analyses the decorations of the properties and validates the obj according to them
6
+ * Retrieves the validation metadata decorators associated with a specific property of a model,
7
+ * using the reflective metadata key.
5
8
  *
6
- * @typedef M extends Model
7
- * @prop {M} obj Model object to validate
8
- * @prop {string[]} [propsToIgnore] object properties to ignore in the validation
9
+ * @param model - The model instance or class containing the decorated property.
10
+ * @param {string} prop - The name of the property whose decorators should be retrieved.
11
+ * @param {string} reflectKey - The metadata key used to retrieve the decorators.
12
+ * Defaults to `ValidationKeys.REFLECT`.
9
13
  *
14
+ * @returns The validation decorators applied to the property
15
+ */
16
+ export declare function getValidationDecorators(model: Record<string, any>, prop: string, reflectKey?: string): ValidationPropertyDecoratorDefinition;
17
+ /**
18
+ * @description
19
+ * Retrieves all validatable property decorators from a given model, excluding specified properties.
20
+ *
21
+ * @summary
22
+ * Iterates through the own enumerable properties of a model instance, filtering out any properties
23
+ * listed in the `propsToIgnore` array. For each remaining property, it checks whether validation
24
+ * decorators are present using `getValidationDecorators`, and if so, collects them in the result array.
25
+ *
26
+ * @template M - A generic parameter extending the `Model` class, representing the model type being inspected.
27
+ *
28
+ * @param {M} model - An instance of a class extending `Model` from which validatable properties will be extracted.
29
+ * @param {string[]} propsToIgnore - An array of property names that should be excluded from validation inspection.
30
+ *
31
+ * @return {ValidationPropertyDecoratorDefinition[]} An array of validation decorator definitions
32
+ * associated with the model's properties, excluding those listed in `propsToIgnore`.
33
+ *
34
+ * @function getValidatableProperties
35
+ */
36
+ export declare function getValidatableProperties<M extends Model>(model: M, propsToIgnore: string[]): ValidationPropertyDecoratorDefinition[];
37
+ export declare function validateDecorator<M extends Model, Async extends boolean = false>(model: M, value: any, decorator: DecoratorMetadataAsync, async?: Async): ConditionalAsync<Async, string | undefined>;
38
+ /**
39
+ * @description
40
+ * Executes validation logic for a set of decorators applied to a model's property, handling both
41
+ * synchronous and asynchronous validations, including support for nested validations and lists.
42
+ *
43
+ * @summary
44
+ * Iterates over an array of decorator metadata objects and applies each validation rule to the
45
+ * provided value. For list decorators (`ValidationKeys.LIST`), it performs element-wise validation,
46
+ * supporting nested model validation and type checks. If the `async` flag is set, asynchronous
47
+ * validation is supported using `Promise.all`. The result is a record mapping validation keys to
48
+ * error messages, or `undefined` if no errors are found.
49
+ *
50
+ * @template M - A type parameter extending `Model`, representing the model type being validated.
51
+ * @template Async - A boolean indicating whether validation should be performed asynchronously.
52
+ *
53
+ * @param {M} model - The model instance that the validation is associated with.
54
+ * @param {any} value - The value to be validated against the provided decorators.
55
+ * @param {DecoratorMetadataAsync[]} decorators - An array of metadata objects representing validation decorators.
56
+ * @param {Async} [async] - Optional flag indicating whether validation should be performed asynchronously.
57
+ *
58
+ * @return {ConditionalAsync<Async, Record<string, string>> | undefined}
59
+ * Returns either a record of validation errors (keyed by the decorator key) or `undefined` if no errors are found.
60
+ * If `async` is true, the return value is a Promise resolving to the same structure.
61
+ *
62
+ * @function validateDecorators
63
+ */
64
+ export declare function validateDecorators<M extends Model, Async extends boolean = false>(model: M, value: any, decorators: DecoratorMetadataAsync[], async?: Async): ConditionalAsync<Async, Record<string, string> | undefined>;
65
+ /**
10
66
  * @function validate
67
+ * @template M
68
+ * @template Async
11
69
  * @memberOf module:decorator-validation
12
70
  * @category Model
71
+ *
72
+ * @description
73
+ * Validates the properties of a {@link Model} instance using registered decorators.
74
+ * Supports both synchronous and asynchronous validation flows, depending on the `async` flag.
75
+ *
76
+ * @summary
77
+ * This function inspects a given model object, identifies decorated properties that require validation,
78
+ * and applies the corresponding validation rules. It also supports nested model validation and gracefully
79
+ * merges any validation errors. For collections (Array/Set), it enforces the presence of the `@list` decorator
80
+ * and checks the type of elements. If a property is a nested model, it will call `hasErrors` on it and flatten
81
+ * the nested error keys using dot notation.
82
+ *
83
+ * @param {M} model - The model instance to be validated. Must extend from {@link Model}.
84
+ * @param {Async} [async] - A flag indicating whether validation should be asynchronous.
85
+ * @param {...string} propsToIgnore - A variadic list of property names that should be skipped during validation.
86
+ *
87
+ * @returns {ConditionalAsync<Async, ModelErrorDefinition | undefined>}
88
+ * Returns either a {@link ModelErrorDefinition} containing validation errors,
89
+ * or `undefined` if no errors are found. When `async` is `true`, returns a Promise.
90
+ *
91
+ * @see {@link Model}
92
+ * @see {@link ModelErrorDefinition}
93
+ * @see {@link validateDecorators}
94
+ * @see {@link getValidatableProperties}
95
+ *
96
+ * @mermaid
97
+ * sequenceDiagram
98
+ * participant Caller
99
+ * participant validate
100
+ * participant getValidatableProperties
101
+ * participant validateDecorators
102
+ * participant ModelInstance
103
+ * Caller->>validate: call with obj, async, propsToIgnore
104
+ * validate->>getValidatableProperties: retrieve decorated props
105
+ * loop for each property
106
+ * validate->>validateDecorators: validate using decorators
107
+ * alt is nested model
108
+ * validate->>ModelInstance: call hasErrors()
109
+ * end
110
+ * end
111
+ * alt async
112
+ * validate->>validate: Promise.allSettled for errors
113
+ * end
114
+ * validate-->>Caller: return ModelErrorDefinition | undefined
13
115
  */
14
- export declare function validate<M extends Model>(obj: M, ...propsToIgnore: string[]): ModelErrorDefinition | undefined;
116
+ export declare function validate<M extends Model<boolean>, Async extends boolean = false>(model: M, async: Async, ...propsToIgnore: string[]): ConditionalAsync<Async, ModelErrorDefinition | undefined>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./validation.cjs"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3ZhbGlkYXRpb25cIjtcbiJdfQ==
@@ -0,0 +1 @@
1
+ export * from "./validation";
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL21vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgd3JhcHMgYSB0eXBlIGluIGEgYFByb21pc2VgIGJhc2VkIG9uIHRoZSBgQXN5bmNgIGZsYWcuXG4gKiBAc3VtbWFyeSBVdGlsaXR5IHR5cGUgdGhhdCByZXNvbHZlcyB0byBgVGAgaWYgYEFzeW5jYCBpcyBgZmFsc2VgLCBvciB0byBgUHJvbWlzZTxUPmAgaWYgYEFzeW5jYCBpcyBgdHJ1ZWAuXG4gKiBVc2VkIHRvIGFic3RyYWN0IHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgZWl0aGVyIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBkZXBlbmRpbmcgb24gYSBmbGFnLlxuICpcbiAqIEB0ZW1wbGF0ZSBBc3luYyBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc3VsdCBzaG91bGQgYmUgYXN5bmNocm9ub3VzIChgdHJ1ZWApIG9yIHN5bmNocm9ub3VzIChgZmFsc2VgKS5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBiYXNlIHR5cGUgdG8gcmV0dXJuIGRpcmVjdGx5IG9yIHRvIHdyYXAgaW4gYSBgUHJvbWlzZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFN5bmNocm9ub3VzIHJlc3VsdFxuICogdHlwZSBTeW5jUmVzdWx0OiBzdHJpbmcgfCBudW1iZXIgPSBDb25kaXRpb25hbEFzeW5jPGZhbHNlLCBzdHJpbmcgfCBudW1iZXI+O1xuICpcbiAqIC8vIEFzeW5jaHJvbm91cyByZXN1bHRcbiAqIHR5cGUgQXN5bmNSZXN1bHQ6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyPiA9IENvbmRpdGlvbmFsQXN5bmM8dHJ1ZSwgc3RyaW5nIHwgbnVtYmVyPjtcbiAqIGBgYFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbEFzeW5jPEFzeW5jIGV4dGVuZHMgYm9vbGVhbiwgVD4gPSBBc3luYyBleHRlbmRzIHRydWVcbiAgPyBQcm9taXNlPFQ+XG4gIDogVDtcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yTWV0YWRhdGFBc3luYyA9IERlY29yYXRvck1ldGFkYXRhICYgeyBhc3luYz86IGJvb2xlYW4gfTtcblxuZXhwb3J0IHR5cGUgTW9kZWxDb25kaXRpb25hbEFzeW5jPE0+ID1cbiAgTSBleHRlbmRzIE1vZGVsPHRydWU+XG4gICAgPyBQcm9taXNlPE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPlxuICAgIDogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ7XG4iXX0=
@@ -0,0 +1,25 @@
1
+ import { DecoratorMetadata } from "@decaf-ts/reflection";
2
+ import { Model, ModelErrorDefinition } from "../model";
3
+ /**
4
+ * @description Conditionally wraps a type in a `Promise` based on the `Async` flag.
5
+ * @summary Utility type that resolves to `T` if `Async` is `false`, or to `Promise<T>` if `Async` is `true`.
6
+ * Used to abstract the return type of functions that may be either synchronous or asynchronous depending on a flag.
7
+ *
8
+ * @template Async A boolean flag indicating whether the result should be asynchronous (`true`) or synchronous (`false`).
9
+ * @template T The base type to return directly or to wrap in a `Promise`.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Synchronous result
14
+ * type SyncResult: string | number = ConditionalAsync<false, string | number>;
15
+ *
16
+ * // Asynchronous result
17
+ * type AsyncResult: Promise<string | number> = ConditionalAsync<true, string | number>;
18
+ * ```
19
+ * @memberOf module:decorator-validation
20
+ */
21
+ export type ConditionalAsync<Async extends boolean, T> = Async extends true ? Promise<T> : T;
22
+ export type DecoratorMetadataAsync = DecoratorMetadata & {
23
+ async?: boolean;
24
+ };
25
+ export type ModelConditionalAsync<M> = M extends Model<true> ? Promise<ModelErrorDefinition | undefined> : ModelErrorDefinition | undefined;
@@ -128,13 +128,11 @@ class Decoration {
128
128
  else {
129
129
  decorators = Decoration.decorators[key][constants_1.DefaultFlavour].decorators;
130
130
  }
131
- [
131
+ const toApply = [
132
132
  ...(decorators ? decorators.values() : []),
133
133
  ...(extras ? extras.values() : []),
134
- ].forEach((d) => d(target, propertyKey, descriptor, descriptor));
135
- // return apply(
136
- //
137
- // )(target, propertyKey, descriptor);
134
+ ];
135
+ toApply.forEach((d) => d(target, propertyKey, descriptor, descriptor));
138
136
  };
139
137
  Object.defineProperty(contextDecorator, "name", {
140
138
  value: [f, key].join("_decorator_for_"),
@@ -193,4 +191,4 @@ class Decoration {
193
191
  }
194
192
  }
195
193
  exports.Decoration = Decoration;
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjb3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVFBLCtDQUE2QztBQUU3Qyw2REFBNkQ7QUFDN0QsU0FBUyxzQkFBc0IsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sMEJBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILE1BQWEsVUFBVTtJQUNyQjs7O09BR0c7YUFDWSxlQUFVLEdBU3JCLEVBQUUsQ0FBQztJQUVQOzs7T0FHRzthQUNZLG9CQUFlLEdBQW9CLHNCQUFzQixDQUFDO0lBbUJ6RSxZQUFvQixVQUFrQiwwQkFBYztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtJQUFHLENBQUM7SUFFeEQ7Ozs7O09BS0c7SUFDSCxHQUFHLENBQUMsR0FBVztRQUNiLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssUUFBUSxDQUNkLFFBQWlCLEtBQUssRUFDdEIsR0FBRyxVQUFvRTtRQUV2RSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDekUsSUFDRSxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxDQUFDLEtBQUs7WUFDTixJQUFJLENBQUMsT0FBTyxLQUFLLDBCQUFjO1lBRS9CLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLENBQzVFLENBQUM7UUFDSixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssMEJBQWMsSUFBSSxLQUFLO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMs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QztJQUNsRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxRQUF5QjtRQUNqRCxVQUFVLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sSUFBSSxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBZTtRQUNoQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7O0FBek1ILGdDQTBNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlY29yYXRpb25CdWlsZGVyQnVpbGQsXG4gIERlY29yYXRpb25CdWlsZGVyRW5kLFxuICBEZWNvcmF0aW9uQnVpbGRlck1pZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJTdGFydCxcbiAgRmxhdm91clJlc29sdmVyLFxuICBJRGVjb3JhdGlvbkJ1aWxkZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Rmxhdm91ciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5mdW5jdGlvbiBkZWZhdWx0Rmxhdm91clJlc29sdmVyKHRhcmdldDogb2JqZWN0KSB7XG4gIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBkZWNvcmF0b3IgbWFuYWdlbWVudCBjbGFzcyB0aGF0IGhhbmRsZXMgZmxhdm91cmVkIGRlY29yYXRvcnNcbiAqIEBzdW1tYXJ5IFRoZSBEZWNvcmF0aW9uIGNsYXNzIHByb3ZpZGVzIGEgYnVpbGRlciBwYXR0ZXJuIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3Vycy5cbiAqIEl0IHN1cHBvcnRzIHJlZ2lzdGVyaW5nLCBleHRlbmRpbmcsIGFuZCBhcHBseWluZyBkZWNvcmF0b3JzIHdpdGggY29udGV4dC1hd2FyZSBmbGF2b3VyIHJlc29sdXRpb24uXG4gKiBUaGUgY2xhc3MgaW1wbGVtZW50cyBhIGZsdWVudCBpbnRlcmZhY2UgZm9yIGRlZmluaW5nLCBleHRlbmRpbmcsIGFuZCBhcHBseWluZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLFxuICogYWxsb3dpbmcgZm9yIGZyYW1ld29yay1zcGVjaWZpYyBkZWNvcmF0b3IgaW1wbGVtZW50YXRpb25zIHdoaWxlIG1haW50YWluaW5nIGEgY29uc2lzdGVudCBBUEkuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBkZWNvcmF0b3IgKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIE9wdGlvbmFsIGZsYXZvdXIgcGFyYW1ldGVyIGZvciB0aGUgZGVjb3JhdG9yIGNvbnRleHRcbiAqIEBjbGFzc1xuICogQGNhdGVnb3J5IE1vZGVsXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IGRlY29yYXRpb24gZm9yICdjb21wb25lbnQnIHdpdGggZGVmYXVsdCBmbGF2b3VyXG4gKiBjb25zdCBjb21wb25lbnREZWNvcmF0b3IgPSBuZXcgRGVjb3JhdGlvbigpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUoY3VzdG9tQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBDcmVhdGUgYSBmbGF2b3VyZWQgZGVjb3JhdGlvblxuICogY29uc3QgdnVlQ29tcG9uZW50ID0gbmV3IERlY29yYXRpb24oJ3Z1ZScpXG4gKiAgIC5mb3IoJ2NvbXBvbmVudCcpXG4gKiAgIC5kZWZpbmUodnVlQ29tcG9uZW50RGVjb3JhdG9yKTtcbiAqXG4gKiAvLyBBcHBseSB0aGUgZGVjb3JhdGlvblxuICogQGNvbXBvbmVudERlY29yYXRvclxuICogY2xhc3MgTXlDb21wb25lbnQge31cbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRpb25cbiAqICAgcGFydGljaXBhbnQgUiBhcyBGbGF2b3VyUmVzb2x2ZXJcbiAqICAgcGFydGljaXBhbnQgRiBhcyBEZWNvcmF0b3JGYWN0b3J5XG4gKlxuICogICBDLT4+RDogbmV3IERlY29yYXRpb24oZmxhdm91cilcbiAqICAgQy0+PkQ6IGZvcihrZXkpXG4gKiAgIEMtPj5EOiBkZWZpbmUoZGVjb3JhdG9ycylcbiAqICAgRC0+PkQ6IHJlZ2lzdGVyKGtleSwgZmxhdm91ciwgZGVjb3JhdG9ycylcbiAqICAgRC0+PkY6IGRlY29yYXRvckZhY3Rvcnkoa2V5LCBmbGF2b3VyKVxuICogICBGLT4+UjogcmVzb2x2ZSh0YXJnZXQpXG4gKiAgIFItLT4+RjogcmVzb2x2ZWQgZmxhdm91clxuICogICBGLT4+RjogYXBwbHkgZGVjb3JhdG9yc1xuICogICBGLS0+PkM6IGRlY29yYXRlZCB0YXJnZXRcbiAqL1xuZXhwb3J0IGNsYXNzIERlY29yYXRpb24gaW1wbGVtZW50cyBJRGVjb3JhdGlvbkJ1aWxkZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtYXAgb2YgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFN0b3JlcyBhbGwgcmVnaXN0ZXJlZCBkZWNvcmF0b3JzIG9yZ2FuaXplZCBieSBrZXkgYW5kIGZsYXZvdXJcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRlY29yYXRvcnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAge1xuICAgICAgICBkZWNvcmF0b3JzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+O1xuICAgICAgICBleHRyYXM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj47XG4gICAgICB9XG4gICAgPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXIgZnJvbSBhIHRhcmdldFxuICAgKiBAc3VtbWFyeSBSZXNvbHZlciBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIGFwcHJvcHJpYXRlIGZsYXZvdXIgZm9yIGEgZ2l2ZW4gdGFyZ2V0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmbGF2b3VyUmVzb2x2ZXI6IEZsYXZvdXJSZXNvbHZlciA9IGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0b3JzPzogU2V0PFxuICAgIENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3JcbiAgPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBhZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgZXh0cmFzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3VycmVudCBkZWNvcmF0b3Iga2V5XG4gICAqL1xuICBwcml2YXRlIGtleT86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZsYXZvdXI6IHN0cmluZyA9IERlZmF1bHRGbGF2b3VyKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUga2V5IGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IGRlY29yYXRpb24gY2hhaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyTWlkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBkZWNvcmF0b3JzIHdpdGggYWRkb24gc3VwcG9ydFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthZGRvbj1mYWxzZV0gV2hldGhlciB0aGUgZGVjb3JhdG9ycyBhcmUgYWRkb25zXG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFycmF5IG9mIGRlY29yYXRvcnNcbiAgICogQHJldHVybiB7dGhpc30gQ3VycmVudCBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdGUoXG4gICAgYWRkb246IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAuLi5kZWNvcmF0b3JzOiAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilbXVxuICApOiB0aGlzIHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwia2V5IG11c3QgYmUgcHJvdmlkZWQgYmVmb3JlIGRlY29yYXRvcnMgY2FuIGJlIGFkZGVkXCIpO1xuICAgIGlmIChcbiAgICAgICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpICYmXG4gICAgICAhYWRkb24gJiZcbiAgICAgIHRoaXMuZmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXJcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTXVzdCBwcm92aWRlIG92ZXJyaWRlcyBvciBhZGRvbnMgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGRlY2FmJ3MgZGVjb3JhdG9yc1wiXG4gICAgICApO1xuICAgIGlmICh0aGlzLmZsYXZvdXIgPT09IERlZmF1bHRGbGF2b3VyICYmIGFkZG9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmYXVsdCBmbGF2b3VyIGNhbm5vdCBiZSBleHRlbmRlZFwiKTtcblxuICAgIHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdID0gbmV3IFNldChbXG4gICAgICAuLi4odGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgYmFzZSBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIGRlZmluZVxuICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGZpbmlzaGluZyB0aGUgY2hhaW5cbiAgICovXG4gIGRlZmluZShcbiAgICAuLi5kZWNvcmF0b3JzOiAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckVuZCAmIERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKGZhbHNlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBleGlzdGluZyBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHRoZSBkZWNvcmF0b3JcbiAgICovXG4gIGV4dGVuZChcbiAgICAuLi5kZWNvcmF0b3JzOiAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZSh0cnVlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWNvcmF0b3JGYWN0b3J5KGtleTogc3RyaW5nLCBmOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge1xuICAgIGNvbnN0IGNvbnRleHREZWNvcmF0b3IgPSBmdW5jdGlvbiBjb250ZXh0RGVjb3JhdG9yKFxuICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICAgKSB7XG4gICAgICBjb25zdCBmbGF2b3VyID0gRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIodGFyZ2V0KTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl1cbiAgICAgICAgPyBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5leHRyYXNcbiAgICAgICAgOiBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtEZWZhdWx0Rmxhdm91cl0uZXh0cmFzO1xuICAgICAgaWYgKFxuICAgICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSAmJlxuICAgICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSAmJlxuICAgICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG4gICAgICBbXG4gICAgICAgIC4uLihkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF0uZm9yRWFjaCgoZCkgPT4gKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yLCBkZXNjcmlwdG9yKSk7XG4gICAgICAvLyByZXR1cm4gYXBwbHkoXG4gICAgICAvL1xuICAgICAgLy8gKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55PywgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I/KTogYW55fSBUaGUgZ2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvblxuICAgKi9cbiAgYXBwbHkoKTogKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICkgPT4gYW55IHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIERlY29yYXRpb24ucmVnaXN0ZXIodGhpcy5rZXksIHRoaXMuZmxhdm91ciwgdGhpcy5kZWNvcmF0b3JzLCB0aGlzLmV4dHJhcyk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0b3Iga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyXG4gICAqIEBwYXJhbSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzXG4gICAqIEBwYXJhbSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+LFxuICAgIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPlxuICApIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRlY29yYXRvcnMgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZmxhdm91ciBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcblxuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0pIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldID0ge307XG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSlcbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdID0ge307XG4gICAgaWYgKGRlY29yYXRvcnMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgIGlmIChleHRyYXMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmV4dHJhcyA9IGV4dHJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZ2xvYmFsIGZsYXZvdXIgcmVzb2x2ZXJcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzXG4gICAqL1xuICBzdGF0aWMgc2V0Rmxhdm91clJlc29sdmVyKHJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIpIHtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiJdfQ==
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjb3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVFBLCtDQUE2QztBQUU3Qyw2REFBNkQ7QUFDN0QsU0FBUyxzQkFBc0IsQ0FBQyxNQUFjO0lBQzVDLE9BQU8sMEJBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILE1BQWEsVUFBVTtJQUNyQjs7O09BR0c7YUFDWSxlQUFVLEdBU3JCLEVBQUUsQ0FBQztJQUVQOzs7T0FHRzthQUNZLG9CQUFlLEdBQW9CLHNCQUFzQixDQUFDO0lBbUJ6RSxZQUFvQixVQUFrQiwwQkFBYztRQUFoQyxZQUFPLEdBQVAsT0FBTyxDQUF5QjtJQUFHLENBQUM7SUFFeEQ7Ozs7O09BS0c7SUFDSCxHQUFHLENBQUMsR0FBVztRQUNiLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssUUFBUSxDQUNkLFFBQWlCLEtBQUssRUFDdEIsR0FBRyxVQUFvRTtRQUV2RSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDekUsSUFDRSxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxDQUFDLEtBQUs7WUFDTixJQUFJLENBQUMsT0FBTyxLQUFLLDBCQUFjO1lBRS9CLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkVBQTJFLENBQzVFLENBQUM7UUFDSixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssMEJBQWMsSUFBSSxLQUFLO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMs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bEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBeUI7UUFDakQsVUFBVSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBVztRQUNwQixPQUFPLElBQUksVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDOztBQXpNSCxnQ0EwTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkLFxuICBEZWNvcmF0aW9uQnVpbGRlckVuZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJNaWQsXG4gIERlY29yYXRpb25CdWlsZGVyU3RhcnQsXG4gIEZsYXZvdXJSZXNvbHZlcixcbiAgSURlY29yYXRpb25CdWlsZGVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZnVuY3Rpb24gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcih0YXJnZXQ6IG9iamVjdCkge1xuICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZGVjb3JhdG9yIG1hbmFnZW1lbnQgY2xhc3MgdGhhdCBoYW5kbGVzIGZsYXZvdXJlZCBkZWNvcmF0b3JzXG4gKiBAc3VtbWFyeSBUaGUgRGVjb3JhdGlvbiBjbGFzcyBwcm92aWRlcyBhIGJ1aWxkZXIgcGF0dGVybiBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMuXG4gKiBJdCBzdXBwb3J0cyByZWdpc3RlcmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGNvbnRleHQtYXdhcmUgZmxhdm91ciByZXNvbHV0aW9uLlxuICogVGhlIGNsYXNzIGltcGxlbWVudHMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBkZWZpbmluZywgZXh0ZW5kaW5nLCBhbmQgYXBwbHlpbmcgZGVjb3JhdG9ycyB3aXRoIGRpZmZlcmVudCBmbGF2b3VycyxcbiAqIGFsbG93aW5nIGZvciBmcmFtZXdvcmstc3BlY2lmaWMgZGVjb3JhdG9yIGltcGxlbWVudGF0aW9ucyB3aGlsZSBtYWludGFpbmluZyBhIGNvbnNpc3RlbnQgQVBJLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgZGVjb3JhdG9yIChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVxuICogQHBhcmFtIHtzdHJpbmd9IFtmbGF2b3VyXSBPcHRpb25hbCBmbGF2b3VyIHBhcmFtZXRlciBmb3IgdGhlIGRlY29yYXRvciBjb250ZXh0XG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBNb2RlbFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIG5ldyBkZWNvcmF0aW9uIGZvciAnY29tcG9uZW50JyB3aXRoIGRlZmF1bHQgZmxhdm91clxuICogY29uc3QgY29tcG9uZW50RGVjb3JhdG9yID0gbmV3IERlY29yYXRpb24oKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKGN1c3RvbUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQ3JlYXRlIGEgZmxhdm91cmVkIGRlY29yYXRpb25cbiAqIGNvbnN0IHZ1ZUNvbXBvbmVudCA9IG5ldyBEZWNvcmF0aW9uKCd2dWUnKVxuICogICAuZm9yKCdjb21wb25lbnQnKVxuICogICAuZGVmaW5lKHZ1ZUNvbXBvbmVudERlY29yYXRvcik7XG4gKlxuICogLy8gQXBwbHkgdGhlIGRlY29yYXRpb25cbiAqIEBjb21wb25lbnREZWNvcmF0b3JcbiAqIGNsYXNzIE15Q29tcG9uZW50IHt9XG4gKiBgYGBcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gKiAgIHBhcnRpY2lwYW50IFIgYXMgRmxhdm91clJlc29sdmVyXG4gKiAgIHBhcnRpY2lwYW50IEYgYXMgRGVjb3JhdG9yRmFjdG9yeVxuICpcbiAqICAgQy0+PkQ6IG5ldyBEZWNvcmF0aW9uKGZsYXZvdXIpXG4gKiAgIEMtPj5EOiBmb3Ioa2V5KVxuICogICBDLT4+RDogZGVmaW5lKGRlY29yYXRvcnMpXG4gKiAgIEQtPj5EOiByZWdpc3RlcihrZXksIGZsYXZvdXIsIGRlY29yYXRvcnMpXG4gKiAgIEQtPj5GOiBkZWNvcmF0b3JGYWN0b3J5KGtleSwgZmxhdm91cilcbiAqICAgRi0+PlI6IHJlc29sdmUodGFyZ2V0KVxuICogICBSLS0+PkY6IHJlc29sdmVkIGZsYXZvdXJcbiAqICAgRi0+PkY6IGFwcGx5IGRlY29yYXRvcnNcbiAqICAgRi0tPj5DOiBkZWNvcmF0ZWQgdGFyZ2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uIGltcGxlbWVudHMgSURlY29yYXRpb25CdWlsZGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbWFwIG9mIHJlZ2lzdGVyZWQgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTdG9yZXMgYWxsIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycyBvcmdhbml6ZWQgYnkga2V5IGFuZCBmbGF2b3VyXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZWNvcmF0b3JzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHtcbiAgICAgICAgZGVjb3JhdG9ycz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcbiAgICAgICAgZXh0cmFzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+O1xuICAgICAgfVxuICAgID5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdG8gcmVzb2x2ZSBmbGF2b3VyIGZyb20gYSB0YXJnZXRcbiAgICogQHN1bW1hcnkgUmVzb2x2ZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBmbGF2b3VyIGZvciBhIGdpdmVuIHRhcmdldFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZmxhdm91clJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIgPSBkZWZhdWx0Rmxhdm91clJlc29sdmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICovXG4gIHByaXZhdGUgZGVjb3JhdG9ycz86IFNldDxcbiAgICBDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yXG4gID47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXQgb2YgYWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqL1xuICBwcml2YXRlIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgZGVjb3JhdG9yIGtleVxuICAgKi9cbiAgcHJpdmF0ZSBrZXk/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmbGF2b3VyOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGtleSBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBkZWNvcmF0aW9uIGNoYWluIHdpdGggdGhlIHNwZWNpZmllZCBrZXlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGRlY29yYXRvclxuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlck1pZH0gQnVpbGRlciBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBmb3Ioa2V5OiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlck1pZCB7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBhZGQgZGVjb3JhdG9ycyB3aXRoIGFkZG9uIHN1cHBvcnRcbiAgICogQHBhcmFtIHtib29sZWFufSBbYWRkb249ZmFsc2VdIFdoZXRoZXIgdGhlIGRlY29yYXRvcnMgYXJlIGFkZG9uc1xuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBcnJheSBvZiBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge3RoaXN9IEN1cnJlbnQgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRlKFxuICAgIGFkZG9uOiBib29sZWFuID0gZmFsc2UsXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogdGhpcyB7XG4gICAgaWYgKCF0aGlzLmtleSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImtleSBtdXN0IGJlIHByb3ZpZGVkIGJlZm9yZSBkZWNvcmF0b3JzIGNhbiBiZSBhZGRlZFwiKTtcbiAgICBpZiAoXG4gICAgICAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSAmJlxuICAgICAgIWFkZG9uICYmXG4gICAgICB0aGlzLmZsYXZvdXIgIT09IERlZmF1bHRGbGF2b3VyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk11c3QgcHJvdmlkZSBvdmVycmlkZXMgb3IgYWRkb25zIHRvIG92ZXJyaWRlIG9yIGV4dGVuZCBkZWNhZidzIGRlY29yYXRvcnNcIlxuICAgICAgKTtcbiAgICBpZiAodGhpcy5mbGF2b3VyID09PSBEZWZhdWx0Rmxhdm91ciAmJiBhZGRvbilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmF1bHQgZmxhdm91ciBjYW5ub3QgYmUgZXh0ZW5kZWRcIik7XG5cbiAgICB0aGlzW2FkZG9uID8gXCJleHRyYXNcIiA6IFwiZGVjb3JhdG9yc1wiXSA9IG5ldyBTZXQoW1xuICAgICAgLi4uKHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdIHx8IG5ldyBTZXQoKSkudmFsdWVzKCksXG4gICAgICAuLi5kZWNvcmF0b3JzLFxuICAgIF0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGJhc2UgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBwcmltYXJ5IGRlY29yYXRvcnMgZm9yIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgRGVjb3JhdG9ycyB0byBkZWZpbmVcbiAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlIGZvciBmaW5pc2hpbmcgdGhlIGNoYWluXG4gICAqL1xuICBkZWZpbmUoXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJFbmQgJiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZShmYWxzZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4dGVuZHMgZXhpc3RpbmcgZGVjb3JhdG9yc1xuICAgKiBAc3VtbWFyeSBBZGRzIGFkZGl0aW9uYWwgZGVjb3JhdG9ycyB0byB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBkZWNvcmF0b3JzIEFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHtEZWNvcmF0aW9uQnVpbGRlckJ1aWxkfSBCdWlsZGVyIGluc3RhbmNlIGZvciBidWlsZGluZyB0aGUgZGVjb3JhdG9yXG4gICAqL1xuICBleHRlbmQoXG4gICAgLi4uZGVjb3JhdG9yczogKENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3IpW11cbiAgKTogRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdGUodHJ1ZSwgLi4uZGVjb3JhdG9ycyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZGVjb3JhdG9yRmFjdG9yeShrZXk6IHN0cmluZywgZjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHtcbiAgICBjb25zdCBjb250ZXh0RGVjb3JhdG9yID0gZnVuY3Rpb24gY29udGV4dERlY29yYXRvcihcbiAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgcHJvcGVydHlLZXk/OiBhbnksXG4gICAgICBkZXNjcmlwdG9yPzogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PlxuICAgICkge1xuICAgICAgY29uc3QgZmxhdm91ciA9IERlY29yYXRpb24uZmxhdm91clJlc29sdmVyKHRhcmdldCk7XG4gICAgICBsZXQgZGVjb3JhdG9ycztcbiAgICAgIGNvbnN0IGV4dHJhcyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdXG4gICAgICAgID8gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzXG4gICAgICAgIDogRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bRGVmYXVsdEZsYXZvdXJdLmV4dHJhcztcbiAgICAgIGlmIChcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0gJiZcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0gJiZcbiAgICAgICAgRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZGVjb3JhdG9yc1xuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvcnMgPSBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW0RlZmF1bHRGbGF2b3VyXS5kZWNvcmF0b3JzO1xuICAgICAgfVxuICAgICAgY29uc3QgdG9BcHBseSA9IFtcbiAgICAgICAgLi4uKGRlY29yYXRvcnMgPyBkZWNvcmF0b3JzLnZhbHVlcygpIDogW10pLFxuICAgICAgICAuLi4oZXh0cmFzID8gZXh0cmFzLnZhbHVlcygpIDogW10pLFxuICAgICAgXTtcbiAgICAgIHRvQXBwbHkuZm9yRWFjaCgoZCkgPT5cbiAgICAgICAgKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yLCBkZXNjcmlwdG9yKVxuICAgICAgKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55PywgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I/KTogYW55fSBUaGUgZ2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvblxuICAgKi9cbiAgYXBwbHkoKTogKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICkgPT4gYW55IHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIERlY29yYXRpb24ucmVnaXN0ZXIodGhpcy5rZXksIHRoaXMuZmxhdm91ciwgdGhpcy5kZWNvcmF0b3JzLCB0aGlzLmV4dHJhcyk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0b3Iga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyXG4gICAqIEBwYXJhbSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzXG4gICAqIEBwYXJhbSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+LFxuICAgIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPlxuICApIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRlY29yYXRvcnMgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZmxhdm91ciBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcblxuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0pIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldID0ge307XG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSlcbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdID0ge307XG4gICAgaWYgKGRlY29yYXRvcnMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgIGlmIChleHRyYXMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmV4dHJhcyA9IGV4dHJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZ2xvYmFsIGZsYXZvdXIgcmVzb2x2ZXJcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzXG4gICAqL1xuICBzdGF0aWMgc2V0Rmxhdm91clJlc29sdmVyKHJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIpIHtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AsyncValidator = void 0;
4
+ const BaseValidator_1 = require("./BaseValidator.cjs");
5
+ const constants_1 = require("./constants.cjs");
6
+ /**
7
+ * @description
8
+ * Abstract class for defining asynchronous validators.
9
+ *
10
+ * This class extends the base `Validator` and enforces that any implementation
11
+ * of `hasErrors` must be asynchronous, always returning a Promise.
12
+ *
13
+ * Use this when the validation process involves asynchronous operations,
14
+ * such as API calls, database lookups, or time-based checks (e.g., timeouts).
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Example of an asynchronous validator that compares value against a timeout
19
+ * class TimeoutValidator extends AsyncValidator<{ timeout?: number }> {
20
+ * constructor(message: string = "Validation failed due to timeout") {
21
+ * super(message);
22
+ * }
23
+ *
24
+ * async hasErrors(value: number, options?: { timeout?: number }) {
25
+ * const delay = options?.timeout ?? 100;
26
+ *
27
+ * // async call
28
+ * await new Promise(res => setTimeout(res, delay));
29
+ *
30
+ * if (value > delay) {
31
+ * // Rejects the validation after waiting the delay if value is greater
32
+ * return Promise.resolve(this.getMessage());
33
+ * }
34
+ *
35
+ * // Passes the validation after waiting the delay
36
+ * return Promise.resolve(undefined);
37
+ * }
38
+ * }
39
+ *
40
+ * // Example usage:
41
+ * const validator = new TimeoutValidator();
42
+ *
43
+ * async function runValidation() {
44
+ * const error = await validator.hasErrors(50, { timeout: 100 });
45
+ * if (error) {
46
+ * return console.error('Validation error:', error);
47
+ * }
48
+ * console.log('Value is valid');
49
+ * }
50
+ *
51
+ * await runValidation();
52
+ * ```
53
+ *
54
+ * - If `value > timeout`, the validator waits for the delay and then rejects with an error.
55
+ * - If `value <= timeout`, the validator waits for the delay and resolves successfully with `undefined`.
56
+ *
57
+ * @see {@link Validator} For the base synchronous validator.
58
+ */
59
+ class AsyncValidator extends BaseValidator_1.BaseValidator {
60
+ constructor(message = constants_1.DEFAULT_ERROR_MESSAGES.DEFAULT, ...acceptedTypes) {
61
+ super(true, message, ...acceptedTypes);
62
+ }
63
+ }
64
+ exports.AsyncValidator = AsyncValidator;
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXN5bmNWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9WYWxpZGF0b3JzL0FzeW5jVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHVEQUFnRDtBQUNoRCwrQ0FBcUQ7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvREc7QUFDSCxNQUFzQixjQUVwQixTQUFRLDZCQUFzQjtJQUM5QixZQUNFLFVBQWtCLGtDQUFzQixDQUFDLE9BQU8sRUFDaEQsR0FBRyxhQUF1QjtRQUUxQixLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FtQkY7QUEzQkQsd0NBMkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgQmFzZVZhbGlkYXRvciB9IGZyb20gXCIuL0Jhc2VWYWxpZGF0b3JcIjtcbmltcG9ydCB7IERFRkFVTFRfRVJST1JfTUVTU0FHRVMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFic3RyYWN0IGNsYXNzIGZvciBkZWZpbmluZyBhc3luY2hyb25vdXMgdmFsaWRhdG9ycy5cbiAqXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGJhc2UgYFZhbGlkYXRvcmAgYW5kIGVuZm9yY2VzIHRoYXQgYW55IGltcGxlbWVudGF0aW9uXG4gKiBvZiBgaGFzRXJyb3JzYCBtdXN0IGJlIGFzeW5jaHJvbm91cywgYWx3YXlzIHJldHVybmluZyBhIFByb21pc2UuXG4gKlxuICogVXNlIHRoaXMgd2hlbiB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGludm9sdmVzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLFxuICogc3VjaCBhcyBBUEkgY2FsbHMsIGRhdGFiYXNlIGxvb2t1cHMsIG9yIHRpbWUtYmFzZWQgY2hlY2tzIChlLmcuLCB0aW1lb3V0cykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEV4YW1wbGUgb2YgYW4gYXN5bmNocm9ub3VzIHZhbGlkYXRvciB0aGF0IGNvbXBhcmVzIHZhbHVlIGFnYWluc3QgYSB0aW1lb3V0XG4gKiBjbGFzcyBUaW1lb3V0VmFsaWRhdG9yIGV4dGVuZHMgQXN5bmNWYWxpZGF0b3I8eyB0aW1lb3V0PzogbnVtYmVyIH0+IHtcbiAqICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gXCJWYWxpZGF0aW9uIGZhaWxlZCBkdWUgdG8gdGltZW91dFwiKSB7XG4gKiAgICAgc3VwZXIobWVzc2FnZSk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGhhc0Vycm9ycyh2YWx1ZTogbnVtYmVyLCBvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pIHtcbiAqICAgICBjb25zdCBkZWxheSA9IG9wdGlvbnM/LnRpbWVvdXQgPz8gMTAwO1xuICpcbiAqICAgICAvLyBhc3luYyBjYWxsXG4gKiAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBkZWxheSkpO1xuICpcbiAqICAgICBpZiAodmFsdWUgPiBkZWxheSkge1xuICogICAgICAgLy8gUmVqZWN0cyB0aGUgdmFsaWRhdGlvbiBhZnRlciB3YWl0aW5nIHRoZSBkZWxheSBpZiB2YWx1ZSBpcyBncmVhdGVyXG4gKiAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZ2V0TWVzc2FnZSgpKTtcbiAqICAgICB9XG4gKlxuICogICAgIC8vIFBhc3NlcyB0aGUgdmFsaWRhdGlvbiBhZnRlciB3YWl0aW5nIHRoZSBkZWxheVxuICogICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4YW1wbGUgdXNhZ2U6XG4gKiBjb25zdCB2YWxpZGF0b3IgPSBuZXcgVGltZW91dFZhbGlkYXRvcigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIHJ1blZhbGlkYXRpb24oKSB7XG4gKiAgY29uc3QgZXJyb3IgPSBhd2FpdCB2YWxpZGF0b3IuaGFzRXJyb3JzKDUwLCB7IHRpbWVvdXQ6IDEwMCB9KTtcbiAqICBpZiAoZXJyb3IpIHtcbiAqICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdWYWxpZGF0aW9uIGVycm9yOicsIGVycm9yKTtcbiAqICB9XG4gKiAgY29uc29sZS5sb2coJ1ZhbHVlIGlzIHZhbGlkJyk7XG4gKiB9XG4gKlxuICogYXdhaXQgcnVuVmFsaWRhdGlvbigpO1xuICogYGBgXG4gKlxuICogLSBJZiBgdmFsdWUgPiB0aW1lb3V0YCwgdGhlIHZhbGlkYXRvciB3YWl0cyBmb3IgdGhlIGRlbGF5IGFuZCB0aGVuIHJlamVjdHMgd2l0aCBhbiBlcnJvci5cbiAqIC0gSWYgYHZhbHVlIDw9IHRpbWVvdXRgLCB0aGUgdmFsaWRhdG9yIHdhaXRzIGZvciB0aGUgZGVsYXkgYW5kIHJlc29sdmVzIHN1Y2Nlc3NmdWxseSB3aXRoIGB1bmRlZmluZWRgLlxuICpcbiAqIEBzZWUge0BsaW5rIFZhbGlkYXRvcn0gRm9yIHRoZSBiYXNlIHN5bmNocm9ub3VzIHZhbGlkYXRvci5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jVmFsaWRhdG9yPFxuICBWIGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9ucyxcbj4gZXh0ZW5kcyBCYXNlVmFsaWRhdG9yPFYsIHRydWU+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcih0cnVlLCBtZXNzYWdlLCAuLi5hY2NlcHRlZFR5cGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXN5bmNocm9ub3VzbHkgdmFsaWRhdGVzIGEgdmFsdWUuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVHlwZSBvZiB0aGUgb3B0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlIHZhbGlkYXRvclxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHtWfSBbb3B0aW9uc10gLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGN1c3RvbWl6aW5nIHZhbGlkYXRpb24gYmVoYXZpb3JcbiAgICogQHBhcmFtIHtQYXRoUHJveHk8YW55Pn0gcHJveHkgLVxuICAgKiBAcmV0dXJuIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiBFcnJvciBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHVuZGVmaW5lZCBpZiB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgKlxuICAgKiBAc2VlIHtAbGluayBWYWxpZGF0b3J9XG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3Qgb3ZlcnJpZGUgaGFzRXJyb3JzKFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFYsXG4gICAgcHJveHk/OiBQYXRoUHJveHk8YW55PlxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG4iXX0=
@@ -0,0 +1,72 @@
1
+ import type { ValidatorOptions } from "../types";
2
+ import type { PathProxy } from "../../utils";
3
+ import { BaseValidator } from "./BaseValidator";
4
+ /**
5
+ * @description
6
+ * Abstract class for defining asynchronous validators.
7
+ *
8
+ * This class extends the base `Validator` and enforces that any implementation
9
+ * of `hasErrors` must be asynchronous, always returning a Promise.
10
+ *
11
+ * Use this when the validation process involves asynchronous operations,
12
+ * such as API calls, database lookups, or time-based checks (e.g., timeouts).
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Example of an asynchronous validator that compares value against a timeout
17
+ * class TimeoutValidator extends AsyncValidator<{ timeout?: number }> {
18
+ * constructor(message: string = "Validation failed due to timeout") {
19
+ * super(message);
20
+ * }
21
+ *
22
+ * async hasErrors(value: number, options?: { timeout?: number }) {
23
+ * const delay = options?.timeout ?? 100;
24
+ *
25
+ * // async call
26
+ * await new Promise(res => setTimeout(res, delay));
27
+ *
28
+ * if (value > delay) {
29
+ * // Rejects the validation after waiting the delay if value is greater
30
+ * return Promise.resolve(this.getMessage());
31
+ * }
32
+ *
33
+ * // Passes the validation after waiting the delay
34
+ * return Promise.resolve(undefined);
35
+ * }
36
+ * }
37
+ *
38
+ * // Example usage:
39
+ * const validator = new TimeoutValidator();
40
+ *
41
+ * async function runValidation() {
42
+ * const error = await validator.hasErrors(50, { timeout: 100 });
43
+ * if (error) {
44
+ * return console.error('Validation error:', error);
45
+ * }
46
+ * console.log('Value is valid');
47
+ * }
48
+ *
49
+ * await runValidation();
50
+ * ```
51
+ *
52
+ * - If `value > timeout`, the validator waits for the delay and then rejects with an error.
53
+ * - If `value <= timeout`, the validator waits for the delay and resolves successfully with `undefined`.
54
+ *
55
+ * @see {@link Validator} For the base synchronous validator.
56
+ */
57
+ export declare abstract class AsyncValidator<V extends ValidatorOptions> extends BaseValidator<V, true> {
58
+ protected constructor(message?: string, ...acceptedTypes: string[]);
59
+ /**
60
+ * @description
61
+ * Asynchronously validates a value.
62
+ *
63
+ * @template V - Type of the option object that can be passed to the validator
64
+ * @param {any} value - The value to validate
65
+ * @param {V} [options] - Optional configuration options for customizing validation behavior
66
+ * @param {PathProxy<any>} proxy -
67
+ * @return Promise<string | undefined> Error message if validation fails, undefined if validation passes
68
+ *
69
+ * @see {@link Validator}
70
+ */
71
+ abstract hasErrors(value: any, options?: V, proxy?: PathProxy<any>): Promise<string | undefined>;
72
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseValidator = void 0;
4
+ const constants_1 = require("./constants.cjs");
5
+ const strings_1 = require("./../../utils/strings.cjs");
6
+ const reflection_1 = require("@decaf-ts/reflection");
7
+ /**
8
+ * @description Abstract base class for all validators in the validation framework.
9
+ * @summary The BaseValidator class provides the foundation for all synchronous and asynchronous validator implementations.
10
+ * It handles type checking, error message formatting, and defines the interface that all validators must implement.
11
+ * This class is designed to be extended by specific validator classes that define their own validation logic.
12
+ *
13
+ * @template V - Validator options type
14
+ * @template IsAsync - Whether the validator is async (true) or sync (false). Default `false`.
15
+ *
16
+ * @param {boolean} async - Defines if the validator is async (must match the subclass signature)
17
+ * @param {string} message - Default error message to display when validation fails (defaults to {@link DEFAULT_ERROR_MESSAGES#DEFAULT})
18
+ * @param {string[]} acceptedTypes - Type names that this validator accepts (used for runtime type checking)
19
+ *
20
+ * @class BaseValidator
21
+ * @abstract
22
+ *
23
+ * @example
24
+ * // Example of a synchronous validator
25
+ * class SyncValidator extends BaseValidator<SomeOptions, false> {
26
+ * constructor() {
27
+ * super(false, "Sync validation failed", String.name);
28
+ * }
29
+ *
30
+ * public hasErrors(value: any, options?: SomeOptions): string | undefined {
31
+ * if (typeof value !== "string") return this.getMessage(this.message);
32
+ * return undefined;
33
+ * }
34
+ * }
35
+ *
36
+ * @example
37
+ * // Example of an asynchronous custom validator
38
+ * class AsyncValidator extends BaseValidator<SomeOptions, true> {
39
+ * constructor() {
40
+ * super(true, "Async validation failed", String.name);
41
+ * }
42
+ *
43
+ * public async hasErrors(value: any, options?: SomeOptions): Promise<string | undefined> {
44
+ * const result = await someAsyncCheck(value);
45
+ * if (!result) return this.getMessage(this.message);
46
+ * return undefined;
47
+ * }
48
+ * }
49
+ *
50
+ * @mermaid
51
+ * sequenceDiagram
52
+ * participant C as Client
53
+ * participant V as Validator Subclass
54
+ * participant B as BaseValidator
55
+ *
56
+ * C->>V: new CustomValidator(async, message)
57
+ * V->>B: super(async, message, acceptedTypes)
58
+ * B->>B: Store message, async flag, and accepted types
59
+ * B->>B: Optionally wrap hasErrors with type checking
60
+ * C->>V: hasErrors(value, options)
61
+ * alt value type not in acceptedTypes
62
+ * B-->>C: Type error message
63
+ * else value type is accepted
64
+ * V->>V: Custom validation logic
65
+ * V-->>C: Validation result
66
+ * end
67
+ *
68
+ * @category Validators
69
+ */
70
+ class BaseValidator {
71
+ constructor(async, message = constants_1.DEFAULT_ERROR_MESSAGES.DEFAULT, ...acceptedTypes) {
72
+ this.async = async;
73
+ this.message = message;
74
+ if (acceptedTypes.length)
75
+ this.acceptedTypes = acceptedTypes;
76
+ if (this.acceptedTypes)
77
+ this.hasErrors = this.checkTypeAndHasErrors(this.hasErrors.bind(this));
78
+ }
79
+ /**
80
+ * @description Formats an error message with optional arguments
81
+ * @summary Creates a formatted error message by replacing placeholders with provided arguments.
82
+ * This method uses the string formatting utility to generate consistent error messages
83
+ * across all validators.
84
+ *
85
+ * @param {string} message - The message template with placeholders
86
+ * @param {...any} args - Values to insert into the message template
87
+ * @return {string} The formatted error message
88
+ * @protected
89
+ */
90
+ getMessage(message, ...args) {
91
+ return (0, strings_1.sf)(message, ...args);
92
+ }
93
+ /**
94
+ * @description Creates a type-checking wrapper around the hasErrors method
95
+ * @summary Wraps the hasErrors method with type validation logic to ensure that
96
+ * the value being validated is of an accepted type before performing specific validation.
97
+ * This method is called during construction if acceptedTypes are provided.
98
+ *
99
+ * @param {Function} unbound - The original hasErrors method to be wrapped
100
+ * @return {Function} A new function that performs type checking before calling the original method
101
+ * @private
102
+ */
103
+ checkTypeAndHasErrors(unbound) {
104
+ return function (value, options, proxy, ...args) {
105
+ if (value === undefined || !this.acceptedTypes)
106
+ return unbound(value, options, proxy, ...args);
107
+ if (!reflection_1.Reflection.checkTypes(value, this.acceptedTypes))
108
+ return this.getMessage(constants_1.DEFAULT_ERROR_MESSAGES.TYPE, this.acceptedTypes.join(", "), typeof value);
109
+ return unbound(value, options, proxy, ...args);
110
+ }.bind(this);
111
+ }
112
+ /**
113
+ * @summary Duck typing for Validators
114
+ * @param val
115
+ */
116
+ static isValidator(val) {
117
+ return val.constructor && !!val["hasErrors"];
118
+ }
119
+ }
120
+ exports.BaseValidator = BaseValidator;
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL1ZhbGlkYXRvcnMvQmFzZVZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQ0FBcUQ7QUFDckQsdURBQXlDO0FBQ3pDLHFEQUFrRDtBQUtsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4REc7QUFDSCxNQUFzQixhQUFhO0lBUWpDLFlBQ0UsS0FBWSxFQUNaLFVBQWtCLGtDQUFzQixDQUFDLE9BQU8sRUFDaEQsR0FBRyxhQUF1QjtRQUUxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QixJQUFJLGFBQWEsQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDN0QsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFRLENBQzFCLENBQUM7SUFDYixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNPLFVBQVUsQ0FBQyxPQUFlLEVBQUUsR0FBRyxJQUFXO1FBQ2xELE9BQU8sSUFBQSxZQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLHFCQUFxQixDQUMzQixPQUtnRDtRQUVoRCxPQUFPLFVBRUwsS0FBVSxFQUNWLE9BQVUsRUFDVixLQUFzQixFQUN0QixHQUFHLElBQVc7WUFFZCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtnQkFDNUMsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsdUJBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FDcEIsa0NBQXNCLENBQUMsSUFBSSxFQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDN0IsT0FBTyxLQUFLLENBQ2IsQ0FBQztZQUNKLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNmLENBQUM7SUF5QkQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFRO1FBQ3pCLE9BQU8sR0FBRyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQXpHRCxzQ0F5R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0VSUk9SX01FU1NBR0VTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzZiB9IGZyb20gXCIuLi8uLi91dGlscy9zdHJpbmdzXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFBhdGhQcm94eSB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25kaXRpb25hbEFzeW5jIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCB2YWxpZGF0b3JzIGluIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay5cbiAqIEBzdW1tYXJ5IFRoZSBCYXNlVmFsaWRhdG9yIGNsYXNzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb25zLlxuICogSXQgaGFuZGxlcyB0eXBlIGNoZWNraW5nLCBlcnJvciBtZXNzYWdlIGZvcm1hdHRpbmcsIGFuZCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdGhhdCBhbGwgdmFsaWRhdG9ycyBtdXN0IGltcGxlbWVudC5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWMgdmFsaWRhdG9yIGNsYXNzZXMgdGhhdCBkZWZpbmUgdGhlaXIgb3duIHZhbGlkYXRpb24gbG9naWMuXG4gKlxuICogQHRlbXBsYXRlIFYgLSBWYWxpZGF0b3Igb3B0aW9ucyB0eXBlXG4gKiBAdGVtcGxhdGUgSXNBc3luYyAtIFdoZXRoZXIgdGhlIHZhbGlkYXRvciBpcyBhc3luYyAodHJ1ZSkgb3Igc3luYyAoZmFsc2UpLiBEZWZhdWx0IGBmYWxzZWAuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBhc3luYyAtIERlZmluZXMgaWYgdGhlIHZhbGlkYXRvciBpcyBhc3luYyAobXVzdCBtYXRjaCB0aGUgc3ViY2xhc3Mgc2lnbmF0dXJlKVxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHZhbGlkYXRpb24gZmFpbHMgKGRlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX0VSUk9SX01FU1NBR0VTI0RFRkFVTFR9KVxuICogQHBhcmFtIHtzdHJpbmdbXX0gYWNjZXB0ZWRUeXBlcyAtIFR5cGUgbmFtZXMgdGhhdCB0aGlzIHZhbGlkYXRvciBhY2NlcHRzICh1c2VkIGZvciBydW50aW1lIHR5cGUgY2hlY2tpbmcpXG4gKlxuICogQGNsYXNzIEJhc2VWYWxpZGF0b3JcbiAqIEBhYnN0cmFjdFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGEgc3luY2hyb25vdXMgdmFsaWRhdG9yXG4gKiBjbGFzcyBTeW5jVmFsaWRhdG9yIGV4dGVuZHMgQmFzZVZhbGlkYXRvcjxTb21lT3B0aW9ucywgZmFsc2U+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoZmFsc2UsIFwiU3luYyB2YWxpZGF0aW9uIGZhaWxlZFwiLCBTdHJpbmcubmFtZSk7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IFNvbWVPcHRpb25zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAqICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5nZXRNZXNzYWdlKHRoaXMubWVzc2FnZSk7XG4gKiAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAqICAgfVxuICogfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIGFuIGFzeW5jaHJvbm91cyBjdXN0b20gdmFsaWRhdG9yXG4gKiBjbGFzcyBBc3luY1ZhbGlkYXRvciBleHRlbmRzIEJhc2VWYWxpZGF0b3I8U29tZU9wdGlvbnMsIHRydWU+IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIodHJ1ZSwgXCJBc3luYyB2YWxpZGF0aW9uIGZhaWxlZFwiLCBTdHJpbmcubmFtZSk7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBhc3luYyBoYXNFcnJvcnModmFsdWU6IGFueSwgb3B0aW9ucz86IFNvbWVPcHRpb25zKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzb21lQXN5bmNDaGVjayh2YWx1ZSk7XG4gKiAgICAgaWYgKCFyZXN1bHQpIHJldHVybiB0aGlzLmdldE1lc3NhZ2UodGhpcy5tZXNzYWdlKTtcbiAqICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICogICB9XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICogICBwYXJ0aWNpcGFudCBWIGFzIFZhbGlkYXRvciBTdWJjbGFzc1xuICogICBwYXJ0aWNpcGFudCBCIGFzIEJhc2VWYWxpZGF0b3JcbiAqXG4gKiAgIEMtPj5WOiBuZXcgQ3VzdG9tVmFsaWRhdG9yKGFzeW5jLCBtZXNzYWdlKVxuICogICBWLT4+Qjogc3VwZXIoYXN5bmMsIG1lc3NhZ2UsIGFjY2VwdGVkVHlwZXMpXG4gKiAgIEItPj5COiBTdG9yZSBtZXNzYWdlLCBhc3luYyBmbGFnLCBhbmQgYWNjZXB0ZWQgdHlwZXNcbiAqICAgQi0+PkI6IE9wdGlvbmFsbHkgd3JhcCBoYXNFcnJvcnMgd2l0aCB0eXBlIGNoZWNraW5nXG4gKiAgIEMtPj5WOiBoYXNFcnJvcnModmFsdWUsIG9wdGlvbnMpXG4gKiAgIGFsdCB2YWx1ZSB0eXBlIG5vdCBpbiBhY2NlcHRlZFR5cGVzXG4gKiAgICAgQi0tPj5DOiBUeXBlIGVycm9yIG1lc3NhZ2VcbiAqICAgZWxzZSB2YWx1ZSB0eXBlIGlzIGFjY2VwdGVkXG4gKiAgICAgVi0+PlY6IEN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljXG4gKiAgICAgVi0tPj5DOiBWYWxpZGF0aW9uIHJlc3VsdFxuICogICBlbmRcbiAqXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdG9yc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVZhbGlkYXRvcjxcbiAgViBleHRlbmRzIFZhbGlkYXRvck9wdGlvbnMgPSBWYWxpZGF0b3JPcHRpb25zLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4ge1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFjY2VwdGVkVHlwZXM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgYXN5bmM/OiBBc3luYztcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgYXN5bmM6IEFzeW5jLFxuICAgIG1lc3NhZ2U6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfTUVTU0FHRVMuREVGQVVMVCxcbiAgICAuLi5hY2NlcHRlZFR5cGVzOiBzdHJpbmdbXVxuICApIHtcbiAgICB0aGlzLmFzeW5jID0gYXN5bmM7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblxuICAgIGlmIChhY2NlcHRlZFR5cGVzLmxlbmd0aCkgdGhpcy5hY2NlcHRlZFR5cGVzID0gYWNjZXB0ZWRUeXBlcztcbiAgICBpZiAodGhpcy5hY2NlcHRlZFR5cGVzKVxuICAgICAgdGhpcy5oYXNFcnJvcnMgPSB0aGlzLmNoZWNrVHlwZUFuZEhhc0Vycm9ycyhcbiAgICAgICAgdGhpcy5oYXNFcnJvcnMuYmluZCh0aGlzKSBhcyBhbnlcbiAgICAgICkgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGb3JtYXRzIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBvcHRpb25hbCBhcmd1bWVudHNcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlIGJ5IHJlcGxhY2luZyBwbGFjZWhvbGRlcnMgd2l0aCBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIHN0cmluZyBmb3JtYXR0aW5nIHV0aWxpdHkgdG8gZ2VuZXJhdGUgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlc1xuICAgKiBhY3Jvc3MgYWxsIHZhbGlkYXRvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdGVtcGxhdGUgd2l0aCBwbGFjZWhvbGRlcnNcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBWYWx1ZXMgdG8gaW5zZXJ0IGludG8gdGhlIG1lc3NhZ2UgdGVtcGxhdGVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGVycm9yIG1lc3NhZ2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzZihtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHR5cGUtY2hlY2tpbmcgd3JhcHBlciBhcm91bmQgdGhlIGhhc0Vycm9ycyBtZXRob2RcbiAgICogQHN1bW1hcnkgV3JhcHMgdGhlIGhhc0Vycm9ycyBtZXRob2Qgd2l0aCB0eXBlIHZhbGlkYXRpb24gbG9naWMgdG8gZW5zdXJlIHRoYXRcbiAgICogdGhlIHZhbHVlIGJlaW5nIHZhbGlkYXRlZCBpcyBvZiBhbiBhY2NlcHRlZCB0eXBlIGJlZm9yZSBwZXJmb3JtaW5nIHNwZWNpZmljIHZhbGlkYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uIGlmIGFjY2VwdGVkVHlwZXMgYXJlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1bmJvdW5kIC0gVGhlIG9yaWdpbmFsIGhhc0Vycm9ycyBtZXRob2QgdG8gYmUgd3JhcHBlZFxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0eXBlIGNoZWNraW5nIGJlZm9yZSBjYWxsaW5nIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tUeXBlQW5kSGFzRXJyb3JzKFxuICAgIHVuYm91bmQ6IChcbiAgICAgIHZhbHVlOiBhbnksXG4gICAgICBvcHRpb25zPzogVixcbiAgICAgIHByb3h5PzogUGF0aFByb3h5PGFueT4sXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICkgPT4gQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuICApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKFxuICAgICAgdGhpczogQmFzZVZhbGlkYXRvcixcbiAgICAgIHZhbHVlOiBhbnksXG4gICAgICBvcHRpb25zOiBWLFxuICAgICAgcHJveHk/OiBQYXRoUHJveHk8YW55PixcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhdGhpcy5hY2NlcHRlZFR5cGVzKVxuICAgICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgb3B0aW9ucywgcHJveHksIC4uLmFyZ3MpO1xuICAgICAgaWYgKCFSZWZsZWN0aW9uLmNoZWNrVHlwZXModmFsdWUsIHRoaXMuYWNjZXB0ZWRUeXBlcykpXG4gICAgICAgIHJldHVybiB0aGlzLmdldE1lc3NhZ2UoXG4gICAgICAgICAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFLFxuICAgICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlcy5qb2luKFwiLCBcIiksXG4gICAgICAgICAgdHlwZW9mIHZhbHVlXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gdW5ib3VuZCh2YWx1ZSwgb3B0aW9ucywgcHJveHksIC4uLmFyZ3MpO1xuICAgIH0uYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCBzcGVjaWZpYyB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIHZhbGlkYXRvciBzdWJjbGFzc2VzLlxuICAgKiBUaGlzIG1ldGhvZCBjb250YWlucyB0aGUgY29yZSB2YWxpZGF0aW9uIGxvZ2ljIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmFsdWVcbiAgICogaXMgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpYyBydWxlcyBvZiB0aGUgdmFsaWRhdG9yLiBJZiB0aGUgdmFsdWUgaXMgdmFsaWQsXG4gICAqIHRoZSBtZXRob2QgcmV0dXJucyB1bmRlZmluZWQ7IG90aGVyd2lzZSwgaXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG9wdGlvbnMgb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgdmFsaWRhdG9yXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0ge1Z9IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY3VzdG9taXppbmcgdmFsaWRhdGlvbiBiZWhhdmlvclxuICAgKiBAcGFyYW0ge1BhdGhQcm94eTxhbnk+fSBwcm94eSAtXG4gICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gRXJyb3IgbWVzc2FnZSBpZiB2YWxpZGF0aW9uIGZhaWxzLCB1bmRlZmluZWQgaWYgdmFsaWRhdGlvbiBwYXNzZXNcbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqXG4gICAqIEBzZWUgTW9kZWwjdmFsaWRhdGVcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBoYXNFcnJvcnMoXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogVixcbiAgICBwcm94eT86IFBhdGhQcm94eTxhbnk+XG4gICk6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IER1Y2sgdHlwaW5nIGZvciBWYWxpZGF0b3JzXG4gICAqIEBwYXJhbSB2YWxcbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkYXRvcih2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwuY29uc3RydWN0b3IgJiYgISF2YWxbXCJoYXNFcnJvcnNcIl07XG4gIH1cbn1cbiJdfQ==