@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/README.md +2 -8
- package/dist/injectable-decorators.cjs +159 -79
- package/dist/injectable-decorators.esm.cjs +157 -80
- package/lib/Injectables.cjs +6 -1
- package/lib/Injectables.d.ts +5 -0
- package/lib/constants.cjs +18 -4
- package/lib/constants.d.ts +15 -2
- package/lib/decorators.cjs +105 -51
- package/lib/decorators.d.ts +140 -94
- package/lib/esm/Injectables.d.ts +5 -0
- package/lib/esm/Injectables.js +6 -1
- package/lib/esm/constants.d.ts +15 -2
- package/lib/esm/constants.js +17 -3
- package/lib/esm/decorators.d.ts +140 -94
- package/lib/esm/decorators.js +102 -48
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/registry.js +6 -4
- package/lib/esm/types.d.ts +40 -3
- package/lib/esm/types.js +1 -1
- package/lib/esm/utils.d.ts +6 -4
- package/lib/esm/utils.js +8 -7
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/registry.cjs +7 -5
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +40 -3
- package/lib/utils.cjs +11 -9
- package/lib/utils.d.ts +6 -4
- package/package.json +2 -1
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
|
-
|
|
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
|
package/lib/constants.d.ts
CHANGED
|
@@ -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";
|
package/lib/decorators.cjs
CHANGED
|
@@ -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
|
|
11
|
-
* @summary
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* @
|
|
15
|
-
*
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
64
|
+
category = category || original.name;
|
|
31
65
|
const metadata = {
|
|
32
|
-
class:
|
|
66
|
+
class: category,
|
|
33
67
|
symbol: symbol,
|
|
34
68
|
};
|
|
35
|
-
Reflect.defineMetadata((0,
|
|
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
|
-
|
|
51
|
-
|
|
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 {
|
|
84
|
-
* @return {
|
|
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,
|
|
173
|
+
function inject(category, cfg) {
|
|
120
174
|
return (target, propertyKey) => {
|
|
121
|
-
const
|
|
122
|
-
const name = category
|
|
123
|
-
|
|
124
|
-
|
|
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,
|
|
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 (
|
|
144
|
-
obj
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0lBLGdDQTBEQztBQVdELDhCQVFDO0FBV0QsNEJBUUM7QUFnSkQsd0JBZ0VDO0FBcGJELCtDQUF3RTtBQUN4RSxtREFBNEM7QUFDNUMsdUNBQTZEO0FBNEY3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsUUFBMkQsRUFDM0QsR0FBK0I7SUFFL0IsR0FBRztRQUNELEdBQUc7WUFDSCxDQUFDLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQTRCLEVBQUUsb0NBQXdCLENBQUM7Z0JBQ3ZFLENBQUMsQ0FBQyxvQ0FBd0IsQ0FBQyxDQUFDO0lBQ2hDLFFBQVE7UUFDTixPQUFPLFFBQVEsS0FBSyxRQUFRO1lBQzFCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxDQUFDLElBQUk7b0JBQy9DLENBQUMsQ0FBQyxRQUFRO29CQUNWLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFcEIsT0FBTyxDQUFDLFFBQWEsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLFFBQWtCO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxjQUFjLENBQ3BCLElBQUEsb0JBQVksRUFBQywyQkFBZSxDQUFDLFVBQVUsQ0FBQyxFQUN4QyxRQUFRLEVBQ1IsUUFBUSxDQUNULENBQUM7UUFDRixnQ0FBZ0M7UUFDaEMsTUFBTSxjQUFjLEdBQVEsVUFBVSxHQUFHLElBQVc7WUFDbEQsT0FBTyx5QkFBVyxDQUFDLEdBQUcsQ0FBTSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7UUFFRixvREFBb0Q7UUFDcEQsY0FBYyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQzlDLGlEQUFpRDtRQUNqRCx5REFBeUQ7UUFDekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFO1lBQzVDLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUk7U0FDM0MsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLGNBQWMsQ0FDcEIsSUFBQSxvQkFBWSxFQUFDLDJCQUFlLENBQUMsVUFBVSxDQUFDLEVBQ3hDLFFBQVEsRUFDUixjQUFjLENBQ2YsQ0FBQztRQUVGLHlCQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUMsa0RBQWtEO1FBQ2xELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFNBQVMsQ0FDdkIsUUFBK0IsRUFDL0IsR0FBeUM7SUFFekMsT0FBTyxVQUFVLENBQ2YsUUFBZSxFQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDbEQsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFFBQVEsQ0FDdEIsUUFBK0IsRUFDL0IsR0FBeUM7SUFFekMsT0FBTyxVQUFVLENBQ2YsUUFBZSxFQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDbkQsQ0FBQztBQUNKLENBQUM7QUFxRkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwREc7QUFDSCxTQUFnQixNQUFNLENBQ3BCLFFBQWlFLEVBQ2pFLEdBQTRCO0lBRTVCLE9BQU8sQ0FBQyxNQUFXLEVBQUUsV0FBZ0IsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sTUFBTSxHQUFrQixDQUM1QixHQUFHLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDbkMsQ0FBQztRQUVuQixNQUFNLElBQUksR0FDUixDQUFDLE9BQU8sUUFBUSxLQUFLLFFBQVE7WUFDMUIsUUFBMEMsQ0FBQztZQUM5QyxJQUFBLDRCQUFvQixFQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUVELE9BQU8sQ0FBQyxjQUFjLENBQ3BCLElBQUEsb0JBQVksRUFBQywyQkFBZSxDQUFDLE1BQU0sQ0FBQyxFQUNwQztZQUNFLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLEVBQ0QsTUFBTSxFQUNOLFdBQVcsQ0FDWixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUU3QixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUU7WUFDekMsWUFBWSxFQUFFLElBQUk7WUFDbEIsR0FBRztnQkFDRCxNQUFNLFVBQVUsR0FBdUIsTUFBTSxDQUFDLHdCQUF3QixDQUNwRSxNQUFNLEVBQ04sV0FBVyxDQUNVLENBQUM7Z0JBQ3hCLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUM1QixpQkFBaUI7b0JBQ2pCLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTt3QkFDdkMsVUFBVSxFQUFFLElBQUk7d0JBQ2hCLFlBQVksRUFBRSxLQUFLO3dCQUNuQixHQUFHOzRCQUNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQzNCLElBQUksR0FBRztnQ0FBRSxPQUFPLEdBQUcsQ0FBQzs0QkFDcEIsR0FBRyxHQUFHLHlCQUFXLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNwRCxJQUFJLENBQUMsR0FBRztnQ0FDTixNQUFNLElBQUksS0FBSyxDQUNiLDRCQUE0QixJQUFJLENBQUMsUUFBUSxFQUFFLGlCQUFpQixNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxXQUFXLEVBQUUsQ0FDMUksQ0FBQzs0QkFDSixJQUFJLE1BQU0sQ0FBQyxXQUFXO2dDQUNwQixJQUFJLENBQUM7b0NBQ0gsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dDQUN4QyxDQUFDO2dDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0NBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbkIsQ0FBQzs0QkFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFFdEIsT0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQztxQkFDRixDQUFDLENBQUM7b0JBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZywgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXksIGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnRyb2xzIGxpZmVjeWNsZSAoc2luZ2xldG9uIHZzIG9uLWRlbWFuZCkgYW5kIGFuIG9wdGlvbmFsIGluc3RhbmNlIHRyYW5zZm9ybWF0aW9uIGNhbGxiYWNrIGV4ZWN1dGVkIHBvc3QtY29uc3RydWN0aW9uLlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgYWZmZWN0ZWQgYnkgdGhlIGNhbGxiYWNrIHdoZW4gcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpbmdsZXRvbiBXaGVuIHRydWUsIGEgc2luZ2xlIGluc3RhbmNlIGlzIHNoYXJlZCAoc2luZ2xldG9uKS4gV2hlbiBmYWxzZSwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VDYWxsYmFjazxUPn0gW2NhbGxiYWNrXSBPcHRpb25hbCBob29rIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYWZ0ZXIgaXQgaXMgY29uc3RydWN0ZWQuXG4gKiBAdHlwZWRlZiBJbmplY3RhYmxlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlQ29uZmlnID0ge1xuICBzaW5nbGV0b246IGJvb2xlYW47XG4gIGNhbGxiYWNrPzogSW5zdGFuY2VDYWxsYmFjazxhbnk+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=
|