@decaf-ts/injectable-decorators 1.6.8 → 1.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,51 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectableBaseDecorator = injectableBaseDecorator;
3
4
  exports.injectable = injectable;
4
5
  exports.singleton = singleton;
5
6
  exports.onDemand = onDemand;
7
+ exports.injectBaseDecorator = injectBaseDecorator;
6
8
  exports.inject = inject;
7
9
  const constants_1 = require("./constants.cjs");
8
10
  const Injectables_1 = require("./Injectables.cjs");
9
11
  const utils_1 = require("./utils.cjs");
10
- /**
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
47
- */
48
- function injectable(category, cfg) {
12
+ const decoration_1 = require("@decaf-ts/decoration");
13
+ function injectableBaseDecorator(category, cfg) {
49
14
  cfg =
50
15
  cfg ||
51
16
  (typeof category === "object"
@@ -59,7 +24,7 @@ function injectable(category, cfg) {
59
24
  : typeof category === "function" && category.name
60
25
  ? category
61
26
  : undefined;
62
- return (original) => {
27
+ return function injectableInnerDecorator(original) {
63
28
  const symbol = Symbol.for(category || original.toString());
64
29
  category = category || original.name;
65
30
  const metadata = {
@@ -87,12 +52,55 @@ function injectable(category, cfg) {
87
52
  return newConstructor;
88
53
  };
89
54
  }
55
+ /**
56
+ * @description Decorator that marks a class as available for dependency injection.
57
+ * @summary Defines a class as an injectable that can be retrieved from the registry.
58
+ * When applied to a class, replaces its constructor with one that returns an instance.
59
+ *
60
+ * @param {string | Constructor} [category] Defaults to the class category. Useful when minification occurs and names are changed,
61
+ * or when you want to upcast the object to a different type.
62
+ * @param {Partial<InjectableConfig>} [cfg=DefaultInjectableConfig] Allows overriding the default singleton behavior and adding a callback function.
63
+ *
64
+ * @return {function(any): any} A decorator function that transforms the class into an injectable.
65
+ *
66
+ * @function injectable
67
+ * @category Class Decorators
68
+ *
69
+ * @mermaid
70
+ * sequenceDiagram
71
+ * participant Client
72
+ * participant Decorator
73
+ * participant Injectables
74
+ *
75
+ * Client->>Decorator: @injectable()
76
+ * Decorator->>Decorator: Create new constructor
77
+ *
78
+ * Note over Decorator: When new instance requested
79
+ * Decorator->>Injectables: get(category)
80
+ * alt Instance exists
81
+ * Injectables-->>Decorator: Return existing instance
82
+ * else No instance
83
+ * Decorator->>Injectables: register(original, category)
84
+ * Decorator->>Injectables: get(category)
85
+ * Injectables-->>Decorator: Return new instance
86
+ * opt Has callback
87
+ * Decorator->>Decorator: Call instanceCallback
88
+ * end
89
+ * end
90
+ * Decorator->>Decorator: Define metadata
91
+ * Decorator-->>Client: Return instance
92
+ */
93
+ function injectable(category, cfg) {
94
+ return decoration_1.Decoration.for(constants_1.InjectablesKeys.INJECTABLE)
95
+ .define({ decorator: injectableBaseDecorator, args: [category, cfg] })
96
+ .apply();
97
+ }
90
98
  /**
91
99
  * @description Convenience decorator to register an injectable as a singleton.
92
100
  * @summary Wraps {@link injectable} forcing the singleton lifecycle so only one instance is created and reused.
93
101
  * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
94
102
  * @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.
103
+ * @return {function(any): any} A class decorator that registers the target as a singleton injectable.
96
104
  * @function singleton
97
105
  * @category Class Decorators
98
106
  */
@@ -111,6 +119,53 @@ function singleton(category, cfg) {
111
119
  function onDemand(category, cfg) {
112
120
  return injectable(category, Object.assign({}, cfg || {}, { singleton: false }));
113
121
  }
122
+ function injectBaseDecorator(category, cfg) {
123
+ return function injectableInnerDecorator(target, propertyKey) {
124
+ const config = (cfg || typeof category === "object" ? category : {});
125
+ const name = (typeof category !== "object" &&
126
+ category) ||
127
+ (0, utils_1.getTypeFromDecorator)(target, propertyKey);
128
+ if (!name) {
129
+ throw new Error(`Could not get Type from decorator`);
130
+ }
131
+ // prop()(target, propertyKey);
132
+ Reflect.defineMetadata((0, utils_1.getInjectKey)(constants_1.InjectablesKeys.INJECT), {
133
+ injectable: name,
134
+ }, target, propertyKey);
135
+ const values = new WeakMap();
136
+ Object.defineProperty(target, propertyKey, {
137
+ configurable: true,
138
+ get() {
139
+ const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
140
+ if (descriptor.configurable) {
141
+ // let /obj: any;
142
+ Object.defineProperty(this, propertyKey, {
143
+ enumerable: true,
144
+ configurable: false,
145
+ get() {
146
+ let obj = values.get(this);
147
+ if (obj)
148
+ return obj;
149
+ obj = Injectables_1.Injectables.get(name, ...(config.args || []));
150
+ if (!obj)
151
+ throw new Error(`Could not get Injectable ${name.toString()} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
152
+ if (config.transformer)
153
+ try {
154
+ obj = config.transformer(obj, target);
155
+ }
156
+ catch (e) {
157
+ console.error(e);
158
+ }
159
+ values.set(this, obj);
160
+ return obj;
161
+ },
162
+ });
163
+ return this[propertyKey];
164
+ }
165
+ },
166
+ });
167
+ };
168
+ }
114
169
  /**
115
170
  * @description Property decorator that injects a dependency into a class property.
116
171
  * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
@@ -171,49 +226,8 @@ function onDemand(category, cfg) {
171
226
  * end
172
227
  */
173
228
  function inject(category, cfg) {
174
- return (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);
179
- if (!name) {
180
- throw new Error(`Could not get Type from decorator`);
181
- }
182
- Reflect.defineMetadata((0, utils_1.getInjectKey)(constants_1.InjectablesKeys.INJECT), {
183
- injectable: name,
184
- }, target, propertyKey);
185
- const values = new WeakMap();
186
- Object.defineProperty(target, propertyKey, {
187
- configurable: true,
188
- get() {
189
- const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
190
- if (descriptor.configurable) {
191
- // let /obj: any;
192
- Object.defineProperty(this, propertyKey, {
193
- enumerable: true,
194
- configurable: false,
195
- get() {
196
- let obj = values.get(this);
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);
210
- return obj;
211
- },
212
- });
213
- return this[propertyKey];
214
- }
215
- },
216
- });
217
- };
229
+ return decoration_1.Decoration.for(constants_1.InjectablesKeys.INJECT)
230
+ .define({ decorator: injectBaseDecorator, args: [category, cfg] })
231
+ .apply();
218
232
  }
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=
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLDBEQXlEQztBQStHRCxnQ0FPQztBQVdELDhCQVFDO0FBV0QsNEJBUUM7QUE0QkQsa0RBaUVDO0FBa0hELHdCQU9DO0FBL2JELCtDQUF3RTtBQUN4RSxtREFBNEM7QUFDNUMsdUNBQTZEO0FBRTdELHFEQUFrRDtBQWdCbEQsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQTJELEVBQzNELEdBQStCO0lBRS9CLEdBQUc7UUFDRCxHQUFHO1lBQ0gsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUE0QixFQUFFLG9DQUF3QixDQUFDO2dCQUN2RSxDQUFDLENBQUMsb0NBQXdCLENBQUMsQ0FBQztJQUNoQyxRQUFRO1FBQ04sT0FBTyxRQUFRLEtBQUssUUFBUTtZQUMxQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUM1QixDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJO29CQUMvQyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sU0FBUyx3QkFBd0IsQ0FBQyxRQUFhO1FBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLFFBQWtCO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxjQUFjLENB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QUUsQ0FBQztvQ0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuQixDQUFDOzRCQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUV0QixPQUFPLEdBQUcsQ0FBQzt3QkFDYixDQUFDO3FCQUNGLENBQUMsQ0FBQztvQkFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDO0FBdUREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERHO0FBQ0gsU0FBZ0IsTUFBTSxDQUNwQixRQUFpRSxFQUNqRSxHQUE0QjtJQUU1QixPQUFPLHVCQUFVLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsTUFBTSxDQUFDO1NBQzFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqRSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsIEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5LCBnZXRUeXBlRnJvbURlY29yYXRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlTWV0YWRhdGEsIEluc3RhbmNlQ2FsbGJhY2sgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb250cm9scyBsaWZlY3ljbGUgKHNpbmdsZXRvbiB2cyBvbi1kZW1hbmQpIGFuZCBhbiBvcHRpb25hbCBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbiBjYWxsYmFjayBleGVjdXRlZCBwb3N0LWNvbnN0cnVjdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGFmZmVjdGVkIGJ5IHRoZSBjYWxsYmFjayB3aGVuIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzaW5nbGV0b24gV2hlbiB0cnVlLCBhIHNpbmdsZSBpbnN0YW5jZSBpcyBzaGFyZWQgKHNpbmdsZXRvbikuIFdoZW4gZmFsc2UsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlQ2FsbGJhY2s8VD59IFtjYWxsYmFja10gT3B0aW9uYWwgaG9vayB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGFmdGVyIGl0IGlzIGNvbnN0cnVjdGVkLlxuICogQHR5cGVkZWYgSW5qZWN0YWJsZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiBib29sZWFuO1xuICBjYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2s8YW55Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlQmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdGFibGVJbm5lckRlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNhdGVnb3J5IGFzIHN0cmluZyxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIGNmZyk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgY29uc3RydWN0b3IgdHlwZSBmb3IgY2xhc3MtbGlrZSB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBjbGFzcyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLCBwcm9kdWNpbmcgYW4gaW5zdGFuY2Ugb2YgdHlwZSBULlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IuXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIENvbnN0cnVjdG9yIHRvIHR5cGUgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiBtYWtlPFQ+KEN0b3I6IENvbnN0cnVjdG9yPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICogICByZXR1cm4gbmV3IEN0b3IoLi4uYXJncyk7XG4gKiB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gYW55PiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RhYmxlSW5uZXJEZWNvcmF0b3IodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpIHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcbiAgICB9XG5cbiAgICAvLyBwcm9wKCkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUKSxcbiAgICAgIHtcbiAgICAgICAgaW5qZWN0YWJsZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgKSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgIC8vIGxldCAvb2JqOiBhbnk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHZhbHVlcy5nZXQodGhpcyk7XG4gICAgICAgICAgICAgIGlmIChvYmopIHJldHVybiBvYmo7XG4gICAgICAgICAgICAgIG9iaiA9IEluamVjdGFibGVzLmdldChuYW1lLCAuLi4oY29uZmlnLmFyZ3MgfHwgW10pKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmopXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBnZXQgSW5qZWN0YWJsZSAke25hbWUudG9TdHJpbmcoKX0gdG8gaW5qZWN0IGluICR7dGFyZ2V0LmNvbnN0cnVjdG9yID8gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgOiB0YXJnZXQubmFtZX0ncyAke3Byb3BlcnR5S2V5fWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY29uZmlnLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBvYmogPSBjb25maWcudHJhbnNmb3JtZXIob2JqLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIG9iaik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHlLZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvclxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IGNmZz17fSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLlxuICogRm9yIHByb2plY3RzIHdoZXJlIG1pbmlmaWNhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3QoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IEdldCB0eXBlIGZyb20gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgcHJvcGVydHkgZ2V0dGVyXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIHByb3BlcnR5IGFjY2Vzc2VkXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogYWNjZXNzIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgaW4gV2Vha01hcFxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBhbHQgSW5qZWN0YWJsZSBmb3VuZFxuICogICAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gaW5qZWN0YWJsZSBpbnN0YW5jZVxuICogICAgICAgb3B0IEhhcyB0cmFuc2Zvcm1lclxuICogICAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgdHJhbnNmb3JtZXJcbiAqICAgICAgIGVuZFxuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBpbiBXZWFrTWFwXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqICAgICBlbHNlIE5vIGluamVjdGFibGVcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFRocm93IGVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAgIC5kZWZpbmUoeyBkZWNvcmF0b3I6IGluamVjdEJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuIl19
@@ -12,6 +12,7 @@ export type InjectableConfig = {
12
12
  singleton: boolean;
13
13
  callback?: InstanceCallback<any>;
14
14
  };
15
+ export declare function injectableBaseDecorator(category?: string | Constructor | Partial<InjectableConfig>, cfg?: Partial<InjectableConfig>): (original: any) => any;
15
16
  /**
16
17
  * @description Generic constructor type for class-like values.
17
18
  * @summary Represents any class that can be instantiated with arbitrary arguments, producing an instance of type T.
@@ -35,7 +36,6 @@ export type Constructor<T = any> = {
35
36
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
36
37
  *
37
38
  * @function injectable
38
- * @category Decorators
39
39
  */
40
40
  export declare function injectable(): (original: any) => any;
41
41
  /**
@@ -49,7 +49,6 @@ export declare function injectable(): (original: any) => any;
49
49
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
50
50
  *
51
51
  * @function injectable
52
- * @category Decorators
53
52
  */
54
53
  export declare function injectable(category: string | Constructor): (original: any) => any;
55
54
  /**
@@ -62,7 +61,6 @@ export declare function injectable(category: string | Constructor): (original: a
62
61
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
63
62
  *
64
63
  * @function injectable
65
- * @category Decorators
66
64
  */
67
65
  export declare function injectable(cfg: Partial<InjectableConfig>): (original: any) => any;
68
66
  /**
@@ -77,7 +75,6 @@ export declare function injectable(cfg: Partial<InjectableConfig>): (original: a
77
75
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
78
76
  *
79
77
  * @function injectable
80
- * @category Decorators
81
78
  */
82
79
  export declare function injectable(category: string | Constructor, cfg: Partial<InjectableConfig>): (original: any) => any;
83
80
  /**
@@ -85,7 +82,7 @@ export declare function injectable(category: string | Constructor, cfg: Partial<
85
82
  * @summary Wraps {@link injectable} forcing the singleton lifecycle so only one instance is created and reused.
86
83
  * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
87
84
  * @param {Omit<InjectableConfig, "singleton">} [cfg] Additional injectable configuration excluding the singleton flag.
88
- * @return function(any): any} A class decorator that registers the target as a singleton injectable.
85
+ * @return {function(any): any} A class decorator that registers the target as a singleton injectable.
89
86
  * @function singleton
90
87
  * @category Class Decorators
91
88
  */
@@ -125,6 +122,7 @@ export type InjectOptions = {
125
122
  args?: any[];
126
123
  transformer?: InstanceTransformer;
127
124
  };
125
+ export declare function injectBaseDecorator(category?: symbol | string | Constructor | Partial<InjectOptions>, cfg?: Partial<InjectOptions>): (target: any, propertyKey: any) => void;
128
126
  /**
129
127
  * @description Property decorator that injects a dependency into a class property.
130
128
  * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
@@ -133,7 +131,6 @@ export type InjectOptions = {
133
131
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
134
132
  *
135
133
  * @function inject
136
- * @category Decorators
137
134
  */
138
135
  export declare function inject(): (target: any, propertyKey: any) => void;
139
136
  /**
@@ -146,7 +143,6 @@ export declare function inject(): (target: any, propertyKey: any) => void;
146
143
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
147
144
  *
148
145
  * @function inject
149
- * @category Decorators
150
146
  */
151
147
  export declare function inject(category: string | Constructor): (target: any, propertyKey: any) => void;
152
148
  /**
@@ -158,7 +154,6 @@ export declare function inject(category: string | Constructor): (target: any, pr
158
154
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
159
155
  *
160
156
  * @function inject
161
- * @category Decorators
162
157
  */
163
158
  export declare function inject(cfg: Partial<InjectOptions>): (target: any, propertyKey: any) => void;
164
159
  /**
@@ -172,6 +167,5 @@ export declare function inject(cfg: Partial<InjectOptions>): (target: any, prope
172
167
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
173
168
  *
174
169
  * @function inject
175
- * @category Decorators
176
170
  */
177
171
  export declare function inject(category: string | Constructor, cfg: Partial<InjectOptions>): (target: any, propertyKey: any) => void;
@@ -0,0 +1,8 @@
1
+ import type { Constructor } from "@decaf-ts/decoration";
2
+ import { InjectOptions } from "./decorators";
3
+ declare module "@decaf-ts/decoration" {
4
+ namespace Metadata {
5
+ function injectables<T extends string | symbol | Constructor>(category?: T): (T extends undefined ? Constructor[] : Constructor) | undefined;
6
+ function injected<T, K extends keyof T>(model: T | Constructor<T>, prop?: K): (K extends keyof T ? InjectOptions : Record<K, InjectOptions>) | undefined;
7
+ }
8
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWV0YWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvTWV0YWRhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEluamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIGV4cG9ydCBuYW1lc3BhY2UgTWV0YWRhdGEge1xuICAgIGZ1bmN0aW9uIGluamVjdGFibGVzPFQgZXh0ZW5kcyBzdHJpbmcgfCBzeW1ib2wgfCBDb25zdHJ1Y3Rvcj4oXG4gICAgICBjYXRlZ29yeT86IFRcbiAgICApOiAoVCBleHRlbmRzIHVuZGVmaW5lZCA/IENvbnN0cnVjdG9yW10gOiBDb25zdHJ1Y3RvcikgfCB1bmRlZmluZWQ7XG5cbiAgICBmdW5jdGlvbiBpbmplY3RlZDxULCBLIGV4dGVuZHMga2V5b2YgVD4oXG4gICAgICBtb2RlbDogVCB8IENvbnN0cnVjdG9yPFQ+LFxuICAgICAgcHJvcD86IEtcbiAgICApOlxuICAgICAgfCAoSyBleHRlbmRzIGtleW9mIFQgPyBJbmplY3RPcHRpb25zIDogUmVjb3JkPEssIEluamVjdE9wdGlvbnM+KVxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -12,6 +12,7 @@ export type InjectableConfig = {
12
12
  singleton: boolean;
13
13
  callback?: InstanceCallback<any>;
14
14
  };
15
+ export declare function injectableBaseDecorator(category?: string | Constructor | Partial<InjectableConfig>, cfg?: Partial<InjectableConfig>): (original: any) => any;
15
16
  /**
16
17
  * @description Generic constructor type for class-like values.
17
18
  * @summary Represents any class that can be instantiated with arbitrary arguments, producing an instance of type T.
@@ -35,7 +36,6 @@ export type Constructor<T = any> = {
35
36
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
36
37
  *
37
38
  * @function injectable
38
- * @category Decorators
39
39
  */
40
40
  export declare function injectable(): (original: any) => any;
41
41
  /**
@@ -49,7 +49,6 @@ export declare function injectable(): (original: any) => any;
49
49
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
50
50
  *
51
51
  * @function injectable
52
- * @category Decorators
53
52
  */
54
53
  export declare function injectable(category: string | Constructor): (original: any) => any;
55
54
  /**
@@ -62,7 +61,6 @@ export declare function injectable(category: string | Constructor): (original: a
62
61
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
63
62
  *
64
63
  * @function injectable
65
- * @category Decorators
66
64
  */
67
65
  export declare function injectable(cfg: Partial<InjectableConfig>): (original: any) => any;
68
66
  /**
@@ -77,7 +75,6 @@ export declare function injectable(cfg: Partial<InjectableConfig>): (original: a
77
75
  * @return {function(any): any} A decorator function that transforms the class into an injectable.
78
76
  *
79
77
  * @function injectable
80
- * @category Decorators
81
78
  */
82
79
  export declare function injectable(category: string | Constructor, cfg: Partial<InjectableConfig>): (original: any) => any;
83
80
  /**
@@ -85,7 +82,7 @@ export declare function injectable(category: string | Constructor, cfg: Partial<
85
82
  * @summary Wraps {@link injectable} forcing the singleton lifecycle so only one instance is created and reused.
86
83
  * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
87
84
  * @param {Omit<InjectableConfig, "singleton">} [cfg] Additional injectable configuration excluding the singleton flag.
88
- * @return function(any): any} A class decorator that registers the target as a singleton injectable.
85
+ * @return {function(any): any} A class decorator that registers the target as a singleton injectable.
89
86
  * @function singleton
90
87
  * @category Class Decorators
91
88
  */
@@ -125,6 +122,7 @@ export type InjectOptions = {
125
122
  args?: any[];
126
123
  transformer?: InstanceTransformer;
127
124
  };
125
+ export declare function injectBaseDecorator(category?: symbol | string | Constructor | Partial<InjectOptions>, cfg?: Partial<InjectOptions>): (target: any, propertyKey: any) => void;
128
126
  /**
129
127
  * @description Property decorator that injects a dependency into a class property.
130
128
  * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
@@ -133,7 +131,6 @@ export type InjectOptions = {
133
131
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
134
132
  *
135
133
  * @function inject
136
- * @category Decorators
137
134
  */
138
135
  export declare function inject(): (target: any, propertyKey: any) => void;
139
136
  /**
@@ -146,7 +143,6 @@ export declare function inject(): (target: any, propertyKey: any) => void;
146
143
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
147
144
  *
148
145
  * @function inject
149
- * @category Decorators
150
146
  */
151
147
  export declare function inject(category: string | Constructor): (target: any, propertyKey: any) => void;
152
148
  /**
@@ -158,7 +154,6 @@ export declare function inject(category: string | Constructor): (target: any, pr
158
154
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
159
155
  *
160
156
  * @function inject
161
- * @category Decorators
162
157
  */
163
158
  export declare function inject(cfg: Partial<InjectOptions>): (target: any, propertyKey: any) => void;
164
159
  /**
@@ -172,6 +167,5 @@ export declare function inject(cfg: Partial<InjectOptions>): (target: any, prope
172
167
  * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
173
168
  *
174
169
  * @function inject
175
- * @category Decorators
176
170
  */
177
171
  export declare function inject(category: string | Constructor, cfg: Partial<InjectOptions>): (target: any, propertyKey: any) => void;