@decaf-ts/core 0.5.20 → 0.5.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE.md +13 -16
  2. package/README.md +252 -604
  3. package/dist/core.cjs +335 -125
  4. package/dist/core.esm.cjs +338 -128
  5. package/lib/esm/identity/decorators.js +1 -1
  6. package/lib/esm/index.d.ts +1 -1
  7. package/lib/esm/index.js +1 -1
  8. package/lib/esm/model/types.d.ts +0 -9
  9. package/lib/esm/model/types.js +1 -1
  10. package/lib/esm/persistence/Adapter.d.ts +61 -51
  11. package/lib/esm/persistence/Adapter.js +120 -47
  12. package/lib/esm/persistence/Dispatch.d.ts +2 -13
  13. package/lib/esm/persistence/Dispatch.js +7 -15
  14. package/lib/esm/persistence/errors.d.ts +2 -2
  15. package/lib/esm/persistence/errors.js +4 -4
  16. package/lib/esm/persistence/types.d.ts +2 -0
  17. package/lib/esm/persistence/types.js +1 -1
  18. package/lib/esm/query/Condition.d.ts +8 -0
  19. package/lib/esm/query/Condition.js +9 -1
  20. package/lib/esm/query/Paginator.d.ts +2 -2
  21. package/lib/esm/query/Paginator.js +1 -1
  22. package/lib/esm/query/Statement.d.ts +4 -3
  23. package/lib/esm/query/Statement.js +4 -2
  24. package/lib/esm/query/errors.d.ts +3 -3
  25. package/lib/esm/query/errors.js +6 -6
  26. package/lib/esm/ram/RamAdapter.d.ts +8 -14
  27. package/lib/esm/ram/RamAdapter.js +44 -33
  28. package/lib/esm/ram/RamContext.d.ts +14 -6
  29. package/lib/esm/ram/RamContext.js +15 -7
  30. package/lib/esm/ram/constants.d.ts +1 -2
  31. package/lib/esm/ram/constants.js +2 -3
  32. package/lib/esm/ram/types.d.ts +3 -0
  33. package/lib/esm/ram/types.js +1 -1
  34. package/lib/esm/repository/Repository.d.ts +8 -7
  35. package/lib/esm/repository/Repository.js +8 -8
  36. package/lib/esm/repository/constants.d.ts +5 -4
  37. package/lib/esm/repository/constants.js +6 -5
  38. package/lib/esm/repository/decorators.d.ts +1 -1
  39. package/lib/esm/repository/decorators.js +12 -9
  40. package/lib/esm/repository/errors.d.ts +2 -2
  41. package/lib/esm/repository/errors.js +4 -4
  42. package/lib/esm/repository/injectables.d.ts +82 -11
  43. package/lib/esm/repository/injectables.js +137 -28
  44. package/lib/esm/repository/utils.d.ts +28 -6
  45. package/lib/esm/repository/utils.js +29 -7
  46. package/lib/esm/utils/errors.d.ts +5 -5
  47. package/lib/esm/utils/errors.js +9 -9
  48. package/lib/identity/decorators.cjs +1 -1
  49. package/lib/index.cjs +1 -1
  50. package/lib/index.d.ts +1 -1
  51. package/lib/model/types.cjs +1 -1
  52. package/lib/model/types.d.ts +0 -9
  53. package/lib/persistence/Adapter.cjs +119 -46
  54. package/lib/persistence/Adapter.d.ts +61 -51
  55. package/lib/persistence/Dispatch.cjs +6 -14
  56. package/lib/persistence/Dispatch.d.ts +2 -13
  57. package/lib/persistence/errors.cjs +3 -3
  58. package/lib/persistence/errors.d.ts +2 -2
  59. package/lib/persistence/types.cjs +1 -1
  60. package/lib/persistence/types.d.ts +2 -0
  61. package/lib/query/Condition.cjs +9 -1
  62. package/lib/query/Condition.d.ts +8 -0
  63. package/lib/query/Paginator.cjs +1 -1
  64. package/lib/query/Paginator.d.ts +2 -2
  65. package/lib/query/Statement.cjs +4 -2
  66. package/lib/query/Statement.d.ts +4 -3
  67. package/lib/query/errors.cjs +5 -5
  68. package/lib/query/errors.d.ts +3 -3
  69. package/lib/ram/RamAdapter.cjs +43 -32
  70. package/lib/ram/RamAdapter.d.ts +8 -14
  71. package/lib/ram/RamContext.cjs +15 -7
  72. package/lib/ram/RamContext.d.ts +14 -6
  73. package/lib/ram/constants.cjs +2 -3
  74. package/lib/ram/constants.d.ts +1 -2
  75. package/lib/ram/types.cjs +1 -1
  76. package/lib/ram/types.d.ts +3 -0
  77. package/lib/repository/Repository.cjs +8 -8
  78. package/lib/repository/Repository.d.ts +8 -7
  79. package/lib/repository/constants.cjs +6 -5
  80. package/lib/repository/constants.d.ts +5 -4
  81. package/lib/repository/decorators.cjs +12 -9
  82. package/lib/repository/decorators.d.ts +1 -1
  83. package/lib/repository/errors.cjs +3 -3
  84. package/lib/repository/errors.d.ts +2 -2
  85. package/lib/repository/injectables.cjs +137 -28
  86. package/lib/repository/injectables.d.ts +82 -11
  87. package/lib/repository/utils.cjs +29 -7
  88. package/lib/repository/utils.d.ts +28 -6
  89. package/lib/utils/errors.cjs +8 -8
  90. package/lib/utils/errors.d.ts +5 -5
  91. package/package.json +3 -2
@@ -8,14 +8,13 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { DBKeys, InternalError, Context, OperationKeys, DefaultRepositoryFlags, modelToTransient, } from "@decaf-ts/db-decorators";
11
- import { Decoration, DefaultFlavour, Model, } from "@decaf-ts/decorator-validation";
11
+ import { Decoration, DefaultFlavour, hashObj, Model, } from "@decaf-ts/decorator-validation";
12
12
  import { PersistenceKeys } from "./constants.js";
13
13
  import { Repository } from "./../repository/Repository.js";
14
- import { Logging } from "@decaf-ts/logging";
15
14
  import { final } from "./../utils/index.js";
16
15
  import { Dispatch } from "./Dispatch.js";
17
16
  import { ObserverHandler } from "./ObserverHandler.js";
18
- import { UnsupportedError } from "./errors.js";
17
+ import { LoggedClass } from "@decaf-ts/logging";
19
18
  Decoration.setFlavourResolver((obj) => {
20
19
  try {
21
20
  return (Adapter.flavourOf(Model.isModel(obj) ? obj.constructor : obj) ||
@@ -35,24 +34,24 @@ Decoration.setFlavourResolver((obj) => {
35
34
  }
36
35
  });
37
36
  /**
38
- * @description Abstract base class for database adapters
37
+ * @description Abstract Facade class for persistence adapters
39
38
  * @summary Provides the foundation for all database adapters in the persistence layer. This class
40
39
  * implements several interfaces to provide a consistent API for database operations, observer
41
40
  * pattern support, and error handling. It manages adapter registration, CRUD operations, and
42
41
  * observer notifications.
43
- * @template Y - The underlying database driver type
44
- * @template Q - The query object type used by the adapter
45
- * @template F - The repository flags type
46
- * @template C - The context type
47
- * @param {Y} _native - The underlying database driver instance
42
+ * @template CONFIG - The underlying persistence driver config
43
+ * @template QUERY - The query object type used by the adapter
44
+ * @template FLAGS - The repository flags type
45
+ * @template CONTEXT - The context type
46
+ * @param {CONFIG} _config - The underlying persistence driver config
48
47
  * @param {string} flavour - The identifier for this adapter type
49
48
  * @param {string} [_alias] - Optional alternative name for this adapter
50
49
  * @class Adapter
51
50
  * @example
52
51
  * ```typescript
53
52
  * // Implementing a concrete adapter
54
- * class PostgresAdapter extends Adapter<pg.Client, pg.Query, PostgresFlags, PostgresContext> {
55
- * constructor(client: pg.Client) {
53
+ * class PostgresAdapter extends Adapter<pg.PoolConfig, pg.Query, PostgresFlags, PostgresContext> {
54
+ * constructor(client: pg.PoolConfig) {
56
55
  * super(client, 'postgres');
57
56
  * }
58
57
  *
@@ -126,25 +125,16 @@ Decoration.setFlavourResolver((obj) => {
126
125
  * Adapter --|> Observer
127
126
  * Adapter --|> ErrorParser
128
127
  */
129
- export class Adapter {
128
+ export class Adapter extends LoggedClass {
130
129
  static { this._cache = {}; }
131
130
  /**
132
- * @description Logger accessor
133
- * @summary Gets or initializes the logger for this adapter instance
134
- * @return {Logger} The logger instance
131
+ * @description Gets the native persistence config
132
+ * @summary Provides access to the underlying persistence driver config
133
+ * @template CONF
134
+ * @return {CONF} The native persistence driver config
135
135
  */
136
- get log() {
137
- if (!this.logger)
138
- this.logger = Logging.for(this);
139
- return this.logger;
140
- }
141
- /**
142
- * @description Gets the native database driver
143
- * @summary Provides access to the underlying database driver instance
144
- * @return {Y} The native database driver
145
- */
146
- get native() {
147
- return this._native;
136
+ get config() {
137
+ return this._config;
148
138
  }
149
139
  /**
150
140
  * @description Gets the adapter's alias or flavor name
@@ -158,17 +148,56 @@ export class Adapter {
158
148
  * @description Gets the repository constructor for this adapter
159
149
  * @summary Returns the constructor for creating repositories that work with this adapter
160
150
  * @template M - The model type
161
- * @return {Constructor<Repository<M, Q, Adapter<Y, Q, F, C>, F, C>>} The repository constructor
151
+ * @return {Constructor<Repository<M, QUERY, Adapter<CONF, CONN, QUERY, FLAGS, CONTEXT>, FLAGS, CONTEXT>>} The repository constructor
162
152
  */
163
153
  repository() {
164
154
  return Repository;
165
155
  }
156
+ async shutdownProxies(k) {
157
+ if (!this.proxies)
158
+ return;
159
+ if (k && !(k in this.proxies))
160
+ throw new InternalError(`No proxy found for ${k}`);
161
+ if (!k) {
162
+ for (const key in this.proxies) {
163
+ try {
164
+ await this.proxies[key].shutdown();
165
+ }
166
+ catch (e) {
167
+ this.log.error(`Failed to shutdown proxied adapter ${key}: ${e}`);
168
+ continue;
169
+ }
170
+ delete this.proxies[key];
171
+ }
172
+ }
173
+ else {
174
+ try {
175
+ await this.proxies[k].shutdown();
176
+ delete this.proxies[k];
177
+ }
178
+ catch (e) {
179
+ this.log.error(`Failed to shutdown proxied adapter ${k}: ${e}`);
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * @description Shuts down the adapter
185
+ * @summary Performs any necessary cleanup tasks, such as closing connections
186
+ * When overriding this method, ensure to call the base method first
187
+ * @return {Promise<void>} A promise that resolves when shutdown is complete
188
+ */
189
+ async shutdown() {
190
+ await this.shutdownProxies();
191
+ if (this.dispatch)
192
+ await this.dispatch.close();
193
+ }
166
194
  /**
167
195
  * @description Creates a new adapter instance
168
196
  * @summary Initializes the adapter with the native driver and registers it in the adapter cache
169
197
  */
170
- constructor(_native, flavour, _alias) {
171
- this._native = _native;
198
+ constructor(_config, flavour, _alias) {
199
+ super();
200
+ this._config = _config;
172
201
  this.flavour = flavour;
173
202
  this._alias = _alias;
174
203
  /**
@@ -176,7 +205,7 @@ export class Adapter {
176
205
  * @summary Reference to the context class constructor used by this adapter
177
206
  */
178
207
  this.Context = (Context);
179
- if (this.flavour in Adapter._cache)
208
+ if (this.alias in Adapter._cache)
180
209
  throw new InternalError(`${this.alias} persistence adapter ${this._alias ? `(${this.flavour}) ` : ""} already registered`);
181
210
  Adapter._cache[this.alias] = this;
182
211
  this.log.info(`Created ${this.alias} persistence adapter ${this._alias ? `(${this.flavour}) ` : ""} persistence adapter`);
@@ -210,6 +239,14 @@ export class Adapter {
210
239
  isReserved(attr) {
211
240
  return !attr;
212
241
  }
242
+ /**
243
+ * @description Initializes the adapter
244
+ * @summary Performs any necessary setup for the adapter, such as establishing connections
245
+ * @param {...any[]} args - Initialization arguments
246
+ * @return {Promise<void>} A promise that resolves when initialization is complete
247
+ */
248
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
249
+ async initialize(...args) { }
213
250
  /**
214
251
  * @description Creates repository flags for an operation
215
252
  * @summary Generates a set of flags that describe a database operation, combining default flags with overrides
@@ -492,12 +529,13 @@ export class Adapter {
492
529
  /**
493
530
  * @description Gets an adapter by flavor
494
531
  * @summary Retrieves a registered adapter by its flavor name
495
- * @template Y - The database driver type
496
- * @template Q - The query type
497
- * @template C - The context type
498
- * @template F - The repository flags type
532
+ * @template CONF - The database driver config
533
+ * @template CONN - The database driver instance
534
+ * @template QUERY - The query type
535
+ * @template CCONTEXT - The context type
536
+ * @template FLAGS - The repository flags type
499
537
  * @param {string} flavour - The flavor name of the adapter to retrieve
500
- * @return {Adapter<Y, Q, F, C> | undefined} The adapter instance or undefined if not found
538
+ * @return {Adapter<CONF, CONN, QUERY, CONTEXT, FLAGS> | undefined} The adapter instance or undefined if not found
501
539
  */
502
540
  static get(flavour) {
503
541
  if (!flavour)
@@ -557,19 +595,49 @@ export class Adapter {
557
595
  }
558
596
  }
559
597
  static decoration() { }
560
- /**
561
- * @description Creates a child Adapter with specific congigurations
562
- * @summary Returns a new Adapter instance with specific congigurations
563
- * @param {string | Function} config - The method name or function to create a logger for
564
- * @param {Partial<LoggingConfig>} config - Optional configuration to override settings
565
- * @param {...any} args - Additional arguments to pass to the logger factory
566
- * @return {Logger} A new logger instance for the specified method
567
- */
598
+ get client() {
599
+ if (!this._client) {
600
+ this._client = this.getClient();
601
+ }
602
+ return this._client;
603
+ }
568
604
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
569
- for(...args) {
570
- throw new UnsupportedError("Method not supported by default");
605
+ for(config, ...args) {
606
+ if (!this.proxies)
607
+ this.proxies = {};
608
+ const key = `${this.alias} - ${hashObj(config)}`;
609
+ if (key in this.proxies)
610
+ return this.proxies[key];
611
+ let client;
612
+ const proxy = new Proxy(this, {
613
+ get: (target, p, receiver) => {
614
+ if (p === "_config") {
615
+ const originalConf = Reflect.get(target, p, receiver);
616
+ return Object.assign({}, originalConf, config);
617
+ }
618
+ if (p === "_client") {
619
+ return client;
620
+ }
621
+ return Reflect.get(target, p, receiver);
622
+ },
623
+ set: (target, p, value, receiver) => {
624
+ if (p === "_client") {
625
+ client = value;
626
+ return true;
627
+ }
628
+ return Reflect.set(target, p, value, receiver);
629
+ },
630
+ });
631
+ this.proxies[key] = proxy;
632
+ return proxy;
571
633
  }
572
634
  }
635
+ __decorate([
636
+ final(),
637
+ __metadata("design:type", Function),
638
+ __metadata("design:paramtypes", [String]),
639
+ __metadata("design:returntype", Promise)
640
+ ], Adapter.prototype, "shutdownProxies", null);
573
641
  __decorate([
574
642
  final(),
575
643
  __metadata("design:type", Function),
@@ -588,4 +656,9 @@ __decorate([
588
656
  __metadata("design:paramtypes", [Object]),
589
657
  __metadata("design:returntype", void 0)
590
658
  ], Adapter.prototype, "unObserve", null);
591
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxNQUFNLEVBQ04sYUFBYSxFQUNiLE9BQU8sRUFDUCxhQUFhLEVBRWIsc0JBQXNCLEVBR3RCLGdCQUFnQixHQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFFTCxVQUFVLEVBQ1YsY0FBYyxFQUNkLEtBQUssR0FHTixNQUFNLGdDQUFnQyxDQUFDO0FBSXhDLE9BQU8sRUFBRSxlQUFlLEVBQUUsdUJBQW9CO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsc0NBQWlDO0FBSXRELE9BQU8sRUFBVSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLDRCQUFpQjtBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLHNCQUFtQjtBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLDZCQUEwQjtBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQWlCO0FBRTVDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO0lBQzVDLElBQUksQ0FBQztRQUNILE9BQU8sQ0FDTCxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFFLEdBQVcsQ0FBQztZQUN0RSxPQUFPLENBQUMsY0FBYztZQUN0QixjQUFjLENBQ2YsQ0FBQztRQUNGLDZEQUE2RDtJQUMvRCxDQUFDO0lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztRQUNwQix5QkFBeUI7SUFDM0IsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLGNBQWMsSUFBSSxjQUFjLENBQUM7UUFDaEQsNkRBQTZE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SUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNQLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQzlCLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUNqQyxDQUEwQixDQUMzQixDQUFDO29CQUNGLElBQUksQ0FBQyxJQUFJO3dCQUFFLE9BQU87b0JBQ2xCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBRTFDLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFDcEMsVUFBVSxDQUNYLENBQUM7b0JBQ0YsT0FBTyxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztZQUNILENBQUMsQ0FBQztpQkFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsS0FBVSxDQUFDO0lBRTVCOzs7Ozs7O09BT0c7SUFDSCw2REFBNkQ7SUFDN0QsR0FBRyxDQUFDLEdBQUcsSUFBVztRQUNoQixNQUFNLElBQUksZ0JBQWdCLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNoRSxDQUFDOztBQW5nQks7SUFETCxLQUFLLEVBQUU7Ozs7c0NBaUJQO0FBd1JEO0lBREMsS0FBSyxFQUFFOzs7O3NDQWdCUDtBQVNEO0lBREMsS0FBSyxFQUFFOzs7O3dDQVVQIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBEQktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIENvbnRleHQsXG4gIE9wZXJhdGlvbktleXMsXG4gIFJlcG9zaXRvcnlGbGFncyxcbiAgRGVmYXVsdFJlcG9zaXRvcnlGbGFncyxcbiAgQ29udGV4dHVhbCxcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBtb2RlbFRvVHJhbnNpZW50LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IHR5cGUgT2JzZXJ2ZXIgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgRGVmYXVsdEZsYXZvdXIsXG4gIE1vZGVsLFxuICBNb2RlbENvbnN0cnVjdG9yLFxuICBNb2RlbFJlZ2lzdHJ5LFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9TZXF1ZW5jZU9wdGlvbnNcIjtcbmltcG9ydCB7IFJhd0V4ZWN1dG9yIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvUmF3RXhlY3V0b3JcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9PYnNlcnZhYmxlXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiLi4vcmVwb3NpdG9yeS9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCIuL1NlcXVlbmNlXCI7XG5pbXBvcnQgeyBFcnJvclBhcnNlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcXVlcnkvU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IGZpbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50SWRzLCB0eXBlIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG5EZWNvcmF0aW9uLnNldEZsYXZvdXJSZXNvbHZlcigob2JqOiBvYmplY3QpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgQWRhcHRlci5mbGF2b3VyT2YoTW9kZWwuaXNNb2RlbChvYmopID8gb2JqLmNvbnN0cnVjdG9yIDogKG9iaiBhcyBhbnkpKSB8fFxuICAgICAgQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fFxuICAgICAgRGVmYXVsdEZsYXZvdXJcbiAgICApO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBBZGFwdGVyLmN1cnJlbnRGbGF2b3VyIHx8IERlZmF1bHRGbGF2b3VyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHJldHVybiBEZWZhdWx0Rmxhdm91cjtcbiAgfVxufSk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGRhdGFiYXNlIGFkYXB0ZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3IgYWxsIGRhdGFiYXNlIGFkYXB0ZXJzIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gVGhpcyBjbGFzc1xuICogaW1wbGVtZW50cyBzZXZlcmFsIGludGVyZmFjZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgQVBJIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLCBvYnNlcnZlclxuICogcGF0dGVybiBzdXBwb3J0LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEl0IG1hbmFnZXMgYWRhcHRlciByZWdpc3RyYXRpb24sIENSVUQgb3BlcmF0aW9ucywgYW5kXG4gKiBvYnNlcnZlciBub3RpZmljYXRpb25zLlxuICogQHRlbXBsYXRlIFkgLSBUaGUgdW5kZXJseWluZyBkYXRhYmFzZSBkcml2ZXIgdHlwZVxuICogQHRlbXBsYXRlIFEgLSBUaGUgcXVlcnkgb2JqZWN0IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlclxuICogQHRlbXBsYXRlIEYgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7WX0gX25hdGl2ZSAtIFRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIGRyaXZlciBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyBhZGFwdGVyIHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbX2FsaWFzXSAtIE9wdGlvbmFsIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoaXMgYWRhcHRlclxuICogQGNsYXNzIEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbXBsZW1lbnRpbmcgYSBjb25jcmV0ZSBhZGFwdGVyXG4gKiBjbGFzcyBQb3N0Z3Jlc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPHBnLkNsaWVudCwgcGcuUXVlcnksIFBvc3RncmVzRmxhZ3MsIFBvc3RncmVzQ29udGV4dD4ge1xuICogICBjb25zdHJ1Y3RvcihjbGllbnQ6IHBnLkNsaWVudCkge1xuICogICAgIHN1cGVyKGNsaWVudCwgJ3Bvc3RncmVzJyk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGluaXRpYWxpemUoKSB7XG4gKiAgICAgLy8gU2V0IHVwIHRoZSBhZGFwdGVyXG4gKiAgICAgYXdhaXQgdGhpcy5uYXRpdmUuY29ubmVjdCgpO1xuICogICB9XG4gKlxuICogICBhc3luYyBjcmVhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpIHtcbiAqICAgICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgY3JlYXRpbmcgcmVjb3Jkc1xuICogICAgIGNvbnN0IGNvbHVtbnMgPSBPYmplY3Qua2V5cyhtb2RlbCkuam9pbignLCAnKTtcbiAqICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKG1vZGVsKTtcbiAqICAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKChfLCBpKSA9PiBgJCR7aSsxfWApLmpvaW4oJywgJyk7XG4gKlxuICogICAgIGNvbnN0IHF1ZXJ5ID0gYElOU0VSVCBJTlRPICR7dGFibGVOYW1lfSAoJHtjb2x1bW5zfSkgVkFMVUVTICgke3BsYWNlaG9sZGVyc30pIFJFVFVSTklORyAqYDtcbiAqICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5xdWVyeShxdWVyeSwgdmFsdWVzKTtcbiAqICAgICByZXR1cm4gcmVzdWx0LnJvd3NbMF07XG4gKiAgIH1cbiAqXG4gKiAgIC8vIE90aGVyIHJlcXVpcmVkIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMuLi5cbiAqIH1cbiAqXG4gKiAvLyBVc2luZyB0aGUgYWRhcHRlclxuICogY29uc3QgcGdDbGllbnQgPSBuZXcgcGcuQ2xpZW50KGNvbm5lY3Rpb25TdHJpbmcpO1xuICogY29uc3QgYWRhcHRlciA9IG5ldyBQb3N0Z3Jlc0FkYXB0ZXIocGdDbGllbnQpO1xuICogYXdhaXQgYWRhcHRlci5pbml0aWFsaXplKCk7XG4gKlxuICogLy8gU2V0IGFzIHRoZSBkZWZhdWx0IGFkYXB0ZXJcbiAqIEFkYXB0ZXIuc2V0Q3VycmVudCgncG9zdGdyZXMnKTtcbiAqXG4gKiAvLyBQZXJmb3JtIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCBhZGFwdGVyLmNyZWF0ZSgndXNlcnMnLCAxLCB7IG5hbWU6ICdKb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9KTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBBZGFwdGVyIHtcbiAqICAgICArWSBuYXRpdmVcbiAqICAgICArc3RyaW5nIGZsYXZvdXJcbiAqICAgICArc3RyaW5nIGFsaWFzXG4gKiAgICAgK2NyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgICArcmVhZCh0YWJsZU5hbWUsIGlkKVxuICogICAgICt1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gKiAgICAgK2RlbGV0ZSh0YWJsZU5hbWUsIGlkKVxuICogICAgICtvYnNlcnZlKG9ic2VydmVyLCBmaWx0ZXIpXG4gKiAgICAgK3VuT2JzZXJ2ZShvYnNlcnZlcilcbiAqICAgICArc3RhdGljIGN1cnJlbnRcbiAqICAgICArc3RhdGljIGdldChmbGF2b3VyKVxuICogICAgICtzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyKVxuICogICB9XG4gKlxuICogICBjbGFzcyBSYXdFeGVjdXRvciB7XG4gKiAgICAgK3JhdyhxdWVyeSlcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgT2JzZXJ2YWJsZSB7XG4gKiAgICAgK29ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcilcbiAqICAgICArdW5PYnNlcnZlKG9ic2VydmVyKVxuICogICAgICt1cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZClcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgT2JzZXJ2ZXIge1xuICogICAgICtyZWZyZXNoKHRhYmxlLCBldmVudCwgaWQpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIEVycm9yUGFyc2VyIHtcbiAqICAgICArcGFyc2VFcnJvcihlcnIpXG4gKiAgIH1cbiAqXG4gKiAgIEFkYXB0ZXIgLS18PiBSYXdFeGVjdXRvclxuICogICBBZGFwdGVyIC0tfD4gT2JzZXJ2YWJsZVxuICogICBBZGFwdGVyIC0tfD4gT2JzZXJ2ZXJcbiAqICAgQWRhcHRlciAtLXw+IEVycm9yUGFyc2VyXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBZGFwdGVyPFxuICAgIFksXG4gICAgUSxcbiAgICBGIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+LFxuICA+XG4gIGltcGxlbWVudHMgUmF3RXhlY3V0b3I8UT4sIENvbnRleHR1YWw8RiwgQz4sIE9ic2VydmFibGUsIE9ic2VydmVyLCBFcnJvclBhcnNlclxue1xuICBwcml2YXRlIHN0YXRpYyBfY3VycmVudEZsYXZvdXI6IHN0cmluZztcbiAgcHJpdmF0ZSBzdGF0aWMgX2NhY2hlOiBSZWNvcmQ8c3RyaW5nLCBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+ID0ge307XG5cbiAgcHJpdmF0ZSBsb2dnZXIhOiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoPzogRGlzcGF0Y2g8WT47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9ic2VydmVySGFuZGxlcj86IE9ic2VydmVySGFuZGxlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBhY2Nlc3NvclxuICAgKiBAc3VtbWFyeSBHZXRzIG9yIGluaXRpYWxpemVzIHRoZSBsb2dnZXIgZm9yIHRoaXMgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBsb2dnZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgbG9nKCkge1xuICAgIGlmICghdGhpcy5sb2dnZXIpIHRoaXMubG9nZ2VyID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpO1xuICAgIHJldHVybiB0aGlzLmxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmF0aXZlIGRhdGFiYXNlIGRyaXZlclxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UgZHJpdmVyIGluc3RhbmNlXG4gICAqIEByZXR1cm4ge1l9IFRoZSBuYXRpdmUgZGF0YWJhc2UgZHJpdmVyXG4gICAqL1xuICBnZXQgbmF0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIncyBhbGlhcyBvciBmbGF2b3IgbmFtZVxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBhbGlhcyBpZiBzZXQsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBmbGF2b3IgbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhZGFwdGVyJ3MgaWRlbnRpZmllclxuICAgKi9cbiAgZ2V0IGFsaWFzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlhcyB8fCB0aGlzLmZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgcmVwb3NpdG9yaWVzIHRoYXQgd29yayB3aXRoIHRoaXMgYWRhcHRlclxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge0NvbnN0cnVjdG9yPFJlcG9zaXRvcnk8TSwgUSwgQWRhcHRlcjxZLCBRLCBGLCBDPiwgRiwgQz4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw8dHJ1ZSB8IGZhbHNlPj4oKTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxNLCBRLCBBZGFwdGVyPFksIFEsIEYsIEM+LCBGLCBDPlxuICA+IHtcbiAgICByZXR1cm4gUmVwb3NpdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBhZGFwdGVyIHdpdGggdGhlIG5hdGl2ZSBkcml2ZXIgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgYWRhcHRlciBjYWNoZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX25hdGl2ZTogWSxcbiAgICByZWFkb25seSBmbGF2b3VyOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgaWYgKHRoaXMuZmxhdm91ciBpbiBBZGFwdGVyLl9jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyICR7dGhpcy5fYWxpYXMgPyBgKCR7dGhpcy5mbGF2b3VyfSkgYCA6IFwiXCJ9IGFscmVhZHkgcmVnaXN0ZXJlZGBcbiAgICAgICk7XG4gICAgQWRhcHRlci5fY2FjaGVbdGhpcy5hbGlhc10gPSB0aGlzO1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgQ3JlYXRlZCAke3RoaXMuYWxpYXN9IHBlcnNpc3RlbmNlIGFkYXB0ZXIgJHt0aGlzLl9hbGlhcyA/IGAoJHt0aGlzLmZsYXZvdXJ9KSBgIDogXCJcIn0gcGVyc2lzdGVuY2UgYWRhcHRlcmBcbiAgICApO1xuICAgIGlmICghQWRhcHRlci5fY3VycmVudEZsYXZvdXIpIHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYERlZmluZWQgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyIGFzIGN1cnJlbnRgKTtcbiAgICAgIEFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyID0gdGhpcy5hbGlhcztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIHN0YXRlbWVudCBidWlsZGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IHF1ZXJpZXMgZm9yIGEgc3BlY2lmaWMgbW9kZWxcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtTdGF0ZW1lbnR9IEEgc3RhdGVtZW50IGJ1aWxkZXIgZm9yIHRoZSBtb2RlbFxuICAgKi9cbiAgYWJzdHJhY3QgU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbD4oKTogU3RhdGVtZW50PFEsIE0sIGFueT47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGRpc3BhdGNoIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7RGlzcGF0Y2g8WT59IEEgbmV3IGRpc3BhdGNoIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgRGlzcGF0Y2goKTogRGlzcGF0Y2g8WT4ge1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBvYnNlcnZlciBoYW5kbGVyXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhbiBvYnNlcnZlciBoYW5kbGVyIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7T2JzZXJ2ZXJIYW5kbGVyfSBBIG5ldyBvYnNlcnZlciBoYW5kbGVyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgT2JzZXJ2ZXJIYW5kbGVyKCk6IE9ic2VydmVySGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZlckhhbmRsZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb2x1bW4gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGlzUmVzZXJ2ZWQoYXR0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICFhdHRyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBkYXRhYmFzZSBlcnJvciBpbnRvIGEgc3RhbmRhcmRpemVkIGVycm9yXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGRhdGFiYXNlLXNwZWNpZmljIGVycm9ycyBpbnRvIHN0YW5kYXJkaXplZCBhcHBsaWNhdGlvbiBlcnJvcnNcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIG9yaWdpbmFsIGRhdGFiYXNlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gQSBzdGFuZGFyZGl6ZWQgZXJyb3JcbiAgICovXG4gIGFic3RyYWN0IHBhcnNlRXJyb3IoZXJyOiBFcnJvcik6IEJhc2VFcnJvcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGFueSBuZWNlc3Nhcnkgc2V0dXAgZm9yIHRoZSBhZGFwdGVyLCBzdWNoIGFzIGVzdGFibGlzaGluZyBjb25uZWN0aW9uc1xuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFic3RyYWN0IGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyByZXBvc2l0b3J5IGZsYWdzIGZvciBhbiBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc2V0IG9mIGZsYWdzIHRoYXQgZGVzY3JpYmUgYSBkYXRhYmFzZSBvcGVyYXRpb24sIGNvbWJpbmluZyBkZWZhdWx0IGZsYWdzIHdpdGggb3ZlcnJpZGVzXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgRmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IGZsYWdzIC0gQ3VzdG9tIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEY+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPEY+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEY+IHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJlcG9zaXRvcnlGbGFncywgZmxhZ3MsIHtcbiAgICAgIGFmZmVjdGVkVGFibGVzOiBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKSxcbiAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgIH0pIGFzIEY7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb250ZXh0IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0IGNsYXNzIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhpcyBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgQ29udGV4dCA9IENvbnRleHQ8Rj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgY29udGV4dCBmb3IgYSBkYXRhYmFzZSBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgY29udGV4dCBvYmplY3QgdGhhdCBkZXNjcmliZXMgYSBkYXRhYmFzZSBvcGVyYXRpb24sIHVzZWQgZm9yIHRyYWNraW5nIGFuZCBhdWRpdGluZ1xuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSBSZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXMuQ1JFQVRFfE9wZXJhdGlvbktleXMuUkVBRHxPcGVyYXRpb25LZXlzLlVQREFURXxPcGVyYXRpb25LZXlzLkRFTEVURX0gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7UGFydGlhbDxGPn0gb3ZlcnJpZGVzIC0gQ3VzdG9tIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEM+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGV4dCBvYmplY3RcbiAgICovXG4gIEBmaW5hbCgpXG4gIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8Rj4sXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Qz4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvbnRleHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBuZXcgY29udGV4dCBmb3IgJHtvcGVyYXRpb259IG9wZXJhdGlvbiBvbiAke21vZGVsLm5hbWV9IG1vZGVsIHdpdGggZmxhZyBvdmVycmlkZXM6ICR7SlNPTi5zdHJpbmdpZnkob3ZlcnJpZGVzKX1gXG4gICAgKTtcbiAgICBjb25zdCBmbGFncyA9IGF3YWl0IHRoaXMuZmxhZ3Mob3BlcmF0aW9uLCBtb2RlbCwgb3ZlcnJpZGVzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gbmV3IHRoaXMuQ29udGV4dCgpLmFjY3VtdWxhdGUoZmxhZ3MpIGFzIHVua25vd24gYXMgQztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBtb2RlbCBmb3IgcGVyc2lzdGVuY2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSBpbnRvIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkYXRhYmFzZSBzdG9yYWdlLFxuICAgKiBoYW5kbGluZyBjb2x1bW4gbWFwcGluZyBhbmQgc2VwYXJhdGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gcHJlcGFyZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcmV0dXJuIFRoZSBwcmVwYXJlZCBkYXRhXG4gICAqL1xuICBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE1cbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnByZXBhcmUpO1xuICAgIGNvbnN0IHNwbGl0ID0gbW9kZWxUb1RyYW5zaWVudChtb2RlbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoc3BsaXQubW9kZWwpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGFjY3VtO1xuICAgICAgICBjb25zdCBtYXBwZWRQcm9wID0gUmVwb3NpdG9yeS5jb2x1bW4obW9kZWwsIGtleSk7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzZXJ2ZWQobWFwcGVkUHJvcCkpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFByb3BlcnR5IG5hbWUgJHttYXBwZWRQcm9wfSBpcyByZXNlcnZlZGApO1xuICAgICAgICBhY2N1bVttYXBwZWRQcm9wXSA9IHZhbDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBpZiAoKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSkge1xuICAgICAgbG9nLnNpbGx5KFxuICAgICAgICBgUGFzc2luZyBhbG9uZyBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHsobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogKG1vZGVsIGFzIGFueSlbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByZWNvcmQ6IHJlc3VsdCxcbiAgICAgIGlkOiBtb2RlbFtwa10gYXMgc3RyaW5nLFxuICAgICAgdHJhbnNpZW50OiBzcGxpdC50cmFuc2llbnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgZGF0YWJhc2UgZGF0YSBiYWNrIGludG8gYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBSZWNvbnN0cnVjdHMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIGRhdGFiYXNlIGRhdGEsIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nXG4gICAqIGFuZCByZWF0dGFjaGluZyB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSBvYmogLSBUaGUgZGF0YWJhc2UgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yPE0+fSBjbGF6eiAtIFRoZSBtb2RlbCBjbGFzcyBvciBuYW1lXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IHZhbHVlXG4gICAqIEBwYXJhbSBbdHJhbnNpZW50XSAtIFRyYW5zaWVudCBwcm9wZXJ0aWVzIHRvIHJlYXR0YWNoXG4gICAqIEByZXR1cm4ge019IFRoZSByZWNvbnN0cnVjdGVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBNIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZXZlcnQpO1xuICAgIGNvbnN0IG9iOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgb2JbcGsgYXMgc3RyaW5nXSA9IGlkO1xuICAgIGNvbnN0IG0gPSAoXG4gICAgICB0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBNb2RlbC5idWlsZChvYiwgY2xhenopIDogbmV3IGNsYXp6KG9iKVxuICAgICkgYXMgTTtcbiAgICBsb2cuc2lsbHkoYFJlYnVpbGRpbmcgbW9kZWwgJHttLmNvbnN0cnVjdG9yLm5hbWV9IGlkICR7aWR9YCk7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBvYmpbUGVyc2lzdGVuY2VLZXlzLk1FVEFEQVRBXTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhtKS5yZWR1Y2UoKGFjY3VtOiBNLCBrZXkpID0+IHtcbiAgICAgIGlmIChrZXkgPT09IHBrKSByZXR1cm4gYWNjdW07XG4gICAgICAoYWNjdW0gYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XSA9IG9ialtSZXBvc2l0b3J5LmNvbHVtbihhY2N1bSwga2V5KV07XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgbSk7XG5cbiAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gcmVzdWx0KVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFRyYW5zaWVudCBwcm9wZXJ0eSAke2tleX0gYWxyZWFkeSBleGlzdHMgb24gbW9kZWwgJHttLmNvbnN0cnVjdG9yLm5hbWV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgICByZXN1bHRba2V5IGFzIGtleW9mIE1dID0gdmFsO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGFkYXRhKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nICR7dGhpcy5mbGF2b3VyfSBwZXJzaXN0ZW5jZSBtZXRhZGF0YSBmb3IgJHttLmNvbnN0cnVjdG9yLm5hbWV9IGlkICR7aWR9OiAke21ldGFkYXRhfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEsIHtcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG1ldGFkYXRhLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgYSBuZXcgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGFuZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGluc2VydCBpbnRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIG5ldyByZWNvcmRcbiAgICogQHBhcmFtIG1vZGVsIC0gVGhlIGRhdGEgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgcmVjb3JkcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBhbmQgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBpbnNlcnQgaW50b1xuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgZm9yIHRoZSBuZXcgcmVjb3Jkc1xuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgZGF0YSB0byBpbnNlcnQgZm9yIGVhY2ggcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGNyZWF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy5jcmVhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJlYWQgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG11bHRpcGxlIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byByZWFkIGZyb21cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJldHJpZXZlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmVhZEFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYFJlYWRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGlkLm1hcCgoaSkgPT4gdGhpcy5yZWFkKHRhYmxlTmFtZSwgaSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgTW9kaWZpZXMgYW4gZXhpc3RpbmcgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGluIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSAgbW9kZWwgLSBUaGUgbmV3IGRhdGEgZm9yIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyBtdWx0aXBsZSBleGlzdGluZyByZWNvcmRzIHdpdGggdGhlIGdpdmVuIElEcyBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nW118bnVtYmVyW119IGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgbmV3IGRhdGEgZm9yIGVhY2ggcmVjb3JkXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHVwZGF0ZWQgcmVjb3Jkc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoaWQubGVuZ3RoICE9PSBtb2RlbC5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIklkcyBhbmQgbW9kZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMudXBkYXRlQWxsKTtcbiAgICBsb2cudmVyYm9zZShgVXBkYXRpbmcgJHtpZC5sZW5ndGh9IGVudHJpZXMgJHt0YWJsZU5hbWV9IHRhYmxlYCk7XG4gICAgbG9nLmRlYnVnKGBwa3M6ICR7aWR9YCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgaWQubWFwKChpLCBjb3VudCkgPT4gdGhpcy51cGRhdGUodGFibGVOYW1lLCBpLCBtb2RlbFtjb3VudF0sIC4uLmFyZ3MpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIHJlY29yZCB3aXRoIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBkZWxldGUgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIG9mIHRoZSByZWNvcmQgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVjb3JkcyB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgZGVsZXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBEZWxldGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaWQubWFwKChpKSA9PiB0aGlzLmRlbGV0ZSh0YWJsZU5hbWUsIGksIC4uLmFyZ3MpKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFsbG93cyBleGVjdXRpbmcgZGF0YWJhc2Utc3BlY2lmaWMgcXVlcmllcyBkaXJlY3RseVxuICAgKiBAdGVtcGxhdGUgUSAtIFRoZSByYXcgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcXVlcnlcbiAgICogQHBhcmFtIHtRfSByYXdJbnB1dCAtIFRoZSBxdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyBzcGVjaWZpYyB0byB0aGUgYWRhcHRlciBpbXBsZW1lbnRhdGlvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqL1xuICBhYnN0cmFjdCByYXc8Uj4ocmF3SW5wdXQ6IFEsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgZGF0YWJhc2UgY2hhbmdlcy4gVGhlIG9ic2VydmVyIGNhbiBvcHRpb25hbGx5XG4gICAqIHByb3ZpZGUgYSBmaWx0ZXIgZnVuY3Rpb24gdG8gcmVjZWl2ZSBvbmx5IHNwZWNpZmljIGV2ZW50cy5cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJvYnNlcnZlckhhbmRsZXJcIiwge1xuICAgICAgICB2YWx1ZTogdGhpcy5PYnNlcnZlckhhbmRsZXIoKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5vYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYFJlZ2lzdGVyaW5nIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gICAgaWYgKCF0aGlzLmRpc3BhdGNoKSB7XG4gICAgICB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKS5pbmZvKGBDcmVhdGluZyBkaXNwYXRjaCBmb3IgJHt0aGlzLmFsaWFzfWApO1xuICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuRGlzcGF0Y2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2gub2JzZXJ2ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb2JzZXJ2ZXIgc28gaXQgbm8gbG9uZ2VyIHJlY2VpdmVzIGRhdGFiYXNlIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgU2VuZHMgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlLFxuICAgKiBmaWx0ZXJpbmcgYmFzZWQgb24gZWFjaCBvYnNlcnZlcidzIGZpbHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yIGFkYXB0ZXIgJHt0aGlzLmFsaWFzfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRoaXMubG9nLFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIGlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyBkYXRhIGJhc2VkIG9uIGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgSW1wbGVtZW50YXRpb24gb2YgdGhlIE9ic2VydmVyIGludGVyZmFjZSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gdXBkYXRlT2JzZXJ2ZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgcmVsYXRlZCB0byB0aGUgZXZlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpZGVudGlmeWluZyB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgQWRhcHRlcmA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgZmxhdm9yIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgYWRhcHRlciBmbGF2b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFkYXB0ZXIgZmxhdm9yIG5hbWVcbiAgICovXG4gIHN0YXRpYyBmbGF2b3VyT2Y8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8TT4pOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKHRoaXMua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICB0aGlzLmN1cnJlbnQ/LmZsYXZvdXJcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldCBjdXJyZW50Rmxhdm91cigpIHtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBwZXJzaXN0ZW5jZSBmbGF2b3VyIHNldC4gUGxlYXNlIGluaXRpYWxpemUgeW91ciBhZGFwdGVyYFxuICAgICAgKTtcbiAgICByZXR1cm4gQWRhcHRlci5fY3VycmVudEZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgYWRhcHRlciB0aGF0IGlzIGN1cnJlbnRseSBzZXQgYXMgdGhlIGRlZmF1bHQgZm9yIG9wZXJhdGlvbnNcbiAgICogQHJldHVybiB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBUaGUgY3VycmVudCBhZGFwdGVyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGN1cnJlbnQoKTogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5jdXJyZW50Rmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYW4gYWRhcHRlciBieSBmbGF2b3JcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGJ5IGl0cyBmbGF2b3IgbmFtZVxuICAgKiBAdGVtcGxhdGUgWSAtIFRoZSBkYXRhYmFzZSBkcml2ZXIgdHlwZVxuICAgKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBDIC0gVGhlIGNvbnRleHQgdHlwZVxuICAgKiBAdGVtcGxhdGUgRiAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG5hbWUgb2YgdGhlIGFkYXB0ZXIgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7QWRhcHRlcjxZLCBRLCBGLCBDPiB8IHVuZGVmaW5lZH0gVGhlIGFkYXB0ZXIgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldDxZLCBRLCBDIGV4dGVuZHMgQ29udGV4dDxGPiwgRiBleHRlbmRzIFJlcG9zaXRvcnlGbGFncz4oXG4gICAgZmxhdm91cj86IGFueVxuICApOiBBZGFwdGVyPFksIFEsIEYsIEM+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZsYXZvdXIpIHJldHVybiBBZGFwdGVyLmdldCh0aGlzLl9jdXJyZW50Rmxhdm91cik7XG4gICAgaWYgKGZsYXZvdXIgaW4gdGhpcy5fY2FjaGUpIHJldHVybiB0aGlzLl9jYWNoZVtmbGF2b3VyXTtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gQWRhcHRlciByZWdpc3RlcmVkIHVuZGVyICR7Zmxhdm91cn0uYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IENoYW5nZXMgd2hpY2ggYWRhcHRlciBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBuYW1lIG9mIHRoZSBhZGFwdGVyIHRvIHNldCBhcyBjdXJyZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0Q3VycmVudChmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXJyZW50Rmxhdm91ciA9IGZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBtZXRhZGF0YSBrZXlcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc3RhbmRhcmRpemVkIG1ldGFkYXRhIGtleSBmb3IgcGVyc2lzdGVuY2UtcmVsYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IG5hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIG1ldGFkYXRhIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBSZXBvc2l0b3J5LmtleShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIGFsbCBtb2RlbHMgYXNzb2NpYXRlZCB3aXRoIGFuIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbGwgbW9kZWwgY29uc3RydWN0b3JzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgdG8gdXNlIGEgc3BlY2lmaWMgYWRhcHRlciBmbGF2b3JcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBhZGFwdGVyIGZsYXZvciB0byBmaW5kIG1vZGVscyBmb3JcbiAgICogQHJldHVybiBBbiBhcnJheSBvZiBtb2RlbCBjb25zdHJ1Y3RvcnNcbiAgICovXG4gIHN0YXRpYyBtb2RlbHM8TSBleHRlbmRzIE1vZGVsPihmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVnaXN0cnkgPSAoTW9kZWwgYXMgYW55KS5nZXRSZWdpc3RyeSgpIGFzIE1vZGVsUmVnaXN0cnk8YW55PjtcbiAgICAgIGNvbnN0IGNhY2hlID0gKFxuICAgICAgICByZWdpc3RyeSBhcyB1bmtub3duIGFzIHsgY2FjaGU6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29uc3RydWN0b3I8YW55Pj4gfVxuICAgICAgKS5jYWNoZTtcbiAgICAgIGNvbnN0IG1hbmFnZWRNb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8YW55PltdID0gT2JqZWN0LnZhbHVlcyhjYWNoZSlcbiAgICAgICAgLm1hcCgobTogTW9kZWxDb25zdHJ1Y3RvcjxNPikgPT4ge1xuICAgICAgICAgIGxldCBmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZiAmJiBmID09PSBmbGF2b3VyKSByZXR1cm4gbTtcbiAgICAgICAgICBpZiAoIWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG8gPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBSZXBvc2l0b3J5LmtleShEQktleXMuUkVQT1NJVE9SWSksXG4gICAgICAgICAgICAgIG0gYXMgTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCFyZXBvKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblxuICAgICAgICAgICAgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICAgIEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSxcbiAgICAgICAgICAgICAgcmVwb3NpdG9yeVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBmO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigobSkgPT4gISFtKTtcbiAgICAgIHJldHVybiBtYW5hZ2VkTW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGRlY29yYXRpb24oKTogdm9pZCB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNoaWxkIEFkYXB0ZXIgd2l0aCBzcGVjaWZpYyBjb25naWd1cmF0aW9uc1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbmV3IEFkYXB0ZXIgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpYyBjb25naWd1cmF0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IEZ1bmN0aW9ufSBjb25maWcgLSBUaGUgbWV0aG9kIG5hbWUgb3IgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbG9nZ2VyIGZvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8TG9nZ2luZ0NvbmZpZz59IGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gdG8gb3ZlcnJpZGUgc2V0dGluZ3NcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBsb2dnZXIgZmFjdG9yeVxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IEEgbmV3IGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2RcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yKC4uLmFyZ3M6IGFueVtdKTogQWRhcHRlcjxZLCBRLCBGLCBDPiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXCJNZXRob2Qgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0XCIpO1xuICB9XG59XG4iXX0=
659
+ __decorate([
660
+ final(),
661
+ __metadata("design:type", Object),
662
+ __metadata("design:paramtypes", [])
663
+ ], Adapter.prototype, "client", null);
664
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wZXJzaXN0ZW5jZS9BZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxNQUFNLEVBQ04sYUFBYSxFQUNiLE9BQU8sRUFDUCxhQUFhLEVBRWIsc0JBQXNCLEVBR3RCLGdCQUFnQixHQUNqQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFFTCxVQUFVLEVBQ1YsY0FBYyxFQUNkLE9BQU8sRUFDUCxLQUFLLEdBR04sTUFBTSxnQ0FBZ0MsQ0FBQztBQUl4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLHVCQUFvQjtBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLHNDQUFpQztBQUl0RCxPQUFPLEVBQUUsS0FBSyxFQUFFLDRCQUFpQjtBQUNqQyxPQUFPLEVBQUUsUUFBUSxFQUFFLHNCQUFtQjtBQUV0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLDZCQUEwQjtBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFaEQsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDNUMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxDQUNMLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUUsR0FBVyxDQUFDO1lBQ3RFLE9BQU8sQ0FBQyxjQUFjO1lBQ3RCLGNBQWMsQ0FDZixDQUFDO1FBQ0YsNkRBQTZEO0lBQy9ELENBQUM7SUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO1FBQ3BCLHlCQUF5QjtJQUMzQixDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQztRQUNoRCw2REFBNkQ7SUFDL0QsQ0FBQztJQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRkc7QUFDSCxNQUFNLE9BQWdCLE9BT3BCLFNBQVEsV0FBVzthQVNKLFdBQU0sR0FBcUQsRUFBRSxBQUF2RCxDQUF3RDtJQVE3RTs7Ozs7T0FLRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVU7UUFTUixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBR2UsQUFBTixLQUFLLENBQUMsZUFBZSxDQUFDLENBQVU7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDM0IsTUFBTSxJQUFJLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDUCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckMsQ0FBQztnQkFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2xFLFNBQVM7Z0JBQ1gsQ0FBQztnQkFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7WUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQ21CLE9BQWEsRUFDckIsT0FBZSxFQUNQLE1BQWU7UUFFaEMsS0FBSyxFQUFFLENBQUM7UUFKUyxZQUFPLEdBQVAsT0FBTyxDQUFNO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDUCxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBd0dsQzs7O1dBR0c7UUFDTyxZQUFPLEdBQUcsQ0FBQSxPQUFjLENBQUEsQ0FBQztRQXpHakMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxNQUFNO1lBQzlCLE1BQU0sSUFBSSxhQUFhLENBQ3JCLEdBQUcsSUFBSSxDQUFDLEtBQUssd0JBQXdCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUNsRyxDQUFDO1FBQ0osT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNYLFdBQVcsSUFBSSxDQUFDLEtBQUssd0JBQXdCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUMzRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLGlDQUFpQyxDQUFDLENBQUM7WUFDekUsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBVUQ7Ozs7T0FJRztJQUNPLFFBQVE7UUFDaEIsT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sZUFBZTtRQUN2QixPQUFPLElBQUksZUFBZSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sVUFBVSxDQUFDLElBQVk7UUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQztJQUNmLENBQUM7SUFVRDs7Ozs7T0FLRztJQUNILDZEQUE2RDtJQUM3RCxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBVyxJQUFrQixDQUFDO0lBVWxEOzs7Ozs7Ozs7O09BVUc7SUFDTyxLQUFLLENBQUMsS0FBSyxDQUNuQixTQUF3QixFQUN4QixLQUFxQixFQUNyQixLQUFxQjtJQUNyQiw2REFBNkQ7SUFDN0QsR0FBRyxJQUFXO1FBRWQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxzQkFBc0IsRUFBRSxLQUFLLEVBQUU7WUFDdEQsY0FBYyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLGNBQWMsRUFBRSxTQUFTLEtBQUssYUFBYSxDQUFDLElBQUk7WUFDaEQsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQVUsQ0FBQztJQUNkLENBQUM7SUFRRDs7Ozs7Ozs7OztPQVVHO0lBRUcsQUFBTixLQUFLLENBQUMsT0FBTyxDQUNYLFNBSXdCLEVBQ3hCLFNBQXlCLEVBQ3pCLEtBQXFCLEVBQ3JCLEdBQUcsSUFBVztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsS0FBSyxDQUNQLDRCQUE0QixTQUFTLGlCQUFpQixLQUFLLENBQUMsSUFBSSwrQkFBK0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUMzSCxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDckUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUF1QixDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE9BQU8sQ0FDTCxLQUFRLEVBQ1IsRUFBVztRQU1YLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQy9DLENBQUMsS0FBMEIsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO1lBQ3pDLElBQUksT0FBTyxHQUFHLEtBQUssV0FBVztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUM3QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDO2dCQUM3QixNQUFNLElBQUksYUFBYSxDQUFDLGlCQUFpQixVQUFVLGNBQWMsQ0FBQyxDQUFDO1lBQ3JFLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDeEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQ0QsRUFBRSxDQUNILENBQUM7UUFDRixJQUFLLEtBQWEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxHQUFHLENBQUMsS0FBSyxDQUNQLDBDQUEyQyxLQUFhLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQ3JGLENBQUM7WUFDRixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUN0RCxVQUFVLEVBQUUsS0FBSztnQkFDakIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLEtBQUssRUFBRyxLQUFhLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQzthQUNoRCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNO1lBQ2QsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQVc7WUFDdkIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQzNCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxNQUFNLENBQ0osR0FBd0IsRUFDeEIsS0FBOEIsRUFDOUIsRUFBVyxFQUNYLEVBQTRCLEVBQzVCLFNBQStCO1FBRS9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBd0IsRUFBRSxDQUFDO1FBQ25DLEVBQUUsQ0FBQyxFQUFZLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsQ0FDUixPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FDOUQsQ0FBQztRQUNQLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNyRCxJQUFJLEdBQUcsS0FBSyxFQUFFO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzVCLEtBQTZCLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLE9BQU8sQ0FDVCxtQ0FBbUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdkUsQ0FBQztZQUNGLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxHQUFHLElBQUksTUFBTTtvQkFDZixNQUFNLElBQUksYUFBYSxDQUNyQixzQkFBc0IsR0FBRyw0QkFBNEIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLHdCQUF3QixDQUNoRyxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxHQUFjLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLEdBQUcsQ0FBQyxLQUFLLENBQ1AsaUJBQWlCLElBQUksQ0FBQyxPQUFPLDZCQUE2QixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLENBQ3JHLENBQUM7WUFDRixNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsUUFBUSxFQUFFO2dCQUN0RCxVQUFVLEVBQUUsS0FBSztnQkFDakIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxLQUFLO2dCQUNmLEtBQUssRUFBRSxRQUFRO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBa0JEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FDYixTQUFpQixFQUNqQixFQUF1QixFQUN2QixLQUE0QixFQUM1QixHQUFHLElBQVc7UUFFZCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07WUFDNUIsTUFBTSxJQUFJLGFBQWEsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sWUFBWSxTQUFTLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FDaEIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUN2RSxDQUFDO0lBQ0osQ0FBQztJQWdCRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxTQUFpQixFQUNqQixFQUFnQyxFQUNoQyxHQUFHLElBQVc7UUFFZCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLFlBQVksU0FBUyxRQUFRLENBQUMsQ0FBQztRQUMvRCxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFrQkQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLFNBQWlCLEVBQ2pCLEVBQXVCLEVBQ3ZCLEtBQTRCLEVBQzVCLEdBQUcsSUFBVztRQUVkLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTTtZQUM1QixNQUFNLElBQUksYUFBYSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxZQUFZLFNBQVMsUUFBUSxDQUFDLENBQUM7UUFDaEUsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUNoQixFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQ3ZFLENBQUM7SUFDSixDQUFDO0lBZ0JEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUNiLFNBQWlCLEVBQ2pCLEVBQWdDLEVBQ2hDLEdBQUcsSUFBVztRQUVkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sWUFBWSxTQUFTLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQWFEOzs7Ozs7O09BT0c7SUFFSCxPQUFPLENBQUMsUUFBa0IsRUFBRSxNQUF1QjtRQUNqRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDdkIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQzdDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUM3QixRQUFRLEVBQUUsS0FBSzthQUNoQixDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxHQUFHO2FBQ0wsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDakIsT0FBTyxDQUFDLDRCQUE0QixRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUVILFNBQVMsQ0FBQyxRQUFrQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDdkIsTUFBTSxJQUFJLGFBQWEsQ0FDckIsb0VBQW9FLENBQ3JFLENBQUM7UUFDSixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsR0FBRzthQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2FBQ25CLE9BQU8sQ0FBQyxZQUFZLFFBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQ25CLEtBQWEsRUFDYixLQUFxRCxFQUNyRCxFQUFZLEVBQ1osR0FBRyxJQUFXO1FBRWQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3ZCLE1BQU0sSUFBSSxhQUFhLENBQ3JCLG9FQUFvRSxDQUNyRSxDQUFDO1FBQ0osTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9DLEdBQUcsQ0FBQyxPQUFPLENBQ1QsWUFBWSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSwwQkFBMEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUMvRSxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FDeEMsSUFBSSxDQUFDLEdBQUcsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUNMLEVBQUUsRUFDRixHQUFHLElBQUksQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FDWCxLQUFhLEVBQ2IsS0FBcUQsRUFDckQsRUFBWSxFQUNaLEdBQUcsSUFBVztRQUVkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ00sUUFBUTtRQUNmLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxzQkFBc0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFNBQVMsQ0FBa0IsS0FBcUI7UUFDckQsT0FBTyxDQUNMLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDO1lBQzdELElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sS0FBSyxjQUFjO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZTtZQUMxQixNQUFNLElBQUksYUFBYSxDQUNyQiw0REFBNEQsQ0FDN0QsQ0FBQztRQUNKLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sS0FBSyxPQUFPO1FBQ2hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQU1SLE9BQWE7UUFDYixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsTUFBTSxJQUFJLGFBQWEsQ0FBQywrQkFBK0IsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQWU7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBa0IsT0FBZTtRQUM1QyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBSSxLQUFhLENBQUMsV0FBVyxFQUF3QixDQUFDO1lBQ3BFLE1BQU0sS0FBSyxHQUNULFFBQ0QsQ0FBQyxLQUFLLENBQUM7WUFDUixNQUFNLGFBQWEsR0FBNEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7aUJBQ2hFLEdBQUcsQ0FBQyxDQUFDLENBQXNCLEVBQUUsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BDLENBQTBCLENBQzNCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU87b0JBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDUCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUM5QixVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFDakMsQ0FBMEIsQ0FDM0IsQ0FBQztvQkFDRixJQUFJLENBQUMsSUFBSTt3QkFBRSxPQUFPO29CQUNsQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUUxQyxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQ3BDLFVBQVUsQ0FDWCxDQUFDO29CQUNGLE9BQU8sQ0FBQyxDQUFDO2dCQUNYLENBQUM7WUFDSCxDQUFDLENBQUM7aUJBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxVQUFVLEtBQVUsQ0FBQztJQWlCNUIsSUFDSSxNQUFNO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCw2REFBNkQ7SUFDN0QsR0FBRyxDQUFDLE1BQXFCLEVBQUUsR0FBRyxJQUFXO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssTUFBTSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQWdCLENBQUM7UUFFakUsSUFBSSxNQUFXLENBQUM7UUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQzVCLEdBQUcsRUFBRSxDQUFDLE1BQW1CLEVBQUUsQ0FBa0IsRUFBRSxRQUFhLEVBQUUsRUFBRTtnQkFDOUQsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BCLE1BQU0sWUFBWSxHQUFTLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDNUQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3BCLE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDO2dCQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxHQUFHLEVBQUUsQ0FBQyxNQUFXLEVBQUUsQ0FBa0IsRUFBRSxLQUFVLEVBQUUsUUFBYSxFQUFFLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNwQixNQUFNLEdBQUcsS0FBSyxDQUFDO29CQUNmLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2pELENBQUM7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7O0FBcHRCZTtJQURmLEtBQUssRUFBRTs7Ozs4Q0F1QlA7QUE4SUs7SUFETCxLQUFLLEVBQUU7Ozs7c0NBaUJQO0FBd1JEO0lBREMsS0FBSyxFQUFFOzs7O3NDQWdCUDtBQVNEO0lBREMsS0FBSyxFQUFFOzs7O3dDQVVQO0FBbU1EO0lBQUMsS0FBSyxFQUFFOzs7cUNBTVAiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIERCS2V5cyxcbiAgSW50ZXJuYWxFcnJvcixcbiAgQ29udGV4dCxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgUmVwb3NpdG9yeUZsYWdzLFxuICBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLFxuICBDb250ZXh0dWFsLFxuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIG1vZGVsVG9UcmFuc2llbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgdHlwZSBPYnNlcnZlciB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmVyXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBEZWZhdWx0Rmxhdm91cixcbiAgaGFzaE9iaixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIE1vZGVsUmVnaXN0cnksXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL1NlcXVlbmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgUmF3RXhlY3V0b3IgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9SYXdFeGVjdXRvclwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL09ic2VydmFibGVcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIi4vU2VxdWVuY2VcIjtcbmltcG9ydCB7IEVycm9yUGFyc2VyIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCIuLi9xdWVyeS9TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IGZpbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBEaXNwYXRjaCB9IGZyb20gXCIuL0Rpc3BhdGNoXCI7XG5pbXBvcnQgeyB0eXBlIEV2ZW50SWRzLCB0eXBlIE9ic2VydmVyRmlsdGVyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE9ic2VydmVySGFuZGxlciB9IGZyb20gXCIuL09ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuRGVjb3JhdGlvbi5zZXRGbGF2b3VyUmVzb2x2ZXIoKG9iajogb2JqZWN0KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIEFkYXB0ZXIuZmxhdm91ck9mKE1vZGVsLmlzTW9kZWwob2JqKSA/IG9iai5jb25zdHJ1Y3RvciA6IChvYmogYXMgYW55KSkgfHxcbiAgICAgIEFkYXB0ZXIuY3VycmVudEZsYXZvdXIgfHxcbiAgICAgIERlZmF1bHRGbGF2b3VyXG4gICAgKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAvLyByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gQWRhcHRlci5jdXJyZW50Rmxhdm91ciB8fCBEZWZhdWx0Rmxhdm91cjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICByZXR1cm4gRGVmYXVsdEZsYXZvdXI7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBGYWNhZGUgY2xhc3MgZm9yIHBlcnNpc3RlbmNlIGFkYXB0ZXJzXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgZm91bmRhdGlvbiBmb3IgYWxsIGRhdGFiYXNlIGFkYXB0ZXJzIGluIHRoZSBwZXJzaXN0ZW5jZSBsYXllci4gVGhpcyBjbGFzc1xuICogaW1wbGVtZW50cyBzZXZlcmFsIGludGVyZmFjZXMgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgQVBJIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLCBvYnNlcnZlclxuICogcGF0dGVybiBzdXBwb3J0LCBhbmQgZXJyb3IgaGFuZGxpbmcuIEl0IG1hbmFnZXMgYWRhcHRlciByZWdpc3RyYXRpb24sIENSVUQgb3BlcmF0aW9ucywgYW5kXG4gKiBvYnNlcnZlciBub3RpZmljYXRpb25zLlxuICogQHRlbXBsYXRlIENPTkZJRyAtIFRoZSB1bmRlcmx5aW5nIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAqIEB0ZW1wbGF0ZSBRVUVSWSAtIFRoZSBxdWVyeSBvYmplY3QgdHlwZSB1c2VkIGJ5IHRoZSBhZGFwdGVyXG4gKiBAdGVtcGxhdGUgRkxBR1MgLSBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gKiBAdGVtcGxhdGUgQ09OVEVYVCAtIFRoZSBjb250ZXh0IHR5cGVcbiAqIEBwYXJhbSB7Q09ORklHfSBfY29uZmlnIC0gVGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyBhZGFwdGVyIHR5cGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbX2FsaWFzXSAtIE9wdGlvbmFsIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoaXMgYWRhcHRlclxuICogQGNsYXNzIEFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbXBsZW1lbnRpbmcgYSBjb25jcmV0ZSBhZGFwdGVyXG4gKiBjbGFzcyBQb3N0Z3Jlc0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPHBnLlBvb2xDb25maWcsIHBnLlF1ZXJ5LCBQb3N0Z3Jlc0ZsYWdzLCBQb3N0Z3Jlc0NvbnRleHQ+IHtcbiAqICAgY29uc3RydWN0b3IoY2xpZW50OiBwZy5Qb29sQ29uZmlnKSB7XG4gKiAgICAgc3VwZXIoY2xpZW50LCAncG9zdGdyZXMnKTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAqICAgICAvLyBTZXQgdXAgdGhlIGFkYXB0ZXJcbiAqICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5jb25uZWN0KCk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbCkge1xuICogICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciBjcmVhdGluZyByZWNvcmRzXG4gKiAgICAgY29uc3QgY29sdW1ucyA9IE9iamVjdC5rZXlzKG1vZGVsKS5qb2luKCcsICcpO1xuICogICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXMobW9kZWwpO1xuICogICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IHZhbHVlcy5tYXAoKF8sIGkpID0+IGAkJHtpKzF9YCkuam9pbignLCAnKTtcbiAqXG4gKiAgICAgY29uc3QgcXVlcnkgPSBgSU5TRVJUIElOVE8gJHt0YWJsZU5hbWV9ICgke2NvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSkgUkVUVVJOSU5HICpgO1xuICogICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubmF0aXZlLnF1ZXJ5KHF1ZXJ5LCB2YWx1ZXMpO1xuICogICAgIHJldHVybiByZXN1bHQucm93c1swXTtcbiAqICAgfVxuICpcbiAqICAgLy8gT3RoZXIgcmVxdWlyZWQgbWV0aG9kIGltcGxlbWVudGF0aW9ucy4uLlxuICogfVxuICpcbiAqIC8vIFVzaW5nIHRoZSBhZGFwdGVyXG4gKiBjb25zdCBwZ0NsaWVudCA9IG5ldyBwZy5DbGllbnQoY29ubmVjdGlvblN0cmluZyk7XG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFBvc3RncmVzQWRhcHRlcihwZ0NsaWVudCk7XG4gKiBhd2FpdCBhZGFwdGVyLmluaXRpYWxpemUoKTtcbiAqXG4gKiAvLyBTZXQgYXMgdGhlIGRlZmF1bHQgYWRhcHRlclxuICogQWRhcHRlci5zZXRDdXJyZW50KCdwb3N0Z3JlcycpO1xuICpcbiAqIC8vIFBlcmZvcm0gb3BlcmF0aW9uc1xuICogY29uc3QgdXNlciA9IGF3YWl0IGFkYXB0ZXIuY3JlYXRlKCd1c2VycycsIDEsIHsgbmFtZTogJ0pvaG4nLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIEFkYXB0ZXIge1xuICogICAgICtZIG5hdGl2ZVxuICogICAgICtzdHJpbmcgZmxhdm91clxuICogICAgICtzdHJpbmcgYWxpYXNcbiAqICAgICArY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICogICAgICtyZWFkKHRhYmxlTmFtZSwgaWQpXG4gKiAgICAgK3VwZGF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgICArZGVsZXRlKHRhYmxlTmFtZSwgaWQpXG4gKiAgICAgK29ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcilcbiAqICAgICArdW5PYnNlcnZlKG9ic2VydmVyKVxuICogICAgICtzdGF0aWMgY3VycmVudFxuICogICAgICtzdGF0aWMgZ2V0KGZsYXZvdXIpXG4gKiAgICAgK3N0YXRpYyBzZXRDdXJyZW50KGZsYXZvdXIpXG4gKiAgIH1cbiAqXG4gKiAgIGNsYXNzIFJhd0V4ZWN1dG9yIHtcbiAqICAgICArcmF3KHF1ZXJ5KVxuICogICB9XG4gKlxuICogICBjbGFzcyBPYnNlcnZhYmxlIHtcbiAqICAgICArb2JzZXJ2ZShvYnNlcnZlciwgZmlsdGVyKVxuICogICAgICt1bk9ic2VydmUob2JzZXJ2ZXIpXG4gKiAgICAgK3VwZGF0ZU9ic2VydmVycyh0YWJsZSwgZXZlbnQsIGlkKVxuICogICB9XG4gKlxuICogICBjbGFzcyBPYnNlcnZlciB7XG4gKiAgICAgK3JlZnJlc2godGFibGUsIGV2ZW50LCBpZClcbiAqICAgfVxuICpcbiAqICAgY2xhc3MgRXJyb3JQYXJzZXIge1xuICogICAgICtwYXJzZUVycm9yKGVycilcbiAqICAgfVxuICpcbiAqICAgQWRhcHRlciAtLXw+IFJhd0V4ZWN1dG9yXG4gKiAgIEFkYXB0ZXIgLS18PiBPYnNlcnZhYmxlXG4gKiAgIEFkYXB0ZXIgLS18PiBPYnNlcnZlclxuICogICBBZGFwdGVyIC0tfD4gRXJyb3JQYXJzZXJcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFkYXB0ZXI8XG4gICAgQ09ORixcbiAgICBDT05OLFxuICAgIFFVRVJZLFxuICAgIEZMQUdTIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzID0gUmVwb3NpdG9yeUZsYWdzLFxuICAgIENPTlRFWFQgZXh0ZW5kcyBDb250ZXh0PEZMQUdTPiA9IENvbnRleHQ8RkxBR1M+LFxuICA+XG4gIGV4dGVuZHMgTG9nZ2VkQ2xhc3NcbiAgaW1wbGVtZW50c1xuICAgIFJhd0V4ZWN1dG9yPFFVRVJZPixcbiAgICBDb250ZXh0dWFsPEZMQUdTLCBDT05URVhUPixcbiAgICBPYnNlcnZhYmxlLFxuICAgIE9ic2VydmVyLFxuICAgIEVycm9yUGFyc2VyXG57XG4gIHByaXZhdGUgc3RhdGljIF9jdXJyZW50Rmxhdm91cjogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBfY2FjaGU6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55LCBhbnk+PiA9IHt9O1xuXG4gIHByb3RlY3RlZCBkaXNwYXRjaD86IERpc3BhdGNoPENPTkY+O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBvYnNlcnZlckhhbmRsZXI/OiBPYnNlcnZlckhhbmRsZXI7XG5cbiAgcHJvdGVjdGVkIF9jbGllbnQ/OiBDT05OO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgbmF0aXZlIHBlcnNpc3RlbmNlIGNvbmZpZ1xuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgcGVyc2lzdGVuY2UgZHJpdmVyIGNvbmZpZ1xuICAgKiBAdGVtcGxhdGUgQ09ORlxuICAgKiBAcmV0dXJuIHtDT05GfSBUaGUgbmF0aXZlIHBlcnNpc3RlbmNlIGRyaXZlciBjb25maWdcbiAgICovXG4gIGdldCBjb25maWcoKTogQ09ORiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgYWRhcHRlcidzIGFsaWFzIG9yIGZsYXZvciBuYW1lXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGFsaWFzIGlmIHNldCwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIGZsYXZvciBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFkYXB0ZXIncyBpZGVudGlmaWVyXG4gICAqL1xuICBnZXQgYWxpYXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXMgfHwgdGhpcy5mbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIHJlcG9zaXRvcmllcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGFkYXB0ZXJcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSZXBvc2l0b3J5PE0sIFFVRVJZLCBBZGFwdGVyPENPTkYsIENPTk4sIFFVRVJZLCBGTEFHUywgQ09OVEVYVD4sIEZMQUdTLCBDT05URVhUPj59IFRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yXG4gICAqL1xuICByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oKTogQ29uc3RydWN0b3I8XG4gICAgUmVwb3NpdG9yeTxcbiAgICAgIE0sXG4gICAgICBRVUVSWSxcbiAgICAgIEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIEZMQUdTLCBDT05URVhUPixcbiAgICAgIEZMQUdTLFxuICAgICAgQ09OVEVYVFxuICAgID5cbiAgPiB7XG4gICAgcmV0dXJuIFJlcG9zaXRvcnk7XG4gIH1cblxuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgYXN5bmMgc2h1dGRvd25Qcm94aWVzKGs/OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucHJveGllcykgcmV0dXJuO1xuICAgIGlmIChrICYmICEoayBpbiB0aGlzLnByb3hpZXMpKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIHByb3h5IGZvdW5kIGZvciAke2t9YCk7XG4gICAgaWYgKCFrKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnByb3hpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnByb3hpZXNba2V5XS5zaHV0ZG93bigpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBwcm94aWVkIGFkYXB0ZXIgJHtrZXl9OiAke2V9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlIHRoaXMucHJveGllc1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnByb3hpZXNba10uc2h1dGRvd24oKTtcbiAgICAgICAgZGVsZXRlIHRoaXMucHJveGllc1trXTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBwcm94aWVkIGFkYXB0ZXIgJHtrfTogJHtlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2h1dHMgZG93biB0aGUgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAgdGFza3MsIHN1Y2ggYXMgY2xvc2luZyBjb25uZWN0aW9uc1xuICAgKiBXaGVuIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QsIGVuc3VyZSB0byBjYWxsIHRoZSBiYXNlIG1ldGhvZCBmaXJzdFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNodXRkb3duIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNodXRkb3duUHJveGllcygpO1xuICAgIGlmICh0aGlzLmRpc3BhdGNoKSBhd2FpdCB0aGlzLmRpc3BhdGNoLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgYWRhcHRlciB3aXRoIHRoZSBuYXRpdmUgZHJpdmVyIGFuZCByZWdpc3RlcnMgaXQgaW4gdGhlIGFkYXB0ZXIgY2FjaGVcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IENPTkYsXG4gICAgcmVhZG9ubHkgZmxhdm91cjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2FsaWFzPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKHRoaXMuYWxpYXMgaW4gQWRhcHRlci5fY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYCR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciAke3RoaXMuX2FsaWFzID8gYCgke3RoaXMuZmxhdm91cn0pIGAgOiBcIlwifSBhbHJlYWR5IHJlZ2lzdGVyZWRgXG4gICAgICApO1xuICAgIEFkYXB0ZXIuX2NhY2hlW3RoaXMuYWxpYXNdID0gdGhpcztcbiAgICB0aGlzLmxvZy5pbmZvKFxuICAgICAgYENyZWF0ZWQgJHt0aGlzLmFsaWFzfSBwZXJzaXN0ZW5jZSBhZGFwdGVyICR7dGhpcy5fYWxpYXMgPyBgKCR7dGhpcy5mbGF2b3VyfSkgYCA6IFwiXCJ9IHBlcnNpc3RlbmNlIGFkYXB0ZXJgXG4gICAgKTtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKSB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKGBEZWZpbmVkICR7dGhpcy5hbGlhc30gcGVyc2lzdGVuY2UgYWRhcHRlciBhcyBjdXJyZW50YCk7XG4gICAgICBBZGFwdGVyLl9jdXJyZW50Rmxhdm91ciA9IHRoaXMuYWxpYXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBzdGF0ZW1lbnQgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBxdWVyaWVzIGZvciBhIHNwZWNpZmljIG1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7U3RhdGVtZW50fSBBIHN0YXRlbWVudCBidWlsZGVyIGZvciB0aGUgbW9kZWxcbiAgICovXG4gIGFic3RyYWN0IFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFN0YXRlbWVudDxRVUVSWSwgTSwgYW55PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgZGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgZGlzcGF0Y2ggaW5zdGFuY2UgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtEaXNwYXRjaDxZPn0gQSBuZXcgZGlzcGF0Y2ggaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBEaXNwYXRjaCgpOiBEaXNwYXRjaDxDT05GPiB7XG4gICAgcmV0dXJuIG5ldyBEaXNwYXRjaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IG9ic2VydmVyIGhhbmRsZXJcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGFuIG9ic2VydmVyIGhhbmRsZXIgZm9yIHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtPYnNlcnZlckhhbmRsZXJ9IEEgbmV3IG9ic2VydmVyIGhhbmRsZXIgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBPYnNlcnZlckhhbmRsZXIoKTogT2JzZXJ2ZXJIYW5kbGVyIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmVySGFuZGxlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYW4gYXR0cmlidXRlIG5hbWUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWF0dHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGRhdGFiYXNlIGVycm9yIGludG8gYSBzdGFuZGFyZGl6ZWQgZXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgZGF0YWJhc2Utc3BlY2lmaWMgZXJyb3JzIGludG8gc3RhbmRhcmRpemVkIGFwcGxpY2F0aW9uIGVycm9yc1xuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgb3JpZ2luYWwgZGF0YWJhc2UgZXJyb3JcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBBIHN0YW5kYXJkaXplZCBlcnJvclxuICAgKi9cbiAgYWJzdHJhY3QgcGFyc2VFcnJvcihlcnI6IEVycm9yKTogQmFzZUVycm9yO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBzZXR1cCBmb3IgdGhlIGFkYXB0ZXIsIHN1Y2ggYXMgZXN0YWJsaXNoaW5nIGNvbm5lY3Rpb25zXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBJbml0aWFsaXphdGlvbiBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIHNlcXVlbmNlIGdlbmVyYXRvclxuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBzZXF1ZW5jZSBnZW5lcmF0b3IgZm9yIGdlbmVyYXRpbmcgc2VxdWVudGlhbCB2YWx1ZXNcbiAgICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFic3RyYWN0IFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyByZXBvc2l0b3J5IGZsYWdzIGZvciBhbiBvcGVyYXRpb25cbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGEgc2V0IG9mIGZsYWdzIHRoYXQgZGVzY3JpYmUgYSBkYXRhYmFzZSBvcGVyYXRpb24sIGNvbWJpbmluZyBkZWZhdWx0IGZsYWdzIHdpdGggb3ZlcnJpZGVzXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgRmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIHR5cGUgb2Ygb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IGZsYWdzIC0gQ3VzdG9tIGZsYWcgb3ZlcnJpZGVzXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEY+fSBUaGUgY29tcGxldGUgc2V0IG9mIGZsYWdzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIGZsYWdzOiBQYXJ0aWFsPEZMQUdTPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGTEFHUz4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLCBmbGFncywge1xuICAgICAgYWZmZWN0ZWRUYWJsZXM6IFJlcG9zaXRvcnkudGFibGUobW9kZWwpLFxuICAgICAgd3JpdGVPcGVyYXRpb246IG9wZXJhdGlvbiAhPT0gT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgfSkgYXMgRkxBR1M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb250ZXh0IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlIHRvIHRoZSBjb250ZXh0IGNsYXNzIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhpcyBhZGFwdGVyXG4gICAqL1xuICBwcm90ZWN0ZWQgQ29udGV4dCA9IENvbnRleHQ8RkxBR1M+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNvbnRleHQgZm9yIGEgZGF0YWJhc2Ugb3BlcmF0aW9uXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGNvbnRleHQgb2JqZWN0IHRoYXQgZGVzY3JpYmVzIGEgZGF0YWJhc2Ugb3BlcmF0aW9uLCB1c2VkIGZvciB0cmFja2luZyBhbmQgYXVkaXRpbmdcbiAgICogQHRlbXBsYXRlIEYgLSBUaGUgUmVwb3NpdG9yeSBmbGFncyB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzLkNSRUFURXxPcGVyYXRpb25LZXlzLlJFQUR8T3BlcmF0aW9uS2V5cy5VUERBVEV8T3BlcmF0aW9uS2V5cy5ERUxFVEV9IG9wZXJhdGlvbiAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge1BhcnRpYWw8Rj59IG92ZXJyaWRlcyAtIEN1c3RvbSBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxDPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRleHQgb2JqZWN0XG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBjb250ZXh0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEZMQUdTPixcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxDT05URVhUPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY29udGV4dCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENyZWF0aW5nIG5ldyBjb250ZXh0IGZvciAke29wZXJhdGlvbn0gb3BlcmF0aW9uIG9uICR7bW9kZWwubmFtZX0gbW9kZWwgd2l0aCBmbGFnIG92ZXJyaWRlczogJHtKU09OLnN0cmluZ2lmeShvdmVycmlkZXMpfWBcbiAgICApO1xuICAgIGNvbnN0IGZsYWdzID0gYXdhaXQgdGhpcy5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBvdmVycmlkZXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBuZXcgdGhpcy5Db250ZXh0KCkuYWNjdW11bGF0ZShmbGFncykgYXMgdW5rbm93biBhcyBDT05URVhUO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIG1vZGVsIGZvciBwZXJzaXN0ZW5jZVxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIG1vZGVsIGluc3RhbmNlIGludG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGRhdGFiYXNlIHN0b3JhZ2UsXG4gICAqIGhhbmRsaW5nIGNvbHVtbiBtYXBwaW5nIGFuZCBzZXBhcmF0aW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBwcmVwYXJlXG4gICAqIEBwYXJhbSBwayAtIFRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEByZXR1cm4gVGhlIHByZXBhcmVkIGRhdGFcbiAgICovXG4gIHByZXBhcmU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBwazoga2V5b2YgTVxuICApOiB7XG4gICAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucHJlcGFyZSk7XG4gICAgY29uc3Qgc3BsaXQgPSBtb2RlbFRvVHJhbnNpZW50KG1vZGVsKTtcbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuZW50cmllcyhzcGxpdC5tb2RlbCkucmVkdWNlKFxuICAgICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gYWNjdW07XG4gICAgICAgIGNvbnN0IG1hcHBlZFByb3AgPSBSZXBvc2l0b3J5LmNvbHVtbihtb2RlbCwga2V5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZXNlcnZlZChtYXBwZWRQcm9wKSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgUHJvcGVydHkgbmFtZSAke21hcHBlZFByb3B9IGlzIHJlc2VydmVkYCk7XG4gICAgICAgIGFjY3VtW21hcHBlZFByb3BdID0gdmFsO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGlmICgobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdKSB7XG4gICAgICBsb2cuc2lsbHkoXG4gICAgICAgIGBQYXNzaW5nIGFsb25nIHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAkeyhtb2RlbCBhcyBhbnkpW1BlcnNpc3RlbmNlS2V5cy5NRVRBREFUQV19YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobW9kZWwgYXMgYW55KVtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZDogcmVzdWx0LFxuICAgICAgaWQ6IG1vZGVsW3BrXSBhcyBzdHJpbmcsXG4gICAgICB0cmFuc2llbnQ6IHNwbGl0LnRyYW5zaWVudCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBkYXRhYmFzZSBkYXRhIGJhY2sgaW50byBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJlY29uc3RydWN0cyBhIG1vZGVsIGluc3RhbmNlIGZyb20gZGF0YWJhc2UgZGF0YSwgaGFuZGxpbmcgY29sdW1uIG1hcHBpbmdcbiAgICogYW5kIHJlYXR0YWNoaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIG9iaiAtIFRoZSBkYXRhYmFzZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3I8TT59IGNsYXp6IC0gVGhlIG1vZGVsIGNsYXNzIG9yIG5hbWVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHBhcmFtIFt0cmFuc2llbnRdIC0gVHJhbnNpZW50IHByb3BlcnRpZXMgdG8gcmVhdHRhY2hcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IE0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJldmVydCk7XG4gICAgY29uc3Qgb2I6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBvYltwayBhcyBzdHJpbmddID0gaWQ7XG4gICAgY29uc3QgbSA9IChcbiAgICAgIHR5cGVvZiBjbGF6eiA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmJ1aWxkKG9iLCBjbGF6eikgOiBuZXcgY2xhenoob2IpXG4gICAgKSBhcyBNO1xuICAgIGxvZy5zaWxseShgUmVidWlsZGluZyBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH1gKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IG9ialtQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEFdO1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IE0sIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gcGspIHJldHVybiBhY2N1bTtcbiAgICAgIChhY2N1bSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldID0gb2JqW1JlcG9zaXRvcnkuY29sdW1uKGFjY3VtLCBrZXkpXTtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBtKTtcblxuICAgIGlmICh0cmFuc2llbnQpIHtcbiAgICAgIGxvZy52ZXJib3NlKFxuICAgICAgICBgcmUtYWRkaW5nIHRyYW5zaWVudCBwcm9wZXJ0aWVzOiAke09iamVjdC5rZXlzKHRyYW5zaWVudCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgICBPYmplY3QuZW50cmllcyh0cmFuc2llbnQpLmZvckVhY2goKFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiByZXN1bHQpXG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICBgVHJhbnNpZW50IHByb3BlcnR5ICR7a2V5fSBhbHJlYWR5IGV4aXN0cyBvbiBtb2RlbCAke20uY29uc3RydWN0b3IubmFtZX0uIHNob3VsZCBiZSBpbXBvc3NpYmxlYFxuICAgICAgICAgICk7XG4gICAgICAgIHJlc3VsdFtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobWV0YWRhdGEpIHtcbiAgICAgIGxvZy5zaWxseShcbiAgICAgICAgYFBhc3NpbmcgYWxvbmcgJHt0aGlzLmZsYXZvdXJ9IHBlcnNpc3RlbmNlIG1ldGFkYXRhIGZvciAke20uY29uc3RydWN0b3IubmFtZX0gaWQgJHtpZH06ICR7bWV0YWRhdGF9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSwge1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogbWV0YWRhdGEsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBhIG5ldyByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgYW5kIGRhdGEgaW50byB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gaW5zZXJ0IGludG9cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgbmV3IHJlY29yZFxuICAgKiBAcGFyYW0gbW9kZWwgLSBUaGUgZGF0YSB0byBpbnNlcnRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSByZWNvcmRzIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGFuZCBkYXRhIGludG8gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGluc2VydCBpbnRvXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBpZGVudGlmaWVycyBmb3IgdGhlIG5ldyByZWNvcmRzXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBkYXRhIHRvIGluc2VydCBmb3IgZWFjaCByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgY3JlYXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGVBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBDcmVhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLmNyZWF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uYXJncykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmVhZCBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKi9cbiAgYWJzdHJhY3QgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgcmVjb3JkcyBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHJlYWQgZnJvbVxuICAgKiBAcGFyYW0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmV0cmlldmVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWFkQWxsKTtcbiAgICBsb2cudmVyYm9zZShgUmVhZGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaWQubWFwKChpKSA9PiB0aGlzLnJlYWQodGFibGVOYW1lLCBpLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyBhbiBleGlzdGluZyByZWNvcmQgd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byB1cGRhdGVcbiAgICogQHBhcmFtICBtb2RlbCAtIFRoZSBuZXcgZGF0YSBmb3IgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIGFic3RyYWN0IHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIG11bHRpcGxlIGV4aXN0aW5nIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gSURzIGluIHRoZSBzcGVjaWZpZWQgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0gaWQgLSBUaGUgaWRlbnRpZmllcnMgb2YgdGhlIHJlY29yZHMgdG8gdXBkYXRlXG4gICAqIEBwYXJhbSBtb2RlbCAtIFRoZSBuZXcgZGF0YSBmb3IgZWFjaCByZWNvcmRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgdXBkYXRlZCByZWNvcmRzXG4gICAqL1xuICBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmIChpZC5sZW5ndGggIT09IG1vZGVsLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiSWRzIGFuZCBtb2RlbHMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy51cGRhdGVBbGwpO1xuICAgIGxvZy52ZXJib3NlKGBVcGRhdGluZyAke2lkLmxlbmd0aH0gZW50cmllcyAke3RhYmxlTmFtZX0gdGFibGVgKTtcbiAgICBsb2cuZGVidWcoYHBrczogJHtpZH1gKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBpZC5tYXAoKGksIGNvdW50KSA9PiB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIGksIG1vZGVsW2NvdW50XSwgLi4uYXJncykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVjb3JkIHdpdGggdGhlIGdpdmVuIElEIGZyb20gdGhlIHNwZWNpZmllZCB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIHRvIGRlbGV0ZSBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byBkZWxldGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRlbGV0ZWQgcmVjb3JkXG4gICAqL1xuICBhYnN0cmFjdCBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZWNvcmRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBJRHMgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gZGVsZXRlIGZyb21cbiAgICogQHBhcmFtIGlkIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZWNvcmRzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgc3BlY2lmaWMgdG8gdGhlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb25cbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBkZWxldGVkIHJlY29yZHNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZUFsbCk7XG4gICAgbG9nLnZlcmJvc2UoYERlbGV0aW5nICR7aWQubGVuZ3RofSBlbnRyaWVzICR7dGFibGVOYW1lfSB0YWJsZWApO1xuICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkfWApO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChpZC5tYXAoKGkpID0+IHRoaXMuZGVsZXRlKHRhYmxlTmFtZSwgaSwgLi4uYXJncykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWxsb3dzIGV4ZWN1dGluZyBkYXRhYmFzZS1zcGVjaWZpYyBxdWVyaWVzIGRpcmVjdGx5XG4gICAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHJhdyBxdWVyeSB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge1F9IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHNwZWNpZmljIHRvIHRoZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBxdWVyeSByZXN1bHRcbiAgICovXG4gIGFic3RyYWN0IHJhdzxSPihyYXdJbnB1dDogUVVFUlksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhbiBvYnNlcnZlciBmb3IgZGF0YWJhc2UgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYW4gb2JzZXJ2ZXIgdG8gYmUgbm90aWZpZWQgYWJvdXQgZGF0YWJhc2UgY2hhbmdlcy4gVGhlIG9ic2VydmVyIGNhbiBvcHRpb25hbGx5XG4gICAqIHByb3ZpZGUgYSBmaWx0ZXIgZnVuY3Rpb24gdG8gcmVjZWl2ZSBvbmx5IHNwZWNpZmljIGV2ZW50cy5cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYnNlcnZlckZpbHRlcn0gW2ZpbHRlcl0gLSBPcHRpb25hbCBmaWx0ZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGV2ZW50cyB0aGUgb2JzZXJ2ZXIgcmVjZWl2ZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIEBmaW5hbCgpXG4gIG9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyLCBmaWx0ZXI/OiBPYnNlcnZlckZpbHRlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJvYnNlcnZlckhhbmRsZXJcIiwge1xuICAgICAgICB2YWx1ZTogdGhpcy5PYnNlcnZlckhhbmRsZXIoKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgdGhpcy5vYnNlcnZlckhhbmRsZXIhLm9ic2VydmUob2JzZXJ2ZXIsIGZpbHRlcik7XG4gICAgdGhpcy5sb2dcbiAgICAgIC5mb3IodGhpcy5vYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYFJlZ2lzdGVyaW5nIG5ldyBvYnNlcnZlciAke29ic2VydmVyLnRvU3RyaW5nKCl9YCk7XG4gICAgaWYgKCF0aGlzLmRpc3BhdGNoKSB7XG4gICAgICB0aGlzLmxvZy5mb3IodGhpcy5vYnNlcnZlKS5pbmZvKGBDcmVhdGluZyBkaXNwYXRjaCBmb3IgJHt0aGlzLmFsaWFzfWApO1xuICAgICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuRGlzcGF0Y2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2gub2JzZXJ2ZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgb2JzZXJ2ZXIgc28gaXQgbm8gbG9uZ2VyIHJlY2VpdmVzIGRhdGFiYXNlIGV2ZW50IG5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXIgLSBUaGUgb2JzZXJ2ZXIgdG8gdW5yZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgQGZpbmFsKClcbiAgdW5PYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vYnNlcnZlckhhbmRsZXIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgXCJPYnNlcnZlckhhbmRsZXIgbm90IGluaXRpYWxpemVkLiBEaWQgeW91IHJlZ2lzdGVyIGFueSBvYnNlcnZhYmxlcz9cIlxuICAgICAgKTtcbiAgICB0aGlzLm9ic2VydmVySGFuZGxlci51bk9ic2VydmUob2JzZXJ2ZXIpO1xuICAgIHRoaXMubG9nXG4gICAgICAuZm9yKHRoaXMudW5PYnNlcnZlKVxuICAgICAgLnZlcmJvc2UoYE9ic2VydmVyICR7b2JzZXJ2ZXIudG9TdHJpbmcoKX0gcmVtb3ZlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3RpZmllcyBhbGwgb2JzZXJ2ZXJzIGFib3V0IGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgU2VuZHMgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgYWJvdXQgYSBjaGFuZ2UgaW4gdGhlIGRhdGFiYXNlLFxuICAgKiBmaWx0ZXJpbmcgYmFzZWQgb24gZWFjaCBvYnNlcnZlcidzIGZpbHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgd2hlcmUgdGhlIGNoYW5nZSBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN8QnVsa0NydWRPcGVyYXRpb25LZXlzfHN0cmluZ30gZXZlbnQgLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0ge0V2ZW50SWRzfSBpZCAtIFRoZSBpZGVudGlmaWVyKHMpIG9mIHRoZSBhZmZlY3RlZCByZWNvcmQocylcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG9ic2VydmVyc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBvYnNlcnZlcnMgaGF2ZSBiZWVuIG5vdGlmaWVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVPYnNlcnZlcnMoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBldmVudDogT3BlcmF0aW9uS2V5cyB8IEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyB8IHN0cmluZyxcbiAgICBpZDogRXZlbnRJZHMsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm9ic2VydmVySGFuZGxlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk9ic2VydmVySGFuZGxlciBub3QgaW5pdGlhbGl6ZWQuIERpZCB5b3UgcmVnaXN0ZXIgYW55IG9ic2VydmFibGVzP1wiXG4gICAgICApO1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZU9ic2VydmVycyk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgVXBkYXRpbmcgJHt0aGlzLm9ic2VydmVySGFuZGxlci5jb3VudCgpfSBvYnNlcnZlcnMgZm9yIGFkYXB0ZXIgJHt0aGlzLmFsaWFzfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMub2JzZXJ2ZXJIYW5kbGVyLnVwZGF0ZU9ic2VydmVycyhcbiAgICAgIHRoaXMubG9nLFxuICAgICAgdGFibGUsXG4gICAgICBldmVudCxcbiAgICAgIGlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyBkYXRhIGJhc2VkIG9uIGEgZGF0YWJhc2UgZXZlbnRcbiAgICogQHN1bW1hcnkgSW1wbGVtZW50YXRpb24gb2YgdGhlIE9ic2VydmVyIGludGVyZmFjZSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gdXBkYXRlT2JzZXJ2ZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB3aGVyZSB0aGUgY2hhbmdlIG9jY3VycmVkXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c3xCdWxrQ3J1ZE9wZXJhdGlvbktleXN8c3RyaW5nfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IG9jY3VycmVkXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkIC0gVGhlIGlkZW50aWZpZXIocykgb2YgdGhlIGFmZmVjdGVkIHJlY29yZChzKVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgcmVsYXRlZCB0byB0aGUgZXZlbnRcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaChcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIGV2ZW50OiBPcGVyYXRpb25LZXlzIHwgQnVsa0NydWRPcGVyYXRpb25LZXlzIHwgc3RyaW5nLFxuICAgIGlkOiBFdmVudElkcyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIGV2ZW50LCBpZCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpZGVudGlmeWluZyB0aGlzIGFkYXB0ZXJcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWRhcHRlclxuICAgKi9cbiAgb3ZlcnJpZGUgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuZmxhdm91cn0gcGVyc2lzdGVuY2UgQWRhcHRlcmA7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGFkYXB0ZXIgZmxhdm9yIGFzc29jaWF0ZWQgd2l0aCBhIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgYWRhcHRlciBmbGF2b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFkYXB0ZXIgZmxhdm9yIG5hbWVcbiAgICovXG4gIHN0YXRpYyBmbGF2b3VyT2Y8TSBleHRlbmRzIE1vZGVsPihtb2RlbDogQ29uc3RydWN0b3I8TT4pOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKHRoaXMua2V5KFBlcnNpc3RlbmNlS2V5cy5BREFQVEVSKSwgbW9kZWwpIHx8XG4gICAgICB0aGlzLmN1cnJlbnQ/LmZsYXZvdXJcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldCBjdXJyZW50Rmxhdm91cigpIHtcbiAgICBpZiAoIUFkYXB0ZXIuX2N1cnJlbnRGbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyBwZXJzaXN0ZW5jZSBmbGF2b3VyIHNldC4gUGxlYXNlIGluaXRpYWxpemUgeW91ciBhZGFwdGVyYFxuICAgICAgKTtcbiAgICByZXR1cm4gQWRhcHRlci5fY3VycmVudEZsYXZvdXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIGN1cnJlbnQgZGVmYXVsdCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgYWRhcHRlciB0aGF0IGlzIGN1cnJlbnRseSBzZXQgYXMgdGhlIGRlZmF1bHQgZm9yIG9wZXJhdGlvbnNcbiAgICogQHJldHVybiB7QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+fSBUaGUgY3VycmVudCBhZGFwdGVyXG4gICAqL1xuICBzdGF0aWMgZ2V0IGN1cnJlbnQoKTogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5jdXJyZW50Rmxhdm91cik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgYW4gYWRhcHRlciBieSBmbGF2b3JcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgcmVnaXN0ZXJlZCBhZGFwdGVyIGJ5IGl0cyBmbGF2b3IgbmFtZVxuICAgKiBAdGVtcGxhdGUgQ09ORiAtIFRoZSBkYXRhYmFzZSBkcml2ZXIgY29uZmlnXG4gICAqIEB0ZW1wbGF0ZSBDT05OIC0gVGhlIGRhdGFiYXNlIGRyaXZlciBpbnN0YW5jZVxuICAgKiBAdGVtcGxhdGUgUVVFUlkgLSBUaGUgcXVlcnkgdHlwZVxuICAgKiBAdGVtcGxhdGUgQ0NPTlRFWFQgLSBUaGUgY29udGV4dCB0eXBlXG4gICAqIEB0ZW1wbGF0ZSBGTEFHUyAtIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG5hbWUgb2YgdGhlIGFkYXB0ZXIgdG8gcmV0cmlldmVcbiAgICogQHJldHVybiB7QWRhcHRlcjxDT05GLCBDT05OLCBRVUVSWSwgQ09OVEVYVCwgRkxBR1M+IHwgdW5kZWZpbmVkfSBUaGUgYWRhcHRlciBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZ2V0PFxuICAgIENPTkYsXG4gICAgQ09OTixcbiAgICBRVUVSWSxcbiAgICBDT05URVhUIGV4dGVuZHMgQ29udGV4dDxGTEFHUz4sXG4gICAgRkxBR1MgZXh0ZW5kcyBSZXBvc2l0b3J5RmxhZ3MsXG4gID4oZmxhdm91cj86IGFueSk6IEFkYXB0ZXI8Q09ORiwgQ09OTiwgUVVFUlksIEZMQUdTLCBDT05URVhUPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmbGF2b3VyKSByZXR1cm4gQWRhcHRlci5nZXQodGhpcy5fY3VycmVudEZsYXZvdXIpO1xuICAgIGlmIChmbGF2b3VyIGluIHRoaXMuX2NhY2hlKSByZXR1cm4gdGhpcy5fY2FjaGVbZmxhdm91cl07XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIEFkYXB0ZXIgcmVnaXN0ZXJlZCB1bmRlciAke2ZsYXZvdXJ9LmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBjdXJyZW50IGRlZmF1bHQgYWRhcHRlclxuICAgKiBAc3VtbWFyeSBDaGFuZ2VzIHdoaWNoIGFkYXB0ZXIgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3Igb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3IgbmFtZSBvZiB0aGUgYWRhcHRlciB0byBzZXQgYXMgY3VycmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldEN1cnJlbnQoZmxhdm91cjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudEZsYXZvdXIgPSBmbGF2b3VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbWV0YWRhdGEga2V5XG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIHN0YW5kYXJkaXplZCBtZXRhZGF0YSBrZXkgZm9yIHBlcnNpc3RlbmNlLXJlbGF0ZWQgbWV0YWRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBiYXNlIGtleSBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBtZXRhZGF0YSBrZXlcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gUmVwb3NpdG9yeS5rZXkoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyBhbGwgbW9kZWxzIGFzc29jaWF0ZWQgd2l0aCBhbiBhZGFwdGVyIGZsYXZvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYWxsIG1vZGVsIGNvbnN0cnVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHVzZSBhIHNwZWNpZmljIGFkYXB0ZXIgZmxhdm9yXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgYWRhcHRlciBmbGF2b3IgdG8gZmluZCBtb2RlbHMgZm9yXG4gICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzXG4gICAqL1xuICBzdGF0aWMgbW9kZWxzPE0gZXh0ZW5kcyBNb2RlbD4oZmxhdm91cjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gKE1vZGVsIGFzIGFueSkuZ2V0UmVnaXN0cnkoKSBhcyBNb2RlbFJlZ2lzdHJ5PGFueT47XG4gICAgICBjb25zdCBjYWNoZSA9IChcbiAgICAgICAgcmVnaXN0cnkgYXMgdW5rbm93biBhcyB7IGNhY2hlOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvbnN0cnVjdG9yPGFueT4+IH1cbiAgICAgICkuY2FjaGU7XG4gICAgICBjb25zdCBtYW5hZ2VkTW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPGFueT5bXSA9IE9iamVjdC52YWx1ZXMoY2FjaGUpXG4gICAgICAgIC5tYXAoKG06IE1vZGVsQ29uc3RydWN0b3I8TT4pID0+IHtcbiAgICAgICAgICBsZXQgZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGYgJiYgZiA9PT0gZmxhdm91cikgcmV0dXJuIG07XG4gICAgICAgICAgaWYgKCFmKSB7XG4gICAgICAgICAgICBjb25zdCByZXBvID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoREJLZXlzLlJFUE9TSVRPUlkpLFxuICAgICAgICAgICAgICBtIGFzIE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghcmVwbykgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cbiAgICAgICAgICAgIGYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuQURBUFRFUiksXG4gICAgICAgICAgICAgIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKG0pID0+ICEhbSk7XG4gICAgICByZXR1cm4gbWFuYWdlZE1vZGVscztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkZWNvcmF0aW9uKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgcHJveGllcz86IFJlY29yZDxzdHJpbmcsIHR5cGVvZiB0aGlzPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byByZXR1cm4gdGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXIuXG4gICAqIEB0ZW1wbGF0ZSBDT04gLSBUaGUgdHlwZSBvZiB0aGUgY2xpZW50IGluc3RhbmNlXG4gICAqIEByZXR1cm4ge0NPTn0gVGhlIGNsaWVudCBpbnN0YW5jZSBmb3IgdGhlIGFkYXB0ZXJcbiAgICogQGFic3RyYWN0XG4gICAqIEBmdW5jdGlvbiBnZXRDbGllbnRcbiAgICogQG1lbWJlck9mIG1vZHVsZTpjb3JlXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Q2xpZW50KCk6IENPTk47XG5cbiAgQGZpbmFsKClcbiAgZ2V0IGNsaWVudCgpOiBDT05OIHtcbiAgICBpZiAoIXRoaXMuX2NsaWVudCkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yKGNvbmZpZzogUGFydGlhbDxDT05GPiwgLi4uYXJnczogYW55W10pOiB0eXBlb2YgdGhpcyB7XG4gICAgaWYgKCF0aGlzLnByb3hpZXMpIHRoaXMucHJveGllcyA9IHt9O1xuICAgIGNvbnN0IGtleSA9IGAke3RoaXMuYWxpYXN9IC0gJHtoYXNoT2JqKGNvbmZpZyl9YDtcbiAgICBpZiAoa2V5IGluIHRoaXMucHJveGllcykgcmV0dXJuIHRoaXMucHJveGllc1trZXldIGFzIHR5cGVvZiB0aGlzO1xuXG4gICAgbGV0IGNsaWVudDogYW55O1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldDogKHRhcmdldDogdHlwZW9mIHRoaXMsIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocCA9PT0gXCJfY29uZmlnXCIpIHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5hbENvbmY6IENPTkYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgb3JpZ2luYWxDb25mLCBjb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwID09PSBcIl9jbGllbnRcIikge1xuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldDogYW55LCBwOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnksIHJlY2VpdmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHAgPT09IFwiX2NsaWVudFwiKSB7XG4gICAgICAgICAgY2xpZW50ID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcCwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm94aWVzW2tleV0gPSBwcm94eTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cbn1cbiJdfQ==
@@ -2,8 +2,8 @@ import { OperationKeys, BulkCrudOperationKeys } from "@decaf-ts/db-decorators";
2
2
  import { ModelConstructor } from "@decaf-ts/decorator-validation";
3
3
  import { Observable, Observer } from "../interfaces";
4
4
  import { Adapter } from "./Adapter";
5
- import { Logger } from "@decaf-ts/logging";
6
5
  import { EventIds } from "./types";
6
+ import { LoggedClass } from "@decaf-ts/logging";
7
7
  /**
8
8
  * @description Dispatches database operation events to observers
9
9
  * @summary The Dispatch class implements the Observable interface and is responsible for intercepting
@@ -30,7 +30,7 @@ import { EventIds } from "./types";
30
30
  * dispatch.unObserve(adapter);
31
31
  * ```
32
32
  */
33
- export declare class Dispatch<Y> implements Observable {
33
+ export declare class Dispatch<Y> extends LoggedClass implements Observable {
34
34
  /**
35
35
  * @description The adapter being observed
36
36
  * @summary Reference to the database adapter whose operations are being monitored
@@ -46,17 +46,6 @@ export declare class Dispatch<Y> implements Observable {
46
46
  * @summary Array of model constructors that are registered with the adapter
47
47
  */
48
48
  protected models: ModelConstructor<any>[];
49
- /**
50
- * @description Logger instance
51
- * @summary Logger for recording dispatch activities
52
- */
53
- private logger;
54
- /**
55
- * @description Accessor for the logger
56
- * @summary Gets or initializes the logger for this dispatch instance
57
- * @return {Logger} The logger instance
58
- */
59
- protected get log(): Logger;
60
49
  /**
61
50
  * @description Creates a new Dispatch instance
62
51
  * @summary Initializes a new Dispatch instance without any adapter