@fireflysemantics/slice 17.0.14 → 17.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,15 +2,17 @@
2
2
 
3
3
  # @fireflysemantics/slice
4
4
 
5
- ## TOC
5
+ ## Table of Contents
6
6
 
7
7
  - [Overview](#overview)
8
8
  - [Why Slice](#why-slice)
9
9
  - [Install](#install)
10
+ - [API Reference](#api-documentation)
10
11
  - [Object Store Core Use Cases](#object-store-core-use-cases)
11
12
  - [Entity Store Core Use Cases](#entity-store-core-use-cases)
12
13
  - [Features](#features)
13
- - [Documentatino and Media](#firefly-semantics-slice-development-center-media-and-documentation)
14
+ - [Help Center Documentatino and Media](#firefly-semantics-slice-development-center-media-and-documentation)
15
+ - [Getting Help](#getting-help)
14
16
 
15
17
  ## Overview
16
18
 
@@ -366,13 +368,43 @@ console.log(
366
368
  );
367
369
 
368
370
  //============================================
369
- // API: count()
371
+ // API: count() and snapshotCount()
370
372
  //
371
- // Dyanically count the Number of Entries in the Store.
373
+ // Take snapshot and observable
374
+ // the counts of store entities
372
375
  //============================================
373
- let countSubscription = store.count().subscribe((c) => {
374
- console.log(`The number of Todo entities stored is ${c}`);
376
+
377
+ const completePredicate: Predicate<Todo> = function pred(t: Todo) {
378
+ return t.complete;
379
+ };
380
+
381
+ const incompletePredicate: Predicate<Todo> = function pred(t: Todo) {
382
+ return !t.complete;
383
+ };
384
+
385
+ store.count().subscribe((c) => {
386
+ console.log(`The observed count of Todo entities is ${c}`);
375
387
  });
388
+ store.count(incompletePredicate).subscribe((c) => {
389
+ console.log(`The observed count of incomplete Todo enttiies is ${c}`);
390
+ });
391
+ store.count(completePredicate).subscribe((c) => {
392
+ console.log(`The observed count of complete Todo enttiies is ${c}`);
393
+ });
394
+
395
+ const snapshotCount = store.countSnapshot(completePredicate);
396
+ console.log(`The count is ${snapshotCount}`);
397
+
398
+ const completeSnapshotCount = store.countSnapshot(completePredicate);
399
+ console.log(
400
+ `The complete Todo Entity Snapshot count is ${completeSnapshotCount}`
401
+ );
402
+
403
+ const incompleteSnapshotCount = store.countSnapshot(incompletePredicate);
404
+ console.log(
405
+ `The incomplete Todo Entity Snapshot count is ${incompleteSnapshotCount}`
406
+ );
407
+
376
408
 
377
409
  //============================================
378
410
  // API: toggle()
@@ -563,11 +595,13 @@ store.isEmpty().subscribe((empty) => {
563
595
  - [Minimal Slice Object Store](https://developer.fireflysemantics.com/examples/examples--slice--minimal-slice-object-store)
564
596
  - [Minimal Angular Slice Object Store State Service](https://developer.fireflysemantics.com/examples/examples--slice--minial-angular-slice-object-store-state-service)
565
597
 
566
- # API Documentation
598
+ # API Reference
599
+
600
+ The [Typedoc API Reference](https://fireflysemantics.github.io/slice/typedoc/) includes simple examples of how to apply the API for the various stores, methods, and classes included.
567
601
 
568
- See [Typedoc API Documentation](https://fireflysemantics.github.io/slice/typedoc/)
602
+ ## Getting Help
569
603
 
570
- The documentation for the API includes simple examples of how to apply the API to a use case.
604
+ [Firefly Semantics Slice on Stackoverflow](https://stackoverflow.com/questions/tagged/fireflysemantics-slice)
571
605
 
572
606
  ## Build
573
607
 
@@ -575,9 +609,7 @@ Run `npm run c` to build the project. The build artifacts will be stored in the
575
609
 
576
610
  ## Running unit tests
577
611
 
578
- Run `npm run test` to execute the unit tests via [Jest](https://jestjs.io/).
579
-
580
-
612
+ Run `npm run test` to execute the unit tests.
581
613
 
582
614
  ## Tests
583
615
 
@@ -1,11 +1,11 @@
1
- import { ReplaySubject } from "rxjs";
2
- import { map } from "rxjs/operators";
1
+ import { ReplaySubject } from 'rxjs';
2
+ import { map } from 'rxjs/operators';
3
3
  const { freeze } = Object;
4
- const ESTORE_DEFAULT_ID_KEY = "id";
5
- const ESTORE_DEFAULT_GID_KEY = "gid";
4
+ const ESTORE_DEFAULT_ID_KEY = 'id';
5
+ const ESTORE_DEFAULT_GID_KEY = 'gid';
6
6
  export const ESTORE_CONFIG_DEFAULT = freeze({
7
7
  idKey: ESTORE_DEFAULT_ID_KEY,
8
- guidKey: ESTORE_DEFAULT_GID_KEY
8
+ guidKey: ESTORE_DEFAULT_GID_KEY,
9
9
  });
10
10
  export class AbstractStore {
11
11
  constructor(config) {
@@ -40,7 +40,6 @@ export class AbstractStore {
40
40
  * An Observable<E[]> reference
41
41
  * to the entities in the store or
42
42
  * Slice instance.
43
- *
44
43
  */
45
44
  this.obs = this.observe();
46
45
  this.config = config
@@ -96,14 +95,15 @@ export class AbstractStore {
96
95
  }
97
96
  /**
98
97
  * Observe store state changes.
98
+ *
99
99
  * @param sort Optional sorting function yielding a sorted observable.
100
100
  * @example
101
- ```
102
- let todos$ = source.observe();
103
- //or with a sort by title function
104
- let todos$ = source.observe((a, b)=>(a.title > b.title ? -1 : 1));
105
- ```
106
- */
101
+ * ```
102
+ * let todos$ = source.observe();
103
+ * //or with a sort by title function
104
+ * let todos$ = source.observe((a, b)=>(a.title > b.title ? -1 : 1));
105
+ * ```
106
+ */
107
107
  observe(sort) {
108
108
  if (sort) {
109
109
  return this.notify.pipe(map((e) => e.sort(sort)));
@@ -112,10 +112,11 @@ export class AbstractStore {
112
112
  }
113
113
  /**
114
114
  * Observe delta updates.
115
+ *
115
116
  * @example
116
- <pre>
117
- let todos$ = source.observeDelta();
118
- </pre>
117
+ * ```
118
+ * let todos$ = source.observeDelta();
119
+ * ```
119
120
  */
120
121
  observeDelta() {
121
122
  return this.notifyDelta.asObservable();
@@ -126,10 +127,10 @@ export class AbstractStore {
126
127
  * @return A hot {@link Observable} that indicates whether the store is empty.
127
128
  *
128
129
  * @example
129
- <pre>
130
- source.isEmpty();
131
- </pre>
132
- */
130
+ * ```
131
+ * const empty$:Observable<boolean> = source.isEmpty();
132
+ * ```
133
+ */
133
134
  isEmpty() {
134
135
  return this.notify.pipe(map((entries) => entries.length == 0));
135
136
  }
@@ -139,10 +140,10 @@ export class AbstractStore {
139
140
  * @return A snapshot that indicates whether the store is empty.
140
141
  *
141
142
  * @example
142
- <pre>
143
- source.isEmpty();
144
- </pre>
145
- */
143
+ * ```
144
+ * const empty:boolean = source.isEmptySnapshot();
145
+ * ```
146
+ */
146
147
  isEmptySnapshot() {
147
148
  return Array.from(this.entries.values()).length == 0;
148
149
  }
@@ -192,7 +193,7 @@ export class AbstractStore {
192
193
  </pre>
193
194
  */
194
195
  contains(target) {
195
- if (typeof target === "string") {
196
+ if (typeof target === 'string') {
196
197
  return this.entries.get(target) ? true : false;
197
198
  }
198
199
  const guid = target[this.config.guidKey];
@@ -210,7 +211,7 @@ export class AbstractStore {
210
211
  </pre>
211
212
  */
212
213
  containsById(target) {
213
- if (typeof target === "string") {
214
+ if (typeof target === 'string') {
214
215
  return this.idEntries.get(target) ? true : false;
215
216
  }
216
217
  const id = target[this.config.idKey];
@@ -242,14 +243,14 @@ export class AbstractStore {
242
243
  * @param p The predicate used to query for the selection.
243
244
  * @return A snapshot array containing the entities that match the predicate.
244
245
  *
245
- * @example Select all the `Todo` instance where the `title` length is greater than 100.
246
- ```
247
- let todos:Todo[]=store.select(todo=>todo.title.length>100);
248
- ```
246
+ * @example Select all the Todo instances where the title length is greater than 100.
247
+ * ```
248
+ * let todos:Todo[]=store.select(todo=>todo.title.length>100);
249
+ * ```
249
250
  */
250
251
  select(p) {
251
252
  const selected = [];
252
- Array.from(this.entries.values()).forEach(e => {
253
+ Array.from(this.entries.values()).forEach((e) => {
253
254
  if (p(e)) {
254
255
  selected.push(e);
255
256
  }
@@ -261,10 +262,11 @@ export class AbstractStore {
261
262
  * @param e1 The first entity
262
263
  * @param e2 The second entity
263
264
  * @return true if the two entities have equal GUID ids
264
- * @example Compare `todo1` with `todo2` by `gid`.
265
- ```
266
- if (equalsByGUID(todo1, todo2)){...};
267
- ```
265
+ *
266
+ * @example Compare todo1 with todo2 by gid.
267
+ * ```
268
+ * if (equalsByGUID(todo1, todo2)){...};
269
+ * ```
268
270
  */
269
271
  equalsByGUID(e1, e2) {
270
272
  return e1[this.GUID_KEY] == e2[this.GUID_KEY];
@@ -274,16 +276,18 @@ export class AbstractStore {
274
276
  * @param e1 The first entity
275
277
  * @param e2 The second entity
276
278
  * @return true if the two entities have equal ID ids
277
- * @example Compare `todo1` with `todo2` by `id`.
278
- ```
279
- if (equalsByID(todo1, todo2)){...};
280
- ```
279
+ *
280
+ * @example Compare todo1 with todo2 by id.
281
+ *
282
+ * ```
283
+ * if (equalsByID(todo1, todo2)){...};
284
+ * ```
281
285
  */
282
286
  equalsByID(e1, e2) {
283
287
  return e1[this.ID_KEY] == e2[this.ID_KEY];
284
288
  }
285
289
  /**
286
- * Calls complete on all {@link BehaviorSubject} instances.
290
+ * Calls complete on all {@link ReplaySubject} instances.
287
291
  *
288
292
  * Call destroy when disposing of the store.
289
293
  */
@@ -293,4 +297,4 @@ export class AbstractStore {
293
297
  this.notifyQuery.complete();
294
298
  }
295
299
  }
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9saWIvQWJzdHJhY3RTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUlwQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFBO0FBRXpCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixNQUFNLENBQUM7SUFDdkQsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixPQUFPLEVBQUUsc0JBQXNCO0NBQ2hDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBZ0IsYUFBYTtJQU9oQyxZQUFZLE1BQW9CO1FBTWpDOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNPLFdBQU0sR0FBVyxFQUFFLENBQUM7UUE0QzlCOztXQUVHO1FBQ0ksWUFBTyxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTFDOzs7V0FHRztRQUNJLGNBQVMsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU1Qzs7O1dBR0c7UUFDTyxXQUFNLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUE7UUFFNUM7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQTtRQThCdEQ7Ozs7O1dBS0c7UUFDSyxRQUFHLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQWxIMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNO1lBQ2xCLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLHFCQUFxQixFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7WUFDakQsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0lBQzVCLENBQUM7SUFZRjs7T0FFRztJQUNILElBQUksS0FBSyxDQUFDLEtBQWE7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7OztNQU1FO0lBQ0ssWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUdEOzs7T0FHRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUE7SUFDMUIsQ0FBQztJQUNEOzs7T0FHRztJQUNILElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFDNUIsQ0FBQztJQXlCRDs7Ozs7T0FLRztJQUNPLFNBQVMsQ0FBQyxDQUFNLEVBQUUsS0FBZTtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7OztNQVNFO0lBQ0ssT0FBTyxDQUFDLElBQWlDO1FBQzlDLElBQUksSUFBSSxFQUFFO1lBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFZRDs7Ozs7O09BTUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7Ozs7OztNQVNFO0lBQ0YsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3JCLEdBQUcsQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7O01BU0U7SUFDRixlQUFlO1FBQ2IsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsQ0FBZ0I7UUFDcEIsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztTQUNIO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhLENBQUMsQ0FBZ0I7UUFDNUIsSUFBSSxDQUFDLEVBQUU7WUFDTCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0Q7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsV0FBVztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLE1BQWtCO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxFQUFFLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLENBQWU7UUFDcEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDUixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxDQUFDLEVBQU0sRUFBRSxFQUFNO1FBQ3pCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxVQUFVLENBQUMsRUFBTSxFQUFFLEVBQU07UUFDdkIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCJcbmltcG9ydCB7IG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiXG5pbXBvcnQgeyBEZWx0YSwgUHJlZGljYXRlIH0gZnJvbSBcIi4vbW9kZWxzXCJcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSBcIi4vbW9kZWxzL1N0b3JlQ29uZmlnXCJcblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdFxuXG5jb25zdCBFU1RPUkVfREVGQVVMVF9JRF9LRVkgPSBcImlkXCJcbmNvbnN0IEVTVE9SRV9ERUZBVUxUX0dJRF9LRVkgPSBcImdpZFwiXG5cbmV4cG9ydCBjb25zdCBFU1RPUkVfQ09ORklHX0RFRkFVTFQ6IFN0b3JlQ29uZmlnID0gZnJlZXplKHtcbiAgaWRLZXk6IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSxcbiAgZ3VpZEtleTogRVNUT1JFX0RFRkFVTFRfR0lEX0tFWVxufSk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JlPEU+IHtcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gICBwdWJsaWMgY29uZmlnOiBTdG9yZUNvbmZpZztcblxuICAgY29uc3RydWN0b3IoY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICAgICA/IGZyZWV6ZSh7IC4uLkVTVE9SRV9DT05GSUdfREVGQVVMVCwgLi4uY29uZmlnIH0pXG4gICAgICAgOiBFU1RPUkVfQ09ORklHX0RFRkFVTFQ7XG4gICB9XG4gXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgb2YgdGhlIHN0b3JlIHF1ZXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXJ5ID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcXVlcnkgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3F1ZXJ5OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBxdWVyeSBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IHF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMubm90aWZ5UXVlcnkubmV4dCh0aGlzLl9xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBxdWVyeSBzdGF0ZS5cbiAgICovXG4gIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgcXVlcnkuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHF1ZXJ5JCA9IHNvdXJjZS5vYnNlcnZlUXVlcnkoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlRdWVyeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGlkIGtleSBmb3IgdGhlIEVTdG9yZSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB0aGlzLmNvbmZpZy5pZEtleTtcbiAgICovXG4gIGdldCBJRF9LRVkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaWRLZXlcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZ3VpZCBrZXkgZm9yIHRoZSBFU3RvcmUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4gdGhpcy5jb25maWcuZ3VpZEtleTtcbiAgICovXG4gIGdldCBHVUlEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ndWlkS2V5XG4gIH1cblxuICAvKipcbiAgICogUHJpbWFyeSBpbmRleCBmb3IgdGhlIHN0b3JlcyBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBlbnRyaWVzIHRoYXQgYXJlIGtleWVkIGJ5XG4gICAqIGFuIGlkIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGlkRW50cmllczogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiB0aGUgZW50aXJlIHNldCBvZiBlbnRyaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeSA9IG5ldyBSZXBsYXlTdWJqZWN0PEVbXT4oMSlcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiBzdG9yZSBvciBzbGljZSBkZWx0YSBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeURlbHRhID0gbmV3IFJlcGxheVN1YmplY3Q8RGVsdGE8RT4+KDEpXG5cbiAgLyoqXG4gICAqIENhbGwgYWxsIHRoZSBub3RpZmllcnMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICogQHBhcmFtIGRlbHRhXG4gICAqL1xuICBwcm90ZWN0ZWQgbm90aWZ5QWxsKHY6IEVbXSwgZGVsdGE6IERlbHRhPEU+KSB7XG4gICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgc3RvcmUgc3RhdGUgY2hhbmdlcy5cbiAgICogQHBhcmFtIHNvcnQgT3B0aW9uYWwgc29ydGluZyBmdW5jdGlvbiB5aWVsZGluZyBhIHNvcnRlZCBvYnNlcnZhYmxlLlxuICAgKiBAZXhhbXBsZVxuYGBgXG5sZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKTtcbi8vb3Igd2l0aCBhIHNvcnQgYnkgdGl0bGUgZnVuY3Rpb25cbmxldCB0b2RvcyQgPSBzb3VyY2Uub2JzZXJ2ZSgoYSwgYik9PihhLnRpdGxlID4gYi50aXRsZSA/IC0xIDogMSkpO1xuYGBgXG4gICovXG4gIHB1YmxpYyBvYnNlcnZlKHNvcnQ/OiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcik6IE9ic2VydmFibGU8RVtdPiB7XG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZTogRVtdKSA9PiBlLnNvcnQoc29ydCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIE9ic2VydmFibGU8RVtdPiByZWZlcmVuY2VcbiAgICogdG8gdGhlIGVudGl0aWVzIGluIHRoZSBzdG9yZSBvclxuICAgKiBTbGljZSBpbnN0YW5jZS5cbiAgICogXG4gICAqL1xuICAgcHVibGljIG9iczogT2JzZXJ2YWJsZTxFW10+ID0gdGhpcy5vYnNlcnZlKClcblxuXG5cbiAgLyoqXG4gICAqIE9ic2VydmUgZGVsdGEgdXBkYXRlcy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IHRvZG9zJCA9IHNvdXJjZS5vYnNlcnZlRGVsdGEoKTtcbiAgICAgPC9wcmU+XG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZURlbHRhKCk6IE9ic2VydmFibGU8RGVsdGE8RT4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlEZWx0YS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eS5cbiAgICogXG4gICAqIEByZXR1cm4gQSBob3Qge0BsaW5rIE9ic2VydmFibGV9IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICA8cHJlPlxuICAgIHNvdXJjZS5pc0VtcHR5KCk7XG4gICAgPC9wcmU+XG4gICovXG4gIGlzRW1wdHkoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUoXG4gICAgICBtYXAoKGVudHJpZXM6IEVbXSkgPT4gZW50cmllcy5sZW5ndGggPT0gMClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQHJldHVybiBBIHNuYXBzaG90IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBzb3VyY2UuaXNFbXB0eSgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBpc0VtcHR5U25hcHNob3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGggPT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBjb250YWluZWQuXG4gICAqIEBwYXJhbSBwIFRoZSBwcmVkaWNhdGUgdG8gYXBwbHkgaW4gb3JkZXIgdG8gZmlsdGVyIHRoZSBjb3VudFxuICAgKi9cbiAgY291bnQocD86IFByZWRpY2F0ZTxFPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKFxuICAgICAgICBtYXAoKGU6IEVbXSkgPT4gZS5yZWR1Y2UoKHRvdGFsLCBlKSA9PiB0b3RhbCArIChwKGUpID8gMSA6IDApLCAwKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZW50cmllczogRVtdKSA9PiBlbnRyaWVzLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY29udGFpbmVkIGluIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB0byBhcHBseSBpbiBvcmRlciB0byBmaWx0ZXIgdGhlIGNvdW50XG4gICAqL1xuICBjb3VudFNuYXBzaG90KHA/OiBQcmVkaWNhdGU8RT4pOiBudW1iZXIge1xuICAgIGlmIChwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZpbHRlcihwKS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIGFsbCBlbnRyaWVzLlxuICAgKiBcbiAgICogQHJldHVybiBTbmFwc2hvdCBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIHRoZSBlbnRpdGllcyB0aGUgc3RvcmUgY29udGFpbnMuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBPYnNlcnZlIGEgc25hcHNob3Qgb2YgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgc3RvcmUuXG5gYGBcbmxldCBzZWxlY3RlZFRvZG9zOlRvZG9bXSA9IHNvdXJjZS5hbGxTbmFwc2hvdCgpO1xuYGBgXG4gICAqL1xuICBhbGxTbmFwc2hvdCgpOiBFW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGlkZW50aWZpZWQgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gdGFyZ2V0IEVpdGhlciBhbiBpbnN0YW5jZSBvZiB0eXBlIGBFYCBvciBhIGBndWlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcGFyYW0gYnlJZCBXaGV0aGVyIHRoZSBsb29rdXAgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBgaWRgIGtleSByYXRoZXIgdGhhbiB0aGUgYGd1aWRgLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBndWlkIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnModGFyZ2V0OiBFIHwgc3RyaW5nKTpib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ3VpZDogc3RyaW5nID0gKDxhbnk+dGFyZ2V0KVt0aGlzLmNvbmZpZy5ndWlkS2V5XTtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChndWlkKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY29udGFpbiB0aGUgaWRlbnRpZmllZCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSB0YXJnZXQgRWl0aGVyIGFuIGluc3RhbmNlIG9mIHR5cGUgYEVgIG9yIGEgYGlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBgaWRgIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnNCeUlkKHRhcmdldDogRSB8IHN0cmluZyk6Ym9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuaWRLZXldO1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIEdVSUQgcGFyYW1ldGVyXG4gICAqIGlmIGl0IGV4aXN0cyBhbmQgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZShndWlkOiBzdHJpbmcpOiBFIHwgdW5kZWZpbmVke1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGd1aWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIElEIHBhcmFtZXRlclxuICAgKiBpZiBpdCBleGlzdHMgYW5kIHJldHVybiBpdC5cbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm4gVGhlIGVudGl0eSBpbnN0YW5jZSBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICBmaW5kT25lQnlJRChpZDogc3RyaW5nKTogRSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaWRFbnRyaWVzLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3Qgb2YgdGhlIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlIHVzZWQgdG8gcXVlcnkgZm9yIHRoZSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBhcnJheSBjb250YWluaW5nIHRoZSBlbnRpdGllcyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBTZWxlY3QgYWxsIHRoZSBgVG9kb2AgaW5zdGFuY2Ugd2hlcmUgdGhlIGB0aXRsZWAgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAxMDAuIFxuYGBgXG5sZXQgdG9kb3M6VG9kb1tdPXN0b3JlLnNlbGVjdCh0b2RvPT50b2RvLnRpdGxlLmxlbmd0aD4xMDApO1xuYGBgXG4gICAqL1xuICBzZWxlY3QocDogUHJlZGljYXRlPEU+KTogRVtdIHtcbiAgICBjb25zdCBzZWxlY3RlZDogRVtdID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICBpZiAocChlKSkge1xuICAgICAgICBzZWxlY3RlZC5wdXNoKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuXG4gIC8qKiBcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBHVUlEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBHVUlEIGlkc1xuICAgKiBAZXhhbXBsZSBDb21wYXJlIGB0b2RvMWAgd2l0aCBgdG9kbzJgIGJ5IGBnaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlHVUlEKHRvZG8xLCB0b2RvMikpey4uLn07XG5gYGBcbiAgICovXG4gIGVxdWFsc0J5R1VJRChlMTphbnksIGUyOmFueSkge1xuICAgIHJldHVybiBlMVt0aGlzLkdVSURfS0VZXSA9PSBlMlt0aGlzLkdVSURfS0VZXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIGVudGl0aWVzIGJ5IElEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBJRCBpZHNcbiAgICogQGV4YW1wbGUgQ29tcGFyZSBgdG9kbzFgIHdpdGggYHRvZG8yYCBieSBgaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlJRCh0b2RvMSwgdG9kbzIpKXsuLi59O1xuYGBgXG4gICAqL1xuICBlcXVhbHNCeUlEKGUxOmFueSwgZTI6YW55KSB7XG4gICAgcmV0dXJuIGUxW3RoaXMuSURfS0VZXSA9PSBlMlt0aGlzLklEX0tFWV07XG4gIH1cbiAgLyoqXG4gICAqIENhbGxzIGNvbXBsZXRlIG9uIGFsbCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqIFxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vdGlmeS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEuY29tcGxldGUoKTtcbiAgICB0aGlzLm5vdGlmeVF1ZXJ5LmNvbXBsZXRlKCk7XG4gIH1cbn0iXX0=
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9saWIvQWJzdHJhY3RTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBRTFCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDO0FBQ25DLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0FBRXJDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixNQUFNLENBQUM7SUFDdkQsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixPQUFPLEVBQUUsc0JBQXNCO0NBQ2hDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBZ0IsYUFBYTtJQU1qQyxZQUFZLE1BQW9CO1FBTWhDOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNPLFdBQU0sR0FBVyxFQUFFLENBQUM7UUEyQzlCOztXQUVHO1FBQ0ksWUFBTyxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTNDOzs7V0FHRztRQUNJLGNBQVMsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUU3Qzs7O1dBR0c7UUFDTyxXQUFNLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7UUFFN0M7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQztRQStCdkQ7Ozs7V0FJRztRQUNJLFFBQUcsR0FBb0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBakgzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU07WUFDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FB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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0Q7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsV0FBVztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLE1BQWtCO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxFQUFFLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLENBQWU7UUFDcEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNSLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLEVBQU8sRUFBRSxFQUFPO1FBQzNCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILFVBQVUsQ0FBQyxFQUFPLEVBQUUsRUFBTztRQUN6QixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEZWx0YSwgUHJlZGljYXRlIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgU3RvcmVDb25maWcgfSBmcm9tICcuL21vZGVscy9TdG9yZUNvbmZpZyc7XG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSA9ICdpZCc7XG5jb25zdCBFU1RPUkVfREVGQVVMVF9HSURfS0VZID0gJ2dpZCc7XG5cbmV4cG9ydCBjb25zdCBFU1RPUkVfQ09ORklHX0RFRkFVTFQ6IFN0b3JlQ29uZmlnID0gZnJlZXplKHtcbiAgaWRLZXk6IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSxcbiAgZ3VpZEtleTogRVNUT1JFX0RFRkFVTFRfR0lEX0tFWSxcbn0pO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIHN0b3JlLlxuICAgKi9cbiAgcHVibGljIGNvbmZpZzogU3RvcmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ1xuICAgICAgPyBmcmVlemUoeyAuLi5FU1RPUkVfQ09ORklHX0RFRkFVTFQsIC4uLmNvbmZpZyB9KVxuICAgICAgOiBFU1RPUkVfQ09ORklHX0RFRkFVTFQ7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIG9mIHRoZSBzdG9yZSBxdWVyeS5cbiAgICovXG4gIHByb3RlY3RlZCBub3RpZnlRdWVyeSA9IG5ldyBSZXBsYXlTdWJqZWN0PHN0cmluZz4oMSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHF1ZXJ5IHN0YXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9xdWVyeTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgcXVlcnkgc3RhdGUgYW5kIG5vdGlmaWVzIG9ic2VydmVycy5cbiAgICovXG4gIHNldCBxdWVyeShxdWVyeTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVlcnkgPSBxdWVyeTtcbiAgICB0aGlzLm5vdGlmeVF1ZXJ5Lm5leHQodGhpcy5fcXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBvZiB0aGUgcXVlcnkgc3RhdGUuXG4gICAqL1xuICBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgdGhlIHF1ZXJ5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBxdWVyeSQgPSBzb3VyY2Uub2JzZXJ2ZVF1ZXJ5KCk7XG4gICAgPC9wcmU+XG4gICovXG4gIHB1YmxpYyBvYnNlcnZlUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5UXVlcnkuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgaWQga2V5IGZvciB0aGUgRVN0b3JlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHRoaXMuY29uZmlnLmlkS2V5O1xuICAgKi9cbiAgZ2V0IElEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5pZEtleTtcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZ3VpZCBrZXkgZm9yIHRoZSBFU3RvcmUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4gdGhpcy5jb25maWcuZ3VpZEtleTtcbiAgICovXG4gIGdldCBHVUlEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ndWlkS2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW1hcnkgaW5kZXggZm9yIHRoZSBzdG9yZXMgZWxlbWVudHMuXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IGVudHJpZXMgdGhhdCBhcmUga2V5ZWQgYnlcbiAgICogYW4gaWQgZ2VuZXJhdGVkIG9uIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgaWRFbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiB0aGUgZW50aXJlIHNldCBvZiBlbnRyaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeSA9IG5ldyBSZXBsYXlTdWJqZWN0PEVbXT4oMSk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBub3RpZmljYXRpb25zIHRoYXQgYnJvYWNhc3RcbiAgICogc3RvcmUgb3Igc2xpY2UgZGVsdGEgc3RhdGUgY2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCBub3RpZnlEZWx0YSA9IG5ldyBSZXBsYXlTdWJqZWN0PERlbHRhPEU+PigxKTtcblxuICAvKipcbiAgICogQ2FsbCBhbGwgdGhlIG5vdGlmaWVycyBhdCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdlxuICAgKiBAcGFyYW0gZGVsdGFcbiAgICovXG4gIHByb3RlY3RlZCBub3RpZnlBbGwodjogRVtdLCBkZWx0YTogRGVsdGE8RT4pIHtcbiAgICB0aGlzLm5vdGlmeS5uZXh0KHYpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzdG9yZSBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gc29ydCBPcHRpb25hbCBzb3J0aW5nIGZ1bmN0aW9uIHlpZWxkaW5nIGEgc29ydGVkIG9ic2VydmFibGUuXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBsZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKTtcbiAgICogLy9vciB3aXRoIGEgc29ydCBieSB0aXRsZSBmdW5jdGlvblxuICAgKiBsZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKGEsIGIpPT4oYS50aXRsZSA+IGIudGl0bGUgPyAtMSA6IDEpKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZShzb3J0PzogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIpOiBPYnNlcnZhYmxlPEVbXT4ge1xuICAgIGlmIChzb3J0KSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnkucGlwZShtYXAoKGU6IEVbXSkgPT4gZS5zb3J0KHNvcnQpKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGlmeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBPYnNlcnZhYmxlPEVbXT4gcmVmZXJlbmNlXG4gICAqIHRvIHRoZSBlbnRpdGllcyBpbiB0aGUgc3RvcmUgb3JcbiAgICogU2xpY2UgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgb2JzOiBPYnNlcnZhYmxlPEVbXT4gPSB0aGlzLm9ic2VydmUoKTtcblxuICAvKipcbiAgICogT2JzZXJ2ZSBkZWx0YSB1cGRhdGVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogbGV0IHRvZG9zJCA9IHNvdXJjZS5vYnNlcnZlRGVsdGEoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZURlbHRhKCk6IE9ic2VydmFibGU8RGVsdGE8RT4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlEZWx0YS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eS5cbiAgICpcbiAgICogQHJldHVybiBBIGhvdCB7QGxpbmsgT2JzZXJ2YWJsZX0gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RvcmUgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBjb25zdCBlbXB0eSQ6T2JzZXJ2YWJsZTxib29sZWFuPiA9IHNvdXJjZS5pc0VtcHR5KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgaXNFbXB0eSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnkucGlwZShtYXAoKGVudHJpZXM6IEVbXSkgPT4gZW50cmllcy5sZW5ndGggPT0gMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcmV0dXJuIEEgc25hcHNob3QgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RvcmUgaXMgZW1wdHkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBjb25zdCBlbXB0eTpib29sZWFuID0gc291cmNlLmlzRW1wdHlTbmFwc2hvdCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGlzRW1wdHlTbmFwc2hvdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGNvbnRhaW5lZC5cbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB0byBhcHBseSBpbiBvcmRlciB0byBmaWx0ZXIgdGhlIGNvdW50XG4gICAqL1xuICBjb3VudChwPzogUHJlZGljYXRlPEU+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBpZiAocCkge1xuICAgICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUoXG4gICAgICAgIG1hcCgoZTogRVtdKSA9PiBlLnJlZHVjZSgodG90YWwsIGUpID0+IHRvdGFsICsgKHAoZSkgPyAxIDogMCksIDApKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUobWFwKChlbnRyaWVzOiBFW10pID0+IGVudHJpZXMubGVuZ3RoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBjb250YWluZWQgaW4gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlIHRvIGFwcGx5IGluIG9yZGVyIHRvIGZpbHRlciB0aGUgY291bnRcbiAgICovXG4gIGNvdW50U25hcHNob3QocD86IFByZWRpY2F0ZTxFPik6IG51bWJlciB7XG4gICAgaWYgKHApIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkuZmlsdGVyKHApLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3Qgb2YgYWxsIGVudHJpZXMuXG4gICAqIFxuICAgKiBAcmV0dXJuIFNuYXBzaG90IGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhlIGVudGl0aWVzIHRoZSBzdG9yZSBjb250YWlucy5cbiAgICogXG4gICAqIEBleGFtcGxlIE9ic2VydmUgYSBzbmFwc2hvdCBvZiBhbGwgdGhlIGVudGl0aWVzIGluIHRoZSBzdG9yZS5cbmBgYFxubGV0IHNlbGVjdGVkVG9kb3M6VG9kb1tdID0gc291cmNlLmFsbFNuYXBzaG90KCk7XG5gYGBcbiAgICovXG4gIGFsbFNuYXBzaG90KCk6IEVbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY29udGFpbiB0aGUgaWRlbnRpZmllZCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSB0YXJnZXQgRWl0aGVyIGFuIGluc3RhbmNlIG9mIHR5cGUgYEVgIG9yIGEgYGd1aWRgIGlkZW50aWZ5aW5nIHRoZSBpbnN0YW5jZS4gXG4gICAqIEBwYXJhbSBieUlkIFdoZXRoZXIgdGhlIGxvb2t1cCBzaG91bGQgYmUgcGVyZm9ybWVkIHdpdGggdGhlIGBpZGAga2V5IHJhdGhlciB0aGFuIHRoZSBgZ3VpZGAuXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGluc3RhbmNlIGlkZW50aWZpZWQgYnkgdGhlIGd1aWQgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgICBsZXQgY29udGFpbnM6Ym9vbGVhbiA9IHNvdXJjZS5jb250YWlucyhndWlkKTtcbiAgICAgPC9wcmU+XG4gICAqL1xuICBjb250YWlucyh0YXJnZXQ6IEUgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KHRhcmdldCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQoZ3VpZCkgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGlkZW50aWZpZWQgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gdGFyZ2V0IEVpdGhlciBhbiBpbnN0YW5jZSBvZiB0eXBlIGBFYCBvciBhIGBpZGAgaWRlbnRpZnlpbmcgdGhlIGluc3RhbmNlLiBcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdGFuY2UgaWRlbnRpZmllZCBieSB0aGUgYGlkYCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgIGxldCBjb250YWluczpib29sZWFuID0gc291cmNlLmNvbnRhaW5zKGd1aWQpO1xuICAgICA8L3ByZT5cbiAgICovXG4gIGNvbnRhaW5zQnlJZCh0YXJnZXQ6IEUgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuaWRLZXldO1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIEdVSUQgcGFyYW1ldGVyXG4gICAqIGlmIGl0IGV4aXN0cyBhbmQgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZShndWlkOiBzdHJpbmcpOiBFIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChndWlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuZCByZXR1cm4gdGhlIGVudGl0eSBpZGVudGlmaWVkIGJ5IHRoZSBJRCBwYXJhbWV0ZXJcbiAgICogaWYgaXQgZXhpc3RzIGFuZCByZXR1cm4gaXQuXG4gICAqXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZUJ5SUQoaWQ6IHN0cmluZyk6IEUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIHRoZSBlbnRyaWVzIHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB1c2VkIHRvIHF1ZXJ5IGZvciB0aGUgc2VsZWN0aW9uLlxuICAgKiBAcmV0dXJuIEEgc25hcHNob3QgYXJyYXkgY29udGFpbmluZyB0aGUgZW50aXRpZXMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBTZWxlY3QgYWxsIHRoZSBUb2RvIGluc3RhbmNlcyB3aGVyZSB0aGUgdGl0bGUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAxMDAuXG4gICAqIGBgYFxuICAgKiBsZXQgdG9kb3M6VG9kb1tdPXN0b3JlLnNlbGVjdCh0b2RvPT50b2RvLnRpdGxlLmxlbmd0aD4xMDApO1xuICAgKiBgYGBcbiAgICovXG4gIHNlbGVjdChwOiBQcmVkaWNhdGU8RT4pOiBFW10ge1xuICAgIGNvbnN0IHNlbGVjdGVkOiBFW10gPSBbXTtcbiAgICBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgc2VsZWN0ZWQucHVzaChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBHVUlEXG4gICAqIEBwYXJhbSBlMSBUaGUgZmlyc3QgZW50aXR5XG4gICAqIEBwYXJhbSBlMiBUaGUgc2Vjb25kIGVudGl0eVxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR3byBlbnRpdGllcyBoYXZlIGVxdWFsIEdVSUQgaWRzXG4gICAqXG4gICAqIEBleGFtcGxlIENvbXBhcmUgdG9kbzEgd2l0aCB0b2RvMiBieSBnaWQuXG4gICAqIGBgYFxuICAgKiBpZiAoZXF1YWxzQnlHVUlEKHRvZG8xLCB0b2RvMikpey4uLn07XG4gICAqIGBgYFxuICAgKi9cbiAgZXF1YWxzQnlHVUlEKGUxOiBhbnksIGUyOiBhbnkpIHtcbiAgICByZXR1cm4gZTFbdGhpcy5HVUlEX0tFWV0gPT0gZTJbdGhpcy5HVUlEX0tFWV07XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBJRFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBJRCBpZHNcbiAgICpcbiAgICogQGV4YW1wbGUgQ29tcGFyZSB0b2RvMSB3aXRoIHRvZG8yIGJ5IGlkLlxuICAgKlxuICAgKiBgYGBcbiAgICogaWYgKGVxdWFsc0J5SUQodG9kbzEsIHRvZG8yKSl7Li4ufTtcbiAgICogYGBgXG4gICAqL1xuICBlcXVhbHNCeUlEKGUxOiBhbnksIGUyOiBhbnkpIHtcbiAgICByZXR1cm4gZTFbdGhpcy5JRF9LRVldID09IGUyW3RoaXMuSURfS0VZXTtcbiAgfVxuICAvKipcbiAgICogQ2FsbHMgY29tcGxldGUgb24gYWxsIHtAbGluayBSZXBsYXlTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqXG4gICAqIENhbGwgZGVzdHJveSB3aGVuIGRpc3Bvc2luZyBvZiB0aGUgc3RvcmUuXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMubm90aWZ5LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5ub3RpZnlEZWx0YS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubm90aWZ5UXVlcnkuY29tcGxldGUoKTtcbiAgfVxufVxuIl19