@nstudio/ui-collectionview 5.1.9-alpha.3 → 5.1.9-alpha.5

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.
@@ -56,7 +56,9 @@ export declare class CollectionViewComponent implements DoCheck, OnDestroy, Afte
56
56
  registerTemplateSupplemental(key: string, template: TemplateRef<ItemContext>, type: 'header' | 'footer'): void;
57
57
  onItemLoading(args: CollectionViewItemEventData): void;
58
58
  onItemRecyclingInternal(args: any): void;
59
+ onItemDisplayInternal(args: CollectionViewItemEventData): void;
59
60
  onItemDisposingInternal(args: any): void;
61
+ private getNgView;
60
62
  setupViewRef(view: EmbeddedViewRef<ItemContext>, data: any, index: number): void;
61
63
  getItemTemplateViewFactory(template: TemplateRef<ItemContext>): () => View;
62
64
  viewPool: Map<TemplateRef<ItemContext>, {
@@ -73,7 +75,7 @@ export declare class CollectionViewComponent implements DoCheck, OnDestroy, Afte
73
75
  private detectChangesOnChild;
74
76
  private refresh;
75
77
  static ɵfac: i0.ɵɵFactoryDeclaration<CollectionViewComponent, never>;
76
- static ɵcmp: i0.ɵɵComponentDeclaration<CollectionViewComponent, "CollectionView", never, { "autoReuseViews": "autoReuseViews"; "itemTemplate": "itemTemplate"; "headerItemTemplate": "headerItemTemplate"; "footerItemTemplate": "footerItemTemplate"; "items": "items"; }, { "setupItemView": "setupItemView"; }, ["itemTemplateQuery"], never, false, never>;
78
+ static ɵcmp: i0.ɵɵComponentDeclaration<CollectionViewComponent, "CollectionView", never, { "autoReuseViews": { "alias": "autoReuseViews"; "required": false; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; }; "headerItemTemplate": { "alias": "headerItemTemplate"; "required": false; }; "footerItemTemplate": { "alias": "footerItemTemplate"; "required": false; }; "items": { "alias": "items"; "required": false; }; }, { "setupItemView": "setupItemView"; }, ["itemTemplateQuery"], never, false, never>;
77
79
  }
78
80
  export interface ComponentView {
79
81
  rootNodes: any[];
@@ -87,7 +89,7 @@ export declare class TemplateKeyDirective {
87
89
  constructor(templateRef: TemplateRef<any>, collectionView: CollectionViewComponent);
88
90
  set cvTemplateKey(value: any);
89
91
  static ɵfac: i0.ɵɵFactoryDeclaration<TemplateKeyDirective, [null, { host: true; }]>;
90
- static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateKeyDirective, "[cvTemplateKey]", never, { "cvTemplateKey": "cvTemplateKey"; }, {}, never, never, false, never>;
92
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateKeyDirective, "[cvTemplateKey]", never, { "cvTemplateKey": { "alias": "cvTemplateKey"; "required": false; }; }, {}, never, never, false, never>;
91
93
  }
92
94
  export declare class TemplateHeaderDirective {
93
95
  private templateRef;
@@ -95,7 +97,7 @@ export declare class TemplateHeaderDirective {
95
97
  constructor(templateRef: TemplateRef<any>, collectionView: CollectionViewComponent);
96
98
  set cvTemplateHeader(value: any);
97
99
  static ɵfac: i0.ɵɵFactoryDeclaration<TemplateHeaderDirective, [null, { host: true; }]>;
98
- static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateHeaderDirective, "[cvTemplateHeader]", never, { "cvTemplateHeader": "cvTemplateHeader"; }, {}, never, never, false, never>;
100
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateHeaderDirective, "[cvTemplateHeader]", never, { "cvTemplateHeader": { "alias": "cvTemplateHeader"; "required": false; }; }, {}, never, never, false, never>;
99
101
  }
100
102
  export declare class TemplateFooterDirective {
101
103
  private templateRef;
@@ -103,5 +105,5 @@ export declare class TemplateFooterDirective {
103
105
  constructor(templateRef: TemplateRef<any>, collectionView: CollectionViewComponent);
104
106
  set cvTemplateFooter(value: any);
105
107
  static ɵfac: i0.ɵɵFactoryDeclaration<TemplateFooterDirective, [null, { host: true; }]>;
106
- static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateFooterDirective, "[cvTemplateFooter]", never, { "cvTemplateFooter": "cvTemplateFooter"; }, {}, never, never, false, never>;
108
+ static ɵdir: i0.ɵɵDirectiveDeclaration<TemplateFooterDirective, "[cvTemplateFooter]", never, { "cvTemplateFooter": { "alias": "cvTemplateFooter"; "required": false; }; }, {}, never, never, false, never>;
107
109
  }
@@ -0,0 +1,525 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, Directive, ElementRef, EventEmitter, Host, HostListener, Inject, Input, IterableDiffers, NgZone, Output, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { CLog, CLogTypes, CollectionView, ViewTemplateType } from '@nstudio/ui-collectionview';
3
+ import { DetachedLoader, NativeScriptRendererFactory, extractSingleViewRecursive, isListLikeIterable, registerElement } from '@nativescript/angular';
4
+ import { LayoutBase, ObservableArray, Trace } from '@nativescript/core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@nativescript/angular";
7
+ registerElement('CollectionView', () => CollectionView);
8
+ const NG_VIEW = '_ngViewRef';
9
+ export class ItemContext {
10
+ $implicit;
11
+ item;
12
+ index;
13
+ even;
14
+ odd;
15
+ constructor($implicit, item, index, even, odd) {
16
+ this.$implicit = $implicit;
17
+ this.item = item;
18
+ this.index = index;
19
+ this.even = even;
20
+ this.odd = odd;
21
+ }
22
+ }
23
+ export class CollectionViewComponent {
24
+ _elementRef;
25
+ _iterableDiffers;
26
+ _renderer;
27
+ _ngZone;
28
+ get nativeElement() {
29
+ return this._collectionView;
30
+ }
31
+ get listView() {
32
+ return this._collectionView;
33
+ }
34
+ loader;
35
+ setupItemView = new EventEmitter();
36
+ itemTemplateQuery;
37
+ autoReuseViews = false;
38
+ detachedLoaderFactory() {
39
+ const ref = this.loader.createComponent(DetachedLoader, {
40
+ index: 0,
41
+ });
42
+ this.loader.detach(0);
43
+ this._loaders.push(ref);
44
+ return ref;
45
+ }
46
+ get itemTemplate() {
47
+ return this._itemTemplate;
48
+ }
49
+ set itemTemplate(value) {
50
+ this._itemTemplate = value;
51
+ // this._collectionView.refresh();
52
+ }
53
+ get headerItemTemplate() {
54
+ return this._headerTemplate;
55
+ }
56
+ set headerItemTemplate(value) {
57
+ this._headerTemplate = value;
58
+ }
59
+ get footerItemTemplate() {
60
+ return this._footerTemplate;
61
+ }
62
+ set footerItemTemplate(value) {
63
+ this._footerTemplate = value;
64
+ }
65
+ get items() {
66
+ return this._items;
67
+ }
68
+ set items(value) {
69
+ this._items = value;
70
+ let needDiffer = true;
71
+ if (value instanceof ObservableArray) {
72
+ needDiffer = false;
73
+ }
74
+ if (needDiffer && !this._differ && isListLikeIterable(value)) {
75
+ this._differ = this._iterableDiffers.find(this._items).create((_index, item) => item);
76
+ }
77
+ this._collectionView.items = this._items;
78
+ }
79
+ _collectionView;
80
+ _items;
81
+ _differ;
82
+ _itemTemplate;
83
+ _templateMap;
84
+ _headerTemplate;
85
+ _headerTemplateMap;
86
+ _footerTemplate;
87
+ _footerTemplateMap;
88
+ _loaders;
89
+ constructor(_elementRef, _iterableDiffers, _renderer, _ngZone) {
90
+ this._elementRef = _elementRef;
91
+ this._iterableDiffers = _iterableDiffers;
92
+ this._renderer = _renderer;
93
+ this._ngZone = _ngZone;
94
+ this._collectionView = _elementRef.nativeElement;
95
+ this._collectionView.on(CollectionView.itemLoadingEvent, this.onItemLoading, this);
96
+ this._collectionView.itemViewLoader = this.itemViewLoader;
97
+ this._loaders = [];
98
+ }
99
+ itemViewLoader = (viewType) => {
100
+ this._ngZone.run(() => {
101
+ switch (viewType) {
102
+ case ViewTemplateType.Item:
103
+ if (this._itemTemplate) {
104
+ return this.getOrCreate(this._itemTemplate);
105
+ }
106
+ break;
107
+ case ViewTemplateType.Header:
108
+ if (this._headerTemplate) {
109
+ return this.getOrCreate(this._headerTemplate);
110
+ }
111
+ break;
112
+ case ViewTemplateType.Footer:
113
+ if (this._footerTemplate) {
114
+ return this.getOrCreate(this._footerTemplate);
115
+ }
116
+ break;
117
+ }
118
+ return null;
119
+ });
120
+ };
121
+ ngAfterContentInit() {
122
+ if (Trace.isEnabled()) {
123
+ CLog(CLogTypes.info, 'CollectionView.ngAfterContentInit()');
124
+ }
125
+ this.setItemTemplates();
126
+ }
127
+ ngOnDestroy() {
128
+ this._collectionView.off(CollectionView.itemLoadingEvent, this.onItemLoading, this);
129
+ this._collectionView = null;
130
+ this._loaders.forEach((l) => l.destroy());
131
+ this._loaders = null;
132
+ this.viewToLoader = null;
133
+ this.viewToTemplate = null;
134
+ this.viewPool = null;
135
+ this._items = null;
136
+ this._differ = null;
137
+ this._itemTemplate = null;
138
+ if (this._templateMap) {
139
+ this._templateMap.clear();
140
+ }
141
+ if (this._headerTemplateMap) {
142
+ this._headerTemplateMap.clear();
143
+ }
144
+ if (this._footerTemplateMap) {
145
+ this._footerTemplateMap.clear();
146
+ }
147
+ this._templateMap = null;
148
+ this._headerTemplateMap = null;
149
+ this._footerTemplateMap = null;
150
+ }
151
+ ngDoCheck() {
152
+ if (Trace.isEnabled()) {
153
+ CLog(CLogTypes.info, 'ngDoCheck() - execute differ? ' + this._differ);
154
+ }
155
+ if (this._differ) {
156
+ if (Trace.isEnabled()) {
157
+ CLog(CLogTypes.info, 'ngDoCheck() - execute differ');
158
+ }
159
+ const changes = this._differ.diff(this._items);
160
+ if (changes) {
161
+ if (Trace.isEnabled()) {
162
+ CLog(CLogTypes.info, 'ngDoCheck() - refresh');
163
+ }
164
+ this.refresh();
165
+ }
166
+ }
167
+ }
168
+ registerTemplate(key, template) {
169
+ if (Trace.isEnabled()) {
170
+ CLog(CLogTypes.info, 'registerTemplate for key: ' + key);
171
+ }
172
+ if (!this._templateMap) {
173
+ this._templateMap = new Map();
174
+ }
175
+ const keyedTemplate = {
176
+ key,
177
+ createView: this.getItemTemplateViewFactory(template),
178
+ };
179
+ this._templateMap.set(key, keyedTemplate);
180
+ }
181
+ registerTemplateSupplemental(key, template, type) {
182
+ if (Trace.isEnabled()) {
183
+ CLog(CLogTypes.info, 'registerTemplate for key: ' + key);
184
+ }
185
+ switch (type) {
186
+ case 'header':
187
+ // if (!this._headerTemplateMap) {
188
+ // this._headerTemplateMap = new Map<string, KeyedTemplate>();
189
+ // }
190
+ // this._headerTemplateMap.set(key, keyedTemplate);
191
+ this._collectionView.headerKey = key;
192
+ this.headerItemTemplate = template;
193
+ this._collectionView.headerItemTemplate = this.getItemTemplateViewFactory(template);
194
+ break;
195
+ case 'footer':
196
+ // if (!this._footerTemplateMap) {
197
+ // this._footerTemplateMap = new Map<string, KeyedTemplate>();
198
+ // }
199
+ // this._footerTemplateMap.set(key, keyedTemplate);
200
+ this._collectionView.footerKey = key;
201
+ this.footerItemTemplate = template;
202
+ this._collectionView.footerItemTemplate = this.getItemTemplateViewFactory(template);
203
+ break;
204
+ }
205
+ }
206
+ onItemLoading(args) {
207
+ if (!args.view && !this.itemTemplate) {
208
+ return;
209
+ }
210
+ if (!this.items)
211
+ return;
212
+ const index = args.index;
213
+ const items = args.object.items;
214
+ const currentItem = typeof items.getItem === 'function' ? items.getItem(index) : items[index];
215
+ let viewRef;
216
+ if (Trace.isEnabled()) {
217
+ CLog(CLogTypes.info, `onItemLoading: ${index} - Reusing existing view`);
218
+ }
219
+ viewRef = this.getNgView(args.view);
220
+ if (!viewRef && Trace.isEnabled()) {
221
+ if (Trace.isEnabled()) {
222
+ CLog(CLogTypes.info, `ViewReference not found for item ${index}. View recycling is not working`);
223
+ }
224
+ }
225
+ if (!viewRef) {
226
+ if (Trace.isEnabled()) {
227
+ CLog(CLogTypes.info, `onItemLoading: ${index} - Creating view from template`);
228
+ }
229
+ viewRef = this.getOrCreate(this.itemTemplate);
230
+ }
231
+ this.setupViewRef(viewRef, currentItem, index);
232
+ this.detectChangesOnChild(viewRef, index);
233
+ }
234
+ onItemRecyclingInternal(args) {
235
+ if (!args.view) {
236
+ return;
237
+ }
238
+ const ngView = this.getNgView(args.view);
239
+ // console.log('recycling', args.view);
240
+ if (ngView) {
241
+ ngView.detach();
242
+ }
243
+ }
244
+ onItemDisplayInternal(args) {
245
+ if (!args.view) {
246
+ return;
247
+ }
248
+ const ngView = this.getNgView(args.view);
249
+ if (ngView) {
250
+ ngView.reattach();
251
+ }
252
+ }
253
+ onItemDisposingInternal(args) {
254
+ if (!args.view) {
255
+ return;
256
+ }
257
+ const ngView = this.getNgView(args.view);
258
+ if (ngView) {
259
+ ngView.detach();
260
+ this.storeViewRef(ngView);
261
+ }
262
+ }
263
+ getNgView(view) {
264
+ const ngView = view[NG_VIEW];
265
+ // Getting angular view from original element (in cases when ProxyViewContainer
266
+ // is used NativeScript internally wraps it in a StackLayout)
267
+ if (!ngView && view instanceof LayoutBase && view.getChildrenCount() > 0) {
268
+ return view.getChildAt(0)[NG_VIEW];
269
+ }
270
+ return ngView;
271
+ }
272
+ setupViewRef(view, data, index) {
273
+ const context = view.context;
274
+ context.$implicit = data;
275
+ context.item = data;
276
+ context.index = index;
277
+ context.even = index % 2 === 0;
278
+ context.odd = !context.even;
279
+ this.setupItemView.next({
280
+ context,
281
+ data,
282
+ index,
283
+ view,
284
+ });
285
+ }
286
+ getItemTemplateViewFactory(template) {
287
+ return () => {
288
+ return this.getOrCreate(template);
289
+ };
290
+ }
291
+ viewPool = new Map();
292
+ storeViewRef(viewRef) {
293
+ const templateRef = this.viewToTemplate.get(viewRef);
294
+ if (templateRef) {
295
+ const scrap = this.viewPool.get(templateRef);
296
+ if (scrap) {
297
+ if (scrap.scrapHead.size >= scrap.scrapSize) {
298
+ viewRef.destroy();
299
+ this.viewToLoader.get(viewRef)?.destroy();
300
+ }
301
+ else {
302
+ scrap.scrapHead.add(viewRef);
303
+ }
304
+ }
305
+ }
306
+ }
307
+ viewToTemplate = new WeakMap();
308
+ viewToLoader = new WeakMap();
309
+ getOrCreate(templateRef) {
310
+ return this._ngZone.run(() => {
311
+ let viewRef = this.getView(templateRef);
312
+ if (!viewRef) {
313
+ const loader = this.detachedLoaderFactory();
314
+ viewRef = loader.instance.vc.createEmbeddedView(templateRef, new ItemContext(), 0);
315
+ this.viewToLoader.set(viewRef, loader);
316
+ this.viewToTemplate.set(viewRef, templateRef);
317
+ }
318
+ viewRef.detach();
319
+ const resultView = getItemViewRoot(viewRef);
320
+ resultView[NG_VIEW] = viewRef;
321
+ resultView.reusable = this.autoReuseViews;
322
+ return resultView;
323
+ });
324
+ }
325
+ getView(templateRef) {
326
+ const pool = this.getViewPool(templateRef);
327
+ while (pool.scrapHead.size > 0) {
328
+ const viewRef = pool.scrapHead.values().next().value;
329
+ pool.scrapHead.delete(viewRef);
330
+ if (!viewRef.destroyed) {
331
+ return viewRef;
332
+ }
333
+ }
334
+ return null;
335
+ }
336
+ getViewPool(templateRef) {
337
+ if (!this.viewPool.has(templateRef)) {
338
+ this.viewPool.set(templateRef, {
339
+ scrapSize: this.autoReuseViews ? Infinity : 0,
340
+ scrapHead: new Set(),
341
+ });
342
+ }
343
+ return this.viewPool.get(templateRef);
344
+ }
345
+ setItemTemplates() {
346
+ // The itemTemplateQuery may be changed after list items are added that contain <template> inside,
347
+ // so cache and use only the original template to avoid errors.
348
+ this.itemTemplate = this.itemTemplateQuery;
349
+ if (this._templateMap) {
350
+ if (Trace.isEnabled()) {
351
+ CLog(CLogTypes.info, 'Setting templates');
352
+ }
353
+ const templates = [];
354
+ this._templateMap.forEach((value) => {
355
+ templates.push(value);
356
+ });
357
+ this._collectionView.itemTemplates = templates;
358
+ }
359
+ else {
360
+ // If the map was not initialized this means that there are no named templates, so we register the default one.
361
+ this._collectionView.itemTemplate = this.getItemTemplateViewFactory(this.itemTemplate);
362
+ }
363
+ }
364
+ detectChangesOnChild(viewRef, index) {
365
+ if (Trace.isEnabled()) {
366
+ CLog(CLogTypes.info, 'Manually detect changes in child: ' + index);
367
+ }
368
+ viewRef.markForCheck();
369
+ viewRef.detectChanges();
370
+ }
371
+ refresh() {
372
+ if (this._collectionView) {
373
+ this._collectionView.refresh();
374
+ }
375
+ }
376
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CollectionViewComponent, deps: [{ token: ElementRef }, { token: IterableDiffers }, { token: NativeScriptRendererFactory }, { token: NgZone }], target: i0.ɵɵFactoryTarget.Component });
377
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: CollectionViewComponent, selector: "CollectionView", inputs: { autoReuseViews: "autoReuseViews", itemTemplate: "itemTemplate", headerItemTemplate: "headerItemTemplate", footerItemTemplate: "footerItemTemplate", items: "items" }, outputs: { setupItemView: "setupItemView" }, host: { listeners: { "itemLoading": "onItemLoading($event)", "itemRecycling": "onItemRecyclingInternal($event)", "displayItem": "onItemDisplayInternal($event)", "itemDisposing": "onItemDisposingInternal($event)" } }, queries: [{ propertyName: "itemTemplateQuery", first: true, predicate: TemplateRef, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "loader", first: true, predicate: ["loader"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `
378
+ <DetachedContainer>
379
+ <Placeholder #loader></Placeholder>
380
+ </DetachedContainer>
381
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
382
+ }
383
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CollectionViewComponent, decorators: [{
384
+ type: Component,
385
+ args: [{
386
+ selector: 'CollectionView',
387
+ template: `
388
+ <DetachedContainer>
389
+ <Placeholder #loader></Placeholder>
390
+ </DetachedContainer>
391
+ `,
392
+ changeDetection: ChangeDetectionStrategy.OnPush,
393
+ }]
394
+ }], ctorParameters: () => [{ type: i0.ElementRef, decorators: [{
395
+ type: Inject,
396
+ args: [ElementRef]
397
+ }] }, { type: i0.IterableDiffers, decorators: [{
398
+ type: Inject,
399
+ args: [IterableDiffers]
400
+ }] }, { type: i1.NativeScriptRendererFactory, decorators: [{
401
+ type: Inject,
402
+ args: [NativeScriptRendererFactory]
403
+ }] }, { type: i0.NgZone, decorators: [{
404
+ type: Inject,
405
+ args: [NgZone]
406
+ }] }], propDecorators: { loader: [{
407
+ type: ViewChild,
408
+ args: ['loader', { read: ViewContainerRef, static: true }]
409
+ }], setupItemView: [{
410
+ type: Output
411
+ }], itemTemplateQuery: [{
412
+ type: ContentChild,
413
+ args: [TemplateRef, { read: TemplateRef, static: true }]
414
+ }], autoReuseViews: [{
415
+ type: Input
416
+ }], itemTemplate: [{
417
+ type: Input
418
+ }], headerItemTemplate: [{
419
+ type: Input
420
+ }], footerItemTemplate: [{
421
+ type: Input
422
+ }], items: [{
423
+ type: Input
424
+ }], onItemLoading: [{
425
+ type: HostListener,
426
+ args: ['itemLoading', ['$event']]
427
+ }], onItemRecyclingInternal: [{
428
+ type: HostListener,
429
+ args: ['itemRecycling', ['$event']]
430
+ }], onItemDisplayInternal: [{
431
+ type: HostListener,
432
+ args: ['displayItem', ['$event']]
433
+ }], onItemDisposingInternal: [{
434
+ type: HostListener,
435
+ args: ['itemDisposing', ['$event']]
436
+ }] } });
437
+ export function getItemViewRoot(viewRef, rootLocator = extractSingleViewRecursive) {
438
+ const rootView = rootLocator(viewRef.rootNodes, 0);
439
+ return rootView;
440
+ }
441
+ export class TemplateKeyDirective {
442
+ templateRef;
443
+ collectionView;
444
+ constructor(templateRef, collectionView) {
445
+ this.templateRef = templateRef;
446
+ this.collectionView = collectionView;
447
+ }
448
+ set cvTemplateKey(value) {
449
+ if (Trace.isEnabled()) {
450
+ CLog(CLogTypes.info, 'cvTemplateKey: ' + value);
451
+ }
452
+ if (this.collectionView && this.templateRef) {
453
+ this.collectionView.registerTemplate(value.toLowerCase(), this.templateRef);
454
+ }
455
+ }
456
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TemplateKeyDirective, deps: [{ token: i0.TemplateRef }, { token: CollectionViewComponent, host: true }], target: i0.ɵɵFactoryTarget.Directive });
457
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.9", type: TemplateKeyDirective, selector: "[cvTemplateKey]", inputs: { cvTemplateKey: "cvTemplateKey" }, ngImport: i0 });
458
+ }
459
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TemplateKeyDirective, decorators: [{
460
+ type: Directive,
461
+ args: [{ selector: '[cvTemplateKey]' }]
462
+ }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: CollectionViewComponent, decorators: [{
463
+ type: Host
464
+ }] }], propDecorators: { cvTemplateKey: [{
465
+ type: Input
466
+ }] } });
467
+ export class TemplateHeaderDirective {
468
+ templateRef;
469
+ collectionView;
470
+ constructor(templateRef, collectionView) {
471
+ this.templateRef = templateRef;
472
+ this.collectionView = collectionView;
473
+ }
474
+ set cvTemplateHeader(value) {
475
+ if (Trace.isEnabled()) {
476
+ CLog(CLogTypes.info, 'cvTemplateHeader: ' + value);
477
+ }
478
+ if (this.collectionView && this.templateRef) {
479
+ // TODO: allow keying of multiple headers per section
480
+ this.collectionView.registerTemplateSupplemental(value || ViewTemplateType.Header, this.templateRef, 'header');
481
+ }
482
+ }
483
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TemplateHeaderDirective, deps: [{ token: i0.TemplateRef }, { token: CollectionViewComponent, host: true }], target: i0.ɵɵFactoryTarget.Directive });
484
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.9", type: TemplateHeaderDirective, selector: "[cvTemplateHeader]", inputs: { cvTemplateHeader: "cvTemplateHeader" }, ngImport: i0 });
485
+ }
486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TemplateHeaderDirective, decorators: [{
487
+ type: Directive,
488
+ args: [{
489
+ selector: '[cvTemplateHeader]',
490
+ }]
491
+ }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: CollectionViewComponent, decorators: [{
492
+ type: Host
493
+ }] }], propDecorators: { cvTemplateHeader: [{
494
+ type: Input
495
+ }] } });
496
+ export class TemplateFooterDirective {
497
+ templateRef;
498
+ collectionView;
499
+ constructor(templateRef, collectionView) {
500
+ this.templateRef = templateRef;
501
+ this.collectionView = collectionView;
502
+ }
503
+ set cvTemplateFooter(value) {
504
+ if (Trace.isEnabled()) {
505
+ CLog(CLogTypes.info, 'cvTemplateFooter: ' + value);
506
+ }
507
+ if (this.collectionView && this.templateRef) {
508
+ // TODO: allow keying of multiple footers per section
509
+ this.collectionView.registerTemplateSupplemental(value || ViewTemplateType.Footer, this.templateRef, 'footer');
510
+ }
511
+ }
512
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TemplateFooterDirective, deps: [{ token: i0.TemplateRef }, { token: CollectionViewComponent, host: true }], target: i0.ɵɵFactoryTarget.Directive });
513
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.9", type: TemplateFooterDirective, selector: "[cvTemplateFooter]", inputs: { cvTemplateFooter: "cvTemplateFooter" }, ngImport: i0 });
514
+ }
515
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TemplateFooterDirective, decorators: [{
516
+ type: Directive,
517
+ args: [{
518
+ selector: '[cvTemplateFooter]',
519
+ }]
520
+ }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: CollectionViewComponent, decorators: [{
521
+ type: Host
522
+ }] }], propDecorators: { cvTemplateFooter: [{
523
+ type: Input
524
+ }] } });
525
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvdWktY29sbGVjdGlvbnZpZXcvYW5ndWxhci9jb2xsZWN0aW9udmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxTQUFTLEVBQWdCLFlBQVksRUFBRSxTQUFTLEVBQVcsVUFBVSxFQUFtQixZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrQixlQUFlLEVBQUUsTUFBTSxFQUFhLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pULE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBK0IsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1SCxPQUFPLEVBQUUsY0FBYyxFQUFFLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JKLE9BQU8sRUFBaUIsVUFBVSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQVEsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBRTdGLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV4RCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUM7QUFFN0IsTUFBTSxPQUFPLFdBQVc7SUFDSDtJQUF3QjtJQUFtQjtJQUF1QjtJQUF1QjtJQUE1RyxZQUFtQixTQUFlLEVBQVMsSUFBVSxFQUFTLEtBQWMsRUFBUyxJQUFjLEVBQVMsR0FBYTtRQUF0RyxjQUFTLEdBQVQsU0FBUyxDQUFNO1FBQVMsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUFTLFVBQUssR0FBTCxLQUFLLENBQVM7UUFBUyxTQUFJLEdBQUosSUFB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LHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFIbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjs7MEJBRXFELElBQUk7eUNBR3BELGdCQUFnQjtzQkFEbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgQ29udGVudENoaWxkLCBEaXJlY3RpdmUsIERvQ2hlY2ssIEVsZW1lbnRSZWYsIEVtYmVkZGVkVmlld1JlZiwgRXZlbnRFbWl0dGVyLCBIb3N0LCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIEl0ZXJhYmxlRGlmZmVyLCBJdGVyYWJsZURpZmZlcnMsIE5nWm9uZSwgT25EZXN0cm95LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENMb2csIENMb2dUeXBlcywgQ29sbGVjdGlvblZpZXcsIENvbGxlY3Rpb25WaWV3SXRlbUV2ZW50RGF0YSwgVmlld1RlbXBsYXRlVHlwZSB9IGZyb20gJ0Buc3R1ZGlvL3VpLWNvbGxlY3Rpb252aWV3JztcbmltcG9ydCB7IERldGFjaGVkTG9hZGVyLCBOYXRpdmVTY3JpcHRSZW5kZXJlckZhY3RvcnksIGV4dHJhY3RTaW5nbGVWaWV3UmVjdXJzaXZlLCBpc0xpc3RMaWtlSXRlcmFibGUsIHJlZ2lzdGVyRWxlbWVudCB9IGZyb20gJ0BuYXRpdmVzY3JpcHQvYW5ndWxhcic7XG5pbXBvcnQgeyBLZXllZFRlbXBsYXRlLCBMYXlvdXRCYXNlLCBPYnNlcnZhYmxlQXJyYXksIFRyYWNlLCBWaWV3IH0gZnJvbSAnQG5hdGl2ZXNjcmlwdC9jb3JlJztcblxucmVnaXN0ZXJFbGVtZW50KCdDb2xsZWN0aW9uVmlldycsICgpID0+IENvbGxlY3Rpb25WaWV3KTtcblxuY29uc3QgTkdfVklFVyA9ICdfbmdWaWV3UmVmJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1Db250ZXh0IHtcbiAgY29uc3RydWN0b3IocHVibGljICRpbXBsaWNpdD86IGFueSwgcHVibGljIGl0ZW0/OiBhbnksIHB1YmxpYyBpbmRleD86IG51bWJlciwgcHVibGljIGV2ZW4/OiBib29sZWFuLCBwdWJsaWMgb2RkPzogYm9vbGVhbikge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXR1cEl0ZW1WaWV3QXJncyB7XG4gIHZpZXc6IEVtYmVkZGVkVmlld1JlZjxhbnk+O1xuICBkYXRhOiBhbnk7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvbnRleHQ6IEl0ZW1Db250ZXh0O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdDb2xsZWN0aW9uVmlldycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPERldGFjaGVkQ29udGFpbmVyPlxuICAgICAgPFBsYWNlaG9sZGVyICNsb2FkZXI+PC9QbGFjZWhvbGRlcj5cbiAgICA8L0RldGFjaGVkQ29udGFpbmVyPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xuICBwdWJsaWMgZ2V0IG5hdGl2ZUVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25WaWV3O1xuICB9XG4gIHB1YmxpYyBnZXQgbGlzdFZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25WaWV3O1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnbG9hZGVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgcHVibGljIGxvYWRlcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQE91dHB1dCgpIHB1YmxpYyBzZXR1cEl0ZW1WaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxTZXR1cEl0ZW1WaWV3QXJncz4oKTtcbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZiwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBpdGVtVGVtcGxhdGVRdWVyeTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+O1xuXG4gIEBJbnB1dCgpIGF1dG9SZXVzZVZpZXdzID0gZmFsc2U7XG5cbiAgZGV0YWNoZWRMb2FkZXJGYWN0b3J5KCkge1xuICAgIGNvbnN0IHJlZiA9IHRoaXMubG9hZGVyLmNyZWF0ZUNvbXBvbmVudChEZXRhY2hlZExvYWRlciwge1xuICAgICAgaW5kZXg6IDAsXG4gICAgfSk7XG4gICAgdGhpcy5sb2FkZXIuZGV0YWNoKDApO1xuICAgIHRoaXMuX2xvYWRlcnMucHVzaChyZWYpO1xuICAgIHJldHVybiByZWY7XG4gIH1cblxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGl0ZW1UZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbVRlbXBsYXRlO1xuICB9XG4gIHB1YmxpYyBzZXQgaXRlbVRlbXBsYXRlKHZhbHVlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICB0aGlzLl9pdGVtVGVtcGxhdGUgPSB2YWx1ZTtcbiAgICAvLyB0aGlzLl9jb2xsZWN0aW9uVmlldy5yZWZyZXNoKCk7XG4gIH1cbiAgQElucHV0KClcbiAgcHVibGljIGdldCBoZWFkZXJJdGVtVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWRlclRlbXBsYXRlO1xuICB9XG4gIHB1YmxpYyBzZXQgaGVhZGVySXRlbVRlbXBsYXRlKHZhbHVlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZSA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgZm9vdGVySXRlbVRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9mb290ZXJUZW1wbGF0ZTtcbiAgfVxuICBwdWJsaWMgc2V0IGZvb3Rlckl0ZW1UZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgdGhpcy5fZm9vdGVyVGVtcGxhdGUgPSB2YWx1ZTtcbiAgfVxuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgfVxuICBwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9pdGVtcyA9IHZhbHVlO1xuICAgIGxldCBuZWVkRGlmZmVyID0gdHJ1ZTtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYnNlcnZhYmxlQXJyYXkpIHtcbiAgICAgIG5lZWREaWZmZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5lZWREaWZmZXIgJiYgIXRoaXMuX2RpZmZlciAmJiBpc0xpc3RMaWtlSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9pdGVyYWJsZURpZmZlcnMuZmluZCh0aGlzLl9pdGVtcykuY3JlYXRlKChfaW5kZXgsIGl0ZW0pID0+IGl0ZW0pO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1zID0gdGhpcy5faXRlbXM7XG4gIH1cblxuICBwcml2YXRlIF9jb2xsZWN0aW9uVmlldzogQ29sbGVjdGlvblZpZXc7XG4gIHByaXZhdGUgX2l0ZW1zOiBhbnk7XG4gIHByaXZhdGUgX2RpZmZlcjogSXRlcmFibGVEaWZmZXI8S2V5ZWRUZW1wbGF0ZT47XG4gIHByaXZhdGUgX2l0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+O1xuICBwcml2YXRlIF90ZW1wbGF0ZU1hcDogTWFwPHN0cmluZywgS2V5ZWRUZW1wbGF0ZT47XG4gIHByaXZhdGUgX2hlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD47XG4gIHByaXZhdGUgX2hlYWRlclRlbXBsYXRlTWFwOiBNYXA8c3RyaW5nLCBLZXllZFRlbXBsYXRlPjtcbiAgcHJpdmF0ZSBfZm9vdGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0PjtcbiAgcHJpdmF0ZSBfZm9vdGVyVGVtcGxhdGVNYXA6IE1hcDxzdHJpbmcsIEtleWVkVGVtcGxhdGU+O1xuICBwcml2YXRlIF9sb2FkZXJzOiBDb21wb25lbnRSZWY8RGV0YWNoZWRMb2FkZXI+W107XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChFbGVtZW50UmVmKSBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBASW5qZWN0KEl0ZXJhYmxlRGlmZmVycykgcHJpdmF0ZSBfaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsIEBJbmplY3QoTmF0aXZlU2NyaXB0UmVuZGVyZXJGYWN0b3J5KSBwcml2YXRlIF9yZW5kZXJlcjogTmF0aXZlU2NyaXB0UmVuZGVyZXJGYWN0b3J5LCBASW5qZWN0KE5nWm9uZSkgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHtcbiAgICB0aGlzLl9jb2xsZWN0aW9uVmlldyA9IF9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5vbihDb2xsZWN0aW9uVmlldy5pdGVtTG9hZGluZ0V2ZW50LCB0aGlzLm9uSXRlbUxvYWRpbmcsIHRoaXMpO1xuICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1WaWV3TG9hZGVyID0gdGhpcy5pdGVtVmlld0xvYWRlcjtcbiAgICB0aGlzLl9sb2FkZXJzID0gW107XG4gIH1cblxuICBwcml2YXRlIGl0ZW1WaWV3TG9hZGVyID0gKHZpZXdUeXBlKSA9PiB7XG4gICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBzd2l0Y2ggKHZpZXdUeXBlKSB7XG4gICAgICAgIGNhc2UgVmlld1RlbXBsYXRlVHlwZS5JdGVtOlxuICAgICAgICAgIGlmICh0aGlzLl9pdGVtVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlKHRoaXMuX2l0ZW1UZW1wbGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZpZXdUZW1wbGF0ZVR5cGUuSGVhZGVyOlxuICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGUodGhpcy5faGVhZGVyVGVtcGxhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBWaWV3VGVtcGxhdGVUeXBlLkZvb3RlcjpcbiAgICAgICAgICBpZiAodGhpcy5fZm9vdGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlKHRoaXMuX2Zvb3RlclRlbXBsYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgfTtcblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ0NvbGxlY3Rpb25WaWV3Lm5nQWZ0ZXJDb250ZW50SW5pdCgpJyk7XG4gICAgfVxuICAgIHRoaXMuc2V0SXRlbVRlbXBsYXRlcygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lm9mZihDb2xsZWN0aW9uVmlldy5pdGVtTG9hZGluZ0V2ZW50LCB0aGlzLm9uSXRlbUxvYWRpbmcsIHRoaXMpO1xuICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3ID0gbnVsbDtcbiAgICB0aGlzLl9sb2FkZXJzLmZvckVhY2goKGwpID0+IGwuZGVzdHJveSgpKTtcbiAgICB0aGlzLl9sb2FkZXJzID0gbnVsbDtcbiAgICB0aGlzLnZpZXdUb0xvYWRlciA9IG51bGw7XG4gICAgdGhpcy52aWV3VG9UZW1wbGF0ZSA9IG51bGw7XG4gICAgdGhpcy52aWV3UG9vbCA9IG51bGw7XG5cbiAgICB0aGlzLl9pdGVtcyA9IG51bGw7XG4gICAgdGhpcy5fZGlmZmVyID0gbnVsbDtcbiAgICB0aGlzLl9pdGVtVGVtcGxhdGUgPSBudWxsO1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVNYXAuY2xlYXIoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hlYWRlclRlbXBsYXRlTWFwKSB7XG4gICAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZU1hcC5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZm9vdGVyVGVtcGxhdGVNYXApIHtcbiAgICAgIHRoaXMuX2Zvb3RlclRlbXBsYXRlTWFwLmNsZWFyKCk7XG4gICAgfVxuICAgIHRoaXMuX3RlbXBsYXRlTWFwID0gbnVsbDtcbiAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZU1hcCA9IG51bGw7XG4gICAgdGhpcy5fZm9vdGVyVGVtcGxhdGVNYXAgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG5nRG9DaGVjaygpIHtcbiAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICduZ0RvQ2hlY2soKSAtIGV4ZWN1dGUgZGlmZmVyPyAnICsgdGhpcy5fZGlmZmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RpZmZlcikge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICduZ0RvQ2hlY2soKSAtIGV4ZWN1dGUgZGlmZmVyJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5faXRlbXMpO1xuICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ25nRG9DaGVjaygpIC0gcmVmcmVzaCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclRlbXBsYXRlKGtleTogc3RyaW5nLCB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAncmVnaXN0ZXJUZW1wbGF0ZSBmb3Iga2V5OiAnICsga2V5KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVNYXAgPSBuZXcgTWFwPHN0cmluZywgS2V5ZWRUZW1wbGF0ZT4oKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXllZFRlbXBsYXRlID0ge1xuICAgICAga2V5LFxuICAgICAgY3JlYXRlVmlldzogdGhpcy5nZXRJdGVtVGVtcGxhdGVWaWV3RmFjdG9yeSh0ZW1wbGF0ZSksXG4gICAgfTtcblxuICAgIHRoaXMuX3RlbXBsYXRlTWFwLnNldChrZXksIGtleWVkVGVtcGxhdGUpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyVGVtcGxhdGVTdXBwbGVtZW50YWwoa2V5OiBzdHJpbmcsIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4sIHR5cGU6ICdoZWFkZXInIHwgJ2Zvb3RlcicpIHtcbiAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdyZWdpc3RlclRlbXBsYXRlIGZvciBrZXk6ICcgKyBrZXkpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgICAgLy8gaWYgKCF0aGlzLl9oZWFkZXJUZW1wbGF0ZU1hcCkge1xuICAgICAgICAvLyAgIHRoaXMuX2hlYWRlclRlbXBsYXRlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEtleWVkVGVtcGxhdGU+KCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhpcy5faGVhZGVyVGVtcGxhdGVNYXAuc2V0KGtleSwga2V5ZWRUZW1wbGF0ZSk7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3LmhlYWRlcktleSA9IGtleTtcbiAgICAgICAgdGhpcy5oZWFkZXJJdGVtVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcuaGVhZGVySXRlbVRlbXBsYXRlID0gdGhpcy5nZXRJdGVtVGVtcGxhdGVWaWV3RmFjdG9yeSh0ZW1wbGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgICAgLy8gaWYgKCF0aGlzLl9mb290ZXJUZW1wbGF0ZU1hcCkge1xuICAgICAgICAvLyAgIHRoaXMuX2Zvb3RlclRlbXBsYXRlTWFwID0gbmV3IE1hcDxzdHJpbmcsIEtleWVkVGVtcGxhdGU+KCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyB0aGlzLl9mb290ZXJUZW1wbGF0ZU1hcC5zZXQoa2V5LCBrZXllZFRlbXBsYXRlKTtcblxuICAgICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5mb290ZXJLZXkgPSBrZXk7XG4gICAgICAgIHRoaXMuZm9vdGVySXRlbVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3LmZvb3Rlckl0ZW1UZW1wbGF0ZSA9IHRoaXMuZ2V0SXRlbVRlbXBsYXRlVmlld0ZhY3RvcnkodGVtcGxhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpdGVtTG9hZGluZycsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkl0ZW1Mb2FkaW5nKGFyZ3M6IENvbGxlY3Rpb25WaWV3SXRlbUV2ZW50RGF0YSkge1xuICAgIGlmICghYXJncy52aWV3ICYmICF0aGlzLml0ZW1UZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXRlbXMpIHJldHVybjtcbiAgICBjb25zdCBpbmRleCA9IGFyZ3MuaW5kZXg7XG4gICAgY29uc3QgaXRlbXMgPSAoYXJncy5vYmplY3QgYXMgYW55KS5pdGVtcztcbiAgICBjb25zdCBjdXJyZW50SXRlbSA9IHR5cGVvZiBpdGVtcy5nZXRJdGVtID09PSAnZnVuY3Rpb24nID8gaXRlbXMuZ2V0SXRlbShpbmRleCkgOiBpdGVtc1tpbmRleF07XG4gICAgbGV0IHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD47XG5cbiAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sIGBvbkl0ZW1Mb2FkaW5nOiAke2luZGV4fSAtIFJldXNpbmcgZXhpc3Rpbmcgdmlld2ApO1xuICAgIH1cblxuICAgIHZpZXdSZWYgPSB0aGlzLmdldE5nVmlldyhhcmdzLnZpZXcpO1xuXG4gICAgaWYgKCF2aWV3UmVmICYmIFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgYFZpZXdSZWZlcmVuY2Ugbm90IGZvdW5kIGZvciBpdGVtICR7aW5kZXh9LiBWaWV3IHJlY3ljbGluZyBpcyBub3Qgd29ya2luZ2ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmlld1JlZikge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sIGBvbkl0ZW1Mb2FkaW5nOiAke2luZGV4fSAtIENyZWF0aW5nIHZpZXcgZnJvbSB0ZW1wbGF0ZWApO1xuICAgICAgfVxuICAgICAgdmlld1JlZiA9IHRoaXMuZ2V0T3JDcmVhdGUodGhpcy5pdGVtVGVtcGxhdGUpIGFzIGFueTtcbiAgICB9XG4gICAgdGhpcy5zZXR1cFZpZXdSZWYodmlld1JlZiwgY3VycmVudEl0ZW0sIGluZGV4KTtcbiAgICB0aGlzLmRldGVjdENoYW5nZXNPbkNoaWxkKHZpZXdSZWYsIGluZGV4KTtcbiAgfVxuICBASG9zdExpc3RlbmVyKCdpdGVtUmVjeWNsaW5nJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uSXRlbVJlY3ljbGluZ0ludGVybmFsKGFyZ3M6IGFueSkge1xuICAgIGlmICghYXJncy52aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5nVmlldyA9IHRoaXMuZ2V0TmdWaWV3KGFyZ3Mudmlldyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3JlY3ljbGluZycsIGFyZ3Mudmlldyk7XG5cbiAgICBpZiAobmdWaWV3KSB7XG4gICAgICBuZ1ZpZXcuZGV0YWNoKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZGlzcGxheUl0ZW0nLCBbJyRldmVudCddKVxuICBwdWJsaWMgb25JdGVtRGlzcGxheUludGVybmFsKGFyZ3M6IENvbGxlY3Rpb25WaWV3SXRlbUV2ZW50RGF0YSkge1xuICAgIGlmICghYXJncy52aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5nVmlldyA9IHRoaXMuZ2V0TmdWaWV3KGFyZ3Mudmlldyk7XG5cbiAgICBpZiAobmdWaWV3KSB7XG4gICAgICBuZ1ZpZXcucmVhdHRhY2goKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpdGVtRGlzcG9zaW5nJywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uSXRlbURpc3Bvc2luZ0ludGVybmFsKGFyZ3M6IGFueSkge1xuICAgIGlmICghYXJncy52aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5nVmlldyA9IHRoaXMuZ2V0TmdWaWV3KGFyZ3Mudmlldyk7XG5cbiAgICBpZiAobmdWaWV3KSB7XG4gICAgICBuZ1ZpZXcuZGV0YWNoKCk7XG4gICAgICB0aGlzLnN0b3JlVmlld1JlZihuZ1ZpZXcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TmdWaWV3KHZpZXc6IFZpZXcpOiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj4ge1xuICAgIGNvbnN0IG5nVmlldyA9IHZpZXdbTkdfVklFV107XG4gICAgLy8gR2V0dGluZyBhbmd1bGFyIHZpZXcgZnJvbSBvcmlnaW5hbCBlbGVtZW50IChpbiBjYXNlcyB3aGVuIFByb3h5Vmlld0NvbnRhaW5lclxuICAgIC8vIGlzIHVzZWQgTmF0aXZlU2NyaXB0IGludGVybmFsbHkgd3JhcHMgaXQgaW4gYSBTdGFja0xheW91dClcbiAgICBpZiAoIW5nVmlldyAmJiB2aWV3IGluc3RhbmNlb2YgTGF5b3V0QmFzZSAmJiB2aWV3LmdldENoaWxkcmVuQ291bnQoKSA+IDApIHtcbiAgICAgIHJldHVybiB2aWV3LmdldENoaWxkQXQoMClbTkdfVklFV107XG4gICAgfVxuICAgIHJldHVybiBuZ1ZpZXc7XG4gIH1cblxuICBwdWJsaWMgc2V0dXBWaWV3UmVmKHZpZXc6IEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD4sIGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRleHQgPSB2aWV3LmNvbnRleHQ7XG4gICAgY29udGV4dC4kaW1wbGljaXQgPSBkYXRhO1xuICAgIGNvbnRleHQuaXRlbSA9IGRhdGE7XG4gICAgY29udGV4dC5pbmRleCA9IGluZGV4O1xuICAgIGNvbnRleHQuZXZlbiA9IGluZGV4ICUgMiA9PT0gMDtcbiAgICBjb250ZXh0Lm9kZCA9ICFjb250ZXh0LmV2ZW47XG5cbiAgICB0aGlzLnNldHVwSXRlbVZpZXcubmV4dCh7XG4gICAgICBjb250ZXh0LFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4LFxuICAgICAgdmlldyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldEl0ZW1UZW1wbGF0ZVZpZXdGYWN0b3J5KHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pOiAoKSA9PiBWaWV3IHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGUodGVtcGxhdGUpO1xuICAgIH07XG4gIH1cbiAgdmlld1Bvb2wgPSBuZXcgTWFwPFxuICAgIFRlbXBsYXRlUmVmPEl0ZW1Db250ZXh0PixcbiAgICB7XG4gICAgICBzY3JhcFNpemU6IG51bWJlcjtcbiAgICAgIHNjcmFwSGVhZDogU2V0PEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD4+O1xuICAgIH1cbiAgPigpO1xuICBwcml2YXRlIHN0b3JlVmlld1JlZih2aWV3UmVmOiBFbWJlZGRlZFZpZXdSZWY8YW55Pikge1xuICAgIGNvbnN0IHRlbXBsYXRlUmVmID0gdGhpcy52aWV3VG9UZW1wbGF0ZS5nZXQodmlld1JlZik7XG4gICAgaWYgKHRlbXBsYXRlUmVmKSB7XG4gICAgICBjb25zdCBzY3JhcCA9IHRoaXMudmlld1Bvb2wuZ2V0KHRlbXBsYXRlUmVmKTtcbiAgICAgIGlmIChzY3JhcCkge1xuICAgICAgICBpZiAoc2NyYXAuc2NyYXBIZWFkLnNpemUgPj0gc2NyYXAuc2NyYXBTaXplKSB7XG4gICAgICAgICAgdmlld1JlZi5kZXN0cm95KCk7XG4gICAgICAgICAgdGhpcy52aWV3VG9Mb2FkZXIuZ2V0KHZpZXdSZWYpPy5kZXN0cm95KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2NyYXAuc2NyYXBIZWFkLmFkZCh2aWV3UmVmKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2aWV3VG9UZW1wbGF0ZSA9IG5ldyBXZWFrTWFwPEVtYmVkZGVkVmlld1JlZjxhbnk+LCBUZW1wbGF0ZVJlZjxhbnk+PigpO1xuICB2aWV3VG9Mb2FkZXIgPSBuZXcgV2Vha01hcDxFbWJlZGRlZFZpZXdSZWY8YW55PiwgQ29tcG9uZW50UmVmPERldGFjaGVkTG9hZGVyPj4oKTtcblxuICBwcml2YXRlIGdldE9yQ3JlYXRlKHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxJdGVtQ29udGV4dD4pIHtcbiAgICByZXR1cm4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBsZXQgdmlld1JlZiA9IHRoaXMuZ2V0Vmlldyh0ZW1wbGF0ZVJlZik7XG4gICAgICBpZiAoIXZpZXdSZWYpIHtcbiAgICAgICAgY29uc3QgbG9hZGVyID0gdGhpcy5kZXRhY2hlZExvYWRlckZhY3RvcnkoKTtcbiAgICAgICAgdmlld1JlZiA9IGxvYWRlci5pbnN0YW5jZS52Yy5jcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGVSZWYsIG5ldyBJdGVtQ29udGV4dCgpLCAwKTtcbiAgICAgICAgdGhpcy52aWV3VG9Mb2FkZXIuc2V0KHZpZXdSZWYsIGxvYWRlcik7XG4gICAgICAgIHRoaXMudmlld1RvVGVtcGxhdGUuc2V0KHZpZXdSZWYsIHRlbXBsYXRlUmVmKTtcbiAgICAgIH1cbiAgICAgIHZpZXdSZWYuZGV0YWNoKCk7XG4gICAgICBjb25zdCByZXN1bHRWaWV3ID0gZ2V0SXRlbVZpZXdSb290KHZpZXdSZWYpO1xuICAgICAgcmVzdWx0Vmlld1tOR19WSUVXXSA9IHZpZXdSZWY7XG4gICAgICByZXN1bHRWaWV3LnJldXNhYmxlID0gdGhpcy5hdXRvUmV1c2VWaWV3cztcbiAgICAgIHJldHVybiByZXN1bHRWaWV3O1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgZ2V0Vmlldyh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgY29uc3QgcG9vbCA9IHRoaXMuZ2V0Vmlld1Bvb2wodGVtcGxhdGVSZWYpO1xuICAgIHdoaWxlIChwb29sLnNjcmFwSGVhZC5zaXplID4gMCkge1xuICAgICAgY29uc3Qgdmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PiA9IHBvb2wuc2NyYXBIZWFkLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICAgIHBvb2wuc2NyYXBIZWFkLmRlbGV0ZSh2aWV3UmVmKTtcbiAgICAgIGlmICghdmlld1JlZi5kZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuIHZpZXdSZWY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRWaWV3UG9vbCh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8SXRlbUNvbnRleHQ+KSB7XG4gICAgaWYgKCF0aGlzLnZpZXdQb29sLmhhcyh0ZW1wbGF0ZVJlZikpIHtcbiAgICAgIHRoaXMudmlld1Bvb2wuc2V0KHRlbXBsYXRlUmVmLCB7XG4gICAgICAgIHNjcmFwU2l6ZTogdGhpcy5hdXRvUmV1c2VWaWV3cyA/IEluZmluaXR5IDogMCxcbiAgICAgICAgc2NyYXBIZWFkOiBuZXcgU2V0PEVtYmVkZGVkVmlld1JlZjxJdGVtQ29udGV4dD4+KCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlld1Bvb2wuZ2V0KHRlbXBsYXRlUmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbVRlbXBsYXRlcygpIHtcbiAgICAvLyBUaGUgaXRlbVRlbXBsYXRlUXVlcnkgbWF5IGJlIGNoYW5nZWQgYWZ0ZXIgbGlzdCBpdGVtcyBhcmUgYWRkZWQgdGhhdCBjb250YWluIDx0ZW1wbGF0ZT4gaW5zaWRlLFxuICAgIC8vIHNvIGNhY2hlIGFuZCB1c2Ugb25seSB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgdG8gYXZvaWQgZXJyb3JzLlxuICAgIHRoaXMuaXRlbVRlbXBsYXRlID0gdGhpcy5pdGVtVGVtcGxhdGVRdWVyeTtcblxuICAgIGlmICh0aGlzLl90ZW1wbGF0ZU1hcCkge1xuICAgICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdTZXR0aW5nIHRlbXBsYXRlcycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0ZW1wbGF0ZXM6IEtleWVkVGVtcGxhdGVbXSA9IFtdO1xuICAgICAgdGhpcy5fdGVtcGxhdGVNYXAuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgdGVtcGxhdGVzLnB1c2godmFsdWUpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9jb2xsZWN0aW9uVmlldy5pdGVtVGVtcGxhdGVzID0gdGVtcGxhdGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgbWFwIHdhcyBub3QgaW5pdGlhbGl6ZWQgdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBuYW1lZCB0ZW1wbGF0ZXMsIHNvIHdlIHJlZ2lzdGVyIHRoZSBkZWZhdWx0IG9uZS5cbiAgICAgIHRoaXMuX2NvbGxlY3Rpb25WaWV3Lml0ZW1UZW1wbGF0ZSA9IHRoaXMuZ2V0SXRlbVRlbXBsYXRlVmlld0ZhY3RvcnkodGhpcy5pdGVtVGVtcGxhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0Q2hhbmdlc09uQ2hpbGQodmlld1JlZjogRW1iZWRkZWRWaWV3UmVmPEl0ZW1Db250ZXh0PiwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ01hbnVhbGx5IGRldGVjdCBjaGFuZ2VzIGluIGNoaWxkOiAnICsgaW5kZXgpO1xuICAgIH1cbiAgICB2aWV3UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIHZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoKCkge1xuICAgIGlmICh0aGlzLl9jb2xsZWN0aW9uVmlldykge1xuICAgICAgdGhpcy5fY29sbGVjdGlvblZpZXcucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudFZpZXcge1xuICByb290Tm9kZXM6IGFueVtdO1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFJvb3RMb2NhdG9yID0gKG5vZGVzOiBhbnlbXSwgbmVzdExldmVsOiBudW1iZXIpID0+IFZpZXc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJdGVtVmlld1Jvb3Qodmlld1JlZjogQ29tcG9uZW50Vmlldywgcm9vdExvY2F0b3I6IFJvb3RMb2NhdG9yID0gZXh0cmFjdFNpbmdsZVZpZXdSZWN1cnNpdmUpOiBWaWV3IHtcbiAgY29uc3Qgcm9vdFZpZXcgPSByb290TG9jYXRvcih2aWV3UmVmLnJvb3ROb2RlcywgMCk7XG4gIHJldHVybiByb290Vmlldztcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2N2VGVtcGxhdGVLZXldJyB9KVxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlS2V5RGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PiwgQEhvc3QoKSBwcml2YXRlIGNvbGxlY3Rpb25WaWV3OiBDb2xsZWN0aW9uVmlld0NvbXBvbmVudCkge31cblxuICBASW5wdXQoKVxuICBzZXQgY3ZUZW1wbGF0ZUtleSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKFRyYWNlLmlzRW5hYmxlZCgpKSB7XG4gICAgICBDTG9nKENMb2dUeXBlcy5pbmZvLCAnY3ZUZW1wbGF0ZUtleTogJyArIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvblZpZXcgJiYgdGhpcy50ZW1wbGF0ZVJlZikge1xuICAgICAgdGhpcy5jb2xsZWN0aW9uVmlldy5yZWdpc3RlclRlbXBsYXRlKHZhbHVlLnRvTG93ZXJDYXNlKCksIHRoaXMudGVtcGxhdGVSZWYpO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY3ZUZW1wbGF0ZUhlYWRlcl0nLFxufSlcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUhlYWRlckRpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4sIEBIb3N0KCkgcHJpdmF0ZSBjb2xsZWN0aW9uVmlldzogQ29sbGVjdGlvblZpZXdDb21wb25lbnQpIHt9XG5cbiAgQElucHV0KClcbiAgc2V0IGN2VGVtcGxhdGVIZWFkZXIodmFsdWU6IGFueSkge1xuICAgIGlmIChUcmFjZS5pc0VuYWJsZWQoKSkge1xuICAgICAgQ0xvZyhDTG9nVHlwZXMuaW5mbywgJ2N2VGVtcGxhdGVIZWFkZXI6ICcgKyB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25WaWV3ICYmIHRoaXMudGVtcGxhdGVSZWYpIHtcbiAgICAgIC8vIFRPRE86IGFsbG93IGtleWluZyBvZiBtdWx0aXBsZSBoZWFkZXJzIHBlciBzZWN0aW9uXG4gICAgICB0aGlzLmNvbGxlY3Rpb25WaWV3LnJlZ2lzdGVyVGVtcGxhdGVTdXBwbGVtZW50YWwodmFsdWUgfHwgVmlld1RlbXBsYXRlVHlwZS5IZWFkZXIsIHRoaXMudGVtcGxhdGVSZWYsICdoZWFkZXInKTtcbiAgICB9XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2N2VGVtcGxhdGVGb290ZXJdJyxcbn0pXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVGb290ZXJEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LCBASG9zdCgpIHByaXZhdGUgY29sbGVjdGlvblZpZXc6IENvbGxlY3Rpb25WaWV3Q29tcG9uZW50KSB7fVxuXG4gIEBJbnB1dCgpXG4gIHNldCBjdlRlbXBsYXRlRm9vdGVyKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoVHJhY2UuaXNFbmFibGVkKCkpIHtcbiAgICAgIENMb2coQ0xvZ1R5cGVzLmluZm8sICdjdlRlbXBsYXRlRm9vdGVyOiAnICsgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uVmlldyAmJiB0aGlzLnRlbXBsYXRlUmVmKSB7XG4gICAgICAvLyBUT0RPOiBhbGxvdyBrZXlpbmcgb2YgbXVsdGlwbGUgZm9vdGVycyBwZXIgc2VjdGlvblxuICAgICAgdGhpcy5jb2xsZWN0aW9uVmlldy5yZWdpc3RlclRlbXBsYXRlU3VwcGxlbWVudGFsKHZhbHVlIHx8IFZpZXdUZW1wbGF0ZVR5cGUuRm9vdGVyLCB0aGlzLnRlbXBsYXRlUmVmLCAnZm9vdGVyJyk7XG4gICAgfVxuICB9XG59XG4iXX0=