@myrmidon/paged-data-browsers 2.0.4 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,419 +0,0 @@
1
- import { BehaviorSubject, forkJoin, of, tap } from 'rxjs';
2
- import { LRUCache } from './lru-cache';
3
- import { DEFAULT_PAGED_LIST_STORE_OPTIONS } from './paged-list.store';
4
- /**
5
- * A store for the node browser component. This store is used to keep a
6
- * list of nodes, and to load them from the API. It also keeps the root
7
- * node. Every tree node in the list is extended with page number,
8
- * page count and total items, plus expansion-related metadata.
9
- * The store keeps a flat list of these tree nodes, allowing users to
10
- * expand and collapse them.
11
- * F is the type of the filter object, E is the type of the paged tree nodes.
12
- */
13
- export class PagedTreeStore {
14
- /**
15
- * The size of nodes pages in this store. If you change it, the store
16
- * is reset. The default value is 20.
17
- */
18
- get pageSize() {
19
- return this._pageSize;
20
- }
21
- set pageSize(value) {
22
- if (this._pageSize === value) {
23
- return;
24
- }
25
- this._pageSize = value;
26
- this.reset();
27
- }
28
- /**
29
- * Create an instance of the store.
30
- * @param _service The service used to load nodes.
31
- * @param options The options to configure this store.
32
- */
33
- constructor(_service, options = DEFAULT_PAGED_LIST_STORE_OPTIONS) {
34
- this._service = _service;
35
- this._pageSize = options.pageSize;
36
- this._cache = new LRUCache(options.cacheSize);
37
- this._customCacheKeyBuilder = options.buildCacheKey;
38
- this._nodes$ = new BehaviorSubject([]);
39
- this.nodes$ = this._nodes$.asObservable();
40
- this._filter$ = new BehaviorSubject({});
41
- this.filter$ = this._filter$.asObservable();
42
- this._dirty = true;
43
- this._hasMockRoot = options.hasMockRoot || false;
44
- }
45
- /**
46
- * Gets the global filter, eventually overridden with values
47
- * from the specified node's filter.
48
- * @param node The optional node.
49
- * @returns The filter.
50
- */
51
- getFilter(node) {
52
- return node?.filter
53
- ? {
54
- ...this._filter$.value,
55
- ...node.filter,
56
- }
57
- : this._filter$.value;
58
- }
59
- /**
60
- * Checks if this store is empty.
61
- * @returns True if this store is empty.
62
- */
63
- isEmpty() {
64
- return this._nodes$.value.length === 0;
65
- }
66
- /**
67
- * Gets all the nodes in the store.
68
- * @returns The nodes.
69
- */
70
- getNodes() {
71
- return this._nodes$.value;
72
- }
73
- /**
74
- * Get the root node of the tree.
75
- * @returns The root node of the tree or undefined if empty.
76
- */
77
- getRootNode() {
78
- return this._nodes$.value[0];
79
- }
80
- /**
81
- * Build the cache key for the given page number and filter.
82
- * The default implementation just returns a stringified object
83
- * containing the page number and the filter. You may override
84
- * this method to provide a custom cache key.
85
- * @param pageNumber The page number.
86
- * @param filter The filter.
87
- * @returns A string to be used as cache key.
88
- */
89
- buildCacheKey(pageNumber, filter) {
90
- if (this._customCacheKeyBuilder) {
91
- return this._customCacheKeyBuilder(pageNumber, filter);
92
- }
93
- return JSON.stringify({ pageNumber, ...filter });
94
- }
95
- /**
96
- * Get the specified page of nodes, either from cache or from the server.
97
- * When the page is retrieved from the server, it is stored in cache.
98
- * @param filter The filter to apply.
99
- * @param pageNumber The page number to get.
100
- * @returns Observable of the page of nodes.
101
- */
102
- getPageFromCacheOrServer(filter, pageNumber) {
103
- const key = this.buildCacheKey(pageNumber, filter);
104
- const pageInCache = this._cache.get(key);
105
- if (pageInCache) {
106
- return of(pageInCache);
107
- }
108
- else {
109
- return this._service
110
- .getNodes(filter, pageNumber, this._pageSize, this._hasMockRoot)
111
- .pipe(tap((page) => {
112
- this._cache.put(key, page, 0);
113
- }));
114
- }
115
- }
116
- /**
117
- * Create paged tree nodes from a page of tree nodes, by providing further
118
- * metadata like page number, page count and total items.
119
- * @param page The page to create nodes from.
120
- * @returns Paged nodes.
121
- */
122
- createPageNodes(page) {
123
- return page.items.map((n) => {
124
- return {
125
- ...n,
126
- hasChildren: n.hasChildren,
127
- paging: {
128
- pageNumber: page.pageNumber,
129
- pageCount: page.pageCount,
130
- total: page.total,
131
- },
132
- };
133
- });
134
- }
135
- /**
136
- * Sets the filter for this store. Whenever the filter is set,
137
- * the store is reset.
138
- * @param filter The filter.
139
- * @returns true if tree was changed, false otherwise.
140
- */
141
- setFilter(filter) {
142
- if (this._filter$.value === filter) {
143
- return Promise.resolve(false);
144
- }
145
- this._filter$.next(filter);
146
- this._dirty = true;
147
- return this.reset();
148
- }
149
- /**
150
- * Reset the store, loading the root nodes and their children.
151
- * @returns true if tree was changed, false otherwise.
152
- */
153
- reset() {
154
- if (!this._dirty) {
155
- return Promise.resolve(false);
156
- }
157
- this._cache.clear();
158
- const filter = this._filter$.value;
159
- return new Promise((resolve, reject) => {
160
- this._service
161
- .getNodes({
162
- ...filter,
163
- parentId: undefined,
164
- }, 1, this._pageSize, this._hasMockRoot)
165
- .subscribe({
166
- next: (page) => {
167
- this._nodes$.next(this.createPageNodes(page));
168
- // get the children of each node thus calculating their hasChildren property
169
- const childrenObservables = this._nodes$.value.map((node) => this.getPageFromCacheOrServer({ ...filter, parentId: node.id }, 1));
170
- forkJoin(childrenObservables).subscribe((childrenPages) => {
171
- childrenPages.forEach((page, i) => {
172
- this._nodes$.value[i].hasChildren = page.total > 0;
173
- });
174
- });
175
- this._dirty = false;
176
- resolve(true);
177
- },
178
- error: (error) => {
179
- reject(error);
180
- },
181
- });
182
- });
183
- }
184
- /**
185
- * Set the node filter for the node with the specified ID.
186
- * @param id The node ID.
187
- * @param filter The filter to set.
188
- * @returns Promise with true if filter was set, false otherwise.
189
- */
190
- setNodeFilter(id, filter) {
191
- if (!id) {
192
- return Promise.resolve(false);
193
- }
194
- return new Promise((resolve, reject) => {
195
- const node = this._nodes$.value.find((n) => n.id === id);
196
- if (!node) {
197
- reject(`Node ID ${id} not found in store`);
198
- }
199
- node.filter = filter || undefined;
200
- return this.changePage(id, 1);
201
- });
202
- }
203
- /**
204
- * Expand the node with the specified ID. If the node is not expandable,
205
- * or it is already expanded, this method does nothing.
206
- * @param node The ID of the node to expand.
207
- * @returns Promise with true if the node was expanded, false otherwise.
208
- */
209
- expand(id) {
210
- if (!id) {
211
- return Promise.resolve(false);
212
- }
213
- return new Promise((resolve, reject) => {
214
- const node = this._nodes$.value.find((n) => n.id === id);
215
- if (!node || node.hasChildren === false || node.expanded) {
216
- resolve(false);
217
- }
218
- this.getPageFromCacheOrServer({ ...this.getFilter(node), parentId: id }, 1).subscribe((page) => {
219
- // no children, set hasChildren to false
220
- if (!page.total) {
221
- node.hasChildren = false;
222
- resolve(false);
223
- }
224
- else {
225
- this._dirty = true;
226
- // insert page nodes after the current node
227
- const nodes = this._nodes$.value;
228
- const index = nodes.indexOf(node);
229
- if (index === -1) {
230
- reject(`Node ID ${id} not found in store`);
231
- }
232
- else {
233
- const pageNodes = this.createPageNodes(page);
234
- nodes.splice(index + 1, 0, ...pageNodes);
235
- this._nodes$.next(nodes);
236
- node.hasChildren = true;
237
- node.expanded = true;
238
- resolve(true);
239
- }
240
- }
241
- });
242
- });
243
- }
244
- /**
245
- * Expand all the descendants of the node with the specified ID.
246
- *
247
- * @param id The ID of the node to expand.
248
- * @returns Promise.
249
- */
250
- expandAll(id) {
251
- if (!id) {
252
- return Promise.resolve(false);
253
- }
254
- // get the parent node to start from
255
- const nodes = this._nodes$.value;
256
- const nodeIndex = nodes.findIndex((n) => n.id === id);
257
- if (nodeIndex === -1) {
258
- return Promise.resolve(false);
259
- }
260
- // collect all the descendant nodes IDs
261
- let i = nodeIndex + 1;
262
- while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {
263
- i++;
264
- }
265
- const nodesToExpand = nodes.slice(nodeIndex, i).map((n) => n.id);
266
- // expand all the descendant nodes
267
- return new Promise((resolve, reject) => {
268
- nodesToExpand.forEach((id) => {
269
- this.expand(id);
270
- this.expandAll(id);
271
- });
272
- resolve(true);
273
- });
274
- }
275
- getChildren(id) {
276
- const node = this._nodes$.value.find((n) => n.id === id);
277
- if (!node || node.hasChildren === false) {
278
- return [];
279
- }
280
- const nodes = this._nodes$.value;
281
- const index = nodes.indexOf(node);
282
- if (index === -1) {
283
- return [];
284
- }
285
- const children = [];
286
- let i = index + 1;
287
- while (i < nodes.length && nodes[i].y > node.y) {
288
- children.push(nodes[i]);
289
- i++;
290
- }
291
- return children;
292
- }
293
- removeDescendants(nodes, nodeIndex) {
294
- let i = nodeIndex + 1;
295
- while (i < nodes.length && nodes[i].y > nodes[nodeIndex].y) {
296
- i++;
297
- }
298
- nodes.splice(nodeIndex + 1, i - nodeIndex - 1);
299
- }
300
- /**
301
- * Collapse the node with the specified ID. If the node is not expandable,
302
- * or it is already collapsed, this method does nothing.
303
- * @param node The node to collapse.
304
- * @returns Promise with true if the node was collapsed, false otherwise.
305
- */
306
- collapse(id) {
307
- if (!id) {
308
- return Promise.resolve(false);
309
- }
310
- return new Promise((resolve, reject) => {
311
- const node = this._nodes$.value.find((n) => n.id === id);
312
- if (!node || node.hasChildren === false || !node.expanded) {
313
- resolve(false);
314
- }
315
- // remove all the descendant nodes after the current node
316
- const nodes = this._nodes$.value;
317
- const nodeIndex = nodes.indexOf(node);
318
- if (nodeIndex === -1) {
319
- reject(`Node ID ${id} not found in store`);
320
- }
321
- else {
322
- this._dirty = true;
323
- this.removeDescendants(nodes, nodeIndex);
324
- this._nodes$.next(nodes);
325
- node.expanded = false;
326
- resolve(true);
327
- }
328
- });
329
- }
330
- /**
331
- * Change the page including the node with the specified ID.
332
- * @param parentId The ID of the parent node whose children are inside the page
333
- * you want to change.
334
- * @param pageNumber The new page number.
335
- * @returns Promise with true if the page was changed, false otherwise.
336
- */
337
- changePage(parentId, pageNumber) {
338
- return new Promise((resolve, reject) => {
339
- // get the parent node
340
- const parentNode = this._nodes$.value.find((n) => n.id === parentId);
341
- if (!parentNode) {
342
- resolve(false);
343
- }
344
- // get the page
345
- this.getPageFromCacheOrServer({ ...this.getFilter(parentNode), parentId }, pageNumber).subscribe((page) => {
346
- // if page is empty do nothing
347
- if (!page.total) {
348
- resolve(false);
349
- }
350
- else {
351
- this._dirty = true;
352
- // remove all the nodes in the same page of node
353
- // with all their descendants
354
- const nodes = this._nodes$.value;
355
- const nodeIndex = nodes.indexOf(parentNode) + 1;
356
- const pageNodes = this.createPageNodes(page);
357
- // find the first node of the node's page
358
- let start = nodeIndex;
359
- const oldPageNr = nodes[start].paging.pageNumber;
360
- while (start > 0 &&
361
- nodes[start - 1].parentId === parentId &&
362
- nodes[start - 1].paging.pageNumber === oldPageNr) {
363
- start--;
364
- }
365
- // find the last node of the node's page,
366
- // including all their descendants
367
- let end = start;
368
- const y = nodes[start].y;
369
- while (end < nodes.length && nodes[end].y >= y) {
370
- end++;
371
- }
372
- // replace all these nodes with the new ones
373
- nodes.splice(start, end - start);
374
- nodes.splice(start, 0, ...pageNodes);
375
- // update the parent node paging info
376
- parentNode.paging.pageNumber = page.pageNumber;
377
- this._nodes$.next(nodes);
378
- resolve(true);
379
- }
380
- });
381
- });
382
- }
383
- /**
384
- * Collapse all the nodes in the store.
385
- */
386
- collapseAll() {
387
- if (this.isEmpty()) {
388
- return;
389
- }
390
- // collapse the first node
391
- const root = this._nodes$.value[0];
392
- this.collapse(root.id);
393
- }
394
- /**
395
- * Clear the store. The cache is cleared and the nodes are removed.
396
- */
397
- clear() {
398
- this._cache.clear();
399
- this._nodes$.next([]);
400
- this._dirty = true;
401
- }
402
- /**
403
- * Clear the cache.
404
- */
405
- clearCache() {
406
- this._cache.clear();
407
- }
408
- /**
409
- * Check if the page with the given number and filter is in cache.
410
- * @param pageNumber The page number.
411
- * @param filter The filter.
412
- * @returns True if the page is in cache, false otherwise.
413
- */
414
- hasCachedPage(pageNumber, filter) {
415
- const key = this.buildCacheKey(pageNumber, filter);
416
- return this._cache.has(key);
417
- }
418
- }
419
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZWQtdHJlZS5zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL2xpYi9zZXJ2aWNlcy9wYWdlZC10cmVlLnN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWMsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQTZGdEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQTRCekI7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFlBQ1UsUUFBa0MsRUFDMUMsVUFBaUMsZ0NBQWdDO1FBRHpELGFBQVEsR0FBUixRQUFRLENBQTBCO1FBRzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFxQixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBTSxF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TSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVTtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksYUFBYSxDQUFDLFVBQWtCLEVBQUUsTUFBUztRQUNoRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IERhdGFQYWdlIH0gZnJvbSAnQG15cm1pZG9uL25nLXRvb2xzJztcclxuXHJcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi9scnUtY2FjaGUnO1xyXG5pbXBvcnQgeyBERUZBVUxUX1BBR0VEX0xJU1RfU1RPUkVfT1BUSU9OUyB9IGZyb20gJy4vcGFnZWQtbGlzdC5zdG9yZSc7XHJcblxyXG4vKipcclxuICogQSB0cmVlIG5vZGUuIFlvdXIgZGF0YSBzZXJ2aWNlIHNob3VsZCByZXR1cm4gYSBsaXN0IG9mIHRoZXNlIG5vZGVzXHJcbiAqIG9yIG9mIGFueSB0eXBlIGV4dGVuZGluZyB0aGlzIGludGVyZmFjZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZU5vZGUge1xyXG4gIGlkOiBudW1iZXI7XHJcbiAgcGFyZW50SWQ/OiBudW1iZXI7XHJcbiAgeTogbnVtYmVyO1xyXG4gIHg6IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHRhZz86IHN0cmluZztcclxuICBoYXNDaGlsZHJlbj86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGZpbHRlciBmb3IgdHJlZSBub2Rlcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZU5vZGVGaWx0ZXIge1xyXG4gIHRhZ3M/OiBzdHJpbmdbXTtcclxuICBwYXJlbnRJZD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFBhZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBwYWdlZCB0cmVlIG5vZGUuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2luZ0luZm8ge1xyXG4gIHBhZ2VOdW1iZXI6IG51bWJlcjtcclxuICBwYWdlQ291bnQ6IG51bWJlcjtcclxuICB0b3RhbDogbnVtYmVyO1xyXG59XHJcblxyXG4vKipcclxuICogQSB0cmVlIG5vZGUgd2l0aCBwYWdpbmcgaW5mb3JtYXRpb24sIHVzZWQgaW4gTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlTm9kZTxGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXI+IGV4dGVuZHMgVHJlZU5vZGUge1xyXG4gIHBhZ2luZzogUGFnaW5nSW5mbztcclxuICBleHBhbmRlZD86IGJvb2xlYW47XHJcbiAgZmlsdGVyPzogRjtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBpbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZpY2UgdXNlZCBieSBOb2RlQnJvd3NlclN0b3JlXHJcbiAqIHRvIGxvYWQgbm9kZXMuXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkVHJlZVN0b3JlU2VydmljZTxGIGV4dGVuZHMgVHJlZU5vZGVGaWx0ZXI+IHtcclxuICAvKipcclxuICAgKiBHZXQgdGhlIHNwZWNpZmllZCBwYWdlIG9mIG5vZGVzLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIHBhZ2VTaXplIFRoZSBwYWdlIHNpemUuXHJcbiAgICogQHBhcmFtIGhhc01vY2tSb290IElmIHRydWUsIHRoZSByb290IG5vZGUgaXMgYSBtb2NrIG5vZGUgcHJvdmlkZWQgYnkgeW91clxyXG4gICAqIHNlcnZpY2UsIHdoaWNoIGltcGxpZXMgdGhhdCBpdHMgWSB2YWx1ZSBpcyAwIHJhdGhlciB0aGFuIDEuIERlZmF1bHQgaXNcclxuICAgKiBmYWxzZSwgbWVhbmluZyB0aGF0IHlvdXIgc2VydmljZSB3aWxsIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUgd2l0aCBZXHJcbiAgICogdmFsdWUgMS5cclxuICAgKi9cclxuICBnZXROb2RlcyhcclxuICAgIGZpbHRlcjogRixcclxuICAgIHBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXIsXHJcbiAgICBoYXNNb2NrUm9vdD86IGJvb2xlYW5cclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPcHRpb25zIGZvciB0aGUgTm9kZUJyb3dzZXJTdG9yZS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZWRUcmVlU3RvcmVPcHRpb25zIHtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBwYWdlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcGFnZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgZm9yIHBhZ2VzIGluIHRoZSBzdG9yZS5cclxuICAgKi9cclxuICBjYWNoZVNpemU6IG51bWJlcjtcclxuICAvKipcclxuICAgKiBBIGN1c3RvbSBmdW5jdGlvbiBmb3IgYnVpbGRpbmcgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyXHJcbiAgICogYW5kIGZpbHRlci5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIGJ1aWxkQ2FjaGVLZXk/OiAocGFnZU51bWJlcjogbnVtYmVyLCBmaWx0ZXI6IGFueSkgPT4gc3RyaW5nO1xyXG4gIC8qKlxyXG4gICAqIElmIHRydWUsIHRoZSByb290IG5vZGUgaXMgYSBtb2NrIG5vZGUgcHJvdmlkZWQgYnkgeW91ciBzZXJ2aWNlLCB3aGljaFxyXG4gICAqIGltcGxpZXMgdGhhdCBpdHMgWSB2YWx1ZSBpcyAwIHJhdGhlciB0aGFuIDEuIERlZmF1bHQgaXMgZmFsc2UsIG1lYW5pbmdcclxuICAgKiB0aGF0IHlvdXIgc2VydmljZSB3aWxsIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUgd2l0aCBZIHZhbHVlIDEuXHJcbiAgICovXHJcbiAgaGFzTW9ja1Jvb3Q/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogQSBzdG9yZSBmb3IgdGhlIG5vZGUgYnJvd3NlciBjb21wb25lbnQuIFRoaXMgc3RvcmUgaXMgdXNlZCB0byBrZWVwIGFcclxuICogbGlzdCBvZiBub2RlcywgYW5kIHRvIGxvYWQgdGhlbSBmcm9tIHRoZSBBUEkuIEl0IGFsc28ga2VlcHMgdGhlIHJvb3RcclxuICogbm9kZS4gRXZlcnkgdHJlZSBub2RlIGluIHRoZSBsaXN0IGlzIGV4dGVuZGVkIHdpdGggcGFnZSBudW1iZXIsXHJcbiAqIHBhZ2UgY291bnQgYW5kIHRvdGFsIGl0ZW1zLCBwbHVzIGV4cGFuc2lvbi1yZWxhdGVkIG1ldGFkYXRhLlxyXG4gKiBUaGUgc3RvcmUga2VlcHMgYSBmbGF0IGxpc3Qgb2YgdGhlc2UgdHJlZSBub2RlcywgYWxsb3dpbmcgdXNlcnMgdG9cclxuICogZXhwYW5kIGFuZCBjb2xsYXBzZSB0aGVtLlxyXG4gKiBGIGlzIHRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIgb2JqZWN0LCBFIGlzIHRoZSB0eXBlIG9mIHRoZSBwYWdlZCB0cmVlIG5vZGVzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBhZ2VkVHJlZVN0b3JlPFxyXG4gIEUgZXh0ZW5kcyBQYWdlZFRyZWVOb2RlPEY+LFxyXG4gIEYgZXh0ZW5kcyBUcmVlTm9kZUZpbHRlclxyXG4+IHtcclxuICBwcml2YXRlIF9ub2RlcyQ6IEJlaGF2aW9yU3ViamVjdDxFW10+O1xyXG4gIHByaXZhdGUgX2ZpbHRlciQ6IEJlaGF2aW9yU3ViamVjdDxGPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jdXN0b21DYWNoZUtleUJ1aWxkZXI/OiAoXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBmaWx0ZXI6IGFueVxyXG4gICkgPT4gc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NhY2hlOiBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+O1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc01vY2tSb290OiBib29sZWFuO1xyXG5cclxuICBwcml2YXRlIF9wYWdlU2l6ZTogbnVtYmVyO1xyXG4gIC8vIGRpcnR5IHN0YXRlOiB0aGlzIGlzIHJlc2V0IHdoZW4gdGhlIHN0b3JlIGlzIHJlc2V0LCBhbmQgc2V0IHRvIHRydWVcclxuICAvLyB3aGVuIHRoZSBzdG9yZSBpcyBjaGFuZ2VkXHJcbiAgcHJpdmF0ZSBfZGlydHk/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgZmxhdCBsaXN0IG9mIHBhZ2VkIG5vZGVzIGluIHRoaXMgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIG5vZGVzJDogT2JzZXJ2YWJsZTxSZWFkb25seTxFW10+PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGdsb2JhbCBmaWx0ZXIgZm9yIGFsbCB0aGUgbm9kZXMuXHJcbiAgICovXHJcbiAgcHVibGljIGZpbHRlciQ6IE9ic2VydmFibGU8UmVhZG9ubHk8Rj4+O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiBub2RlcyBwYWdlcyBpbiB0aGlzIHN0b3JlLiBJZiB5b3UgY2hhbmdlIGl0LCB0aGUgc3RvcmVcclxuICAgKiBpcyByZXNldC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMjAuXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBwYWdlU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VTaXplO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHBhZ2VTaXplKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLl9wYWdlU2l6ZSA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcGFnZVNpemUgPSB2YWx1ZTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc3RvcmUuXHJcbiAgICogQHBhcmFtIF9zZXJ2aWNlIFRoZSBzZXJ2aWNlIHVzZWQgdG8gbG9hZCBub2Rlcy5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB0byBjb25maWd1cmUgdGhpcyBzdG9yZS5cclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFBhZ2VkVHJlZVN0b3JlU2VydmljZTxGPixcclxuICAgIG9wdGlvbnM6IFBhZ2VkVHJlZVN0b3JlT3B0aW9ucyA9IERFRkFVTFRfUEFHRURfTElTVF9TVE9SRV9PUFRJT05TXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemU7XHJcbiAgICB0aGlzLl9jYWNoZSA9IG5ldyBMUlVDYWNoZTxEYXRhUGFnZTxUcmVlTm9kZT4+KG9wdGlvbnMuY2FjaGVTaXplKTtcclxuICAgIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlciA9IG9wdGlvbnMuYnVpbGRDYWNoZUtleTtcclxuICAgIHRoaXMuX25vZGVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RVtdPihbXSk7XHJcbiAgICB0aGlzLm5vZGVzJCA9IHRoaXMuX25vZGVzJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2ZpbHRlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEY+KHt9IGFzIEYpO1xyXG4gICAgdGhpcy5maWx0ZXIkID0gdGhpcy5fZmlsdGVyJC5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuX2RpcnR5ID0gdHJ1ZTtcclxuICAgIHRoaXMuX2hhc01vY2tSb290ID0gb3B0aW9ucy5oYXNNb2NrUm9vdCB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgdGhlIGdsb2JhbCBmaWx0ZXIsIGV2ZW50dWFsbHkgb3ZlcnJpZGRlbiB3aXRoIHZhbHVlc1xyXG4gICAqIGZyb20gdGhlIHNwZWNpZmllZCBub2RlJ3MgZmlsdGVyLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBvcHRpb25hbCBub2RlLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmaWx0ZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRGaWx0ZXIobm9kZT86IFBhZ2VkVHJlZU5vZGU8Rj4pOiBGIHtcclxuICAgIHJldHVybiBub2RlPy5maWx0ZXJcclxuICAgICAgPyB7XHJcbiAgICAgICAgICAuLi50aGlzLl9maWx0ZXIkLnZhbHVlLFxyXG4gICAgICAgICAgLi4ubm9kZS5maWx0ZXIsXHJcbiAgICAgICAgfVxyXG4gICAgICA6IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgdGhpcyBzdG9yZSBpcyBlbXB0eS5cclxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoaXMgc3RvcmUgaXMgZW1wdHkuXHJcbiAgICovXHJcbiAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlLmxlbmd0aCA9PT0gMDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICogQHJldHVybnMgVGhlIG5vZGVzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXROb2RlcygpOiBSZWFkb25seTxQYWdlZFRyZWVOb2RlPEY+W10+IHtcclxuICAgIHJldHVybiB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZS5cclxuICAgKiBAcmV0dXJucyBUaGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIG9yIHVuZGVmaW5lZCBpZiBlbXB0eS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Um9vdE5vZGUoKTogUGFnZWRUcmVlTm9kZTxGPiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbm9kZXMkLnZhbHVlWzBdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmVuIHBhZ2UgbnVtYmVyIGFuZCBmaWx0ZXIuXHJcbiAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIGEgc3RyaW5naWZpZWQgb2JqZWN0XHJcbiAgICogY29udGFpbmluZyB0aGUgcGFnZSBudW1iZXIgYW5kIHRoZSBmaWx0ZXIuIFlvdSBtYXkgb3ZlcnJpZGVcclxuICAgKiB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGEgY3VzdG9tIGNhY2hlIGtleS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgY2FjaGUga2V5LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBidWlsZENhY2hlS2V5KHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLl9jdXN0b21DYWNoZUtleUJ1aWxkZXIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbUNhY2hlS2V5QnVpbGRlcihwYWdlTnVtYmVyLCBmaWx0ZXIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgcGFnZU51bWJlciwgLi4uZmlsdGVyIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBzcGVjaWZpZWQgcGFnZSBvZiBub2RlcywgZWl0aGVyIGZyb20gY2FjaGUgb3IgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIFdoZW4gdGhlIHBhZ2UgaXMgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlciwgaXQgaXMgc3RvcmVkIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB0byBhcHBseS5cclxuICAgKiBAcGFyYW0gcGFnZU51bWJlciBUaGUgcGFnZSBudW1iZXIgdG8gZ2V0LlxyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgdGhlIHBhZ2Ugb2Ygbm9kZXMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICBmaWx0ZXI6IEYsXHJcbiAgICBwYWdlTnVtYmVyOiBudW1iZXJcclxuICApOiBPYnNlcnZhYmxlPERhdGFQYWdlPFRyZWVOb2RlPj4ge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZENhY2hlS2V5KHBhZ2VOdW1iZXIsIGZpbHRlcik7XHJcbiAgICBjb25zdCBwYWdlSW5DYWNoZSA9IHRoaXMuX2NhY2hlLmdldChrZXkpO1xyXG5cclxuICAgIGlmIChwYWdlSW5DYWNoZSkge1xyXG4gICAgICByZXR1cm4gb2YocGFnZUluQ2FjaGUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VcclxuICAgICAgICAuZ2V0Tm9kZXMoZmlsdGVyLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlU2l6ZSwgdGhpcy5faGFzTW9ja1Jvb3QpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YXAoKHBhZ2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGUucHV0KGtleSwgcGFnZSwgMCk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgcGFnZWQgdHJlZSBub2RlcyBmcm9tIGEgcGFnZSBvZiB0cmVlIG5vZGVzLCBieSBwcm92aWRpbmcgZnVydGhlclxyXG4gICAqIG1ldGFkYXRhIGxpa2UgcGFnZSBudW1iZXIsIHBhZ2UgY291bnQgYW5kIHRvdGFsIGl0ZW1zLlxyXG4gICAqIEBwYXJhbSBwYWdlIFRoZSBwYWdlIHRvIGNyZWF0ZSBub2RlcyBmcm9tLlxyXG4gICAqIEByZXR1cm5zIFBhZ2VkIG5vZGVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlUGFnZU5vZGVzKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPik6IEVbXSB7XHJcbiAgICByZXR1cm4gcGFnZS5pdGVtcy5tYXAoKG4pID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICAuLi5uLFxyXG4gICAgICAgIGhhc0NoaWxkcmVuOiBuLmhhc0NoaWxkcmVuLFxyXG4gICAgICAgIHBhZ2luZzoge1xyXG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZS5wYWdlTnVtYmVyLFxyXG4gICAgICAgICAgcGFnZUNvdW50OiBwYWdlLnBhZ2VDb3VudCxcclxuICAgICAgICAgIHRvdGFsOiBwYWdlLnRvdGFsLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gYXMgRTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgZmlsdGVyIGZvciB0aGlzIHN0b3JlLiBXaGVuZXZlciB0aGUgZmlsdGVyIGlzIHNldCxcclxuICAgKiB0aGUgc3RvcmUgaXMgcmVzZXQuXHJcbiAgICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLlxyXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdHJlZSB3YXMgY2hhbmdlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRGaWx0ZXIoZmlsdGVyOiBGKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5fZmlsdGVyJC52YWx1ZSA9PT0gZmlsdGVyKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZmlsdGVyJC5uZXh0KGZpbHRlcik7XHJcbiAgICB0aGlzLl9kaXJ0eSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIHN0b3JlLCBsb2FkaW5nIHRoZSByb290IG5vZGVzIGFuZCB0aGVpciBjaGlsZHJlbi5cclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRyZWUgd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuX2RpcnR5KSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuX2ZpbHRlciQudmFsdWU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5fc2VydmljZVxyXG4gICAgICAgIC5nZXROb2RlcyhcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgLi4uZmlsdGVyLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIDEsXHJcbiAgICAgICAgICB0aGlzLl9wYWdlU2l6ZSxcclxuICAgICAgICAgIHRoaXMuX2hhc01vY2tSb290XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKHBhZ2U6IERhdGFQYWdlPFRyZWVOb2RlPikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9ub2RlcyQubmV4dCh0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZXQgdGhlIGNoaWxkcmVuIG9mIGVhY2ggbm9kZSB0aHVzIGNhbGN1bGF0aW5nIHRoZWlyIGhhc0NoaWxkcmVuIHByb3BlcnR5XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuT2JzZXJ2YWJsZXMgPSB0aGlzLl9ub2RlcyQudmFsdWUubWFwKChub2RlKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0UGFnZUZyb21DYWNoZU9yU2VydmVyKHsgLi4uZmlsdGVyLCBwYXJlbnRJZDogbm9kZS5pZCB9LCAxKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBmb3JrSm9pbihjaGlsZHJlbk9ic2VydmFibGVzKS5zdWJzY3JpYmUoKGNoaWxkcmVuUGFnZXMpID0+IHtcclxuICAgICAgICAgICAgICBjaGlsZHJlblBhZ2VzLmZvckVhY2goKHBhZ2UsIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vZGVzJC52YWx1ZVtpXS5oYXNDaGlsZHJlbiA9IHBhZ2UudG90YWwgPiAwO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RpcnR5ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBub2RlIGZpbHRlciBmb3IgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELlxyXG4gICAqIEBwYXJhbSBpZCBUaGUgbm9kZSBJRC5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gc2V0LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIGZpbHRlciB3YXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIHNldE5vZGVGaWx0ZXIoaWQ6IG51bWJlciwgZmlsdGVyPzogRiB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlKSB7XHJcbiAgICAgICAgcmVqZWN0KGBOb2RlIElEICR7aWR9IG5vdCBmb3VuZCBpbiBzdG9yZWApO1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUhLmZpbHRlciA9IGZpbHRlciB8fCB1bmRlZmluZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZVBhZ2UoaWQsIDEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGV4cGFuZGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuXHJcbiAgICogQHBhcmFtIG5vZGUgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1ZSBpZiB0aGUgbm9kZSB3YXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgZXhwYW5kKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBub2RlID0gdGhpcy5fbm9kZXMkLnZhbHVlLmZpbmQoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgICAgaWYgKCFub2RlIHx8IG5vZGUuaGFzQ2hpbGRyZW4gPT09IGZhbHNlIHx8IG5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihub2RlKSwgcGFyZW50SWQ6IGlkIH0sXHJcbiAgICAgICAgMVxyXG4gICAgICApLnN1YnNjcmliZSgocGFnZSkgPT4ge1xyXG4gICAgICAgIC8vIG5vIGNoaWxkcmVuLCBzZXQgaGFzQ2hpbGRyZW4gdG8gZmFsc2VcclxuICAgICAgICBpZiAoIXBhZ2UudG90YWwpIHtcclxuICAgICAgICAgIG5vZGUhLmhhc0NoaWxkcmVuID0gZmFsc2U7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gaW5zZXJ0IHBhZ2Ugbm9kZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgbm9kZVxyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSEpO1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuICAgICAgICAgICAgbm9kZXMuc3BsaWNlKGluZGV4ICsgMSwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuICAgICAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgICAgICBub2RlIS5oYXNDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIG5vZGUhLmV4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHBhbmQgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgSUQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSBub2RlIHRvIGV4cGFuZC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBleHBhbmRBbGwoaWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIC8vIGdldCB0aGUgcGFyZW50IG5vZGUgdG8gc3RhcnQgZnJvbVxyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5maW5kSW5kZXgoKG4pID0+IG4uaWQgPT09IGlkKTtcclxuICAgIGlmIChub2RlSW5kZXggPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBkZXNjZW5kYW50IG5vZGVzIElEc1xyXG4gICAgbGV0IGkgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgd2hpbGUgKGkgPCBub2Rlcy5sZW5ndGggJiYgbm9kZXNbaV0ueSA+IG5vZGVzW25vZGVJbmRleF0ueSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBjb25zdCBub2Rlc1RvRXhwYW5kID0gbm9kZXMuc2xpY2Uobm9kZUluZGV4LCBpKS5tYXAoKG4pID0+IG4uaWQpO1xyXG5cclxuICAgIC8vIGV4cGFuZCBhbGwgdGhlIGRlc2NlbmRhbnQgbm9kZXNcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIG5vZGVzVG9FeHBhbmQuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICB0aGlzLmV4cGFuZChpZCk7XHJcbiAgICAgICAgdGhpcy5leHBhbmRBbGwoaWQpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoaWxkcmVuKGlkOiBudW1iZXIpOiBFW10ge1xyXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBpZCk7XHJcbiAgICBpZiAoIW5vZGUgfHwgbm9kZS5oYXNDaGlsZHJlbiA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSk7XHJcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNoaWxkcmVuOiBFW10gPSBbXTtcclxuICAgIGxldCBpID0gaW5kZXggKyAxO1xyXG4gICAgd2hpbGUgKGkgPCBub2Rlcy5sZW5ndGggJiYgbm9kZXNbaV0ueSA+IG5vZGUueSkge1xyXG4gICAgICBjaGlsZHJlbi5wdXNoKG5vZGVzW2ldKTtcclxuICAgICAgaSsrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVEZXNjZW5kYW50cyhcclxuICAgIG5vZGVzOiBQYWdlZFRyZWVOb2RlPEY+W10sXHJcbiAgICBub2RlSW5kZXg6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgbGV0IGkgPSBub2RlSW5kZXggKyAxO1xyXG4gICAgd2hpbGUgKGkgPCBub2Rlcy5sZW5ndGggJiYgbm9kZXNbaV0ueSA+IG5vZGVzW25vZGVJbmRleF0ueSkge1xyXG4gICAgICBpKys7XHJcbiAgICB9XHJcbiAgICBub2Rlcy5zcGxpY2Uobm9kZUluZGV4ICsgMSwgaSAtIG5vZGVJbmRleCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgdGhlIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIElELiBJZiB0aGUgbm9kZSBpcyBub3QgZXhwYW5kYWJsZSxcclxuICAgKiBvciBpdCBpcyBhbHJlYWR5IGNvbGxhcHNlZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLlxyXG4gICAqIEBwYXJhbSBub2RlIFRoZSBub2RlIHRvIGNvbGxhcHNlLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVlIGlmIHRoZSBub2RlIHdhcyBjb2xsYXBzZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY29sbGFwc2UoaWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLl9ub2RlcyQudmFsdWUuZmluZCgobikgPT4gbi5pZCA9PT0gaWQpO1xyXG4gICAgICBpZiAoIW5vZGUgfHwgbm9kZS5oYXNDaGlsZHJlbiA9PT0gZmFsc2UgfHwgIW5vZGUuZXhwYW5kZWQpIHtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgZGVzY2VuZGFudCBub2RlcyBhZnRlciB0aGUgY3VycmVudCBub2RlXHJcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5fbm9kZXMkLnZhbHVlO1xyXG4gICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKG5vZGUhKTtcclxuICAgICAgaWYgKG5vZGVJbmRleCA9PT0gLTEpIHtcclxuICAgICAgICByZWplY3QoYE5vZGUgSUQgJHtpZH0gbm90IGZvdW5kIGluIHN0b3JlYCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRGVzY2VuZGFudHMobm9kZXMsIG5vZGVJbmRleCk7XHJcbiAgICAgICAgdGhpcy5fbm9kZXMkLm5leHQobm9kZXMpO1xyXG4gICAgICAgIG5vZGUhLmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2UgdGhlIHBhZ2UgaW5jbHVkaW5nIHRoZSBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBJRC5cclxuICAgKiBAcGFyYW0gcGFyZW50SWQgVGhlIElEIG9mIHRoZSBwYXJlbnQgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgaW5zaWRlIHRoZSBwYWdlXHJcbiAgICogeW91IHdhbnQgdG8gY2hhbmdlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBuZXcgcGFnZSBudW1iZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHRydWUgaWYgdGhlIHBhZ2Ugd2FzIGNoYW5nZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgY2hhbmdlUGFnZShwYXJlbnRJZDogbnVtYmVyLCBwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIGdldCB0aGUgcGFyZW50IG5vZGVcclxuICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX25vZGVzJC52YWx1ZS5maW5kKChuKSA9PiBuLmlkID09PSBwYXJlbnRJZCk7XHJcbiAgICAgIGlmICghcGFyZW50Tm9kZSkge1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBnZXQgdGhlIHBhZ2VcclxuICAgICAgdGhpcy5nZXRQYWdlRnJvbUNhY2hlT3JTZXJ2ZXIoXHJcbiAgICAgICAgeyAuLi50aGlzLmdldEZpbHRlcihwYXJlbnROb2RlKSwgcGFyZW50SWQgfSxcclxuICAgICAgICBwYWdlTnVtYmVyXHJcbiAgICAgICkuc3Vic2NyaWJlKChwYWdlKSA9PiB7XHJcbiAgICAgICAgLy8gaWYgcGFnZSBpcyBlbXB0eSBkbyBub3RoaW5nXHJcbiAgICAgICAgaWYgKCFwYWdlLnRvdGFsKSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgLy8gcmVtb3ZlIGFsbCB0aGUgbm9kZXMgaW4gdGhlIHNhbWUgcGFnZSBvZiBub2RlXHJcbiAgICAgICAgICAvLyB3aXRoIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9ub2RlcyQudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2Rlcy5pbmRleE9mKHBhcmVudE5vZGUhKSArIDE7XHJcbiAgICAgICAgICBjb25zdCBwYWdlTm9kZXMgPSB0aGlzLmNyZWF0ZVBhZ2VOb2RlcyhwYWdlKTtcclxuXHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBub2RlJ3MgcGFnZVxyXG4gICAgICAgICAgbGV0IHN0YXJ0ID0gbm9kZUluZGV4O1xyXG4gICAgICAgICAgY29uc3Qgb2xkUGFnZU5yID0gbm9kZXNbc3RhcnRdLnBhZ2luZy5wYWdlTnVtYmVyO1xyXG4gICAgICAgICAgd2hpbGUgKFxyXG4gICAgICAgICAgICBzdGFydCA+IDAgJiZcclxuICAgICAgICAgICAgbm9kZXNbc3RhcnQgLSAxXS5wYXJlbnRJZCA9PT0gcGFyZW50SWQgJiZcclxuICAgICAgICAgICAgbm9kZXNbc3RhcnQgLSAxXS5wYWdpbmcucGFnZU51bWJlciA9PT0gb2xkUGFnZU5yXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgc3RhcnQtLTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG5vZGUgb2YgdGhlIG5vZGUncyBwYWdlLFxyXG4gICAgICAgICAgLy8gaW5jbHVkaW5nIGFsbCB0aGVpciBkZXNjZW5kYW50c1xyXG4gICAgICAgICAgbGV0IGVuZCA9IHN0YXJ0O1xyXG4gICAgICAgICAgY29uc3QgeSA9IG5vZGVzW3N0YXJ0XS55O1xyXG4gICAgICAgICAgd2hpbGUgKGVuZCA8IG5vZGVzLmxlbmd0aCAmJiBub2Rlc1tlbmRdLnkgPj0geSkge1xyXG4gICAgICAgICAgICBlbmQrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIHRoZXNlIG5vZGVzIHdpdGggdGhlIG5ldyBvbmVzXHJcbiAgICAgICAgICBub2Rlcy5zcGxpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0KTtcclxuICAgICAgICAgIG5vZGVzLnNwbGljZShzdGFydCwgMCwgLi4uKHBhZ2VOb2RlcyBhcyBFW10pKTtcclxuXHJcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIHBhcmVudCBub2RlIHBhZ2luZyBpbmZvXHJcbiAgICAgICAgICBwYXJlbnROb2RlIS5wYWdpbmcucGFnZU51bWJlciA9IHBhZ2UucGFnZU51bWJlcjtcclxuICAgICAgICAgIHRoaXMuX25vZGVzJC5uZXh0KG5vZGVzKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGFwc2UgYWxsIHRoZSBub2RlcyBpbiB0aGUgc3RvcmUuXHJcbiAgICovXHJcbiAgcHVibGljIGNvbGxhcHNlQWxsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNFbXB0eSgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNvbGxhcHNlIHRoZSBmaXJzdCBub2RlXHJcbiAgICBjb25zdCByb290ID0gdGhpcy5fbm9kZXMkLnZhbHVlWzBdO1xyXG4gICAgdGhpcy5jb2xsYXBzZShyb290LmlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBzdG9yZS4gVGhlIGNhY2hlIGlzIGNsZWFyZWQgYW5kIHRoZSBub2RlcyBhcmUgcmVtb3ZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYWNoZS5jbGVhcigpO1xyXG4gICAgdGhpcy5fbm9kZXMkLm5leHQoW10pO1xyXG4gICAgdGhpcy5fZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGNhY2hlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FjaGUuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBwYWdlIHdpdGggdGhlIGdpdmVuIG51bWJlciBhbmQgZmlsdGVyIGlzIGluIGNhY2hlLlxyXG4gICAqIEBwYXJhbSBwYWdlTnVtYmVyIFRoZSBwYWdlIG51bWJlci5cclxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIuXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGFnZSBpcyBpbiBjYWNoZSwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNDYWNoZWRQYWdlKHBhZ2VOdW1iZXI6IG51bWJlciwgZmlsdGVyOiBGKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkQ2FjaGVLZXkocGFnZU51bWJlciwgZmlsdGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9jYWNoZS5oYXMoa2V5KTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,5 +0,0 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXlybWlkb24tcGFnZWQtZGF0YS1icm93c2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL215cm1pZG9uLXBhZ2VkLWRhdGEtYnJvd3NlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -1,11 +0,0 @@
1
- /*
2
- * Public API Surface of paged-data-browsers
3
- */
4
- export * from './lib/components/compact-pager/compact-pager.component';
5
- export * from './lib/components/range-view/range-view.component';
6
- export * from './lib/components/browser-tree-node/browser-tree-node.component';
7
- export * from './lib/services/paged-list.store';
8
- export * from './lib/services/paged-tree.store';
9
- export * from './lib/services/lru-cache';
10
- export * from './lib/paged-data-browsers.module';
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL3BhZ2VkLWRhdGEtYnJvd3NlcnMvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyxnRUFBZ0UsQ0FBQztBQUUvRSxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYywwQkFBMEIsQ0FBQztBQUV6QyxjQUFjLGtDQUFrQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBwYWdlZC1kYXRhLWJyb3dzZXJzXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9jb21wYWN0LXBhZ2VyL2NvbXBhY3QtcGFnZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcmFuZ2Utdmlldy9yYW5nZS12aWV3LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2Jyb3dzZXItdHJlZS1ub2RlL2Jyb3dzZXItdHJlZS1ub2RlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL3BhZ2VkLWxpc3Quc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VydmljZXMvcGFnZWQtdHJlZS5zdG9yZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9scnUtY2FjaGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL2xpYi9wYWdlZC1kYXRhLWJyb3dzZXJzLm1vZHVsZSc7XG4iXX0=