@decaf-ts/injectable-decorators 1.6.6 → 1.6.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.
package/lib/constants.cjs CHANGED
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InjectablesKeys = void 0;
3
+ exports.TypeKey = exports.DefaultInjectablesConfig = exports.InjectablesKeys = void 0;
4
4
  /**
5
5
  * @description Constants used for reflection metadata keys in the dependency injection system.
6
6
  * @summary Injectables Reflection keys used to store and retrieve metadata about injectable classes and properties.
7
- *
8
7
  * @property {string} REFLECT Reflection injectables base key prefix for all metadata keys
9
8
  * @property {string} INJECTABLE Reflection key suffix for marking a class as injectable
10
9
  * @property {string} INJECT Reflection key suffix for marking a property for injection
11
- *
12
10
  * @const InjectablesKeys
13
11
  * @memberOf module:injectable-decorators
14
12
  */
@@ -17,4 +15,20 @@ exports.InjectablesKeys = {
17
15
  INJECTABLE: "injectable",
18
16
  INJECT: "inject",
19
17
  };
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ1UsUUFBQSxlQUFlLEdBQUc7SUFDN0IsT0FBTyxFQUFFLFlBQVk7SUFDckIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGtleXMgaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IEluamVjdGFibGVzIFJlZmxlY3Rpb24ga2V5cyB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBpbmplY3RhYmxlIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMuXG4gKiBcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIFJlZmxlY3Rpb24gaW5qZWN0YWJsZXMgYmFzZSBrZXkgcHJlZml4IGZvciBhbGwgbWV0YWRhdGEga2V5c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IElOSkVDVEFCTEUgUmVmbGVjdGlvbiBrZXkgc3VmZml4IGZvciBtYXJraW5nIGEgY2xhc3MgYXMgaW5qZWN0YWJsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOSkVDVCBSZWZsZWN0aW9uIGtleSBzdWZmaXggZm9yIG1hcmtpbmcgYSBwcm9wZXJ0eSBmb3IgaW5qZWN0aW9uXG4gKiBcbiAqIEBjb25zdCBJbmplY3RhYmxlc0tleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBJbmplY3RhYmxlc0tleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiaW5qZWN0LmRiLlwiLFxuICBJTkpFQ1RBQkxFOiBcImluamVjdGFibGVcIixcbiAgSU5KRUNUOiBcImluamVjdFwiLFxufTtcbiJdfQ==
18
+ /**
19
+ * @description Default configuration applied by the @injectable decorator when none is provided.
20
+ * @summary Sets sensible defaults such as singleton lifecycle for newly registered injectables.
21
+ * @const DefaultInjectablesConfig
22
+ * @memberOf module:injectable-decorators
23
+ */
24
+ exports.DefaultInjectablesConfig = {
25
+ singleton: true,
26
+ };
27
+ /**
28
+ * @description Reflection metadata key for accessing TypeScript type information.
29
+ * @summary Holds the key for retrieving the design type from TypeScript's reflection metadata.
30
+ * @const TypeKey
31
+ * @memberOf module:injectable-decorators
32
+ */
33
+ exports.TypeKey = "design:type";
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7Ozs7R0FRRztBQUNVLFFBQUEsZUFBZSxHQUFHO0lBQzdCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE1BQU0sRUFBRSxRQUFRO0NBQ2pCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsd0JBQXdCLEdBQXFCO0lBQ3hELFNBQVMsRUFBRSxJQUFJO0NBQ2hCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGVDb25maWcgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGtleXMgaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IEluamVjdGFibGVzIFJlZmxlY3Rpb24ga2V5cyB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBpbmplY3RhYmxlIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBSZWZsZWN0aW9uIGluamVjdGFibGVzIGJhc2Uga2V5IHByZWZpeCBmb3IgYWxsIG1ldGFkYXRhIGtleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1RBQkxFIFJlZmxlY3Rpb24ga2V5IHN1ZmZpeCBmb3IgbWFya2luZyBhIGNsYXNzIGFzIGluamVjdGFibGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1QgUmVmbGVjdGlvbiBrZXkgc3VmZml4IGZvciBtYXJraW5nIGEgcHJvcGVydHkgZm9yIGluamVjdGlvblxuICogQGNvbnN0IEluamVjdGFibGVzS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEluamVjdGFibGVzS2V5cyA9IHtcbiAgUkVGTEVDVDogXCJpbmplY3QuZGIuXCIsXG4gIElOSkVDVEFCTEU6IFwiaW5qZWN0YWJsZVwiLFxuICBJTkpFQ1Q6IFwiaW5qZWN0XCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCBieSB0aGUgQGluamVjdGFibGUgZGVjb3JhdG9yIHdoZW4gbm9uZSBpcyBwcm92aWRlZC5cbiAqIEBzdW1tYXJ5IFNldHMgc2Vuc2libGUgZGVmYXVsdHMgc3VjaCBhcyBzaW5nbGV0b24gbGlmZWN5Y2xlIGZvciBuZXdseSByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICogQGNvbnN0IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZzogSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiB0cnVlLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkgZm9yIGFjY2Vzc2luZyBUeXBlU2NyaXB0IHR5cGUgaW5mb3JtYXRpb24uXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUga2V5IGZvciByZXRyaWV2aW5nIHRoZSBkZXNpZ24gdHlwZSBmcm9tIFR5cGVTY3JpcHQncyByZWZsZWN0aW9uIG1ldGFkYXRhLlxuICogQGNvbnN0IFR5cGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlS2V5ID0gXCJkZXNpZ246dHlwZVwiO1xuIl19
@@ -1,11 +1,10 @@
1
+ import { InjectableConfig } from "./decorators";
1
2
  /**
2
3
  * @description Constants used for reflection metadata keys in the dependency injection system.
3
4
  * @summary Injectables Reflection keys used to store and retrieve metadata about injectable classes and properties.
4
- *
5
5
  * @property {string} REFLECT Reflection injectables base key prefix for all metadata keys
6
6
  * @property {string} INJECTABLE Reflection key suffix for marking a class as injectable
7
7
  * @property {string} INJECT Reflection key suffix for marking a property for injection
8
- *
9
8
  * @const InjectablesKeys
10
9
  * @memberOf module:injectable-decorators
11
10
  */
@@ -14,3 +13,17 @@ export declare const InjectablesKeys: {
14
13
  INJECTABLE: string;
15
14
  INJECT: string;
16
15
  };
16
+ /**
17
+ * @description Default configuration applied by the @injectable decorator when none is provided.
18
+ * @summary Sets sensible defaults such as singleton lifecycle for newly registered injectables.
19
+ * @const DefaultInjectablesConfig
20
+ * @memberOf module:injectable-decorators
21
+ */
22
+ export declare const DefaultInjectablesConfig: InjectableConfig;
23
+ /**
24
+ * @description Reflection metadata key for accessing TypeScript type information.
25
+ * @summary Holds the key for retrieving the design type from TypeScript's reflection metadata.
26
+ * @const TypeKey
27
+ * @memberOf module:injectable-decorators
28
+ */
29
+ export declare const TypeKey = "design:type";
@@ -1,38 +1,72 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getInjectKey = void 0;
4
3
  exports.injectable = injectable;
4
+ exports.singleton = singleton;
5
+ exports.onDemand = onDemand;
5
6
  exports.inject = inject;
6
7
  const constants_1 = require("./constants.cjs");
7
8
  const Injectables_1 = require("./Injectables.cjs");
8
9
  const utils_1 = require("./utils.cjs");
9
10
  /**
10
- * @description Generates a fully qualified reflection metadata key.
11
- * @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
12
- * @param {string} key The key to be prefixed
13
- * @return {string} The fully qualified reflection key
14
- * @function getInjectKey
15
- * @memberOf module:injectable-decorators
11
+ * @description Decorator that marks a class as available for dependency injection.
12
+ * @summary Defines a class as an injectable that can be retrieved from the registry.
13
+ * When applied to a class, replaces its constructor with one that returns an instance.
14
+ *
15
+ * @param {string | Constructor} [category] Defaults to the class category. Useful when minification occurs and names are changed,
16
+ * or when you want to upcast the object to a different type.
17
+ * @param {Partial<InjectableConfig>} [cfg=DefaultInjectableConfig] Allows overriding the default singleton behavior and adding a callback function.
18
+ *
19
+ * @return {function(any): any} A decorator function that transforms the class into an injectable.
20
+ *
21
+ * @function injectable
22
+ * @category Decorators
23
+ *
24
+ * @mermaid
25
+ * sequenceDiagram
26
+ * participant Client
27
+ * participant Decorator
28
+ * participant Injectables
29
+ *
30
+ * Client->>Decorator: @injectable()
31
+ * Decorator->>Decorator: Create new constructor
32
+ *
33
+ * Note over Decorator: When new instance requested
34
+ * Decorator->>Injectables: get(category)
35
+ * alt Instance exists
36
+ * Injectables-->>Decorator: Return existing instance
37
+ * else No instance
38
+ * Decorator->>Injectables: register(original, category)
39
+ * Decorator->>Injectables: get(category)
40
+ * Injectables-->>Decorator: Return new instance
41
+ * opt Has callback
42
+ * Decorator->>Decorator: Call instanceCallback
43
+ * end
44
+ * end
45
+ * Decorator->>Decorator: Define metadata
46
+ * Decorator-->>Client: Return instance
16
47
  */
17
- const getInjectKey = (key) => constants_1.InjectablesKeys.REFLECT + key;
18
- exports.getInjectKey = getInjectKey;
19
- function injectable(name, cb) {
20
- const instanceCallback = (typeof name === "function" && !name.name ? name : cb);
21
- const category = typeof name === "string"
22
- ? name
23
- : cb
24
- ? name
25
- : typeof name === "function" && !name.name
26
- ? undefined
27
- : name;
48
+ function injectable(category, cfg) {
49
+ cfg =
50
+ cfg ||
51
+ (typeof category === "object"
52
+ ? Object.assign(category, constants_1.DefaultInjectablesConfig)
53
+ : constants_1.DefaultInjectablesConfig);
54
+ category =
55
+ typeof category === "object"
56
+ ? undefined
57
+ : typeof category === "string"
58
+ ? category
59
+ : typeof category === "function" && category.name
60
+ ? category
61
+ : undefined;
28
62
  return (original) => {
29
63
  const symbol = Symbol.for(category || original.toString());
30
- const name = category || original.name;
64
+ category = category || original.name;
31
65
  const metadata = {
32
- class: name,
66
+ class: category,
33
67
  symbol: symbol,
34
68
  };
35
- Reflect.defineMetadata((0, exports.getInjectKey)(constants_1.InjectablesKeys.INJECTABLE), metadata, original);
69
+ Reflect.defineMetadata((0, utils_1.getInjectKey)(constants_1.InjectablesKeys.INJECTABLE), metadata, original);
36
70
  // the new constructor behaviour
37
71
  const newConstructor = function (...args) {
38
72
  return Injectables_1.Injectables.get(symbol, ...args);
@@ -47,16 +81,36 @@ function injectable(name, cb) {
47
81
  configurable: false,
48
82
  value: original.prototype.constructor.name,
49
83
  });
50
- const opts = {
51
- singleton: true,
52
- callback: instanceCallback,
53
- };
54
- Reflect.defineMetadata((0, exports.getInjectKey)(constants_1.InjectablesKeys.INJECTABLE), metadata, newConstructor);
55
- Injectables_1.Injectables.register(original, symbol, opts);
84
+ Reflect.defineMetadata((0, utils_1.getInjectKey)(constants_1.InjectablesKeys.INJECTABLE), metadata, newConstructor);
85
+ Injectables_1.Injectables.register(original, symbol, cfg);
56
86
  // return new constructor (will override original)
57
87
  return newConstructor;
58
88
  };
59
89
  }
90
+ /**
91
+ * @description Convenience decorator to register an injectable as a singleton.
92
+ * @summary Wraps {@link injectable} forcing the singleton lifecycle so only one instance is created and reused.
93
+ * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
94
+ * @param {Omit<InjectableConfig, "singleton">} [cfg] Additional injectable configuration excluding the singleton flag.
95
+ * @return function(any): any} A class decorator that registers the target as a singleton injectable.
96
+ * @function singleton
97
+ * @category Class Decorators
98
+ */
99
+ function singleton(category, cfg) {
100
+ return injectable(category, Object.assign({}, cfg || {}, { singleton: true }));
101
+ }
102
+ /**
103
+ * @description Convenience decorator to register an injectable as on-demand (non-singleton).
104
+ * @summary Wraps {@link injectable} forcing new instances to be created on every injection or retrieval.
105
+ * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
106
+ * @param {Omit<InjectableConfig, "singleton">} [cfg] Additional injectable configuration excluding the singleton flag.
107
+ * @return {function(any): any} A class decorator that registers the target as a non-singleton injectable.
108
+ * @function onDemand
109
+ * @category Class Decorators
110
+ */
111
+ function onDemand(category, cfg) {
112
+ return injectable(category, Object.assign({}, cfg || {}, { singleton: false }));
113
+ }
60
114
  /**
61
115
  * @description Property decorator that injects a dependency into a class property.
62
116
  * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
@@ -80,8 +134,8 @@ function injectable(name, cb) {
80
134
  *
81
135
  * @param {string} [category] Defaults to the class name derived from the property type. Useful when minification occurs
82
136
  * and names are changed, or when you want to upcast the object to a different type.
83
- * @param {InstanceTransformer} [transformer] Optional function to transform the injectable instance before it's injected.
84
- * @return {Function} A property decorator function that sets up the dependency injection.
137
+ * @param {Partial<InjectOptions>} [cfg={}] Optional function to transform the injectable instance before it's injected, or arguments to pass the constructor when injecting onDemand
138
+ * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
85
139
  *
86
140
  * @function inject
87
141
  * @category Property Decorators
@@ -116,43 +170,43 @@ function injectable(name, cb) {
116
170
  * end
117
171
  * end
118
172
  */
119
- function inject(category, transformer) {
173
+ function inject(category, cfg) {
120
174
  return (target, propertyKey) => {
121
- const values = new WeakMap();
122
- const name = category
123
- ? typeof category === "symbol"
124
- ? category
125
- : Symbol.for(category.toString())
126
- : (0, utils_1.getTypeFromDecorator)(target, propertyKey);
175
+ const config = (cfg || typeof category === "object" ? category : {});
176
+ const name = (typeof category !== "object" &&
177
+ category) ||
178
+ (0, utils_1.getTypeFromDecorator)(target, propertyKey);
127
179
  if (!name) {
128
180
  throw new Error(`Could not get Type from decorator`);
129
181
  }
130
- Reflect.defineMetadata((0, exports.getInjectKey)(constants_1.InjectablesKeys.INJECT), {
182
+ Reflect.defineMetadata((0, utils_1.getInjectKey)(constants_1.InjectablesKeys.INJECT), {
131
183
  injectable: name,
132
184
  }, target, propertyKey);
185
+ const values = new WeakMap();
133
186
  Object.defineProperty(target, propertyKey, {
134
187
  configurable: true,
135
188
  get() {
136
189
  const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
137
190
  if (descriptor.configurable) {
191
+ // let /obj: any;
138
192
  Object.defineProperty(this, propertyKey, {
139
193
  enumerable: true,
140
194
  configurable: false,
141
195
  get() {
142
196
  let obj = values.get(this);
143
- if (!obj) {
144
- obj = Injectables_1.Injectables.get(name);
145
- if (!obj)
146
- throw new Error(`Could not get Injectable ${name.toString()} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
147
- if (transformer)
148
- try {
149
- obj = transformer(obj, target);
150
- }
151
- catch (e) {
152
- console.error(e);
153
- }
154
- values.set(this, obj);
155
- }
197
+ if (obj)
198
+ return obj;
199
+ obj = Injectables_1.Injectables.get(name, ...(config.args || []));
200
+ if (!obj)
201
+ throw new Error(`Could not get Injectable ${name.toString()} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
202
+ if (config.transformer)
203
+ try {
204
+ obj = config.transformer(obj, target);
205
+ }
206
+ catch (e) {
207
+ console.error(e);
208
+ }
209
+ values.set(this, obj);
156
210
  return obj;
157
211
  },
158
212
  });
@@ -162,4 +216,4 @@ function inject(category, transformer) {
162
216
  });
163
217
  };
164
218
  }
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXFFQSxnQ0E2REM7QUF5RUQsd0JBNERDO0FBdlFELCtDQUE4QztBQUM5QyxtREFBNEM7QUFDNUMsdUNBQStDO0FBTy9DOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsMkJBQWUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQTlELFFBQUEsWUFBWSxnQkFBa0Q7QUFvRDNFLFNBQWdCLFVBQVUsQ0FDeEIsSUFBcUUsRUFDckUsRUFBMEI7SUFFMUIsTUFBTSxnQkFBZ0IsR0FBRyxDQUN2QixPQUFPLElBQUksS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDaEIsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FDWixPQUFPLElBQUksS0FBSyxRQUFRO1FBQ3RCLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLEVBQUU7WUFDRixDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDeEMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVmLE9BQU8sQ0FBQyxRQUFhLEVBQUUsRUFBRTtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMzRCxNQUFNLElBQUksR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUV2QyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLElBQUk7WUFDWCxNQUFNLEVBQUUsTUFBTTtTQUNm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LENBQUM7Z0NBQzVCLElBQUksQ0FBQyxHQUFHO29DQUNOLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEJBQTRCLElBQUksQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLFdBQVcsRUFBRSxDQUMxSSxDQUFDO2dDQUNKLElBQUksV0FBVztvQ0FDYixJQUFJLENBQUM7d0NBQ0gsR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7b0NBQ2pDLENBQUM7b0NBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3Q0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUNuQixDQUFDO2dDQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN4QixDQUFDOzRCQUNELE9BQU8sR0FBRyxDQUFDO3dCQUNiLENBQUM7cUJBQ0YsQ0FBQyxDQUFDO29CQUNILE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmltcG9ydCB7IGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEluamVjdGFibGVNZXRhZGF0YSxcbiAgSW5qZWN0YWJsZU9wdGlvbnMsXG4gIEluc3RhbmNlQ2FsbGJhY2ssXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIG1ldGFkYXRhIGtleS5cbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHJlZmxlY3Rpb24ga2V5IGZvciBpbmplY3RhYmxlcyBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBiYXNlIHJlZmxlY3Rpb24ga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBrZXlcbiAqIEBmdW5jdGlvbiBnZXRJbmplY3RLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbmplY3RLZXkgPSAoa2V5OiBzdHJpbmcpID0+IEluamVjdGFibGVzS2V5cy5SRUZMRUNUICsga2V5O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSBzaW5nbGV0b24gdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBbZm9yY2VdIERlZmluZXMgaWYgdGhlIGluamVjdGFibGUgc2hvdWxkIG92ZXJyaWRlIGFuIGFscmVhZHkgZXhpc3RpbmcgaW5zdGFuY2UgKGlmIGFueSkuXG4gKiBPbmx5IG1lYW50IGZvciBleHRlbmRpbmcgZGVjb3JhdG9ycy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbnN0YW5jZUNhbGxiYWNrXSBPcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGluc3RhbmNlIGFmdGVyIGNyZWF0aW9uLlxuICogQHJldHVybiB7RnVuY3Rpb259IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0YWJsZSgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ3JlYXRlIG5ldyBjb25zdHJ1Y3RvclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBuZXcgaW5zdGFuY2UgcmVxdWVzdGVkXG4gKiAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIG5hbWUpXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIG5ldyBpbnN0YW5jZVxuICogICAgIG9wdCBIYXMgY2FsbGJhY2tcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCBpbnN0YW5jZUNhbGxiYWNrXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH1cbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgaW5zdGFuY2VDYWxsYmFjazogSW5zdGFuY2VDYWxsYmFjazxhbnk+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSxcbiAgaW5zdGFuY2VDYWxsYmFjazogSW5zdGFuY2VDYWxsYmFjazxhbnk+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIG5hbWU/OiBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSB8IEluc3RhbmNlQ2FsbGJhY2s8YW55PixcbiAgY2I/OiBJbnN0YW5jZUNhbGxiYWNrPGFueT5cbikge1xuICBjb25zdCBpbnN0YW5jZUNhbGxiYWNrID0gKFxuICAgIHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgJiYgIW5hbWUubmFtZSA/IG5hbWUgOiBjYlxuICApIGFzIEluc3RhbmNlQ2FsbGJhY2s8YW55PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY2F0ZWdvcnkgPVxuICAgIHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiXG4gICAgICA/IG5hbWVcbiAgICAgIDogY2JcbiAgICAgICAgPyBuYW1lXG4gICAgICAgIDogdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiAmJiAhbmFtZS5uYW1lXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IG5hbWU7XG5cbiAgcmV0dXJuIChvcmlnaW5hbDogYW55KSA9PiB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjb25zdCBuYW1lID0gY2F0ZWdvcnkgfHwgb3JpZ2luYWwubmFtZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhOiBJbmplY3RhYmxlTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogbmFtZSxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3B0czogSW5qZWN0YWJsZU9wdGlvbnM8YW55PiA9IHtcbiAgICAgIHNpbmdsZXRvbjogdHJ1ZSxcbiAgICAgIGNhbGxiYWNrOiBpbnN0YW5jZUNhbGxiYWNrIGFzIEluc3RhbmNlQ2FsbGJhY2s8YW55PixcbiAgICB9O1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIG9wdHMpO1xuICAgIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gICAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xuICB9O1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdHlwZSBmb3IgdHJhbnNmb3JtaW5nIGluamVjdGFibGUgaW5zdGFuY2VzIGJlZm9yZSB0aGV5J3JlIGluamVjdGVkLlxuICogQHN1bW1hcnkgRnVuY3Rpb24gd2hpY2ggdHJhbnNmb3JtcyBhIGNhY2hlZCB7QGxpbmsgaW5qZWN0YWJsZX0gaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQgaW50byBhIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHthbnl9IGluamVjdGFibGUgVGhlIGluamVjdGFibGUgaW5zdGFuY2UgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdGhlIGluamVjdGFibGUgd2lsbCBiZSBpbmplY3RlZCBvblxuICogQHJldHVybiB7YW55fSBUaGUgdHJhbnNmb3JtZWQgaW5qZWN0YWJsZSBpbnN0YW5jZVxuICpcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gSW5zdGFuY2VUcmFuc2Zvcm1lclxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLlxuICogRm9yIHByb2plY3RzIHdoZXJlIG1pbmlmaWNhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZC5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3QoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IEdldCB0eXBlIGZyb20gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgcHJvcGVydHkgZ2V0dGVyXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIHByb3BlcnR5IGFjY2Vzc2VkXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogYWNjZXNzIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgaW4gV2Vha01hcFxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBhbHQgSW5qZWN0YWJsZSBmb3VuZFxuICogICAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gaW5qZWN0YWJsZSBpbnN0YW5jZVxuICogICAgICAgb3B0IEhhcyB0cmFuc2Zvcm1lclxuICogICAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgdHJhbnNmb3JtZXJcbiAqICAgICAgIGVuZFxuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBpbiBXZWFrTWFwXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqICAgICBlbHNlIE5vIGluamVjdGFibGVcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFRocm93IGVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9LFxuICB0cmFuc2Zvcm1lcj86IEluc3RhbmNlVHJhbnNmb3JtZXJcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBjb25zdCBuYW1lOiBzeW1ib2wgfCB1bmRlZmluZWQgPSBjYXRlZ29yeVxuICAgICAgPyB0eXBlb2YgY2F0ZWdvcnkgPT09IFwic3ltYm9sXCJcbiAgICAgICAgPyBjYXRlZ29yeVxuICAgICAgICA6IFN5bWJvbC5mb3IoY2F0ZWdvcnkudG9TdHJpbmcoKSlcbiAgICAgIDogZ2V0VHlwZUZyb21EZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuICAgIH1cblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVCksXG4gICAgICB7XG4gICAgICAgIGluamVjdGFibGU6IG5hbWUsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgKSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgICBpZiAoIW9iaikge1xuICAgICAgICAgICAgICAgIG9iaiA9IEluamVjdGFibGVzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBnZXQgSW5qZWN0YWJsZSAke25hbWUudG9TdHJpbmcoKX0gdG8gaW5qZWN0IGluICR7dGFyZ2V0LmNvbnN0cnVjdG9yID8gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgOiB0YXJnZXQubmFtZX0ncyAke3Byb3BlcnR5S2V5fWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gdHJhbnNmb3JtZXIob2JqLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iXX0=
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0lBLGdDQTBEQztBQVdELDhCQVFDO0FBV0QsNEJBUUM7QUFnSkQsd0JBZ0VDO0FBcGJELCtDQUF3RTtBQUN4RSxtREFBNEM7QUFDNUMsdUNBQTZEO0FBNEY3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsUUFBMkQsRUFDM0QsR0FBK0I7SUFFL0IsR0FBRztRQUNELEdBQUc7WUFDSCxDQUFDLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQTRCLEVBQUUsb0NBQXdCLENBQUM7Z0JBQ3ZFLENBQUMsQ0FBQyxvQ0FBd0IsQ0FBQyxDQUFDO0lBQ2hDLFFBQVE7UUFDTixPQUFPLFFBQVEsS0FBSyxRQUFRO1lBQzFCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxDQUFDLElBQUk7b0JBQy9DLENBQUMsQ0FBQyxRQUFRO29CQUNWLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFcEIsT0FBTyxDQUFDLFFBQWEsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLFFBQWtCO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxj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LENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZywgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXksIGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnRyb2xzIGxpZmVjeWNsZSAoc2luZ2xldG9uIHZzIG9uLWRlbWFuZCkgYW5kIGFuIG9wdGlvbmFsIGluc3RhbmNlIHRyYW5zZm9ybWF0aW9uIGNhbGxiYWNrIGV4ZWN1dGVkIHBvc3QtY29uc3RydWN0aW9uLlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgYWZmZWN0ZWQgYnkgdGhlIGNhbGxiYWNrIHdoZW4gcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpbmdsZXRvbiBXaGVuIHRydWUsIGEgc2luZ2xlIGluc3RhbmNlIGlzIHNoYXJlZCAoc2luZ2xldG9uKS4gV2hlbiBmYWxzZSwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VDYWxsYmFjazxUPn0gW2NhbGxiYWNrXSBPcHRpb25hbCBob29rIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYWZ0ZXIgaXQgaXMgY29uc3RydWN0ZWQuXG4gKiBAdHlwZWRlZiBJbmplY3RhYmxlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlQ29uZmlnID0ge1xuICBzaW5nbGV0b246IGJvb2xlYW47XG4gIGNhbGxiYWNrPzogSW5zdGFuY2VDYWxsYmFjazxhbnk+O1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJpYyBjb25zdHJ1Y3RvciB0eXBlIGZvciBjbGFzcy1saWtlIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IGNsYXNzIHRoYXQgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFyYml0cmFyeSBhcmd1bWVudHMsIHByb2R1Y2luZyBhbiBpbnN0YW5jZSBvZiB0eXBlIFQuXG4gKiBAdGVtcGxhdGUgVCBUaGUgaW5zdGFuY2UgdHlwZSBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEB0eXBlZGVmIENvbnN0cnVjdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgQ29uc3RydWN0b3IgdG8gdHlwZSBhIGZhY3RvcnlcbiAqIGZ1bmN0aW9uIG1ha2U8VD4oQ3RvcjogQ29uc3RydWN0b3I8VD4sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gKiAgIHJldHVybiBuZXcgQ3RvciguLi5hcmdzKTtcbiAqIH1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBhbnk+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBjZmc9RGVmYXVsdEluamVjdGFibGVDb25maWcgQWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgc2luZ2xldG9uIGJlaGF2aW9yIGFuZCBhZGRpbmcgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKGNhdGVnb3J5IHx8IG9yaWdpbmFsLnRvU3RyaW5nKCkpO1xuICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkgfHwgb3JpZ2luYWwubmFtZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhOiBJbmplY3RhYmxlTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2F0ZWdvcnkgYXMgc3RyaW5nLFxuICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgfTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBvcmlnaW5hbFxuICAgICk7XG4gICAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0PGFueT4oc3ltYm9sLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcbiAgICAvLyBuZXdDb25zdHJ1Y3Rvci5fX3Byb3RvX18gPSBvcmlnaW5hbC5fX3Byb3RvX187XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgbmV3Q29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIob3JpZ2luYWwsIHN5bWJvbCwgY2ZnKTtcbiAgICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICAgIHJldHVybiBuZXdDb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgZGVjb3JhdG9yIHRvIHJlZ2lzdGVyIGFuIGluamVjdGFibGUgYXMgYSBzaW5nbGV0b24uXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyB0aGUgc2luZ2xldG9uIGxpZmVjeWNsZSBzbyBvbmx5IG9uZSBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCByZXVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ3xDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBPcHRpb25hbCBleHBsaWNpdCBjYXRlZ29yeS9zeW1ib2wgc291cmNlOyBkZWZhdWx0cyB0byB0aGUgY2xhc3MuXG4gKiBAcGFyYW0ge09taXQ8SW5qZWN0YWJsZUNvbmZpZywgXCJzaW5nbGV0b25cIj59IFtjZmddIEFkZGl0aW9uYWwgaW5qZWN0YWJsZSBjb25maWd1cmF0aW9uIGV4Y2x1ZGluZyB0aGUgc2luZ2xldG9uIGZsYWcuXG4gKiBAcmV0dXJuIGZ1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gY2ZnPXt9IE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLlxuICogRm9yIHByb2plY3RzIHdoZXJlIG1pbmlmaWNhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3QoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IEdldCB0eXBlIGZyb20gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgcHJvcGVydHkgZ2V0dGVyXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIHByb3BlcnR5IGFjY2Vzc2VkXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogYWNjZXNzIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgaW4gV2Vha01hcFxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBhbHQgSW5qZWN0YWJsZSBmb3VuZFxuICogICAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gaW5qZWN0YWJsZSBpbnN0YW5jZVxuICogICAgICAgb3B0IEhhcyB0cmFuc2Zvcm1lclxuICogICAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgdHJhbnNmb3JtZXJcbiAqICAgICAgIGVuZFxuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBpbiBXZWFrTWFwXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqICAgICBlbHNlIE5vIGluamVjdGFibGVcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFRocm93IGVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcbiAgICB9XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgLy8gbGV0IC9vYmo6IGFueTtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKG9iaikgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUsIC4uLihjb25maWcuYXJncyB8fCBbXSkpO1xuICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZS50b1N0cmluZygpfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChjb25maWcudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG9iaiA9IGNvbmZpZy50cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcblxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iXX0=