@decaf-ts/logging 0.3.17 → 0.3.18

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.
@@ -30,6 +30,7 @@ import { BrowserEnvKey, DefaultLoggingConfig, ENV_PATH_DELIMITER, } from "./cons
30
30
  * Env-->>Client: merged value
31
31
  */
32
32
  const EmptyValue = Symbol("EnvironmentEmpty");
33
+ const ModelSymbol = Symbol("EnvironmentModel");
33
34
  export class Environment extends ObjectAccumulator {
34
35
  /**
35
36
  * @static
@@ -41,6 +42,12 @@ export class Environment extends ObjectAccumulator {
41
42
  static { this.factory = () => new Environment(); }
42
43
  constructor() {
43
44
  super();
45
+ Object.defineProperty(this, ModelSymbol, {
46
+ value: {},
47
+ writable: true,
48
+ enumerable: false,
49
+ configurable: false,
50
+ });
44
51
  }
45
52
  /**
46
53
  * @description Retrieves a value from the runtime environment.
@@ -87,6 +94,7 @@ export class Environment extends ObjectAccumulator {
87
94
  */
88
95
  expand(value) {
89
96
  Object.entries(value).forEach(([k, v]) => {
97
+ Environment.mergeModel(this[ModelSymbol], k, v);
90
98
  Object.defineProperty(this, k, {
91
99
  get: () => {
92
100
  const fromEnv = this.fromEnv(k);
@@ -109,6 +117,100 @@ export class Environment extends ObjectAccumulator {
109
117
  });
110
118
  });
111
119
  }
120
+ /**
121
+ * @description Returns a proxy enforcing required environment variables.
122
+ * @summary Accessing a property that resolves to `undefined` or an empty string when declared in the model throws an error.
123
+ * @return {this} Proxy of the environment enforcing required variables.
124
+ */
125
+ orThrow() {
126
+ // eslint-disable-next-line @typescript-eslint/no-this-alias
127
+ const base = this;
128
+ const modelRoot = base[ModelSymbol];
129
+ const buildKey = (path) => path.map((segment) => toENVFormat(segment)).join(ENV_PATH_DELIMITER);
130
+ const readRuntime = (key) => Environment.readRuntimeEnv(key);
131
+ const parseRuntime = (raw) => typeof raw !== "undefined" ? this.parseEnvValue(raw) : undefined;
132
+ const missing = (key, empty = false) => Environment.missingEnvError(key, empty);
133
+ const createNestedProxy = (model, path) => {
134
+ const handler = {
135
+ get(_target, prop) {
136
+ if (typeof prop !== "string")
137
+ return undefined;
138
+ const nextPath = [...path, prop];
139
+ const envKey = buildKey(nextPath);
140
+ const runtimeRaw = readRuntime(envKey);
141
+ if (typeof runtimeRaw === "string" && runtimeRaw.length === 0)
142
+ throw missing(envKey, true);
143
+ const runtimeValue = parseRuntime(runtimeRaw);
144
+ if (typeof runtimeValue !== "undefined") {
145
+ if (typeof runtimeValue === "string" && runtimeValue.length === 0)
146
+ throw missing(envKey, true);
147
+ return runtimeValue;
148
+ }
149
+ const hasProp = model && Object.prototype.hasOwnProperty.call(model, prop);
150
+ if (!hasProp)
151
+ throw missing(envKey);
152
+ const modelValue = model[prop];
153
+ if (typeof modelValue === "undefined")
154
+ return undefined;
155
+ if (modelValue === "")
156
+ throw missing(envKey);
157
+ if (modelValue &&
158
+ typeof modelValue === "object" &&
159
+ !Array.isArray(modelValue)) {
160
+ return createNestedProxy(modelValue, nextPath);
161
+ }
162
+ return modelValue;
163
+ },
164
+ ownKeys() {
165
+ return model ? Reflect.ownKeys(model) : [];
166
+ },
167
+ getOwnPropertyDescriptor(_target, prop) {
168
+ if (!model)
169
+ return undefined;
170
+ if (Object.prototype.hasOwnProperty.call(model, prop)) {
171
+ return {
172
+ enumerable: true,
173
+ configurable: true,
174
+ };
175
+ }
176
+ return undefined;
177
+ },
178
+ };
179
+ return new Proxy({}, handler);
180
+ };
181
+ const handler = {
182
+ get(target, prop, receiver) {
183
+ if (typeof prop !== "string")
184
+ return Reflect.get(target, prop, receiver);
185
+ const hasModelProp = Object.prototype.hasOwnProperty.call(modelRoot, prop);
186
+ if (!hasModelProp)
187
+ return Reflect.get(target, prop, receiver);
188
+ const envKey = buildKey([prop]);
189
+ const runtimeRaw = readRuntime(envKey);
190
+ if (typeof runtimeRaw === "string" && runtimeRaw.length === 0)
191
+ throw missing(envKey, true);
192
+ const runtimeValue = parseRuntime(runtimeRaw);
193
+ if (typeof runtimeValue !== "undefined") {
194
+ if (typeof runtimeValue === "string" && runtimeValue.length === 0)
195
+ throw missing(envKey, true);
196
+ return runtimeValue;
197
+ }
198
+ const modelValue = modelRoot[prop];
199
+ if (modelValue &&
200
+ typeof modelValue === "object" &&
201
+ !Array.isArray(modelValue)) {
202
+ return createNestedProxy(modelValue, [prop]);
203
+ }
204
+ if (typeof modelValue === "undefined")
205
+ return Reflect.get(target, prop, receiver);
206
+ const actual = Reflect.get(target, prop);
207
+ if (typeof actual === "undefined" || actual === "")
208
+ throw missing(envKey, actual === "");
209
+ return actual;
210
+ },
211
+ };
212
+ return new Proxy(base, handler);
213
+ }
112
214
  /**
113
215
  * @protected
114
216
  * @static
@@ -189,11 +291,7 @@ export class Environment extends ObjectAccumulator {
189
291
  const buildKey = (p) => p.map((seg) => toENVFormat(seg)).join(ENV_PATH_DELIMITER);
190
292
  // Helper to read from the active environment given a composed key
191
293
  const readEnv = (key) => {
192
- if (isBrowser()) {
193
- const env = globalThis[BrowserEnvKey];
194
- return env ? env[key] : undefined;
195
- }
196
- return globalThis?.process?.env?.[key];
294
+ return Environment.readRuntimeEnv(key);
197
295
  };
198
296
  const handler = {
199
297
  get(_target, prop) {
@@ -257,6 +355,33 @@ export class Environment extends ObjectAccumulator {
257
355
  .keys()
258
356
  .map((k) => (toEnv ? toENVFormat(k) : k));
259
357
  }
358
+ static mergeModel(model, key, value) {
359
+ if (!model)
360
+ return;
361
+ if (value && typeof value === "object" && !Array.isArray(value)) {
362
+ const existing = model[key];
363
+ const target = existing && typeof existing === "object" && !Array.isArray(existing)
364
+ ? existing
365
+ : {};
366
+ model[key] = target;
367
+ Object.entries(value).forEach(([childKey, childValue]) => {
368
+ Environment.mergeModel(target, childKey, childValue);
369
+ });
370
+ return;
371
+ }
372
+ model[key] = value;
373
+ }
374
+ static readRuntimeEnv(key) {
375
+ if (isBrowser()) {
376
+ const env = globalThis[BrowserEnvKey];
377
+ return env ? env[key] : undefined;
378
+ }
379
+ return globalThis?.process?.env?.[key];
380
+ }
381
+ static missingEnvError(key, empty) {
382
+ const suffix = empty ? "an empty string" : "undefined";
383
+ return new Error(`Environment variable ${key} is required but was ${suffix}.`);
384
+ }
260
385
  }
261
386
  /**
262
387
  * @description Singleton environment instance seeded with default logging configuration.
@@ -269,4 +394,4 @@ export const LoggedEnvironment = Environment.accumulate(Object.assign({}, Defaul
269
394
  ? globalThis[BrowserEnvKey]["NODE_ENV"]
270
395
  : globalThis.process.env["NODE_ENV"]) || "development",
271
396
  }));
272
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBZTtBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFjO0FBQ2xDLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQix1QkFBb0I7QUFjckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFOUMsTUFBTSxPQUFPLFdBQThCLFNBQVEsaUJBQW9CO0lBQ3JFOzs7Ozs7T0FNRzthQUNjLFlBQU8sR0FDdEIsR0FBcUIsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7SUFVNUM7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLE9BQU8sQ0FBQyxDQUFTO1FBQ3pCLElBQUksR0FBNEIsQ0FBQztRQUNqQyxJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDaEIsR0FBRztnQkFFQyxVQUdELENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQzdCLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxhQUFhLENBQUMsR0FBWTtRQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFB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QUFFLFlBQVksRUFBRSxJQUFJLEVBQXdCLENBQUM7Z0JBQ3hFLENBQUM7Z0JBQ0QsT0FBTyxTQUFnQixDQUFDO1lBQzFCLENBQUM7U0FDRixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsRUFBUyxDQUFDO1FBQ3pCLE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQWlCLElBQUk7UUFDL0IsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFO2FBQzFCLElBQUksRUFBRTthQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDOztBQUdIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FDckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsb0JBQW9CLEVBQUU7SUFDdEMsR0FBRyxFQUNELENBQUMsU0FBUyxFQUFFLElBQUssVUFBa0IsQ0FBQyxhQUFhLENBQUM7UUFDaEQsQ0FBQyxDQUFFLFVBQWtCLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ2hELENBQUMsQ0FBRSxVQUFrQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxhQUFhO0NBQ3BFLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0QWNjdW11bGF0b3IgfSBmcm9tIFwidHlwZWQtb2JqZWN0LWFjY3VtdWxhdG9yXCI7XG5pbXBvcnQgeyB0b0VOVkZvcm1hdCB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gXCIuL3dlYlwiO1xuaW1wb3J0IHtcbiAgQnJvd3NlckVudktleSxcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIEVOVl9QQVRIX0RFTElNSVRFUixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgRGVzY3JpYmVzIGZhY3RvcmllcyB0aGF0IGNvbnN0cnVjdCB7QGxpbmsgRW52aXJvbm1lbnR9IGRlcml2YXRpdmVzIHdpdGggY3VzdG9tIGluaXRpYWxpemF0aW9uLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBvYmplY3QgdGhlIEVudmlyb25tZW50IHdpbGwgYWNjdW11bGF0ZS5cbiAqIEB0ZW1wbGF0ZSBFIC0gVGhlIHNwZWNpZmljIEVudmlyb25tZW50IHR5cGUgdG8gYmUgY3JlYXRlZCwgZXh0ZW5kaW5nIEVudmlyb25tZW50PFQ+LlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHVua25vd25bXSk6IEV9IEVudmlyb25tZW50RmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50RmFjdG9yeTxUIGV4dGVuZHMgb2JqZWN0LCBFIGV4dGVuZHMgRW52aXJvbm1lbnQ8VD4+ID0gKFxuICAuLi5hcmdzOiB1bmtub3duW11cbikgPT4gRTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW52aXJvbm1lbnQgYWNjdW11bGF0b3IgdGhhdCBsYXppbHkgcmVhZHMgZnJvbSBydW50aW1lIHNvdXJjZXMuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHtAbGluayBPYmplY3RBY2N1bXVsYXRvcn0gdG8gbWVyZ2UgY29uZmlndXJhdGlvbiBvYmplY3RzIHdoaWxlIHJlc29sdmluZyB2YWx1ZXMgZnJvbSBOb2RlIG9yIGJyb3dzZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIGRlbWFuZC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2xhc3MgRW52aXJvbm1lbnRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBDb25maWcgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKHsgbG9nZ2luZzogeyBsZXZlbDogXCJpbmZvXCIgfSB9KTtcbiAqIGNvbnNvbGUubG9nKENvbmZpZy5sb2dnaW5nLmxldmVsKTtcbiAqIGNvbnNvbGUubG9nKFN0cmluZyhDb25maWcubG9nZ2luZy5sZXZlbCkpOyAvLyA9PiBMT0dHSU5HX19MRVZFTCBrZXkgd2hlbiBzZXJpYWxpemVkXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBFbnYgYXMgRW52aXJvbm1lbnRcbiAqICAgcGFydGljaXBhbnQgUHJvY2VzcyBhcyBwcm9jZXNzLmVudlxuICogICBwYXJ0aWNpcGFudCBCcm93c2VyIGFzIGdsb2JhbFRoaXMuRU5WXG4gKiAgIENsaWVudC0+PkVudjogYWNjdW11bGF0ZShwYXJ0aWFsQ29uZmlnKVxuICogICBFbnYtPj5FbnY6IGV4cGFuZCh2YWx1ZXMpXG4gKiAgIENsaWVudC0+PkVudjogQ29uZmlnLmxvZ2dpbmcubGV2ZWxcbiAqICAgYWx0IEJyb3dzZXIgcnVudGltZVxuICogICAgIEVudi0+PkJyb3dzZXI6IGxvb2t1cCBFTlYga2V5XG4gKiAgICAgQnJvd3Nlci0tPj5FbnY6IHJlc29sdmVkIHZhbHVlXG4gKiAgIGVsc2UgTm9kZSBydW50aW1lXG4gKiAgICAgRW52LT4+UHJvY2VzczogbG9va3VwIEVOViBrZXlcbiAqICAgICBQcm9jZXNzLS0+PkVudjogcmVzb2x2ZWQgdmFsdWVcbiAqICAgZW5kXG4gKiAgIEVudi0tPj5DbGllbnQ6IG1lcmdlZCB2YWx1ZVxuICovXG5jb25zdCBFbXB0eVZhbHVlID0gU3ltYm9sKFwiRW52aXJvbm1lbnRFbXB0eVwiKTtcblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgdmFsdWUgZnJvbSB0aGUgcnVudGltZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBicm93c2VyIGFuZCBOb2RlLmpzIGVudmlyb25tZW50cyBieSBub3JtYWxpemluZyBrZXlzIGFuZCBwYXJzaW5nIHZhbHVlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGsgLSBLZXkgdG8gcmVzb2x2ZSBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7dW5rbm93bn0gVmFsdWUgcmVzb2x2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUVudihrOiBzdHJpbmcpIHtcbiAgICBsZXQgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGVudiA9XG4gICAgICAgIChcbiAgICAgICAgICBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgICAgICAgICAgW0Jyb3dzZXJFbnZLZXldOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmVudjtcbiAgICAgIGsgPSB0b0VOVkZvcm1hdChrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VFbnZWYWx1ZShlbnZba10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBzdHJpbmdpZmllZCBlbnZpcm9ubWVudCB2YWx1ZXMgaW50byBuYXRpdmUgdHlwZXMuXG4gICAqIEBzdW1tYXJ5IEludGVycHJldHMgYm9vbGVhbnMgYW5kIG51bWJlcnMgd2hpbGUgbGVhdmluZyBvdGhlciB0eXBlcyB1bmNoYW5nZWQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsIC0gUmF3IHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7dW5rbm93bn0gUGFyc2VkIHZhbHVlIGNvbnZlcnRlZCB0byBib29sZWFuLCBudW1iZXIsIG9yIGxlZnQgYXMtaXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFyc2VFbnZWYWx1ZSh2YWw6IHVua25vd24pIHtcbiAgICBpZiAodHlwZW9mIHZhbCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbDtcbiAgICBpZiAodmFsID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gICAgaWYgKHZhbCA9PT0gXCJmYWxzZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VGbG9hdCh2YWwpO1xuICAgIGlmICghaXNOYU4ocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeHBhbmRzIGFuIG9iamVjdCBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBsYXp5IHByb3BlcnRpZXMgdGhhdCBmaXJzdCBjb25zdWx0IHJ1bnRpbWUgdmFyaWFibGVzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gc2VlZGVkIHZhbHVlcy5cbiAgICogQHRlbXBsYXRlIFYgLSBUeXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgZXhwYW5kZWQuXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBPYmplY3QgdG8gZXhwb3NlIHRocm91Z2ggZW52aXJvbm1lbnQgZ2V0dGVycyBhbmQgc2V0dGVycy5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBleHBhbmQ8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5mcm9tRW52KGspO1xuICAgICAgICAgIGlmICh0eXBlb2YgZnJvbUVudiAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGZyb21FbnY7XG4gICAgICAgICAgaWYgKHYgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KHYgYXMgYW55LCBba10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvdmlkZXMgYW4gZW1wdHkgc3RyaW5nLCBtYXJrIHdpdGggRW1wdHlWYWx1ZSBzbyBpbnN0YW5jZSBwcm94eSBjYW4gcmV0dXJuIHVuZGVmaW5lZCB3aXRob3V0IGVuYWJsaW5nIGtleSBjb21wb3NpdGlvblxuICAgICAgICAgIGlmICh2ID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRW1wdHlWYWx1ZSBhcyB1bmtub3duIGFzIFZba2V5b2YgVl07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICh2YWw6IFZba2V5b2YgVl0pID0+IHtcbiAgICAgICAgICB2ID0gdmFsO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIG9ubHkgb25lIHtAbGluayBFbnZpcm9ubWVudH0gaW5zdGFuY2UgaXMgY3JlYXRlZCwgd3JhcHBpbmcgaXQgaW4gYSBwcm94eSB0byBjb21wb3NlIEVOViBrZXlzIG9uIGRlbWFuZC5cbiAgICogQHRlbXBsYXRlIEVcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBmYWN0b3J5IHdoZW4gaW5zdGFudGlhdGluZyB0aGUgc2luZ2xldG9uLlxuICAgKiBAcmV0dXJuIHtFfSBTaW5nbGV0b24gZW52aXJvbm1lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGluc3RhbmNlPEUgZXh0ZW5kcyBFbnZpcm9ubWVudDxhbnk+PiguLi5hcmdzOiB1bmtub3duW10pOiBFIHtcbiAgICBpZiAoIUVudmlyb25tZW50Ll9pbnN0YW5jZSkge1xuICAgICAgY29uc3QgYmFzZSA9IEVudmlyb25tZW50LmZhY3RvcnkoLi4uYXJncykgYXMgRTtcbiAgICAgIGNvbnN0IHByb3hpZWQgPSBuZXcgUHJveHkoYmFzZSBhcyBhbnksIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gRW1wdHlWYWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAvLyBJZiB0aGUgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSBpbnN0YW5jZSBidXQgcmVzb2x2ZXMgdG8gdW5kZWZpbmVkLCByZXR1cm4gdW5kZWZpbmVkIChubyBwcm94eSlcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgcHJvcCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRhcmdldCwgcHJvcClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIGludGVyZmVyaW5nIHdpdGggbG9nZ2luZyBjb25maWcgbG9va3VwcyBmb3Igb3B0aW9uYWwgZmllbGRzIGxpa2UgJ2FwcCdcbiAgICAgICAgICAgIGlmIChwcm9wID09PSBcImFwcFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIEVudmlyb25tZW50LmJ1aWxkRW52UHJveHkodW5kZWZpbmVkLCBbcHJvcF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIEVudmlyb25tZW50Ll9pbnN0YW5jZSA9IHByb3hpZWQgYXMgYW55O1xuICAgIH1cbiAgICByZXR1cm4gRW52aXJvbm1lbnQuX2luc3RhbmNlIGFzIEU7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gQWNjdW11bGF0ZXMgdGhlIGdpdmVuIHZhbHVlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAc3VtbWFyeSBBZGRzIG5ldyBwcm9wZXJ0aWVzLCBoaWRpbmcgcmF3IGRlc2NyaXB0b3JzIHRvIGF2b2lkIGxlYWtpbmcgZW51bWVyYXRpb24gc2VtYW50aWNzLlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAdGVtcGxhdGUgVlxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gT2JqZWN0IHRvIG1lcmdlIGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAcmV0dXJuIHtFbnZpcm9ubWVudH0gVXBkYXRlZCBlbnZpcm9ubWVudCByZWZlcmVuY2UuXG4gICAqL1xuICBzdGF0aWMgYWNjdW11bGF0ZTxWIGV4dGVuZHMgb2JqZWN0LCBUQmFzZSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4oXG4gICAgdmFsdWU6IFZcbiAgKTogRW52aXJvbm1lbnQ8VEJhc2UgJiBWPiAmIFRCYXNlICYgViB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBFbnZpcm9ubWVudC5pbnN0YW5jZTxFbnZpcm9ubWVudDxUQmFzZSAmIFY+PigpO1xuICAgIE9iamVjdC5rZXlzKGluc3RhbmNlIGFzIGFueSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbnN0YW5jZSBhcyBhbnksIGtleSk7XG4gICAgICBpZiAoZGVzYyAmJiBkZXNjLmNvbmZpZ3VyYWJsZSAmJiBkZXNjLmVudW1lcmFibGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGluc3RhbmNlIGFzIGFueSwga2V5LCB7XG4gICAgICAgICAgLi4uZGVzYyxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmFjY3VtdWxhdGUodmFsdWUpIGFzIHVua25vd24gYXMgRW52aXJvbm1lbnQ8VEJhc2UgJiBWPiAmXG4gICAgICBUQmFzZSAmXG4gICAgICBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSB2YWx1ZSB1c2luZyBhIGRvdC1wYXRoIGtleSBmcm9tIHRoZSBhY2N1bXVsYXRlZCBlbnZpcm9ubWVudC5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgdG8gYWNjZXNzIHN0b3JlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gS2V5IHRvIHJlc29sdmUgZnJvbSB0aGUgZW52aXJvbm1lbnQgc3RvcmUuXG4gICAqIEByZXR1cm4ge3Vua25vd259IFN0b3JlZCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkuXG4gICAqL1xuICBzdGF0aWMgZ2V0KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Ll9pbnN0YW5jZS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgcHJveHkgdGhhdCBjb21wb3NlcyBlbnZpcm9ubWVudCBrZXlzIGZvciBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgQWxsb3dzIGNoYWluZWQgcHJvcGVydHkgYWNjZXNzIHRvIGVtaXQgdXBwZXJjYXNlIEVOViBpZGVudGlmaWVycyB3aGlsZSBob25vcmluZyBleGlzdGluZyBydW50aW1lIG92ZXJyaWRlcy5cbiAgICogQHBhcmFtIHthbnl9IGN1cnJlbnQgLSBTZWVkIG1vZGVsIHNlZ21lbnQgdXNlZCB3aGVuIHByb2plY3RpbmcgbmVzdGVkIHN0cnVjdHVyZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGggLSBBY2N1bXVsYXRlZCBwYXRoIHNlZ21lbnRzIGxlYWRpbmcgdG8gdGhlIHByb3h5LlxuICAgKiBAcmV0dXJuIHthbnl9IFByb3h5IHRoYXQgcmVzb2x2ZXMgZW52aXJvbm1lbnQgdmFsdWVzIG9yIGNvbXBvc2VzIGFkZGl0aW9uYWwgcHJveGllcyBmb3IgZGVlcGVyIHBhdGhzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRFbnZQcm94eShjdXJyZW50OiBhbnksIHBhdGg6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBidWlsZEtleSA9IChwOiBzdHJpbmdbXSkgPT5cbiAgICAgIHAubWFwKChzZWcpID0+IHRvRU5WRm9ybWF0KHNlZykpLmpvaW4oRU5WX1BBVEhfREVMSU1JVEVSKTtcblxuICAgIC8vIEhlbHBlciB0byByZWFkIGZyb20gdGhlIGFjdGl2ZSBlbnZpcm9ubWVudCBnaXZlbiBhIGNvbXBvc2VkIGtleVxuICAgIGNvbnN0IHJlYWRFbnYgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgICBjb25zdCBlbnYgPSAoXG4gICAgICAgICAgZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgICAgICAgICAgIFtCcm93c2VyRW52S2V5XT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIH1cbiAgICAgICAgKVtCcm93c2VyRW52S2V5XTtcbiAgICAgICAgcmV0dXJuIGVudiA/IGVudltrZXldIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSk/LnByb2Nlc3M/LmVudj8uW2tleV07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xuICAgICAgZ2V0KF90YXJnZXQsIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLnRvUHJpbWl0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSBcInRvU3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gYnVpbGRLZXkocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AgPT09IFwidmFsdWVPZlwiKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBoYXNQcm9wID1cbiAgICAgICAgICAhIWN1cnJlbnQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHByb3ApO1xuICAgICAgICBjb25zdCBuZXh0TW9kZWwgPSBoYXNQcm9wID8gKGN1cnJlbnQgYXMgYW55KVtwcm9wXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV4dFBhdGggPSBbLi4ucGF0aCwgcHJvcF07XG4gICAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gYnVpbGRLZXkobmV4dFBhdGgpO1xuXG4gICAgICAgIC8vIElmIGFuIEVOViB2YWx1ZSBleGlzdHMgZm9yIHRoaXMgcGF0aCwgcmV0dXJuIGl0IGRpcmVjdGx5XG4gICAgICAgIGNvbnN0IGVudlZhbHVlID0gcmVhZEVudihjb21wb3NlZEtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgZW52VmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbnZWYWx1ZTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBtb2RlbCBoYXMgYW4gb2JqZWN0IGF0IHRoaXMgcGF0aCwga2VlcCBkcmlsbGluZyB3aXRoIGEgcHJveHlcbiAgICAgICAgY29uc3QgaXNOZXh0T2JqZWN0ID0gbmV4dE1vZGVsICYmIHR5cGVvZiBuZXh0TW9kZWwgPT09IFwib2JqZWN0XCI7XG4gICAgICAgIGlmIChpc05leHRPYmplY3QpIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KG5leHRNb2RlbCwgbmV4dFBhdGgpO1xuXG4gICAgICAgIC8vIElmIHRoZSBtb2RlbCBtYXJrcyB0aGlzIGxlYWYgYXMgYW4gZW1wdHkgc3RyaW5nLCB0cmVhdCBhcyB1bmRlZmluZWQgKG5vIHByb3h5KVxuICAgICAgICBpZiAoaGFzUHJvcCAmJiBuZXh0TW9kZWwgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIElmIHRoZSBtb2RlbCBleHBsaWNpdGx5IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSB3aXRoIHZhbHVlIHVuZGVmaW5lZCwgdHJlYXQgYXMgdW5kZWZpbmVkIChubyBwcm94eSlcbiAgICAgICAgaWYgKGhhc1Byb3AgJiYgdHlwZW9mIG5leHRNb2RlbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBBbHdheXMgcmV0dXJuIGEgcHJveHkgZm9yIGZ1cnRoZXIgcGF0aCBjb21wb3NpdGlvbiB3aGVuIG5vIEVOViB2YWx1ZTtcbiAgICAgICAgLy8gZG8gbm90IHN1cmZhY2UgcHJpbWl0aXZlIG1vZGVsIGRlZmF1bHRzIGhlcmUgKHRoaXMgQVBJIGlzIGZvciBrZXkgY29tcG9zaXRpb24pLlxuICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh1bmRlZmluZWQsIG5leHRQYXRoKTtcbiAgICAgIH0sXG4gICAgICBvd25LZXlzKCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IFJlZmxlY3Qub3duS2V5cyhjdXJyZW50KSA6IFtdO1xuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfdCwgcCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHApKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdGFyZ2V0ID0ge30gYXMgYW55O1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGtleXMgb2YgdGhlIGVudmlyb25tZW50LCBvcHRpb25hbGx5IGNvbnZlcnRpbmcgdGhlbSB0byBFTlYgZm9ybWF0LlxuICAgKiBAc3VtbWFyeSBHZXRzIGFsbCBrZXlzIGluIHRoZSBlbnZpcm9ubWVudCwgd2l0aCBhbiBvcHRpb24gdG8gZm9ybWF0IHRoZW0gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9FbnY9dHJ1ZV0gLSBXaGV0aGVyIHRvIGNvbnZlcnQgdGhlIGtleXMgdG8gRU5WIGZvcm1hdC5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBzdGF0aWMga2V5cyh0b0VudjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Lmluc3RhbmNlKClcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGspID0+ICh0b0VudiA/IHRvRU5WRm9ybWF0KGspIDogaykpO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNpbmdsZXRvbiBlbnZpcm9ubWVudCBpbnN0YW5jZSBzZWVkZWQgd2l0aCBkZWZhdWx0IGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBzdW1tYXJ5IENvbWJpbmVzIHtAbGluayBEZWZhdWx0TG9nZ2luZ0NvbmZpZ30gd2l0aCBydW50aW1lIGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwcm92aWRlIGNvbnNpc3RlbnQgbG9nZ2luZyBkZWZhdWx0cyBhY3Jvc3MgcGxhdGZvcm1zLlxuICogQGNvbnN0IExvZ2dlZEVudmlyb25tZW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IExvZ2dlZEVudmlyb25tZW50ID0gRW52aXJvbm1lbnQuYWNjdW11bGF0ZShcbiAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdExvZ2dpbmdDb25maWcsIHtcbiAgICBlbnY6XG4gICAgICAoaXNCcm93c2VyKCkgJiYgKGdsb2JhbFRoaXMgYXMgYW55KVtCcm93c2VyRW52S2V5XVxuICAgICAgICA/IChnbG9iYWxUaGlzIGFzIGFueSlbQnJvd3NlckVudktleV1bXCJOT0RFX0VOVlwiXVxuICAgICAgICA6IChnbG9iYWxUaGlzIGFzIGFueSkucHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSkgfHwgXCJkZXZlbG9wbWVudFwiLFxuICB9KVxuKTtcbiJdfQ==
397
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW52aXJvbm1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBZTtBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGlCQUFjO0FBQ2xDLE9BQU8sRUFDTCxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLGtCQUFrQixHQUNuQix1QkFBb0I7QUFjckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDOUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFL0MsTUFBTSxPQUFPLFdBQThCLFNBQVEsaUJBQW9CO0lBQ3JFOzs7Ozs7T0FNRzthQUNjLFlBQU8sR0FDdEIsR0FBcUIsRUFBRSxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7SUFVNUM7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUNSLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUN2QyxLQUFLLEVBQUUsRUFBRTtZQUNULFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sT0FBTyxDQUFDLENBQVM7UUFDekIsSUFBSSxHQUE0QixDQUFDO1FBQ2pDLElBQUksU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNoQixHQUFHO2dCQUVDLFVBR0QsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7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QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxhQUFhO0NBQ3BFLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0QWNjdW11bGF0b3IgfSBmcm9tIFwidHlwZWQtb2JqZWN0LWFjY3VtdWxhdG9yXCI7XG5pbXBvcnQgeyB0b0VOVkZvcm1hdCB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gXCIuL3dlYlwiO1xuaW1wb3J0IHtcbiAgQnJvd3NlckVudktleSxcbiAgRGVmYXVsdExvZ2dpbmdDb25maWcsXG4gIEVOVl9QQVRIX0RFTElNSVRFUixcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZhY3RvcnkgdHlwZSBmb3IgY3JlYXRpbmcgRW52aXJvbm1lbnQgaW5zdGFuY2VzLlxuICogQHN1bW1hcnkgRGVzY3JpYmVzIGZhY3RvcmllcyB0aGF0IGNvbnN0cnVjdCB7QGxpbmsgRW52aXJvbm1lbnR9IGRlcml2YXRpdmVzIHdpdGggY3VzdG9tIGluaXRpYWxpemF0aW9uLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBvYmplY3QgdGhlIEVudmlyb25tZW50IHdpbGwgYWNjdW11bGF0ZS5cbiAqIEB0ZW1wbGF0ZSBFIC0gVGhlIHNwZWNpZmljIEVudmlyb25tZW50IHR5cGUgdG8gYmUgY3JlYXRlZCwgZXh0ZW5kaW5nIEVudmlyb25tZW50PFQ+LlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHVua25vd25bXSk6IEV9IEVudmlyb25tZW50RmFjdG9yeVxuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50RmFjdG9yeTxUIGV4dGVuZHMgb2JqZWN0LCBFIGV4dGVuZHMgRW52aXJvbm1lbnQ8VD4+ID0gKFxuICAuLi5hcmdzOiB1bmtub3duW11cbikgPT4gRTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW52aXJvbm1lbnQgYWNjdW11bGF0b3IgdGhhdCBsYXppbHkgcmVhZHMgZnJvbSBydW50aW1lIHNvdXJjZXMuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHtAbGluayBPYmplY3RBY2N1bXVsYXRvcn0gdG8gbWVyZ2UgY29uZmlndXJhdGlvbiBvYmplY3RzIHdoaWxlIHJlc29sdmluZyB2YWx1ZXMgZnJvbSBOb2RlIG9yIGJyb3dzZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIGRlbWFuZC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2xhc3MgRW52aXJvbm1lbnRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBDb25maWcgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKHsgbG9nZ2luZzogeyBsZXZlbDogXCJpbmZvXCIgfSB9KTtcbiAqIGNvbnNvbGUubG9nKENvbmZpZy5sb2dnaW5nLmxldmVsKTtcbiAqIGNvbnNvbGUubG9nKFN0cmluZyhDb25maWcubG9nZ2luZy5sZXZlbCkpOyAvLyA9PiBMT0dHSU5HX19MRVZFTCBrZXkgd2hlbiBzZXJpYWxpemVkXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBFbnYgYXMgRW52aXJvbm1lbnRcbiAqICAgcGFydGljaXBhbnQgUHJvY2VzcyBhcyBwcm9jZXNzLmVudlxuICogICBwYXJ0aWNpcGFudCBCcm93c2VyIGFzIGdsb2JhbFRoaXMuRU5WXG4gKiAgIENsaWVudC0+PkVudjogYWNjdW11bGF0ZShwYXJ0aWFsQ29uZmlnKVxuICogICBFbnYtPj5FbnY6IGV4cGFuZCh2YWx1ZXMpXG4gKiAgIENsaWVudC0+PkVudjogQ29uZmlnLmxvZ2dpbmcubGV2ZWxcbiAqICAgYWx0IEJyb3dzZXIgcnVudGltZVxuICogICAgIEVudi0+PkJyb3dzZXI6IGxvb2t1cCBFTlYga2V5XG4gKiAgICAgQnJvd3Nlci0tPj5FbnY6IHJlc29sdmVkIHZhbHVlXG4gKiAgIGVsc2UgTm9kZSBydW50aW1lXG4gKiAgICAgRW52LT4+UHJvY2VzczogbG9va3VwIEVOViBrZXlcbiAqICAgICBQcm9jZXNzLS0+PkVudjogcmVzb2x2ZWQgdmFsdWVcbiAqICAgZW5kXG4gKiAgIEVudi0tPj5DbGllbnQ6IG1lcmdlZCB2YWx1ZVxuICovXG5jb25zdCBFbXB0eVZhbHVlID0gU3ltYm9sKFwiRW52aXJvbm1lbnRFbXB0eVwiKTtcbmNvbnN0IE1vZGVsU3ltYm9sID0gU3ltYm9sKFwiRW52aXJvbm1lbnRNb2RlbFwiKTtcblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgTW9kZWxTeW1ib2wsIHtcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIHRoZSBydW50aW1lIGVudmlyb25tZW50LlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGJyb3dzZXIgYW5kIE5vZGUuanMgZW52aXJvbm1lbnRzIGJ5IG5vcm1hbGl6aW5nIGtleXMgYW5kIHBhcnNpbmcgdmFsdWVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gayAtIEtleSB0byByZXNvbHZlIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKiBAcmV0dXJuIHt1bmtub3dufSBWYWx1ZSByZXNvbHZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHByb3RlY3RlZCBmcm9tRW52KGs6IHN0cmluZykge1xuICAgIGxldCBlbnY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgZW52ID1cbiAgICAgICAgKFxuICAgICAgICAgIGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgICAgICAgICBbQnJvd3NlckVudktleV06IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgICAgICAgfVxuICAgICAgICApW0Jyb3dzZXJFbnZLZXldIHx8IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnYgPSBnbG9iYWxUaGlzLnByb2Nlc3MuZW52O1xuICAgICAgayA9IHRvRU5WRm9ybWF0KGspO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJzZUVudlZhbHVlKGVudltrXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHN0cmluZ2lmaWVkIGVudmlyb25tZW50IHZhbHVlcyBpbnRvIG5hdGl2ZSB0eXBlcy5cbiAgICogQHN1bW1hcnkgSW50ZXJwcmV0cyBib29sZWFucyBhbmQgbnVtYmVycyB3aGlsZSBsZWF2aW5nIG90aGVyIHR5cGVzIHVuY2hhbmdlZC5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWwgLSBSYXcgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKiBAcmV0dXJuIHt1bmtub3dufSBQYXJzZWQgdmFsdWUgY29udmVydGVkIHRvIGJvb2xlYW4sIG51bWJlciwgb3IgbGVmdCBhcy1pcy5cbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUVudlZhbHVlKHZhbDogdW5rbm93bikge1xuICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsO1xuICAgIGlmICh2YWwgPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodmFsID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgaWYgKCFpc05hTihyZXN1bHQpKSByZXR1cm4gcmVzdWx0O1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4cGFuZHMgYW4gb2JqZWN0IGludG8gdGhlIGVudmlyb25tZW50LlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIGxhenkgcHJvcGVydGllcyB0aGF0IGZpcnN0IGNvbnN1bHQgcnVudGltZSB2YXJpYWJsZXMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBzZWVkZWQgdmFsdWVzLlxuICAgKiBAdGVtcGxhdGUgViAtIFR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBleHBhbmRlZC5cbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIE9iamVjdCB0byBleHBvc2UgdGhyb3VnaCBlbnZpcm9ubWVudCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGV4cGFuZDxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIEVudmlyb25tZW50Lm1lcmdlTW9kZWwoKHRoaXMgYXMgYW55KVtNb2RlbFN5bWJvbF0sIGssIHYpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGssIHtcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudiA9IHRoaXMuZnJvbUVudihrKTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZyb21FbnYgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBmcm9tRW52O1xuICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh2IGFzIGFueSwgW2tdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIG1vZGVsIHByb3ZpZGVzIGFuIGVtcHR5IHN0cmluZywgbWFyayB3aXRoIEVtcHR5VmFsdWUgc28gaW5zdGFuY2UgcHJveHkgY2FuIHJldHVybiB1bmRlZmluZWQgd2l0aG91dCBlbmFibGluZyBrZXkgY29tcG9zaXRpb25cbiAgICAgICAgICBpZiAodiA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIEVtcHR5VmFsdWUgYXMgdW5rbm93biBhcyBWW2tleW9mIFZdO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAodmFsOiBWW2tleW9mIFZdKSA9PiB7XG4gICAgICAgICAgdiA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBwcm94eSBlbmZvcmNpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKiBAc3VtbWFyeSBBY2Nlc3NpbmcgYSBwcm9wZXJ0eSB0aGF0IHJlc29sdmVzIHRvIGB1bmRlZmluZWRgIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIGRlY2xhcmVkIGluIHRoZSBtb2RlbCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEByZXR1cm4ge3RoaXN9IFByb3h5IG9mIHRoZSBlbnZpcm9ubWVudCBlbmZvcmNpbmcgcmVxdWlyZWQgdmFyaWFibGVzLlxuICAgKi9cbiAgb3JUaHJvdygpOiB0aGlzIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBjb25zdCBiYXNlID0gdGhpcztcbiAgICBjb25zdCBtb2RlbFJvb3QgPSAoYmFzZSBhcyBhbnkpW01vZGVsU3ltYm9sXSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IGJ1aWxkS2V5ID0gKHBhdGg6IHN0cmluZ1tdKSA9PlxuICAgICAgcGF0aC5tYXAoKHNlZ21lbnQpID0+IHRvRU5WRm9ybWF0KHNlZ21lbnQpKS5qb2luKEVOVl9QQVRIX0RFTElNSVRFUik7XG4gICAgY29uc3QgcmVhZFJ1bnRpbWUgPSAoa2V5OiBzdHJpbmcpID0+IEVudmlyb25tZW50LnJlYWRSdW50aW1lRW52KGtleSk7XG4gICAgY29uc3QgcGFyc2VSdW50aW1lID0gKHJhdzogdW5rbm93bikgPT5cbiAgICAgIHR5cGVvZiByYXcgIT09IFwidW5kZWZpbmVkXCIgPyB0aGlzLnBhcnNlRW52VmFsdWUocmF3KSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG1pc3NpbmcgPSAoa2V5OiBzdHJpbmcsIGVtcHR5OiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICBFbnZpcm9ubWVudC5taXNzaW5nRW52RXJyb3Ioa2V5LCBlbXB0eSk7XG5cbiAgICBjb25zdCBjcmVhdGVOZXN0ZWRQcm94eSA9IChtb2RlbDogYW55LCBwYXRoOiBzdHJpbmdbXSk6IGFueSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8YW55PiA9IHtcbiAgICAgICAgZ2V0KF90YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgbmV4dFBhdGggPSBbLi4ucGF0aCwgcHJvcF07XG4gICAgICAgICAgY29uc3QgZW52S2V5ID0gYnVpbGRLZXkobmV4dFBhdGgpO1xuICAgICAgICAgIGNvbnN0IHJ1bnRpbWVSYXcgPSByZWFkUnVudGltZShlbnZLZXkpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVudGltZVJhdyA9PT0gXCJzdHJpbmdcIiAmJiBydW50aW1lUmF3Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHRocm93IG1pc3NpbmcoZW52S2V5LCB0cnVlKTtcbiAgICAgICAgICBjb25zdCBydW50aW1lVmFsdWUgPSBwYXJzZVJ1bnRpbWUocnVudGltZVJhdyk7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lVmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcnVudGltZVZhbHVlID09PSBcInN0cmluZ1wiICYmIHJ1bnRpbWVWYWx1ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgIHRocm93IG1pc3NpbmcoZW52S2V5LCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiBydW50aW1lVmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaGFzUHJvcCA9XG4gICAgICAgICAgICBtb2RlbCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApO1xuICAgICAgICAgIGlmICghaGFzUHJvcCkgdGhyb3cgbWlzc2luZyhlbnZLZXkpO1xuXG4gICAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9IG1vZGVsW3Byb3BdO1xuICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobW9kZWxWYWx1ZSA9PT0gXCJcIikgdGhyb3cgbWlzc2luZyhlbnZLZXkpO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbW9kZWxWYWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIG1vZGVsVmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KG1vZGVsVmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTmVzdGVkUHJveHkobW9kZWxWYWx1ZSwgbmV4dFBhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtb2RlbFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBvd25LZXlzKCkge1xuICAgICAgICAgIHJldHVybiBtb2RlbCA/IFJlZmxlY3Qub3duS2V5cyhtb2RlbCkgOiBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKF90YXJnZXQsIHByb3ApIHtcbiAgICAgICAgICBpZiAoIW1vZGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB9IGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCBoYW5kbGVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPGFueT4gPSB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpO1xuICAgICAgICBjb25zdCBoYXNNb2RlbFByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG4gICAgICAgICAgbW9kZWxSb290LFxuICAgICAgICAgIHByb3BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFoYXNNb2RlbFByb3ApIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3AsIHJlY2VpdmVyKTtcblxuICAgICAgICBjb25zdCBlbnZLZXkgPSBidWlsZEtleShbcHJvcF0pO1xuICAgICAgICBjb25zdCBydW50aW1lUmF3ID0gcmVhZFJ1bnRpbWUoZW52S2V5KTtcbiAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lUmF3ID09PSBcInN0cmluZ1wiICYmIHJ1bnRpbWVSYXcubGVuZ3RoID09PSAwKVxuICAgICAgICAgIHRocm93IG1pc3NpbmcoZW52S2V5LCB0cnVlKTtcbiAgICAgICAgY29uc3QgcnVudGltZVZhbHVlID0gcGFyc2VSdW50aW1lKHJ1bnRpbWVSYXcpO1xuICAgICAgICBpZiAodHlwZW9mIHJ1bnRpbWVWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVudGltZVZhbHVlID09PSBcInN0cmluZ1wiICYmIHJ1bnRpbWVWYWx1ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICB0aHJvdyBtaXNzaW5nKGVudktleSwgdHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuIHJ1bnRpbWVWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSBtb2RlbFJvb3RbcHJvcF07XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtb2RlbFZhbHVlICYmXG4gICAgICAgICAgdHlwZW9mIG1vZGVsVmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlTmVzdGVkUHJveHkobW9kZWxWYWx1ZSwgW3Byb3BdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kZWxWYWx1ZSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG5cbiAgICAgICAgY29uc3QgYWN0dWFsID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3R1YWwgPT09IFwidW5kZWZpbmVkXCIgfHwgYWN0dWFsID09PSBcIlwiKVxuICAgICAgICAgIHRocm93IG1pc3NpbmcoZW52S2V5LCBhY3R1YWwgPT09IFwiXCIpO1xuXG4gICAgICAgIHJldHVybiBhY3R1YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb3h5KGJhc2UsIGhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGNyZWF0ZXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEVuc3VyZXMgb25seSBvbmUge0BsaW5rIEVudmlyb25tZW50fSBpbnN0YW5jZSBpcyBjcmVhdGVkLCB3cmFwcGluZyBpdCBpbiBhIHByb3h5IHRvIGNvbXBvc2UgRU5WIGtleXMgb24gZGVtYW5kLlxuICAgKiBAdGVtcGxhdGUgRVxuICAgKiBAcGFyYW0gey4uLnVua25vd25bXX0gYXJncyAtIEFyZ3VtZW50cyBmb3J3YXJkZWQgdG8gdGhlIGZhY3Rvcnkgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBzaW5nbGV0b24uXG4gICAqIEByZXR1cm4ge0V9IFNpbmdsZXRvbiBlbnZpcm9ubWVudCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgaW5zdGFuY2U8RSBleHRlbmRzIEVudmlyb25tZW50PGFueT4+KC4uLmFyZ3M6IHVua25vd25bXSk6IEUge1xuICAgIGlmICghRW52aXJvbm1lbnQuX2luc3RhbmNlKSB7XG4gICAgICBjb25zdCBiYXNlID0gRW52aXJvbm1lbnQuZmFjdG9yeSguLi5hcmdzKSBhcyBFO1xuICAgICAgY29uc3QgcHJveGllZCA9IG5ldyBQcm94eShiYXNlIGFzIGFueSwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSBFbXB0eVZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIC8vIElmIHRoZSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIGluc3RhbmNlIGJ1dCByZXNvbHZlcyB0byB1bmRlZmluZWQsIHJldHVybiB1bmRlZmluZWQgKG5vIHByb3h5KVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBwcm9wKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gQXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBsb2dnaW5nIGNvbmZpZyBsb29rdXBzIGZvciBvcHRpb25hbCBmaWVsZHMgbGlrZSAnYXBwJ1xuICAgICAgICAgICAgaWYgKHByb3AgPT09IFwiYXBwXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh1bmRlZmluZWQsIFtwcm9wXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgRW52aXJvbm1lbnQuX2luc3RhbmNlID0gcHJveGllZCBhcyBhbnk7XG4gICAgfVxuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmV3IHByb3BlcnRpZXMsIGhpZGluZyByYXcgZGVzY3JpcHRvcnMgdG8gYXZvaWQgbGVha2luZyBlbnVtZXJhdGlvbiBzZW1hbnRpY3MuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEB0ZW1wbGF0ZSBWXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBPYmplY3QgdG8gbWVyZ2UgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50fSBVcGRhdGVkIGVudmlyb25tZW50IHJlZmVyZW5jZS5cbiAgICovXG4gIHN0YXRpYyBhY2N1bXVsYXRlPFYgZXh0ZW5kcyBvYmplY3QsIFRCYXNlIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PihcbiAgICB2YWx1ZTogVlxuICApOiBFbnZpcm9ubWVudDxUQmFzZSAmIFY+ICYgVEJhc2UgJiBWIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IEVudmlyb25tZW50Lmluc3RhbmNlPEVudmlyb25tZW50PFRCYXNlICYgVj4+KCk7XG4gICAgT2JqZWN0LmtleXMoaW5zdGFuY2UgYXMgYW55KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluc3RhbmNlIGFzIGFueSwga2V5KTtcbiAgICAgIGlmIChkZXNjICYmIGRlc2MuY29uZmlndXJhYmxlICYmIGRlc2MuZW51bWVyYWJsZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW5zdGFuY2UgYXMgYW55LCBrZXksIHtcbiAgICAgICAgICAuLi5kZXNjLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdGFuY2UuYWNjdW11bGF0ZSh2YWx1ZSkgYXMgdW5rbm93biBhcyBFbnZpcm9ubWVudDxUQmFzZSAmIFY+ICZcbiAgICAgIFRCYXNlICZcbiAgICAgIFY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIHVzaW5nIGEgZG90LXBhdGgga2V5IGZyb20gdGhlIGFjY3VtdWxhdGVkIGVudmlyb25tZW50LlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSB0byBhY2Nlc3Mgc3RvcmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBLZXkgdG8gcmVzb2x2ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBzdG9yZS5cbiAgICogQHJldHVybiB7dW5rbm93bn0gU3RvcmVkIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleS5cbiAgICovXG4gIHN0YXRpYyBnZXQoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gRW52aXJvbm1lbnQuX2luc3RhbmNlLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZHMgYSBwcm94eSB0aGF0IGNvbXBvc2VzIGVudmlyb25tZW50IGtleXMgZm9yIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBBbGxvd3MgY2hhaW5lZCBwcm9wZXJ0eSBhY2Nlc3MgdG8gZW1pdCB1cHBlcmNhc2UgRU5WIGlkZW50aWZpZXJzIHdoaWxlIGhvbm9yaW5nIGV4aXN0aW5nIHJ1bnRpbWUgb3ZlcnJpZGVzLlxuICAgKiBAcGFyYW0ge2FueX0gY3VycmVudCAtIFNlZWQgbW9kZWwgc2VnbWVudCB1c2VkIHdoZW4gcHJvamVjdGluZyBuZXN0ZWQgc3RydWN0dXJlcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aCAtIEFjY3VtdWxhdGVkIHBhdGggc2VnbWVudHMgbGVhZGluZyB0byB0aGUgcHJveHkuXG4gICAqIEByZXR1cm4ge2FueX0gUHJveHkgdGhhdCByZXNvbHZlcyBlbnZpcm9ubWVudCB2YWx1ZXMgb3IgY29tcG9zZXMgYWRkaXRpb25hbCBwcm94aWVzIGZvciBkZWVwZXIgcGF0aHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBidWlsZEVudlByb3h5KGN1cnJlbnQ6IGFueSwgcGF0aDogc3RyaW5nW10pOiBhbnkge1xuICAgIGNvbnN0IGJ1aWxkS2V5ID0gKHA6IHN0cmluZ1tdKSA9PlxuICAgICAgcC5tYXAoKHNlZykgPT4gdG9FTlZGb3JtYXQoc2VnKSkuam9pbihFTlZfUEFUSF9ERUxJTUlURVIpO1xuXG4gICAgLy8gSGVscGVyIHRvIHJlYWQgZnJvbSB0aGUgYWN0aXZlIGVudmlyb25tZW50IGdpdmVuIGEgY29tcG9zZWQga2V5XG4gICAgY29uc3QgcmVhZEVudiA9IChrZXk6IHN0cmluZyk6IHVua25vd24gPT4ge1xuICAgICAgcmV0dXJuIEVudmlyb25tZW50LnJlYWRSdW50aW1lRW52KGtleSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xuICAgICAgZ2V0KF90YXJnZXQsIHByb3A6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgICBpZiAocHJvcCA9PT0gU3ltYm9sLnRvUHJpbWl0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wID09PSBcInRvU3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gYnVpbGRLZXkocGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3AgPT09IFwidmFsdWVPZlwiKSB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGJ1aWxkS2V5KHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBoYXNQcm9wID1cbiAgICAgICAgICAhIWN1cnJlbnQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHByb3ApO1xuICAgICAgICBjb25zdCBuZXh0TW9kZWwgPSBoYXNQcm9wID8gKGN1cnJlbnQgYXMgYW55KVtwcm9wXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbmV4dFBhdGggPSBbLi4ucGF0aCwgcHJvcF07XG4gICAgICAgIGNvbnN0IGNvbXBvc2VkS2V5ID0gYnVpbGRLZXkobmV4dFBhdGgpO1xuXG4gICAgICAgIC8vIElmIGFuIEVOViB2YWx1ZSBleGlzdHMgZm9yIHRoaXMgcGF0aCwgcmV0dXJuIGl0IGRpcmVjdGx5XG4gICAgICAgIGNvbnN0IGVudlZhbHVlID0gcmVhZEVudihjb21wb3NlZEtleSk7XG4gICAgICAgIGlmICh0eXBlb2YgZW52VmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbnZWYWx1ZTtcblxuICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBtb2RlbCBoYXMgYW4gb2JqZWN0IGF0IHRoaXMgcGF0aCwga2VlcCBkcmlsbGluZyB3aXRoIGEgcHJveHlcbiAgICAgICAgY29uc3QgaXNOZXh0T2JqZWN0ID0gbmV4dE1vZGVsICYmIHR5cGVvZiBuZXh0TW9kZWwgPT09IFwib2JqZWN0XCI7XG4gICAgICAgIGlmIChpc05leHRPYmplY3QpIHJldHVybiBFbnZpcm9ubWVudC5idWlsZEVudlByb3h5KG5leHRNb2RlbCwgbmV4dFBhdGgpO1xuXG4gICAgICAgIC8vIElmIHRoZSBtb2RlbCBtYXJrcyB0aGlzIGxlYWYgYXMgYW4gZW1wdHkgc3RyaW5nLCB0cmVhdCBhcyB1bmRlZmluZWQgKG5vIHByb3h5KVxuICAgICAgICBpZiAoaGFzUHJvcCAmJiBuZXh0TW9kZWwgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIElmIHRoZSBtb2RlbCBleHBsaWNpdGx5IGNvbnRhaW5zIHRoZSBwcm9wZXJ0eSB3aXRoIHZhbHVlIHVuZGVmaW5lZCwgdHJlYXQgYXMgdW5kZWZpbmVkIChubyBwcm94eSlcbiAgICAgICAgaWYgKGhhc1Byb3AgJiYgdHlwZW9mIG5leHRNb2RlbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBBbHdheXMgcmV0dXJuIGEgcHJveHkgZm9yIGZ1cnRoZXIgcGF0aCBjb21wb3NpdGlvbiB3aGVuIG5vIEVOViB2YWx1ZTtcbiAgICAgICAgLy8gZG8gbm90IHN1cmZhY2UgcHJpbWl0aXZlIG1vZGVsIGRlZmF1bHRzIGhlcmUgKHRoaXMgQVBJIGlzIGZvciBrZXkgY29tcG9zaXRpb24pLlxuICAgICAgICByZXR1cm4gRW52aXJvbm1lbnQuYnVpbGRFbnZQcm94eSh1bmRlZmluZWQsIG5leHRQYXRoKTtcbiAgICAgIH0sXG4gICAgICBvd25LZXlzKCkge1xuICAgICAgICByZXR1cm4gY3VycmVudCA/IFJlZmxlY3Qub3duS2V5cyhjdXJyZW50KSA6IFtdO1xuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfdCwgcCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQpIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIHApKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQgYXMgYW55O1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgdGFyZ2V0ID0ge30gYXMgYW55O1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIGtleXMgb2YgdGhlIGVudmlyb25tZW50LCBvcHRpb25hbGx5IGNvbnZlcnRpbmcgdGhlbSB0byBFTlYgZm9ybWF0LlxuICAgKiBAc3VtbWFyeSBHZXRzIGFsbCBrZXlzIGluIHRoZSBlbnZpcm9ubWVudCwgd2l0aCBhbiBvcHRpb24gdG8gZm9ybWF0IHRoZW0gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9FbnY9dHJ1ZV0gLSBXaGV0aGVyIHRvIGNvbnZlcnQgdGhlIGtleXMgdG8gRU5WIGZvcm1hdC5cbiAgICogQHJldHVybiB7c3RyaW5nW119IEFuIGFycmF5IG9mIGtleXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gICAqL1xuICBzdGF0aWMga2V5cyh0b0VudjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50Lmluc3RhbmNlKClcbiAgICAgIC5rZXlzKClcbiAgICAgIC5tYXAoKGspID0+ICh0b0VudiA/IHRvRU5WRm9ybWF0KGspIDogaykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbWVyZ2VNb2RlbChcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogYW55XG4gICkge1xuICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBtb2RlbFtrZXldO1xuICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nKVxuICAgICAgICAgID8gZXhpc3RpbmdcbiAgICAgICAgICA6IHt9O1xuICAgICAgbW9kZWxba2V5XSA9IHRhcmdldDtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbY2hpbGRLZXksIGNoaWxkVmFsdWVdKSA9PiB7XG4gICAgICAgIEVudmlyb25tZW50Lm1lcmdlTW9kZWwodGFyZ2V0LCBjaGlsZEtleSwgY2hpbGRWYWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbW9kZWxba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZFJ1bnRpbWVFbnYoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBpZiAoaXNCcm93c2VyKCkpIHtcbiAgICAgIGNvbnN0IGVudiA9IChcbiAgICAgICAgZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgICAgICAgICBbQnJvd3NlckVudktleV0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgKVtCcm93c2VyRW52S2V5XTtcbiAgICAgIHJldHVybiBlbnYgPyBlbnZba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSk/LnByb2Nlc3M/LmVudj8uW2tleV07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtaXNzaW5nRW52RXJyb3Ioa2V5OiBzdHJpbmcsIGVtcHR5OiBib29sZWFuKTogRXJyb3Ige1xuICAgIGNvbnN0IHN1ZmZpeCA9IGVtcHR5ID8gXCJhbiBlbXB0eSBzdHJpbmdcIiA6IFwidW5kZWZpbmVkXCI7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICAgIGBFbnZpcm9ubWVudCB2YXJpYWJsZSAke2tleX0gaXMgcmVxdWlyZWQgYnV0IHdhcyAke3N1ZmZpeH0uYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2luZ2xldG9uIGVudmlyb25tZW50IGluc3RhbmNlIHNlZWRlZCB3aXRoIGRlZmF1bHQgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHN1bW1hcnkgQ29tYmluZXMge0BsaW5rIERlZmF1bHRMb2dnaW5nQ29uZmlnfSB3aXRoIHJ1bnRpbWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHByb3ZpZGUgY29uc2lzdGVudCBsb2dnaW5nIGRlZmF1bHRzIGFjcm9zcyBwbGF0Zm9ybXMuXG4gKiBAY29uc3QgTG9nZ2VkRW52aXJvbm1lbnRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgTG9nZ2VkRW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudC5hY2N1bXVsYXRlKFxuICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0TG9nZ2luZ0NvbmZpZywge1xuICAgIGVudjpcbiAgICAgIChpc0Jyb3dzZXIoKSAmJiAoZ2xvYmFsVGhpcyBhcyBhbnkpW0Jyb3dzZXJFbnZLZXldXG4gICAgICAgID8gKGdsb2JhbFRoaXMgYXMgYW55KVtCcm93c2VyRW52S2V5XVtcIk5PREVfRU5WXCJdXG4gICAgICAgIDogKGdsb2JhbFRoaXMgYXMgYW55KS5wcm9jZXNzLmVudltcIk5PREVfRU5WXCJdKSB8fCBcImRldmVsb3BtZW50XCIsXG4gIH0pXG4pO1xuIl19
@@ -8,6 +8,7 @@ export * from "./text";
8
8
  export * from "./time";
9
9
  export * from "./types";
10
10
  export * from "./web";
11
+ export * from "./utils";
11
12
  /**
12
13
  * @description Comprehensive logging toolkit for browser and Node environments.
13
14
  * @summary Exposes {@link Logging} and {@link MiniLogger} for runtime logging, decorators such as {@link log} for method instrumentation, and utilities like {@link PatternFilter}, {@link StopWatch}, and {@link LoggedEnvironment} to build configurable, theme-aware log pipelines.
@@ -20,4 +21,4 @@ export * from "./web";
20
21
  * @type {string}
21
22
  * @memberOf module:Logging
22
23
  */
23
- export declare const VERSION = "0.3.16";
24
+ export declare const VERSION = "0.3.17";
package/lib/esm/index.js CHANGED
@@ -8,6 +8,7 @@ export * from "./text.js";
8
8
  export * from "./time.js";
9
9
  export * from "./types.js";
10
10
  export * from "./web.js";
11
+ export * from "./utils.js";
11
12
  /**
12
13
  * @description Comprehensive logging toolkit for browser and Node environments.
13
14
  * @summary Exposes {@link Logging} and {@link MiniLogger} for runtime logging, decorators such as {@link log} for method instrumentation, and utilities like {@link PatternFilter}, {@link StopWatch}, and {@link LoggedEnvironment} to build configurable, theme-aware log pipelines.
@@ -20,5 +21,5 @@ export * from "./web.js";
20
21
  * @type {string}
21
22
  * @memberOf module:Logging
22
23
  */
23
- export const VERSION = "0.3.16";
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQTBCO0FBQzFCLCtCQUE0QjtBQUM1QixnQ0FBNkI7QUFDN0IsaUNBQThCO0FBQzlCLGlDQUE4QjtBQUM5Qiw2QkFBMEI7QUFDMUIsMEJBQXVCO0FBQ3ZCLDBCQUF1QjtBQUN2QiwyQkFBd0I7QUFDeEIseUJBQXNCO0FBRXRCOzs7O0dBSUc7QUFFSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZmlsdGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnZpcm9ubWVudFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTG9nZ2VkQ2xhc3NcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RpbWVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93ZWJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcHJlaGVuc2l2ZSBsb2dnaW5nIHRvb2xraXQgZm9yIGJyb3dzZXIgYW5kIE5vZGUgZW52aXJvbm1lbnRzLlxuICogQHN1bW1hcnkgRXhwb3NlcyB7QGxpbmsgTG9nZ2luZ30gYW5kIHtAbGluayBNaW5pTG9nZ2VyfSBmb3IgcnVudGltZSBsb2dnaW5nLCBkZWNvcmF0b3JzIHN1Y2ggYXMge0BsaW5rIGxvZ30gZm9yIG1ldGhvZCBpbnN0cnVtZW50YXRpb24sIGFuZCB1dGlsaXRpZXMgbGlrZSB7QGxpbmsgUGF0dGVybkZpbHRlcn0sIHtAbGluayBTdG9wV2F0Y2h9LCBhbmQge0BsaW5rIExvZ2dlZEVudmlyb25tZW50fSB0byBidWlsZCBjb25maWd1cmFibGUsIHRoZW1lLWF3YXJlIGxvZyBwaXBlbGluZXMuXG4gKiBAbW9kdWxlIExvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBzdHJpbmcuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHBhY2thZ2UgdmVyc2lvbiBmb3IgZGlhZ25vc3RpY3MgYW5kIGNvbXBhdGliaWxpdHkgY2hlY2tzLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXX0=
24
+ export const VERSION = "0.3.17";
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQTBCO0FBQzFCLCtCQUE0QjtBQUM1QixnQ0FBNkI7QUFDN0IsaUNBQThCO0FBQzlCLGlDQUE4QjtBQUM5Qiw2QkFBMEI7QUFDMUIsMEJBQXVCO0FBQ3ZCLDBCQUF1QjtBQUN2QiwyQkFBd0I7QUFDeEIseUJBQXNCO0FBQ3RCLDJCQUF3QjtBQUV4Qjs7OztHQUlHO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2ZpbHRlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0xvZ2dlZENsYXNzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90aW1lXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2ViXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wcmVoZW5zaXZlIGxvZ2dpbmcgdG9vbGtpdCBmb3IgYnJvd3NlciBhbmQgTm9kZSBlbnZpcm9ubWVudHMuXG4gKiBAc3VtbWFyeSBFeHBvc2VzIHtAbGluayBMb2dnaW5nfSBhbmQge0BsaW5rIE1pbmlMb2dnZXJ9IGZvciBydW50aW1lIGxvZ2dpbmcsIGRlY29yYXRvcnMgc3VjaCBhcyB7QGxpbmsgbG9nfSBmb3IgbWV0aG9kIGluc3RydW1lbnRhdGlvbiwgYW5kIHV0aWxpdGllcyBsaWtlIHtAbGluayBQYXR0ZXJuRmlsdGVyfSwge0BsaW5rIFN0b3BXYXRjaH0sIGFuZCB7QGxpbmsgTG9nZ2VkRW52aXJvbm1lbnR9IHRvIGJ1aWxkIGNvbmZpZ3VyYWJsZSwgdGhlbWUtYXdhcmUgbG9nIHBpcGVsaW5lcy5cbiAqIEBtb2R1bGUgTG9nZ2luZ1xuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZy5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgcGFja2FnZSB2ZXJzaW9uIGZvciBkaWFnbm9zdGljcyBhbmQgY29tcGF0aWJpbGl0eSBjaGVja3MuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6TG9nZ2luZ1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdfQ==
@@ -97,6 +97,14 @@ export declare class MiniLogger implements Logger {
97
97
  * @return {void}
98
98
  */
99
99
  error(msg: StringLike | Error, e?: Error): void;
100
+ /**
101
+ * @description Logs a message at the error level
102
+ * @summary Logs a message at the error level for errors and exceptions
103
+ * @param {StringLike | Error} msg - The message to be logged or an Error object
104
+ * @param e
105
+ * @return {void}
106
+ */
107
+ warn(msg: StringLike): void;
100
108
  /**
101
109
  * @description Updates the logger configuration
102
110
  * @summary Merges the provided configuration with the existing configuration
@@ -246,6 +254,13 @@ export declare class Logging {
246
254
  * @param msg - The message to be logged.
247
255
  */
248
256
  static silly(msg: StringLike): void;
257
+ /**
258
+ * @description Logs a silly message.
259
+ * @summary Delegates the debug logging to the global logger instance.
260
+ *
261
+ * @param msg - The message to be logged.
262
+ */
263
+ static warn(msg: StringLike): void;
249
264
  /**
250
265
  * @description Logs an error message.
251
266
  * @summary Delegates the error logging to the global logger instance.