ng-select2-component 15.4.0 → 17.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,1170 +0,0 @@
1
- import { CdkConnectedOverlay, } from '@angular/cdk/overlay';
2
- import { Attribute, Component, EventEmitter, HostBinding, HostListener, Input, Optional, Output, Self, TemplateRef, ViewChild, ViewChildren, booleanAttribute, computed, input, numberAttribute, signal, } from '@angular/core';
3
- import { Subject } from 'rxjs';
4
- import { Select2Utils } from './select2-utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/cdk/scrolling";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "@angular/cdk/overlay";
10
- import * as i5 from "ngx-infinite-scroll";
11
- let nextUniqueId = 0;
12
- const OPEN_KEYS = ['ArrowDown', 'ArrowUp', 'Enter', ' ', 'Home', 'End', 'PageUp', 'PageDown'];
13
- const ON_OPEN_KEYS = ['Home', 'End', 'PageUp', 'PageDown'];
14
- const CLOSE_KEYS = ['Escape', 'Tab', { key: 'ArrowUp', altKey: true }];
15
- export class Select2 {
16
- /** data of options & optiongrps */
17
- set data(data) {
18
- this._data = data;
19
- this.updateFilteredData(true);
20
- }
21
- get multiple() {
22
- return this._multiple;
23
- }
24
- set multiple(value) {
25
- this._multiple = value;
26
- this.ngOnInit();
27
- }
28
- /** minimal data of show the search field */
29
- get minCountForSearch() {
30
- return this._minCountForSearch;
31
- }
32
- set minCountForSearch(value) {
33
- this._minCountForSearch = value;
34
- this.updateSearchBox();
35
- }
36
- /** Whether selected items should be hidden. */
37
- get disabled() {
38
- return this._control ? this._control.disabled : this._disabled;
39
- }
40
- set disabled(value) {
41
- this._disabled = value;
42
- }
43
- /** The input element's value. */
44
- get value() {
45
- return this._value;
46
- }
47
- set value(value) {
48
- if (this.testValueChange(this._value, value)) {
49
- setTimeout(() => {
50
- if (this._value === undefined) {
51
- this._value = value ?? null;
52
- }
53
- this.writeValue(value ?? null);
54
- }, 10);
55
- }
56
- }
57
- /** Tab index for the select2 element. */
58
- get tabIndex() {
59
- return this.disabled ? -1 : this._tabIndex;
60
- }
61
- set tabIndex(value) {
62
- this._tabIndex = value;
63
- }
64
- get select2Options() {
65
- return this.multiple ? this.option : null;
66
- }
67
- get select2Option() {
68
- return this.multiple ? null : this.option;
69
- }
70
- get searchText() {
71
- return this.innerSearchText;
72
- }
73
- set searchText(text) {
74
- this.innerSearchText = text;
75
- }
76
- get classMaterial() {
77
- return this.styleMode === 'material';
78
- }
79
- get classNostyle() {
80
- return this.styleMode === 'noStyle';
81
- }
82
- get classBorderless() {
83
- return this.styleMode === 'borderless';
84
- }
85
- get select2above() {
86
- return !this.overlay ? this.listPosition === 'above' : this._isAbobeOverlay();
87
- }
88
- get _positions() {
89
- return this.listPosition === 'auto' ? undefined : null;
90
- }
91
- get resultsElement() {
92
- return this.resultContainer?.nativeElement;
93
- }
94
- constructor(_viewportRuler, _changeDetectorRef, _parentForm, _parentFormGroup, _control, tabIndex) {
95
- this._viewportRuler = _viewportRuler;
96
- this._changeDetectorRef = _changeDetectorRef;
97
- this._parentForm = _parentForm;
98
- this._parentFormGroup = _parentFormGroup;
99
- this._control = _control;
100
- this._uid = `select2-${nextUniqueId++}`;
101
- this.minCharForSearch = 0;
102
- this.limitSelection = 0;
103
- this.listPosition = 'below';
104
- /** use the material style */
105
- this.overlay = false;
106
- /** use the material style */
107
- this.styleMode = 'default';
108
- /** maximum results limit (0 = no limit) */
109
- this.maxResults = 0;
110
- /** message when maximum results */
111
- this.maxResultsMessage = 'Too many results…';
112
- /** infinite scroll distance */
113
- this.infiniteScrollDistance = 1.5;
114
- /** infinite scroll distance */
115
- this.infiniteScrollThrottle = 150;
116
- /** infinite scroll activated */
117
- this.infiniteScroll = false;
118
- /** auto create if not exist */
119
- this.autoCreate = false;
120
- /** no template for label selection */
121
- this.noLabelTemplate = false;
122
- /** the max height of the results container when opening the select */
123
- this.resultMaxHeight = '200px';
124
- /** Active Search event */
125
- this.customSearchEnabled = false;
126
- /** Unique id of the element. */
127
- this.id = input(this._uid);
128
- this.idLabel = computed(() => `${this.id()}-label`);
129
- this.idCombo = computed(() => `${this.id()}-combo`);
130
- this.idOptions = computed(() => `${this.id()}-options`);
131
- this.idOverlay = computed(() => `${this.id()}-overlay`);
132
- this.title = input();
133
- this.ariaLabelledby = input();
134
- this.ariaDescribedby = input();
135
- this.ariaInvalid = input(false, { transform: booleanAttribute });
136
- this.ariaResetButtonDescription = input('Reset');
137
- /** Whether the element is required. */
138
- this.required = false;
139
- /** Whether items are hidden when has. */
140
- this.hideSelectedItems = false;
141
- /** Whether the element is readonly. */
142
- this.readonly = false;
143
- /** reset with no selected value */
144
- this.resettable = false;
145
- /** grid: item by line
146
- * * 0 = no grid
147
- * * number = item by line (4)
148
- * * string = minimal size item (100px)
149
- */
150
- this.grid = '';
151
- /** force selection on one line */
152
- this.selectionNoWrap = false;
153
- /** Add an option to select or remove all (if all is selected) */
154
- this.showSelectAll = false;
155
- /** Text for remove all options */
156
- this.removeAllText = 'Remove all';
157
- /** Text for select all options */
158
- this.selectAllText = 'Select all';
159
- this.update = new EventEmitter();
160
- this.autoCreateItem = new EventEmitter();
161
- this.open = new EventEmitter();
162
- this.close = new EventEmitter();
163
- this.focus = new EventEmitter();
164
- this.blur = new EventEmitter();
165
- this.search = new EventEmitter();
166
- this.scroll = new EventEmitter();
167
- this.removeOption = new EventEmitter();
168
- this.option = null;
169
- this.isOpen = false;
170
- /** Whether the element is focused or not. */
171
- this.focused = false;
172
- this.filteredData = signal(undefined);
173
- this.hoveringOption = signal(null);
174
- this.hoveringOptionId = computed(() => this.getElementId(this.hoveringOption()));
175
- this.innerSearchText = '';
176
- this._stateChanges = new Subject();
177
- this._disabled = false;
178
- this._multiple = false;
179
- this._value = null;
180
- /** View -> model callback called when select has been touched */
181
- this._onTouched = () => {
182
- // do nothing
183
- };
184
- /** View -> model callback called when value changes */
185
- this._onChange = () => {
186
- // do nothing
187
- };
188
- this._tabIndex = parseInt(tabIndex, 10) || 0;
189
- if (this._control) {
190
- this._control.valueAccessor = this;
191
- }
192
- }
193
- clickDetection(e) {
194
- if (this.isOpen && focus) {
195
- const target = e.target;
196
- if (!this.ifParentContainsClass(target, 'selection')) {
197
- if (!this.ifParentContainsClass(target, 'select2-dropdown')) {
198
- this.toggleOpenAndClose();
199
- }
200
- if (!this.overlay && !this.ifParentContainsId(target, this.id())) {
201
- this.clickExit();
202
- }
203
- }
204
- else if (!this.ifParentContainsId(target, this.id())) {
205
- this.toggleOpenAndClose();
206
- this.clickExit();
207
- }
208
- }
209
- else if (this.focused) {
210
- const target = e.target;
211
- this._focus(this.clickOnSelect2Element(target));
212
- }
213
- }
214
- ngOnInit() {
215
- this._viewportRuler.change(100).subscribe(() => {
216
- if (this.isOpen) {
217
- this.triggerRect();
218
- }
219
- });
220
- const option = Select2Utils.getOptionsByValue(this._data, this._control ? this._control.value : this.value, this.multiple);
221
- if (option !== null) {
222
- this.option = option;
223
- }
224
- if (!Array.isArray(option)) {
225
- this.hoveringOption.set(Select2Utils.getOptionByValue(this._data, this.value));
226
- }
227
- this.updateSearchBox();
228
- }
229
- ngAfterViewInit() {
230
- this.cdkConnectedOverlay.positionChange.subscribe((posChange) => {
231
- if (this.listPosition === 'auto' &&
232
- posChange.connectionPair?.originY &&
233
- this._overlayPosition !== posChange.connectionPair.originY) {
234
- this.triggerRect();
235
- this._overlayPosition = posChange.connectionPair.originY;
236
- this._changeDetectorRef.detectChanges();
237
- }
238
- });
239
- this.selectionElement = this.selection.nativeElement;
240
- this.triggerRect();
241
- }
242
- ngDoCheck() {
243
- this.updateSearchBox();
244
- this._dirtyCheckNativeValue();
245
- if (this._triggerRect) {
246
- if (this.overlayWidth !== this._triggerRect.width) {
247
- this.overlayWidth = this._triggerRect.width;
248
- }
249
- if (this._dropdownRect?.height > 0 && this.overlayHeight !== this._dropdownRect.height) {
250
- this.overlayHeight = this.listPosition === 'auto' ? this._dropdownRect.height : 0;
251
- }
252
- }
253
- }
254
- updateSearchBox() {
255
- const hidden = this.displaySearchStatus === 'hidden' ||
256
- (this.displaySearchStatus !== 'always' &&
257
- !this.customSearchEnabled &&
258
- Select2Utils.isSearchboxHidden(this._data, this._minCountForSearch));
259
- if (this.isSearchboxHidden !== hidden) {
260
- this.isSearchboxHidden = hidden;
261
- }
262
- }
263
- getOptionStyle(option) {
264
- return ('select2-results__option ' +
265
- (option.hide ? 'select2-results__option--hide ' : '') +
266
- (option === this.hoveringOption() ? 'select2-results__option--highlighted ' : '') +
267
- (option.classes || ''));
268
- }
269
- mouseenter(option) {
270
- if (!option.disabled) {
271
- this.hoveringOption.set(option);
272
- }
273
- }
274
- click(option) {
275
- if (this.testSelection(option)) {
276
- this.select(option);
277
- }
278
- }
279
- reset(event) {
280
- // const test = Select2Utils.getOptionByValue(this._data, this.resetSelectedValue);
281
- // debugger;
282
- this.select(this.resetSelectedValue !== undefined
283
- ? (Select2Utils.getOptionByValue(this._data, this.resetSelectedValue) ?? null)
284
- : null);
285
- if (event) {
286
- this.stopEvent(event);
287
- }
288
- this._focus(true);
289
- }
290
- prevChange(event) {
291
- event.stopPropagation();
292
- }
293
- stopEvent(event) {
294
- event.preventDefault();
295
- event.stopPropagation();
296
- }
297
- toggleOpenAndClose(focus = true, open, event) {
298
- if (this.disabled || this.readonly) {
299
- return;
300
- }
301
- this._focus(focus);
302
- const onOpenAction = event && this._testKey(event, ON_OPEN_KEYS);
303
- const changeEmit = this.isOpen !== (open ?? !this.isOpen);
304
- this.isOpen = open ?? !this.isOpen;
305
- if (this.isOpen) {
306
- if (!this.isSearchboxHidden) {
307
- this.innerSearchText = '';
308
- this.updateFilteredData();
309
- this._focusSearchbox(focus);
310
- }
311
- if (this.isSearchboxHidden && !changeEmit && event) {
312
- this.keyDown(event);
313
- }
314
- else {
315
- setTimeout(() => {
316
- if (this.option) {
317
- const option = Array.isArray(this.option) ? this.option[0] : this.option;
318
- this.updateScrollFromOption(option);
319
- }
320
- else if (this.resultsElement) {
321
- this.resultsElement.scrollTop = 0;
322
- }
323
- if (onOpenAction) {
324
- this.keyDown(event);
325
- }
326
- setTimeout(() => {
327
- this.triggerRect();
328
- this.cdkConnectedOverlay?.overlayRef?.updatePosition();
329
- }, 100);
330
- });
331
- }
332
- if (changeEmit) {
333
- this.open.emit(this);
334
- }
335
- }
336
- else if (changeEmit) {
337
- this.close.emit(this);
338
- }
339
- this._changeDetectorRef.markForCheck();
340
- }
341
- hasTemplate(option, defaultValue, select = false) {
342
- return ((select
343
- ? this.templates?.[option.templateSelectionId] instanceof TemplateRef ||
344
- this.templates?.[`${defaultValue}Selection`] instanceof TemplateRef ||
345
- this.templates?.[`templateSelection`] instanceof TemplateRef ||
346
- this.templateSelection instanceof TemplateRef
347
- : false) ||
348
- this.templates?.[option.templateId] instanceof TemplateRef ||
349
- this.templates?.[defaultValue] instanceof TemplateRef ||
350
- this.templates?.['template'] instanceof TemplateRef ||
351
- this.templates instanceof TemplateRef ||
352
- false);
353
- }
354
- getTemplate(option, defaultValue, select = false) {
355
- return this.hasTemplate(option, defaultValue, select)
356
- ? (select
357
- ? this.templates?.[option.templateSelectionId] ||
358
- this.templates?.[`${defaultValue}Selection`] ||
359
- this.templates?.[`templateSelection`] ||
360
- this.templateSelection
361
- : undefined) ||
362
- this.templates?.[option.templateId] ||
363
- this.templates?.[defaultValue] ||
364
- this.templates?.['template'] ||
365
- this.templates
366
- : undefined;
367
- }
368
- triggerRect() {
369
- this._triggerRect = this.selectionElement.getBoundingClientRect();
370
- this._dropdownRect = this.dropdown?.nativeElement
371
- ? this.dropdown.nativeElement.getBoundingClientRect()
372
- : undefined;
373
- }
374
- isNumber(o) {
375
- return !isNaN(o - 0) && o !== null && o !== '' && o !== false;
376
- }
377
- selectAll() {
378
- if (this.multiple) {
379
- if (!this.selectAllTest()) {
380
- const options = [];
381
- this._data.forEach(e => {
382
- if (Select2Utils.isGroup(e)) {
383
- e.options.forEach(f => {
384
- if (!f.disabled && !f.hide) {
385
- options.push(f);
386
- }
387
- });
388
- }
389
- else if (!e.disabled && !e.hide) {
390
- options.push(e);
391
- }
392
- });
393
- this.option = options;
394
- this.value = options.map(e => e.value);
395
- }
396
- else {
397
- this.option = [];
398
- this.value = [];
399
- }
400
- this.isOpen = false;
401
- this.close.emit(this);
402
- }
403
- }
404
- selectAllTest() {
405
- if (this.multiple && Array.isArray(this.option) && this.option.length) {
406
- let options = 0;
407
- this._data.forEach(e => {
408
- if (Select2Utils.isGroup(e)) {
409
- e.options.forEach(f => {
410
- if (!f.disabled && !f.hide) {
411
- options++;
412
- }
413
- });
414
- }
415
- else if (!e.disabled && !e.hide) {
416
- options++;
417
- }
418
- });
419
- return this.option.length === options;
420
- }
421
- return false;
422
- }
423
- testSelection(option) {
424
- if (option.disabled) {
425
- return false;
426
- }
427
- return (!this.multiple ||
428
- !this.limitSelection ||
429
- (Array.isArray(this._value) && this._value.length < this.limitSelection));
430
- }
431
- testValueChange(value1, value2) {
432
- if (((value1 === null || value1 === undefined) && (value2 === null || value2 === undefined)) ||
433
- value1 === value2) {
434
- return false;
435
- }
436
- if (this.multiple &&
437
- value1?.length &&
438
- value2?.length &&
439
- value1.length === value2.length) {
440
- for (const e1 of value1) {
441
- const test = value2.indexOf(e1) > -1;
442
- if (!test) {
443
- return true;
444
- }
445
- }
446
- return false;
447
- }
448
- return true;
449
- }
450
- updateFilteredData(writeValue = false) {
451
- setTimeout(() => {
452
- let result = this._data;
453
- if (this.multiple && this.hideSelectedItems) {
454
- result = Select2Utils.getFilteredSelectedData(result, this.option);
455
- }
456
- if (!this.customSearchEnabled && this.searchText && this.searchText.length >= +this.minCharForSearch) {
457
- result = Select2Utils.getFilteredData(result, this.searchText, this.editPattern);
458
- }
459
- if (this.maxResults > 0) {
460
- const data = Select2Utils.getReduceData(result, +this.maxResults);
461
- result = data.result;
462
- this.maxResultsExceeded = data.reduce;
463
- }
464
- else {
465
- this.maxResultsExceeded = false;
466
- }
467
- if (Select2Utils.optionIsNotInFilteredData(result, this.hoveringOption())) {
468
- this.hoveringOption.set(Select2Utils.getFirstAvailableOption(result));
469
- }
470
- if (writeValue && this._previousNativeValue !== this._value) {
471
- // refresh current selected value
472
- this.writeValue(this._control ? this._control.value : this._value);
473
- }
474
- this.filteredData.set(result);
475
- // replace selected options when data change
476
- if (this.multiple && Array.isArray(this.option) && this.option.length) {
477
- const options = [];
478
- const value = this.option.map(e => e.value);
479
- this._data.forEach(e => {
480
- if (Select2Utils.isGroup(e)) {
481
- e.options.forEach(f => {
482
- if (value.includes(f.value)) {
483
- options.push(f);
484
- }
485
- });
486
- }
487
- else if (value.includes(e.value)) {
488
- options.push(e);
489
- }
490
- });
491
- // preserve selection order
492
- this.option = this.option.map(e => options.find(f => f.value === e.value));
493
- }
494
- else if (!Array.isArray(this.option) && this.option) {
495
- let option = undefined;
496
- this._data.forEach(e => {
497
- if (Select2Utils.isGroup(e)) {
498
- e.options.forEach(f => {
499
- if (this.option.value === f.value) {
500
- option = f;
501
- }
502
- });
503
- }
504
- else if (this.option.value === e.value) {
505
- option = e;
506
- }
507
- });
508
- this.option = option;
509
- }
510
- this._changeDetectorRef.detectChanges();
511
- });
512
- }
513
- clickExit() {
514
- this._focus(false);
515
- }
516
- isInSelect(elt) {
517
- return this.ifParentContainsId(elt, this.id()) || this.ifParentContainsId(elt, this.idOverlay());
518
- }
519
- ifParentContainsClass(element, cssClass) {
520
- return this.getParentElementByClass(element, cssClass) !== null;
521
- }
522
- ifParentContainsId(element, id) {
523
- return this.getParentElementById(element, id) !== null;
524
- }
525
- getParentElementByClass(element, cssClass) {
526
- return this.containClasses(element, cssClass.trim().split(/\s+/))
527
- ? element
528
- : element.parentElement
529
- ? this.getParentElementByClass(element.parentElement, cssClass)
530
- : null;
531
- }
532
- getParentElementById(element, id) {
533
- return element.id === id
534
- ? element
535
- : element.parentElement
536
- ? this.getParentElementById(element.parentElement, id)
537
- : null;
538
- }
539
- containClasses(element, cssClasses) {
540
- if (!element.classList) {
541
- return false;
542
- }
543
- for (const cssClass of cssClasses) {
544
- if (!element.classList.contains(cssClass)) {
545
- return false;
546
- }
547
- }
548
- return true;
549
- }
550
- containAlmostOneClasses(element, cssClasses) {
551
- if (!element.classList) {
552
- return false;
553
- }
554
- let containAlmostOne = false;
555
- for (const cssClass of cssClasses) {
556
- if (element.classList.contains(cssClass)) {
557
- containAlmostOne = true;
558
- }
559
- }
560
- return containAlmostOne;
561
- }
562
- clickOnSelect2Element(element) {
563
- return this.containAlmostOneClasses(element, [
564
- 'select2-overlay-backdrop',
565
- 'select2-label-content',
566
- 'select2-selection__rendered',
567
- 'select2-results__option',
568
- ]);
569
- }
570
- focusin(options) {
571
- if (!this.disabled) {
572
- this._focus(true, options);
573
- }
574
- }
575
- focusout(event) {
576
- if (!event.relatedTarget || !this.isInSelect(event.relatedTarget)) {
577
- this._focus(false);
578
- this._onTouched();
579
- }
580
- }
581
- select(option, emit = true) {
582
- let value;
583
- if (option !== null && option !== undefined) {
584
- if (this.multiple) {
585
- const options = this.option;
586
- const index = options.findIndex(op => op.value === option.value);
587
- if (index === -1) {
588
- options.push(option);
589
- }
590
- else {
591
- options.splice(index, 1);
592
- }
593
- value = this.option.map(op => op.value);
594
- }
595
- else {
596
- this.option = option;
597
- if (this.isOpen) {
598
- this.isOpen = false;
599
- this.close.emit(this);
600
- this.selectionElement?.focus();
601
- }
602
- value = this.option.value;
603
- if (!option && this._value === null) {
604
- this._value = value ?? null;
605
- }
606
- }
607
- }
608
- else {
609
- // when remove value
610
- if (Array.isArray(this.option) ? this.option?.length : this.option) {
611
- value = '';
612
- }
613
- this.option = null;
614
- }
615
- if (this.multiple && this.hideSelectedItems) {
616
- this.updateFilteredData();
617
- }
618
- emit &&= value !== undefined && this.testDiffValue(this._value, value);
619
- if (this._control) {
620
- this._onChange(value);
621
- }
622
- if (emit) {
623
- this._value = value ?? null;
624
- setTimeout(() => {
625
- this.update.emit({
626
- component: this,
627
- value: this._value,
628
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
629
- });
630
- });
631
- }
632
- }
633
- testDiffValue(val1, val2) {
634
- return Array.isArray(val1) ? val1?.length !== val2?.length : val1 !== val2;
635
- }
636
- keyDown(event, create = false) {
637
- if (create && this._testKey(event, ['Enter'])) {
638
- this.createAndAdd(event);
639
- }
640
- else if (this._testKey(event, [{ key: 'ArrowDown', altKey: false }])) {
641
- this.moveDown();
642
- event.preventDefault();
643
- }
644
- else if (this._testKey(event, [{ key: 'ArrowUp', altKey: false }])) {
645
- this.moveUp();
646
- event.preventDefault();
647
- }
648
- else if (this._testKey(event, ['Home'])) {
649
- this.moveStart();
650
- event.preventDefault();
651
- }
652
- else if (this._testKey(event, ['End'])) {
653
- this.moveEnd();
654
- event.preventDefault();
655
- }
656
- else if (this._testKey(event, ['PageUp'])) {
657
- this.moveUp(10);
658
- event.preventDefault();
659
- }
660
- else if (this._testKey(event, ['PageDown'])) {
661
- this.moveDown(10);
662
- event.preventDefault();
663
- }
664
- else if (this._testKey(event, ['Enter']) || (this.isSearchboxHidden && this._testKey(event, [' ']))) {
665
- this.selectByEnter();
666
- event.preventDefault();
667
- }
668
- else if (this._testKey(event, CLOSE_KEYS) && this.isOpen) {
669
- this.toggleOpenAndClose();
670
- this._focus(true);
671
- }
672
- }
673
- openKey(event, create = false) {
674
- if (create && this._testKey(event, ['Enter'])) {
675
- this.createAndAdd(event);
676
- }
677
- else if (this._testKey(event, OPEN_KEYS)) {
678
- this.toggleOpenAndClose(true, true, event);
679
- event.preventDefault();
680
- }
681
- else if (this._testKey(event, CLOSE_KEYS)) {
682
- if (this.isOpen) {
683
- this.toggleOpenAndClose();
684
- this._onTouched();
685
- }
686
- }
687
- }
688
- searchUpdate(e) {
689
- this.searchText = e.target.value;
690
- if (!this.customSearchEnabled) {
691
- this.updateFilteredData();
692
- }
693
- else {
694
- this.search.emit({
695
- component: this,
696
- value: this._value,
697
- search: this.searchText,
698
- data: this._data,
699
- filteredData: (data) => {
700
- this.filteredData.set(data);
701
- this._changeDetectorRef.markForCheck();
702
- },
703
- });
704
- }
705
- }
706
- trackBy(_index, item) {
707
- return item.value ?? item;
708
- }
709
- isSelected(option) {
710
- return Select2Utils.isSelected(this.option, option, this.multiple);
711
- }
712
- isDisabled(option) {
713
- return option.disabled ? 'true' : 'false';
714
- }
715
- removeSelection(e, option) {
716
- if (this.readonly || this.disabled) {
717
- return;
718
- }
719
- Select2Utils.removeSelection(this.option, option);
720
- if (this.multiple && this.hideSelectedItems) {
721
- this.updateFilteredData();
722
- }
723
- const value = this.option.map(op => op.value);
724
- if (this._control) {
725
- this._onChange(value);
726
- }
727
- else {
728
- this._value = value ?? null;
729
- }
730
- this.update.emit({
731
- component: this,
732
- value: value,
733
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
734
- });
735
- this.removeOption.emit({
736
- component: this,
737
- value: value,
738
- removedOption: option,
739
- });
740
- e.preventDefault();
741
- e.stopPropagation();
742
- if (this.isOpen) {
743
- this._focusSearchbox();
744
- }
745
- else {
746
- this._focus(true);
747
- }
748
- }
749
- /**
750
- * Sets the model value. Implemented as part of ControlValueAccessor.
751
- * @param value
752
- */
753
- writeValue(value) {
754
- this._setSelectionByValue(value);
755
- }
756
- /**
757
- * Saves a callback function to be invoked when the select's value
758
- * changes from user input. Part of the ControlValueAccessor interface
759
- * required to integrate with Angular's core forms API.
760
- *
761
- * @param fn Callback to be triggered when the value changes.
762
- */
763
- registerOnChange(fn) {
764
- this._onChange = fn;
765
- }
766
- /**
767
- * Saves a callback function to be invoked when the select is blurred
768
- * by the user. Part of the ControlValueAccessor interface required
769
- * to integrate with Angular's core forms API.
770
- *
771
- * @param fn Callback to be triggered when the component has been touched.
772
- */
773
- registerOnTouched(fn) {
774
- this._onTouched = fn;
775
- }
776
- /**
777
- * Sets whether the component should be disabled.
778
- * Implemented as part of ControlValueAccessor.
779
- * @param isDisabled
780
- */
781
- setDisabledState(isDisabled) {
782
- this.disabled = isDisabled;
783
- }
784
- onScroll(way) {
785
- this.scroll.emit({
786
- component: this,
787
- way,
788
- search: this.innerSearchText,
789
- data: this._data,
790
- });
791
- }
792
- _isErrorState() {
793
- const isInvalid = this._control?.invalid;
794
- const isTouched = this._control?.touched;
795
- const isSubmitted = this._parentFormGroup?.submitted || this._parentForm?.submitted;
796
- return !!(isInvalid && (isTouched || isSubmitted));
797
- }
798
- _selectionOverrideLabel() {
799
- if (typeof this.selectionOverride === 'function') {
800
- return this.selectionOverride({
801
- size: this.optionsSize(),
802
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
803
- });
804
- }
805
- else if (typeof this.selectionOverride === 'string') {
806
- return this.selectionOverride.replaceAll('%size%', `${this.optionsSize()}`);
807
- }
808
- }
809
- getElementId(elt) {
810
- if (!elt) {
811
- return null;
812
- }
813
- const [i, j] = this._getElementPath(elt);
814
- const toSuffix = index => (index !== undefined ? `-${index}` : '');
815
- return elt.id ?? `${this.id()}-option${toSuffix(i)}${toSuffix(j)}`;
816
- }
817
- _getElementPath(elt) {
818
- for (let i = 0; i < this._data.length; i++) {
819
- const optionOrGroup = this._data[i];
820
- if (optionOrGroup === elt) {
821
- return [i];
822
- }
823
- else if (Select2Utils.isGroup(optionOrGroup)) {
824
- const j = optionOrGroup.options.findIndex(o => o === elt);
825
- if (j >= 0) {
826
- return [i, j];
827
- }
828
- }
829
- }
830
- return [];
831
- }
832
- optionsSize() {
833
- return Array.isArray(this.option) ? this.option.length : this.option ? 1 : 0;
834
- }
835
- addItem(value) {
836
- let item = Select2Utils.getOptionByValue(this._data, value);
837
- if (!item) {
838
- item = {
839
- value,
840
- label: value,
841
- };
842
- this._data.push(item);
843
- }
844
- return item;
845
- }
846
- createAndAdd(e) {
847
- const value = e.target.value;
848
- if (value.trim()) {
849
- const item = this.addItem(value.trim());
850
- this.click(item);
851
- e.target.value = '';
852
- this.autoCreateItem.emit({
853
- value: item,
854
- component: this,
855
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
856
- });
857
- }
858
- this.stopEvent(e);
859
- }
860
- moveUp(times = 1) {
861
- for (let i = 0; i < times; i++) {
862
- this.updateScrollFromOption(Select2Utils.getPreviousOption(this.filteredData(), this.hoveringOption()));
863
- }
864
- }
865
- moveDown(times = 1) {
866
- for (let i = 0; i < times; i++) {
867
- this.updateScrollFromOption(Select2Utils.getNextOption(this.filteredData(), this.hoveringOption()));
868
- }
869
- }
870
- moveStart() {
871
- this.updateScrollFromOption(Select2Utils.getFirstOption(this.filteredData()));
872
- }
873
- moveEnd() {
874
- this.updateScrollFromOption(Select2Utils.getLastOption(this.filteredData()));
875
- }
876
- updateScrollFromOption(option) {
877
- if (option) {
878
- this.hoveringOption.set(option);
879
- const domElement = this.results.find(r => r.nativeElement.innerText.trim() === option.label);
880
- if (domElement && this.resultsElement) {
881
- this.resultsElement.scrollTop = 0;
882
- const listClientRect = this.resultsElement.getBoundingClientRect();
883
- const optionClientRect = domElement.nativeElement.getBoundingClientRect();
884
- this.resultsElement.scrollTop = optionClientRect.top - listClientRect.top;
885
- }
886
- }
887
- }
888
- selectByEnter() {
889
- if (this.hoveringOption()) {
890
- this.select(this.hoveringOption());
891
- }
892
- }
893
- _testKey(event, refs = []) {
894
- const { key, altKey } = event;
895
- return refs.some(ref => {
896
- if (typeof ref === 'string') {
897
- return ref === key;
898
- }
899
- else {
900
- return key === ref.key && altKey === ref.altKey;
901
- }
902
- });
903
- }
904
- /**
905
- * Sets the selected option based on a value. If no option can be
906
- * found with the designated value, the select trigger is cleared.
907
- */
908
- _setSelectionByValue(value) {
909
- if (this.option || (value !== undefined && value !== null)) {
910
- const isArray = Array.isArray(value);
911
- if (this.multiple && value && !isArray) {
912
- throw new Error('Non array value.');
913
- }
914
- else if (this._data) {
915
- if (this.multiple) {
916
- this.option = []; // if value is null, then empty option and return
917
- if (isArray) {
918
- // value is not null. Preselect value
919
- const selectedValues = Select2Utils.getOptionsByValue(this._data, value, this.multiple);
920
- selectedValues.map(item => this.select(item, false));
921
- this._value ??= value;
922
- if (this.testDiffValue(this._value, value)) {
923
- this.update.emit({
924
- component: this,
925
- value: value,
926
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
927
- });
928
- }
929
- }
930
- else if (value === null) {
931
- // fix if value is null
932
- this.value = [];
933
- this.reset();
934
- this.select(null, false);
935
- if (this.testDiffValue(this._value, value)) {
936
- this._value = [];
937
- this.update.emit({
938
- component: this,
939
- value: this._value,
940
- options: Array.isArray(this.option) ? this.option : this.option ? [this.option] : null,
941
- });
942
- }
943
- }
944
- }
945
- else {
946
- this._value ??= value;
947
- this.select(Select2Utils.getOptionByValue(this._data, value));
948
- }
949
- }
950
- else if (this._control) {
951
- this._control.viewToModelUpdate(value);
952
- }
953
- this._changeDetectorRef.markForCheck();
954
- }
955
- }
956
- /** Does some manual dirty checking on the native input `value` property. */
957
- _dirtyCheckNativeValue() {
958
- const newValue = this.value;
959
- if (this._previousNativeValue !== newValue) {
960
- this._previousNativeValue = newValue;
961
- this._stateChanges.next();
962
- }
963
- }
964
- _focusSearchbox(focus = true) {
965
- if (!this.isSearchboxHidden) {
966
- setTimeout(() => {
967
- if (this.searchInput && this.searchInput.nativeElement && focus) {
968
- this.searchInput.nativeElement.focus();
969
- }
970
- });
971
- }
972
- }
973
- _focus(state, options) {
974
- if (state) {
975
- const eltToFocus = !this.isSearchboxHidden && this.isOpen ? this.searchInput.nativeElement : this.selection.nativeElement;
976
- if (document.activeElement !== eltToFocus) {
977
- eltToFocus.focus(options);
978
- }
979
- }
980
- else if (document.activeElement === this.selection?.nativeElement ||
981
- document.activeElement === this.searchInput?.nativeElement) {
982
- document.activeElement.blur();
983
- }
984
- this._updateFocusState(state);
985
- }
986
- _isAbobeOverlay() {
987
- return this.overlay && this._overlayPosition && this.listPosition === 'auto'
988
- ? this._overlayPosition === 'top'
989
- : this.listPosition === 'above';
990
- }
991
- _updateFocusState(state) {
992
- if (!state && this.focused) {
993
- this.focused = state;
994
- this.blur.emit(this);
995
- }
996
- else if (state && !this.focused) {
997
- this.focused = state;
998
- this.focus.emit(this);
999
- }
1000
- }
1001
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Select2, deps: [{ token: i1.ViewportRuler }, { token: i0.ChangeDetectorRef }, { token: i2.NgForm, optional: true }, { token: i2.FormGroupDirective, optional: true }, { token: i2.NgControl, optional: true, self: true }, { token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
1002
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: Select2, selector: "select2", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: true, transformFunction: null }, minCharForSearch: { classPropertyName: "minCharForSearch", publicName: "minCharForSearch", isSignal: false, isRequired: false, transformFunction: numberAttribute }, displaySearchStatus: { classPropertyName: "displaySearchStatus", publicName: "displaySearchStatus", isSignal: false, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: false, isRequired: false, transformFunction: null }, limitSelection: { classPropertyName: "limitSelection", publicName: "limitSelection", isSignal: false, isRequired: false, transformFunction: numberAttribute }, listPosition: { classPropertyName: "listPosition", publicName: "listPosition", isSignal: false, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, styleMode: { classPropertyName: "styleMode", publicName: "styleMode", isSignal: false, isRequired: false, transformFunction: null }, noResultMessage: { classPropertyName: "noResultMessage", publicName: "noResultMessage", isSignal: false, isRequired: false, transformFunction: null }, maxResults: { classPropertyName: "maxResults", publicName: "maxResults", isSignal: false, isRequired: false, transformFunction: numberAttribute }, maxResultsMessage: { classPropertyName: "maxResultsMessage", publicName: "maxResultsMessage", isSignal: false, isRequired: false, transformFunction: null }, infiniteScrollDistance: { classPropertyName: "infiniteScrollDistance", publicName: "infiniteScrollDistance", isSignal: false, isRequired: false, transformFunction: numberAttribute }, infiniteScrollThrottle: { classPropertyName: "infiniteScrollThrottle", publicName: "infiniteScrollThrottle", isSignal: false, isRequired: false, transformFunction: numberAttribute }, infiniteScroll: { classPropertyName: "infiniteScroll", publicName: "infiniteScroll", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, autoCreate: { classPropertyName: "autoCreate", publicName: "autoCreate", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, noLabelTemplate: { classPropertyName: "noLabelTemplate", publicName: "noLabelTemplate", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, editPattern: { classPropertyName: "editPattern", publicName: "editPattern", isSignal: false, isRequired: false, transformFunction: null }, templates: { classPropertyName: "templates", publicName: "templates", isSignal: false, isRequired: false, transformFunction: null }, templateSelection: { classPropertyName: "templateSelection", publicName: "templateSelection", isSignal: false, isRequired: false, transformFunction: null }, resultMaxHeight: { classPropertyName: "resultMaxHeight", publicName: "resultMaxHeight", isSignal: false, isRequired: false, transformFunction: null }, customSearchEnabled: { classPropertyName: "customSearchEnabled", publicName: "customSearchEnabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, minCountForSearch: { classPropertyName: "minCountForSearch", publicName: "minCountForSearch", isSignal: false, isRequired: false, transformFunction: numberAttribute }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "ariaLabelledby", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "ariaDescribedby", isSignal: true, isRequired: false, transformFunction: null }, ariaInvalid: { classPropertyName: "ariaInvalid", publicName: "ariaInvalid", isSignal: true, isRequired: false, transformFunction: null }, ariaResetButtonDescription: { classPropertyName: "ariaResetButtonDescription", publicName: "ariaResetButtonDescription", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, hideSelectedItems: { classPropertyName: "hideSelectedItems", publicName: "hideSelectedItems", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, value: { classPropertyName: "value", publicName: "value", isSignal: false, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: false, isRequired: false, transformFunction: numberAttribute }, resettable: { classPropertyName: "resettable", publicName: "resettable", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, resetSelectedValue: { classPropertyName: "resetSelectedValue", publicName: "resetSelectedValue", isSignal: false, isRequired: false, transformFunction: null }, grid: { classPropertyName: "grid", publicName: "grid", isSignal: false, isRequired: false, transformFunction: null }, selectionOverride: { classPropertyName: "selectionOverride", publicName: "selectionOverride", isSignal: false, isRequired: false, transformFunction: null }, selectionNoWrap: { classPropertyName: "selectionNoWrap", publicName: "selectionNoWrap", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, showSelectAll: { classPropertyName: "showSelectAll", publicName: "showSelectAll", isSignal: false, isRequired: false, transformFunction: booleanAttribute }, removeAllText: { classPropertyName: "removeAllText", publicName: "removeAllText", isSignal: false, isRequired: false, transformFunction: null }, selectAllText: { classPropertyName: "selectAllText", publicName: "selectAllText", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { update: "update", autoCreateItem: "autoCreateItem", open: "open", close: "close", focus: "focus", blur: "blur", search: "search", scroll: "scroll", removeOption: "removeOption" }, host: { listeners: { "document:click": "clickDetection($event)" }, properties: { "id": "id()", "class.select2-selection-nowrap": "this.selectionNoWrap", "class.material": "this.classMaterial", "class.nostyle": "this.classNostyle", "class.borderless": "this.classBorderless", "class.select2-above": "this.select2above" } }, viewQueries: [{ propertyName: "cdkConnectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true, static: true }, { propertyName: "resultContainer", first: true, predicate: ["results"], descendants: true }, { propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "results", predicate: ["result"], descendants: true }], ngImport: i0, template: "<label class=\"select2-label\" (click)=\"toggleOpenAndClose()\" [id]=\"idLabel()\">\n <ng-content select=\"select2-label\"></ng-content>\n @if (required) {\n <span class=\"select2-required\" aria-hidden=\"true\"></span>\n }\n</label>\n\n<div\n class=\"select2 select2-container select2-container--default\"\n [class.select2-container--focus]=\"focused\"\n [class.select2-container--below]=\"!select2above\"\n [class.select2-container--above]=\"select2above\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-container--disabled]=\"disabled\"\n [class.select2-container--readonly]=\"readonly\"\n>\n <div\n [id]=\"idCombo()\"\n role=\"combobox\"\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-expanded]=\"isOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"idOptions()\"\n [attr.aria-activedescendant]=\"isOpen ? hoveringOptionId() : null\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.title]=\"title()\"\n [attr.aria-invalid]=\"_isErrorState() || ariaInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required ? 'true' : null\"\n [attr.aria-readonly]=\"readonly ? 'true' : null\"\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (focusout)=\"focusout($event)\"\n (keydown)=\"openKey($event)\"\n cdkOverlayOrigin\n [class.select2-focused]=\"focused\"\n >\n <div\n class=\"select2-selection\"\n [class.select2-selection--multiple]=\"multiple\"\n [class.select2-selection--single]=\"!multiple\"\n >\n @if (selectionOverride) {\n <span class=\"select2-selection__override\" [innerHTML]=\"_selectionOverrideLabel()\"></span>\n @if (\n !multiple && resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)\n ) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n } @else if (!multiple) {\n <span class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n @if (!select2Option) {\n <span>&nbsp;</span>\n }\n @if (select2Option) {\n @if (!hasTemplate(select2Option, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"select2Option.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(select2Option, 'option', true); context: select2Option\"\n ></ng-container>\n }\n }\n <span\n [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n </span>\n @if (resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n <span class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n } @else {\n <ul class=\"select2-selection__rendered\">\n @if (!autoCreate) {\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n }\n @for (op of option || []; track trackBy($index, op)) {\n <li\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (focus)=\"_updateFocusState(true)\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n @if (!(disabled || readonly)) {\n <span\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\u00D7</span\n >\n }\n @if (!hasTemplate(op, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"op.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(op, 'option', true); context: op\"\n ></ng-container>\n }\n </li>\n }\n @if (autoCreate) {\n <li\n class=\"select2-selection__auto-create\"\n (focus)=\"stopEvent($event)\"\n (blur)=\"stopEvent($event)\"\n >\n <input\n [id]=\"id() + '-create-field'\"\n (click)=\"toggleOpenAndClose(false, true); stopEvent($event)\"\n (keydown)=\"keyDown($event, true)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-create__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n />\n </li>\n }\n </ul>\n }\n </div>\n </div>\n @if (!overlay) {\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n }\n\n <div class=\"select2-subscript-wrapper\">\n <ng-content select=\"select2-hint\"></ng-content>\n </div>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"select2-overlay-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"this.isOpen && overlay\"\n [cdkConnectedOverlayMinWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHeight]=\"overlayHeight\"\n [cdkConnectedOverlayPositions]=\"_positions\"\n (backdropClick)=\"toggleOpenAndClose()\"\n>\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #containerTemplate>\n <div\n [id]=\"idOverlay()\"\n class=\"select2-container select2-container--default select2-container-dropdown\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-overlay]=\"overlay\"\n [class.select2-position-auto]=\"listPosition === 'auto'\"\n [class.select2-style-borderless]=\"styleMode === 'borderless'\"\n >\n <div\n #dropdown\n class=\"select2-dropdown\"\n [class.select2-dropdown--below]=\"!select2above\"\n [class.select2-dropdown--above]=\"select2above\"\n >\n <div class=\"select2-search select2-search--dropdown\" [class.select2-search--hide]=\"isSearchboxHidden\">\n <input\n #searchInput\n [id]=\"id() + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event, autoCreate)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"idOptions()\"\n aria-expanded=\"true\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n />\n </div>\n\n <div class=\"select2-results\">\n <ul\n [id]=\"idOptions()\"\n #results\n class=\"select2-results__options\"\n [class.select2-grid]=\"grid && isNumber(grid)\"\n [class.select2-grid-auto]=\"grid && !isNumber(grid)\"\n [style.max-height]=\"resultMaxHeight\"\n [style.--grid-size]=\"grid || null\"\n role=\"listbox\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-multiselectable]=\"multiple\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n @if (showSelectAll && multiple) {\n <li\n class=\"select2-results__option select2-selectall\"\n (click)=\"selectAll()\"\n tabindex=\"1\"\n aria-selected\n >\n <div class=\"select2-label-content\">\n {{ selectAllTest() ? removeAllText : selectAllText }}\n </div>\n </li>\n }\n\n @for (groupOrOption of filteredData(); track trackBy(i, groupOrOption); let i = $index) {\n @if (groupOrOption.options !== undefined) {\n <li class=\"select2-results__option select2-results__group\">\n <span [id]=\"getElementId(groupOrOption)\">\n @if (!hasTemplate(groupOrOption, 'group')) {\n <strong\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n getTemplate(groupOrOption, 'group');\n context: groupOrOption\n \"\n >\n </ng-container>\n }\n </span>\n <ul\n class=\"select2-results__options select2-results__options--nested\"\n role=\"group\"\n [attr.aria-labelledby]=\"getElementId(groupOrOption)\"\n >\n @for (option of groupOrOption.options; track trackBy(j, option); let j = $index) {\n <li\n #result\n [id]=\"getElementId(option)\"\n [class]=\"getOptionStyle(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n @if (!hasTemplate(option, 'option')) {\n <div class=\"select2-label-content\" [innerHTML]=\"option.label\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n }\n </li>\n }\n </ul>\n </li>\n } @else {\n <li\n #result\n [id]=\"getElementId(groupOrOption)\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n @if (!hasTemplate(groupOrOption, 'option')) {\n <div [innerHTML]=\"groupOrOption.label\" class=\"select2-label-content\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n }\n </li>\n\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n }\n }\n @if (!filteredData()?.length && noResultMessage) {\n <li class=\"select2-no-result select2-results__option\" [innerHTML]=\"noResultMessage\"></li>\n }\n @if (maxResultsExceeded) {\n <li\n class=\"select2-too-much-result select2-results__option\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n }\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resetButton>\n <button\n type=\"button\"\n (focus)=\"_updateFocusState(true)\"\n (click)=\"reset($event)\"\n (keydown)=\"$event.stopPropagation()\"\n class=\"select2-selection__reset\"\n [attr.aria-description]=\"ariaResetButtonDescription()\"\n [attr.aria-controls]=\"idCombo()\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n</ng-template>\n", styles: [".select2-label{color:var(--select2-label-text-color, #000)}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;width:100%}.select2-container .select2-container-dropdown{position:absolute;width:0px;opacity:0}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:var(--select2-single-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:var(--select2-selection-padding, 0 0 0 8px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:var(--select2-multiple-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-flex;overflow:hidden;padding-left:8px;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap;flex-wrap:wrap;gap:var(--select2-selection-multiple-gap, 2px 5px)}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-selection__auto-create{flex:1 1 150px;min-width:150px;display:flex}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field{width:100%;border:0}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field:focus{border:0;outline:0}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background:var(--select2-dropdown-background, white);border:1px solid var(--select2-dropdown-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);box-sizing:border-box;display:block;position:absolute;width:100%;z-index:1051;height:0;overflow:hidden}.select2-dropdown .select2-label-content{display:contents}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:var(--select2-option-padding, 6px);-webkit-user-select:none;user-select:none;color:var(--select2-option-text-color, #000)}.select2-results__option[aria-selected]{cursor:pointer}.select2-container.select2-container-dropdown.select2-container--open{width:100%;opacity:1}.select2-container--open .select2-dropdown{overflow:auto;height:auto}.select2-container--open .select2-dropdown--above{border-bottom:var(--select2-dropdown-above-border-bottom, none);border-bottom-left-radius:var(--select2-dropdown-above-border-bottom-left-radius, 0);border-bottom-right-radius:var(--select2-dropdown-above-border-bottom-right-radius, 0);bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:var(--select2-dropdown-below-border-top, none);border-top-left-radius:var(--select2-dropdown-below-border-top-left-radius, 0);border-top-right-radius:var(--select2-dropdown-below-border-top-right-radius, 0)}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99}.select2-required:before{content:\"*\";color:var(--select2-required-color, red)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:var(--select2-selection-text-color, #111);line-height:var(--select2-selection-line-height, 28px)}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--single .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--single .select2-selection__override{flex:1;margin:0 5px}.select2-container--default .select2-selection--single .select2-selection__reset,.select2-container--default .select2-selection--single .select2-selection__arrow{display:flex;width:20px;align-items:center;justify-content:center}.select2-container--default .select2-selection--single .select2-selection__arrow:before{content:\" \";border-color:var(--select2-arrow-color, #888) transparent;border-style:solid;border-width:5px 4px 0;height:0;width:0}.select2-container--default .select2-selection--single .select2-selection__reset{color:var(--select2-reset-color, #999);background:var(--select2-reset-background, transparent);border:var(--select2-reset-border, none);border-radius:var(--select2-reset-border-radius, 4px);height:fit-content;align-self:center}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove,.select2-container--default.select2-container--readonly .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--readonly .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--disabled .select2-selection--single,.select2-container--default.select2-container--disabled .select2-selection--multiple{cursor:default;background:var(--select2-selection-disabled-background, #eee)}.select2-container--default.select2-container--readonly .select2-selection--single,.select2-container--default.select2-container--readonly .select2-selection--multiple{background:var(--select2-selection-readonly-background, #eee)}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-color:transparent transparent var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:text;display:flex}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:var(--select2-selection-multiple-padding, 2px 5px);width:100%;min-height:1em;align-items:center}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;line-height:var(--select2-selection-choice-line-height, 20px)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--multiple .select2-selection__override{flex:1;margin:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{color:var(--select2-selection-choice-text-color, #000);background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:default;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:var(--select2-selection-choice-close-color, #999);cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid var(--select2-search-border-color, #aaa);background:1px solid var(--select2-search-background, #fff);border-radius:var(--select2-search-border-radius, 0px)}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{overflow-y:auto}.select2-container--default .select2-results__option.select2-results__group{padding:0;grid-column:col-start/col-end}.select2-container--default .select2-results__option[aria-disabled=true]{color:var(--select2-option-disabled-text-color, #999);background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-option-selected-text-color, #000);background:var(--select2-option-selected-background, #ddd)}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background:var(--select2-option-highlighted-background, #5897fb);color:var(--select2-option-highlighted-text-color, #fff)}.select2-container--default .select2-results__option--hide{display:none}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;color:var(--select2-option-group-text-color, gray);background:var(--select2-option-group-background, transparent)}.select2-no-result{color:var(--select2-no-result-color, #888);font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:var(--select2-too-much-result-color, #888);font-style:var(--select2-too-much-font-style, italic)}.select2-grid,.select2-grid ul{display:grid;grid-template-columns:[col-start] repeat(var(--grid-size),1fr) [col-end]}.select2-grid-auto,.select2-grid-auto ul{display:grid;grid-template-columns:[col-start] repeat(auto-fill,minmax(var(--grid-size, 100px),1fr)) [col-end]}.select2-container--default .select2-grid ul,.select2-container--default .select2-grid-auto ul{padding-left:var(--select2-option-padding, 6px)}.select2-container--default .select2-grid ul .select2-results__group,.select2-container--default .select2-grid-auto ul .select2-results__group{padding-left:0}.select2-container--default .select2-grid ul .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{padding-left:var(--select2-option-padding, 6px)}:host.nostyle .select2-dropdown{border-color:transparent}:host.nostyle .select2-selection--single,:host.nostyle .select2-selection--multiple{background:transparent;border-color:transparent}:host.nostyle .select2-container--default .select2-focused .select2-selection--single,:host.nostyle .select2-container--default .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}:host.borderless .select2-selection--single,:host.borderless .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless .select2-container--default .select2-focused .select2-selection--single,:host.borderless .select2-container--default .select2-focused .select2-selection--multiple,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.select2-selection-nowrap .select2-selection--single.select2-selection,:host.select2-selection-nowrap .select2-selection--single.select2-selection span,:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection span,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{display:flex;flex-wrap:nowrap}:host.material{display:inline-block;width:300px}:host.material>.select2-container{padding-bottom:1.29688em;vertical-align:inherit}:host.material>.select2-container .selection{padding:.4375em 0;border-top:.84375em solid transparent;display:inline-flex;align-items:baseline;width:100%;height:auto}:host.material .select2-container--default .select2-selection--single,:host.material .select2-container--default .select2-selection--multiple{width:100%;border:0;border-radius:0;height:24px;box-sizing:border-box}:host.material .select2-container--default .select2-selection--single:before,:host.material .select2-container--default .select2-selection--multiple:before{content:\" \";display:block;position:absolute;bottom:1.65em;background:var(--select2-material-underline, #ddd);height:1px;width:100%}:host.material .select2-container--default .select2-selection--single:after,:host.material .select2-container--default .select2-selection--multiple:after{content:\" \";display:block;position:absolute;bottom:1.63em;background:var(--select2-material-underline-active, #5a419e);height:2px;width:0%;left:50%;transition:none}:host.material .select2-container--default .select2-selection--single .select2-selection__rendered,:host.material .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:1px;line-height:inherit}:host.material .select2-container--default .select2-selection--single .select2-selection__placeholder,:host.material .select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;color:var(--select2-material-placeholder-color, rgba(0, 0, 0, .38));transition:transform .3s;position:absolute;transform-origin:0 21px;left:0;top:20px}:host.material .select2-container--default .select2-container--open{left:0;bottom:1.6em}:host.material .select2-container--default .select2-selection__placeholder__option{transform:translateY(-1.5em) scale(.75) perspective(100px) translateZ(.001px);width:133.33333%}:host.material .select2-container--default .select2-selection__arrow{top:20px}:host.material .select2-container--default.select2-container--open .select2-selection--single:after,:host.material .select2-container--default.select2-container--open .select2-selection--multiple:after,:host.material .select2-container--default .select2-focused .select2-selection--single:after,:host.material .select2-container--default .select2-focused .select2-selection--multiple:after{transition:width .3s cubic-bezier(.12,1,.77,1),left .3s cubic-bezier(.12,1,.77,1);width:100%;left:0%}:host.material .select2-container--default .select2-dropdown{border-radius:0;border:0;box-shadow:0 5px 5px #00000080}:host.material .select2-container--default .select2-results__option[aria-selected=true],:host.material .select2-container--default .select2-results__option--highlighted[aria-selected]{background:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-material-option-selected-text-color, #ff5722)}:host.material .select2-container--default.select2-container--disabled .select2-selection--single,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple,:host.material .select2-container--default.select2-container--readonly .select2-selection--single,:host.material .select2-container--default.select2-container--readonly .select2-selection--multiple{background:transparent}:host.material .select2-container--default.select2-container--disabled .select2-selection--single:before,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple:before{background:var(--select2-material-underline-disabled, linear-gradient(to right, rgba(0, 0, 0, .26) 0, rgba(0, 0, 0, .26) 33%, transparent 0));background-size:4px 1px;background-repeat:repeat-x;background-position:0 bottom}:host.material .select2-container--default.select2-container--readonly .select2-selection--single:before,:host.material .select2-container--default.select2-container--readonly .select2-selection--multiple:before{background:var(--select2-material-underline-readonly, linear-gradient(to right, rgba(0, 0, 0, .26) 0, rgba(0, 0, 0, .26) 33%, transparent 0));background-size:4px 1px;background-repeat:repeat-x;background-position:0 bottom}:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:after{background:var(--select2-material-underline-invalid, red)}:host.material:not(.select2-container--open) .select2-focused .select2-selection--single,:host.material:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:0}:host.material .select2-subscript-wrapper{position:absolute;top:calc(100% - 1.72917em);font-size:75%;color:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{background:var(--select2-overlay-backdrop, transparent)}::ng-deep .cdk-overlay-container .select2-container .select2-dropdown.select2-dropdown--above{bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown{margin-bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown.select2-dropdown--above{bottom:0;margin-bottom:0;margin-top:28px}::ng-deep .cdk-overlay-container .select2-style-borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i4.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: i5.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }] }); }
1003
- }
1004
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Select2, decorators: [{
1005
- type: Component,
1006
- args: [{ selector: 'select2', host: {
1007
- '[id]': 'id()',
1008
- }, template: "<label class=\"select2-label\" (click)=\"toggleOpenAndClose()\" [id]=\"idLabel()\">\n <ng-content select=\"select2-label\"></ng-content>\n @if (required) {\n <span class=\"select2-required\" aria-hidden=\"true\"></span>\n }\n</label>\n\n<div\n class=\"select2 select2-container select2-container--default\"\n [class.select2-container--focus]=\"focused\"\n [class.select2-container--below]=\"!select2above\"\n [class.select2-container--above]=\"select2above\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-container--disabled]=\"disabled\"\n [class.select2-container--readonly]=\"readonly\"\n>\n <div\n [id]=\"idCombo()\"\n role=\"combobox\"\n class=\"selection\"\n #selection\n #trigger=\"cdkOverlayOrigin\"\n [tabindex]=\"!this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-expanded]=\"isOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"idOptions()\"\n [attr.aria-activedescendant]=\"isOpen ? hoveringOptionId() : null\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.title]=\"title()\"\n [attr.aria-invalid]=\"_isErrorState() || ariaInvalid() ? 'true' : null\"\n [attr.aria-required]=\"required ? 'true' : null\"\n [attr.aria-readonly]=\"readonly ? 'true' : null\"\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\n (click)=\"toggleOpenAndClose()\"\n (focus)=\"focusin()\"\n (focusout)=\"focusout($event)\"\n (keydown)=\"openKey($event)\"\n cdkOverlayOrigin\n [class.select2-focused]=\"focused\"\n >\n <div\n class=\"select2-selection\"\n [class.select2-selection--multiple]=\"multiple\"\n [class.select2-selection--single]=\"!multiple\"\n >\n @if (selectionOverride) {\n <span class=\"select2-selection__override\" [innerHTML]=\"_selectionOverrideLabel()\"></span>\n @if (\n !multiple && resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)\n ) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n } @else if (!multiple) {\n <span class=\"select2-selection__rendered\" [title]=\"select2Option?.label || ''\">\n @if (!select2Option) {\n <span>&nbsp;</span>\n }\n @if (select2Option) {\n @if (!hasTemplate(select2Option, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"select2Option.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(select2Option, 'option', true); context: select2Option\"\n ></ng-container>\n }\n }\n <span\n [class.select2-selection__placeholder__option]=\"option\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n </span>\n @if (resettable && resetSelectedValue !== value && select2Option && !(disabled || readonly)) {\n <ng-container *ngTemplateOutlet=\"resetButton\"></ng-container>\n }\n <span class=\"select2-selection__arrow\" role=\"presentation\"> </span>\n } @else {\n <ul class=\"select2-selection__rendered\">\n @if (!autoCreate) {\n <span\n [class.select2-selection__placeholder__option]=\"select2Options?.length > 0\"\n class=\"select2-selection__placeholder\"\n >{{ placeholder }}</span\n >\n }\n @for (op of option || []; track trackBy($index, op)) {\n <li\n class=\"select2-selection__choice\"\n [title]=\"op.label\"\n tabindex=\"0\"\n (focus)=\"_updateFocusState(true)\"\n (keydown.enter)=\"removeSelection($event, op)\"\n >\n @if (!(disabled || readonly)) {\n <span\n (click)=\"removeSelection($event, op)\"\n class=\"select2-selection__choice__remove\"\n role=\"presentation\"\n aria-hidden=\"true\"\n >\u00D7</span\n >\n }\n @if (!hasTemplate(op, 'option', true) || noLabelTemplate) {\n <span [innerHTML]=\"op.label\"></span>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(op, 'option', true); context: op\"\n ></ng-container>\n }\n </li>\n }\n @if (autoCreate) {\n <li\n class=\"select2-selection__auto-create\"\n (focus)=\"stopEvent($event)\"\n (blur)=\"stopEvent($event)\"\n >\n <input\n [id]=\"id() + '-create-field'\"\n (click)=\"toggleOpenAndClose(false, true); stopEvent($event)\"\n (keydown)=\"keyDown($event, true)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-create__field\"\n type=\"search\"\n role=\"textbox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n />\n </li>\n }\n </ul>\n }\n </div>\n </div>\n @if (!overlay) {\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n }\n\n <div class=\"select2-subscript-wrapper\">\n <ng-content select=\"select2-hint\"></ng-content>\n </div>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"select2-overlay-backdrop\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"this.isOpen && overlay\"\n [cdkConnectedOverlayMinWidth]=\"overlayWidth\"\n [cdkConnectedOverlayHeight]=\"overlayHeight\"\n [cdkConnectedOverlayPositions]=\"_positions\"\n (backdropClick)=\"toggleOpenAndClose()\"\n>\n <ng-container *ngTemplateOutlet=\"containerTemplate\"></ng-container>\n</ng-template>\n\n<ng-template #containerTemplate>\n <div\n [id]=\"idOverlay()\"\n class=\"select2-container select2-container--default select2-container-dropdown\"\n [class.select2-container--open]=\"isOpen\"\n [class.select2-overlay]=\"overlay\"\n [class.select2-position-auto]=\"listPosition === 'auto'\"\n [class.select2-style-borderless]=\"styleMode === 'borderless'\"\n >\n <div\n #dropdown\n class=\"select2-dropdown\"\n [class.select2-dropdown--below]=\"!select2above\"\n [class.select2-dropdown--above]=\"select2above\"\n >\n <div class=\"select2-search select2-search--dropdown\" [class.select2-search--hide]=\"isSearchboxHidden\">\n <input\n #searchInput\n [id]=\"id() + '-search-field'\"\n [value]=\"searchText\"\n (keydown)=\"keyDown($event, autoCreate)\"\n (keyup)=\"searchUpdate($event)\"\n (change)=\"prevChange($event)\"\n class=\"select2-search__field\"\n type=\"search\"\n role=\"combobox\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n autocapitalize=\"off\"\n spellcheck=\"false\"\n [attr.tabindex]=\"this.isOpen ? tabIndex : '-1'\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n aria-autocomplete=\"list\"\n [attr.aria-controls]=\"idOptions()\"\n aria-expanded=\"true\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n />\n </div>\n\n <div class=\"select2-results\">\n <ul\n [id]=\"idOptions()\"\n #results\n class=\"select2-results__options\"\n [class.select2-grid]=\"grid && isNumber(grid)\"\n [class.select2-grid-auto]=\"grid && !isNumber(grid)\"\n [style.max-height]=\"resultMaxHeight\"\n [style.--grid-size]=\"grid || null\"\n role=\"listbox\"\n tabindex=\"-1\"\n infiniteScroll\n [infiniteScrollDisabled]=\"!infiniteScroll && !isOpen\"\n [infiniteScrollDistance]=\"infiniteScrollDistance\"\n [infiniteScrollThrottle]=\"infiniteScrollThrottle\"\n [infiniteScrollContainer]=\"results\"\n [attr.aria-labelledby]=\"ariaLabelledby() ?? idLabel()\"\n [attr.aria-multiselectable]=\"multiple\"\n [attr.aria-activedescendant]=\"hoveringOptionId()\"\n (scrolled)=\"onScroll('down')\"\n (scrolledUp)=\"onScroll('up')\"\n (keydown)=\"keyDown($event)\"\n >\n @if (showSelectAll && multiple) {\n <li\n class=\"select2-results__option select2-selectall\"\n (click)=\"selectAll()\"\n tabindex=\"1\"\n aria-selected\n >\n <div class=\"select2-label-content\">\n {{ selectAllTest() ? removeAllText : selectAllText }}\n </div>\n </li>\n }\n\n @for (groupOrOption of filteredData(); track trackBy(i, groupOrOption); let i = $index) {\n @if (groupOrOption.options !== undefined) {\n <li class=\"select2-results__option select2-results__group\">\n <span [id]=\"getElementId(groupOrOption)\">\n @if (!hasTemplate(groupOrOption, 'group')) {\n <strong\n [attr.class]=\"\n 'select2-results__group' +\n (groupOrOption.classes ? ' ' + groupOrOption.classes : '')\n \"\n [innerHTML]=\"groupOrOption.label\"\n ></strong>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n getTemplate(groupOrOption, 'group');\n context: groupOrOption\n \"\n >\n </ng-container>\n }\n </span>\n <ul\n class=\"select2-results__options select2-results__options--nested\"\n role=\"group\"\n [attr.aria-labelledby]=\"getElementId(groupOrOption)\"\n >\n @for (option of groupOrOption.options; track trackBy(j, option); let j = $index) {\n <li\n #result\n [id]=\"getElementId(option)\"\n [class]=\"getOptionStyle(option)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(option)\"\n [attr.aria-disabled]=\"isDisabled(option)\"\n (mouseenter)=\"mouseenter(option)\"\n (click)=\"click(option)\"\n >\n @if (!hasTemplate(option, 'option')) {\n <div class=\"select2-label-content\" [innerHTML]=\"option.label\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(option, 'option'); context: option\"\n >\n </ng-container>\n }\n </li>\n }\n </ul>\n </li>\n } @else {\n <li\n #result\n [id]=\"getElementId(groupOrOption)\"\n [class]=\"getOptionStyle(groupOrOption)\"\n role=\"option\"\n [attr.aria-selected]=\"isSelected(groupOrOption)\"\n [attr.aria-disabled]=\"isDisabled(groupOrOption)\"\n (mouseenter)=\"mouseenter(groupOrOption)\"\n (click)=\"click(groupOrOption)\"\n >\n @if (!hasTemplate(groupOrOption, 'option')) {\n <div [innerHTML]=\"groupOrOption.label\" class=\"select2-label-content\"></div>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n }\n </li>\n\n <ng-template #li>\n <ng-container\n *ngTemplateOutlet=\"getTemplate(groupOrOption, 'option'); context: groupOrOption\"\n >\n </ng-container>\n </ng-template>\n }\n }\n @if (!filteredData()?.length && noResultMessage) {\n <li class=\"select2-no-result select2-results__option\" [innerHTML]=\"noResultMessage\"></li>\n }\n @if (maxResultsExceeded) {\n <li\n class=\"select2-too-much-result select2-results__option\"\n [innerHTML]=\"maxResultsMessage\"\n ></li>\n }\n </ul>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resetButton>\n <button\n type=\"button\"\n (focus)=\"_updateFocusState(true)\"\n (click)=\"reset($event)\"\n (keydown)=\"$event.stopPropagation()\"\n class=\"select2-selection__reset\"\n [attr.aria-description]=\"ariaResetButtonDescription()\"\n [attr.aria-controls]=\"idCombo()\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n</ng-template>\n", styles: [".select2-label{color:var(--select2-label-text-color, #000)}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;width:100%}.select2-container .select2-container-dropdown{position:absolute;width:0px;opacity:0}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:var(--select2-single-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding:var(--select2-selection-padding, 0 0 0 8px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:var(--select2-multiple-height, 28px);-webkit-user-select:none;user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-flex;overflow:hidden;padding-left:8px;padding-bottom:2px;text-overflow:ellipsis;white-space:nowrap;flex-wrap:wrap;gap:var(--select2-selection-multiple-gap, 2px 5px)}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-selection__auto-create{flex:1 1 150px;min-width:150px;display:flex}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field{width:100%;border:0}.select2-container .select2-selection--multiple .select2-selection__rendered .select2-create__field:focus{border:0;outline:0}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background:var(--select2-dropdown-background, white);border:1px solid var(--select2-dropdown-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);box-sizing:border-box;display:block;position:absolute;width:100%;z-index:1051;height:0;overflow:hidden}.select2-dropdown .select2-label-content{display:contents}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:var(--select2-option-padding, 6px);-webkit-user-select:none;user-select:none;color:var(--select2-option-text-color, #000)}.select2-results__option[aria-selected]{cursor:pointer}.select2-container.select2-container-dropdown.select2-container--open{width:100%;opacity:1}.select2-container--open .select2-dropdown{overflow:auto;height:auto}.select2-container--open .select2-dropdown--above{border-bottom:var(--select2-dropdown-above-border-bottom, none);border-bottom-left-radius:var(--select2-dropdown-above-border-bottom-left-radius, 0);border-bottom-right-radius:var(--select2-dropdown-above-border-bottom-right-radius, 0);bottom:27px;display:flex;flex-direction:column-reverse}.select2-container--open .select2-dropdown--below{border-top:var(--select2-dropdown-below-border-top, none);border-top-left-radius:var(--select2-dropdown-below-border-top-left-radius, 0);border-top-right-radius:var(--select2-dropdown-below-border-top-right-radius, 0)}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99}.select2-required:before{content:\"*\";color:var(--select2-required-color, red)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);display:flex}.select2-container--default .select2-selection--single .select2-selection__rendered{color:var(--select2-selection-text-color, #111);line-height:var(--select2-selection-line-height, 28px)}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:var(--select2-placeholder-color, #999)}.select2-container--default .select2-selection--single .select2-selection__placeholder span{overflow:hidden;white-space:nowrap;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--single .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--single .select2-selection__override{flex:1;margin:0 5px}.select2-container--default .select2-selection--single .select2-selection__reset,.select2-container--default .select2-selection--single .select2-selection__arrow{display:flex;width:20px;align-items:center;justify-content:center}.select2-container--default .select2-selection--single .select2-selection__arrow:before{content:\" \";border-color:var(--select2-arrow-color, #888) transparent;border-style:solid;border-width:5px 4px 0;height:0;width:0}.select2-container--default .select2-selection--single .select2-selection__reset{color:var(--select2-reset-color, #999);background:var(--select2-reset-background, transparent);border:var(--select2-reset-border, none);border-radius:var(--select2-reset-border-radius, 4px);height:fit-content;align-self:center}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--disabled .select2-selection__choice__remove,.select2-container--default.select2-container--readonly .select2-selection--single .select2-selection__clear,.select2-container--default.select2-container--readonly .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--disabled .select2-selection--single,.select2-container--default.select2-container--disabled .select2-selection--multiple{cursor:default;background:var(--select2-selection-disabled-background, #eee)}.select2-container--default.select2-container--readonly .select2-selection--single,.select2-container--default.select2-container--readonly .select2-selection--multiple{background:var(--select2-selection-readonly-background, #eee)}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow:before{border-color:transparent transparent var(--select2-arrow-color, #888);border-width:0 4px 5px}.select2-container--default .select2-selection--multiple{background:var(--select2-selection-background, #fff);border:1px solid var(--select2-selection-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:text;display:flex}.select2-container--default .select2-selection--multiple .select2-selection__rendered{flex:1 1 auto;box-sizing:border-box;list-style:none;margin:0;padding:var(--select2-selection-multiple-padding, 2px 5px);width:100%;min-height:1em;align-items:center}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;line-height:var(--select2-selection-choice-line-height, 20px)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;width:100%;color:var(--select2-placeholder-color, #999);margin-top:5px;float:left;overflow:hidden;white-space:nowrap;text-overflow:var(--select2-placeholder-overflow, ellipsis)}.select2-container--default .select2-selection--multiple .select2-selection__placeholder__option{display:none}.select2-container--default .select2-selection--multiple .select2-selection__override{flex:1;margin:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{color:var(--select2-selection-choice-text-color, #000);background:var(--select2-selection-choice-background, #e4e4e4);border:1px solid var(--select2-selection-choice-border-color, #aaa);border-radius:var(--select2-selection-border-radius, 4px);cursor:default;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:var(--select2-selection-choice-close-color, #999);cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:var(--select2-selection-choice-hover-close-color, #333)}.select2-container--default.select2-container--focused .select2-selection--multiple{border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,.select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:solid var(--select2-selection-focus-border-color, #000) 1px;outline:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid var(--select2-search-border-color, #aaa);background:1px solid var(--select2-search-background, #fff);border-radius:var(--select2-search-border-radius, 0px)}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{overflow-y:auto}.select2-container--default .select2-results__option.select2-results__group{padding:0;grid-column:col-start/col-end}.select2-container--default .select2-results__option[aria-disabled=true]{color:var(--select2-option-disabled-text-color, #999);background:var(--select2-option-disabled-background, transparent)}.select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-option-selected-text-color, #000);background:var(--select2-option-selected-background, #ddd)}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background:var(--select2-option-highlighted-background, #5897fb);color:var(--select2-option-highlighted-text-color, #fff)}.select2-container--default .select2-results__option--hide{display:none}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;color:var(--select2-option-group-text-color, gray);background:var(--select2-option-group-background, transparent)}.select2-no-result{color:var(--select2-no-result-color, #888);font-style:var(--select2-no-result-font-style, italic)}.select2-too-much-result{color:var(--select2-too-much-result-color, #888);font-style:var(--select2-too-much-font-style, italic)}.select2-grid,.select2-grid ul{display:grid;grid-template-columns:[col-start] repeat(var(--grid-size),1fr) [col-end]}.select2-grid-auto,.select2-grid-auto ul{display:grid;grid-template-columns:[col-start] repeat(auto-fill,minmax(var(--grid-size, 100px),1fr)) [col-end]}.select2-container--default .select2-grid ul,.select2-container--default .select2-grid-auto ul{padding-left:var(--select2-option-padding, 6px)}.select2-container--default .select2-grid ul .select2-results__group,.select2-container--default .select2-grid-auto ul .select2-results__group{padding-left:0}.select2-container--default .select2-grid ul .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option,.select2-container--default .select2-grid-auto ul .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{padding-left:var(--select2-option-padding, 6px)}:host.nostyle .select2-dropdown{border-color:transparent}:host.nostyle .select2-selection--single,:host.nostyle .select2-selection--multiple{background:transparent;border-color:transparent}:host.nostyle .select2-container--default .select2-focused .select2-selection--single,:host.nostyle .select2-container--default .select2-focused .select2-selection--multiple,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.nostyle .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}:host.borderless .select2-selection--single,:host.borderless .select2-selection--multiple{background:transparent;border-color:transparent}:host.borderless .select2-container--default .select2-focused .select2-selection--single,:host.borderless .select2-container--default .select2-focused .select2-selection--multiple,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--single,:host.borderless .select2-container--default:not(.select2-container--open) .select2-focused .select2-selection--multiple{background:transparent;border-color:transparent}:host.select2-selection-nowrap .select2-selection--single.select2-selection,:host.select2-selection-nowrap .select2-selection--single.select2-selection span,:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection span,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}:host.select2-selection-nowrap .select2-selection--single.select2-selection ul,:host.select2-selection-nowrap .select2-selection--multiple.select2-selection ul{display:flex;flex-wrap:nowrap}:host.material{display:inline-block;width:300px}:host.material>.select2-container{padding-bottom:1.29688em;vertical-align:inherit}:host.material>.select2-container .selection{padding:.4375em 0;border-top:.84375em solid transparent;display:inline-flex;align-items:baseline;width:100%;height:auto}:host.material .select2-container--default .select2-selection--single,:host.material .select2-container--default .select2-selection--multiple{width:100%;border:0;border-radius:0;height:24px;box-sizing:border-box}:host.material .select2-container--default .select2-selection--single:before,:host.material .select2-container--default .select2-selection--multiple:before{content:\" \";display:block;position:absolute;bottom:1.65em;background:var(--select2-material-underline, #ddd);height:1px;width:100%}:host.material .select2-container--default .select2-selection--single:after,:host.material .select2-container--default .select2-selection--multiple:after{content:\" \";display:block;position:absolute;bottom:1.63em;background:var(--select2-material-underline-active, #5a419e);height:2px;width:0%;left:50%;transition:none}:host.material .select2-container--default .select2-selection--single .select2-selection__rendered,:host.material .select2-container--default .select2-selection--multiple .select2-selection__rendered{padding-left:1px;line-height:inherit}:host.material .select2-container--default .select2-selection--single .select2-selection__placeholder,:host.material .select2-container--default .select2-selection--multiple .select2-selection__placeholder{display:block;color:var(--select2-material-placeholder-color, rgba(0, 0, 0, .38));transition:transform .3s;position:absolute;transform-origin:0 21px;left:0;top:20px}:host.material .select2-container--default .select2-container--open{left:0;bottom:1.6em}:host.material .select2-container--default .select2-selection__placeholder__option{transform:translateY(-1.5em) scale(.75) perspective(100px) translateZ(.001px);width:133.33333%}:host.material .select2-container--default .select2-selection__arrow{top:20px}:host.material .select2-container--default.select2-container--open .select2-selection--single:after,:host.material .select2-container--default.select2-container--open .select2-selection--multiple:after,:host.material .select2-container--default .select2-focused .select2-selection--single:after,:host.material .select2-container--default .select2-focused .select2-selection--multiple:after{transition:width .3s cubic-bezier(.12,1,.77,1),left .3s cubic-bezier(.12,1,.77,1);width:100%;left:0%}:host.material .select2-container--default .select2-dropdown{border-radius:0;border:0;box-shadow:0 5px 5px #00000080}:host.material .select2-container--default .select2-results__option[aria-selected=true],:host.material .select2-container--default .select2-results__option--highlighted[aria-selected]{background:var(--select2-material-option-selected-background, rgba(0, 0, 0, .04));color:var(--select2-material-option-highlighted-text-color, #000)}:host.material .select2-container--default .select2-results__option[aria-selected=true]{color:var(--select2-material-option-selected-text-color, #ff5722)}:host.material .select2-container--default.select2-container--disabled .select2-selection--single,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple,:host.material .select2-container--default.select2-container--readonly .select2-selection--single,:host.material .select2-container--default.select2-container--readonly .select2-selection--multiple{background:transparent}:host.material .select2-container--default.select2-container--disabled .select2-selection--single:before,:host.material .select2-container--default.select2-container--disabled .select2-selection--multiple:before{background:var(--select2-material-underline-disabled, linear-gradient(to right, rgba(0, 0, 0, .26) 0, rgba(0, 0, 0, .26) 33%, transparent 0));background-size:4px 1px;background-repeat:repeat-x;background-position:0 bottom}:host.material .select2-container--default.select2-container--readonly .select2-selection--single:before,:host.material .select2-container--default.select2-container--readonly .select2-selection--multiple:before{background:var(--select2-material-underline-readonly, linear-gradient(to right, rgba(0, 0, 0, .26) 0, rgba(0, 0, 0, .26) 33%, transparent 0));background-size:4px 1px;background-repeat:repeat-x;background-position:0 bottom}:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--single:after,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:before,:host.material.ng-invalid.ng-touched .select2-container--default .select2-selection--multiple:after{background:var(--select2-material-underline-invalid, red)}:host.material:not(.select2-container--open) .select2-focused .select2-selection--single,:host.material:not(.select2-container--open) .select2-focused .select2-selection--multiple{border:0}:host.material .select2-subscript-wrapper{position:absolute;top:calc(100% - 1.72917em);font-size:75%;color:var(--select2-hint-text-color, #888)}::ng-deep .select2-overlay-backdrop{background:var(--select2-overlay-backdrop, transparent)}::ng-deep .cdk-overlay-container .select2-container .select2-dropdown.select2-dropdown--above{bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown{margin-bottom:28px}::ng-deep .cdk-overlay-container .select2-container--open.select2-position-auto .select2-dropdown.select2-dropdown--above{bottom:0;margin-bottom:0;margin-top:28px}::ng-deep .cdk-overlay-container .select2-style-borderless{--select2-dropdown-above-border-bottom: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-above-border-bottom-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-above-border-bottom-right-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top: 1px solid var(--select2-dropdown-border-color, #aaa);--select2-dropdown-below-border-top-left-radius: var(--select2-selection-border-radius, 4px);--select2-dropdown-below-border-top-right-radius: var(--select2-selection-border-radius, 4px)}@supports (-moz-appearance: none){select2.material .select2-container--default .select2-selection--single,select2.material .select2-container--default .select2-selection--multiple{height:26px}}\n"] }]
1009
- }], ctorParameters: () => [{ type: i1.ViewportRuler }, { type: i0.ChangeDetectorRef }, { type: i2.NgForm, decorators: [{
1010
- type: Optional
1011
- }] }, { type: i2.FormGroupDirective, decorators: [{
1012
- type: Optional
1013
- }] }, { type: i2.NgControl, decorators: [{
1014
- type: Self
1015
- }, {
1016
- type: Optional
1017
- }] }, { type: undefined, decorators: [{
1018
- type: Attribute,
1019
- args: ['tabindex']
1020
- }] }], propDecorators: { data: [{
1021
- type: Input,
1022
- args: [{ required: true }]
1023
- }], minCharForSearch: [{
1024
- type: Input,
1025
- args: [{ transform: numberAttribute }]
1026
- }], displaySearchStatus: [{
1027
- type: Input
1028
- }], placeholder: [{
1029
- type: Input
1030
- }], limitSelection: [{
1031
- type: Input,
1032
- args: [{ transform: numberAttribute }]
1033
- }], listPosition: [{
1034
- type: Input
1035
- }], multiple: [{
1036
- type: Input,
1037
- args: [{ transform: booleanAttribute }]
1038
- }], overlay: [{
1039
- type: Input,
1040
- args: [{ transform: booleanAttribute }]
1041
- }], styleMode: [{
1042
- type: Input
1043
- }], noResultMessage: [{
1044
- type: Input
1045
- }], maxResults: [{
1046
- type: Input,
1047
- args: [{ transform: numberAttribute }]
1048
- }], maxResultsMessage: [{
1049
- type: Input
1050
- }], infiniteScrollDistance: [{
1051
- type: Input,
1052
- args: [{ transform: numberAttribute }]
1053
- }], infiniteScrollThrottle: [{
1054
- type: Input,
1055
- args: [{ transform: numberAttribute }]
1056
- }], infiniteScroll: [{
1057
- type: Input,
1058
- args: [{ transform: booleanAttribute }]
1059
- }], autoCreate: [{
1060
- type: Input,
1061
- args: [{ transform: booleanAttribute }]
1062
- }], noLabelTemplate: [{
1063
- type: Input,
1064
- args: [{ transform: booleanAttribute }]
1065
- }], editPattern: [{
1066
- type: Input
1067
- }], templates: [{
1068
- type: Input
1069
- }], templateSelection: [{
1070
- type: Input
1071
- }], resultMaxHeight: [{
1072
- type: Input
1073
- }], customSearchEnabled: [{
1074
- type: Input,
1075
- args: [{ transform: booleanAttribute }]
1076
- }], minCountForSearch: [{
1077
- type: Input,
1078
- args: [{ transform: numberAttribute }]
1079
- }], required: [{
1080
- type: Input,
1081
- args: [{ transform: booleanAttribute }]
1082
- }], disabled: [{
1083
- type: Input,
1084
- args: [{ transform: booleanAttribute }]
1085
- }], hideSelectedItems: [{
1086
- type: Input,
1087
- args: [{ transform: booleanAttribute }]
1088
- }], readonly: [{
1089
- type: Input,
1090
- args: [{ transform: booleanAttribute }]
1091
- }], value: [{
1092
- type: Input
1093
- }], tabIndex: [{
1094
- type: Input,
1095
- args: [{ transform: numberAttribute }]
1096
- }], resettable: [{
1097
- type: Input,
1098
- args: [{ transform: booleanAttribute }]
1099
- }], resetSelectedValue: [{
1100
- type: Input
1101
- }], grid: [{
1102
- type: Input
1103
- }], selectionOverride: [{
1104
- type: Input
1105
- }], selectionNoWrap: [{
1106
- type: HostBinding,
1107
- args: ['class.select2-selection-nowrap']
1108
- }, {
1109
- type: Input,
1110
- args: [{ transform: booleanAttribute }]
1111
- }], showSelectAll: [{
1112
- type: Input,
1113
- args: [{ transform: booleanAttribute }]
1114
- }], removeAllText: [{
1115
- type: Input
1116
- }], selectAllText: [{
1117
- type: Input
1118
- }], update: [{
1119
- type: Output
1120
- }], autoCreateItem: [{
1121
- type: Output
1122
- }], open: [{
1123
- type: Output
1124
- }], close: [{
1125
- type: Output
1126
- }], focus: [{
1127
- type: Output
1128
- }], blur: [{
1129
- type: Output
1130
- }], search: [{
1131
- type: Output
1132
- }], scroll: [{
1133
- type: Output
1134
- }], removeOption: [{
1135
- type: Output
1136
- }], classMaterial: [{
1137
- type: HostBinding,
1138
- args: ['class.material']
1139
- }], classNostyle: [{
1140
- type: HostBinding,
1141
- args: ['class.nostyle']
1142
- }], classBorderless: [{
1143
- type: HostBinding,
1144
- args: ['class.borderless']
1145
- }], select2above: [{
1146
- type: HostBinding,
1147
- args: ['class.select2-above']
1148
- }], cdkConnectedOverlay: [{
1149
- type: ViewChild,
1150
- args: [CdkConnectedOverlay]
1151
- }], selection: [{
1152
- type: ViewChild,
1153
- args: ['selection', { static: true }]
1154
- }], resultContainer: [{
1155
- type: ViewChild,
1156
- args: ['results']
1157
- }], results: [{
1158
- type: ViewChildren,
1159
- args: ['result']
1160
- }], searchInput: [{
1161
- type: ViewChild,
1162
- args: ['searchInput']
1163
- }], dropdown: [{
1164
- type: ViewChild,
1165
- args: ['dropdown']
1166
- }], clickDetection: [{
1167
- type: HostListener,
1168
- args: ['document:click', ['$event']]
1169
- }] } });
1170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Mi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1zZWxlY3QyLWNvbXBvbmVudC9zcmMvbGliL3NlbGVjdDIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctc2VsZWN0Mi1jb21wb25lbnQvc3JjL2xpYi9zZWxlY3QyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxtQkFBbUIsR0FJdEIsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBRUgsU0FBUyxFQUVULFNBQVMsRUFFVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixLQUFLLEVBQ0wsZUFBZSxFQUNmLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBZS9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7OztBQUUvQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFPckIsTUFBTSxTQUFTLEdBQXlCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3BILE1BQU0sWUFBWSxHQUF5QixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pGLE1BQU0sVUFBVSxHQUF5QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBVTdGLE1BQU0sT0FBTyxPQUFPO0lBSWhCLG1DQUFtQztJQUNuQyxJQUErQixJQUFJLENBQUMsSUFBaUI7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFRRCxJQUNJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQWM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFnREQsNENBQTRDO0lBQzVDLElBQ0ksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFJLGlCQUFpQixDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQWtCRCwrQ0FBK0M7SUFDL0MsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNuRSxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBUUQsaUNBQWlDO0lBQ2pDLElBQ0ksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBeUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDO2dCQUNoQyxDQUFDO2dCQUNELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDTCxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLElBQ0ksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQWE7UUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQTJERCxJQUFJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxNQUEwQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsTUFBd0IsQ0FBQztJQUNqRSxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUNJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUNJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUNJLGVBQWU7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssWUFBWSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUNJLFlBQVk7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNsRixDQUFDO0lBT0QsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQXFCRCxJQUFZLGNBQWM7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQztJQUMvQyxDQUFDO0lBYUQsWUFDYyxjQUE2QixFQUMvQixrQkFBcUMsRUFDekIsV0FBbUIsRUFDbkIsZ0JBQW9DLEVBQzdCLFFBQW1CLEVBQ3ZCLFFBQWdCO1FBTDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQy9CLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDekIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBclJ6QyxTQUFJLEdBQUcsV0FBVyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBUUwscUJBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBSXJCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELGlCQUFZLEdBQStCLE9BQU8sQ0FBQztRQVc1RCw2QkFBNkI7UUFFN0IsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQiw2QkFBNkI7UUFDcEIsY0FBUyxHQUFzRCxTQUFTLENBQUM7UUFLbEYsMkNBQTJDO1FBQ0osZUFBVSxHQUFHLENBQUMsQ0FBQztRQUV0RCxtQ0FBbUM7UUFDMUIsc0JBQWlCLEdBQUcsbUJBQW1CLENBQUM7UUFFakQsK0JBQStCO1FBQ1EsMkJBQXNCLEdBQUcsR0FBRyxDQUFDO1FBRXBFLCtCQUErQjtRQUNRLDJCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUVwRSxnQ0FBZ0M7UUFDUSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUUvRCwrQkFBK0I7UUFDUyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTNELHNDQUFzQztRQUNFLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBV2hFLHNFQUFzRTtRQUM3RCxvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuQywwQkFBMEI7UUFDYyx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFZcEUsZ0NBQWdDO1FBQ2hDLE9BQUUsR0FBRyxLQUFLLENBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLFlBQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLFlBQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELGNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRW5ELFVBQUssR0FBRyxLQUFLLEVBQVUsQ0FBQztRQUN4QixtQkFBYyxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ2pDLG9CQUFlLEdBQUcsS0FBSyxFQUFVLENBQUM7UUFDbEMsZ0JBQVcsR0FBRyxLQUFLLENBQW1CLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDOUUsK0JBQTBCLEdBQUcsS0FBSyxDQUFTLE9BQU8sQ0FBQyxDQUFDO1FBRXBELHVDQUF1QztRQUNDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFXekQseUNBQXlDO1FBQ0Qsc0JBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRWxFLHVDQUF1QztRQUNDLGFBQVEsR0FBRyxLQUFLLENBQUM7UUEyQnpELG1DQUFtQztRQUVuQyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBS25COzs7O1dBSUc7UUFDTSxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBU25CLGtDQUFrQztRQUdsQyxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4QixpRUFBaUU7UUFFakUsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFFdEIsa0NBQWtDO1FBRWxDLGtCQUFhLEdBQUcsWUFBWSxDQUFDO1FBRTdCLGtDQUFrQztRQUVsQyxrQkFBYSxHQUFHLFlBQVksQ0FBQztRQUVuQixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFDcEUsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBOEMsQ0FBQztRQUNoRixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNuQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNwQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNwQyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNuQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFDcEUsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBQ2hELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFFcEYsV0FBTSxHQUEyQyxJQUFJLENBQUM7UUFDdEQsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUdmLDZDQUE2QztRQUM3QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGlCQUFZLEdBQUcsTUFBTSxDQUEwQixTQUFTLENBQUMsQ0FBQztRQTBEbEQsbUJBQWMsR0FBRyxNQUFNLENBQXVCLElBQUksQ0FBQyxDQUFDO1FBQzVELHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFcEUsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFTckIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBS3BDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixXQUFNLEdBQXVCLElBQUksQ0FBQztRQXdDMUMsaUVBQWlFO1FBQ3pELGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDdEIsYUFBYTtRQUNqQixDQUFDLENBQUM7UUFFRix1REFBdUQ7UUFDL0MsY0FBUyxHQUF5QixHQUFHLEVBQUU7WUFDM0MsYUFBYTtRQUNqQixDQUFDLENBQUM7UUFwQ0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDdkMsQ0FBQztJQUNMLENBQUM7SUFHRCxjQUFjLENBQUMsQ0FBYTtRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7WUFDdkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQXFCLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUMxRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNyQixDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQXFCLENBQUM7WUFDdkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQztJQVlELFFBQVE7UUFDSixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQ3pDLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQ2hELElBQUksQ0FBQyxRQUFRLENBQ2hCLENBQUM7UUFDRixJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUF5QyxFQUFFLEVBQUU7WUFDNUYsSUFDSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU07Z0JBQzVCLFNBQVMsQ0FBQyxjQUFjLEVBQUUsT0FBTztnQkFDakMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUM1RCxDQUFDO2dCQUNDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1FBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNoRCxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RGLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxNQUFNLE1BQU0sR0FDUixJQUFJLENBQUMsbUJBQW1CLEtBQUssUUFBUTtZQUNyQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxRQUFRO2dCQUNsQyxDQUFDLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3pCLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFN0UsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNwQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFxQjtRQUNoQyxPQUFPLENBQ0gsMEJBQTBCO1lBQzFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakYsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUN6QixDQUFDO0lBQ04sQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFxQjtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQXFCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBa0I7UUFDcEIsbUZBQW1GO1FBQ25GLFlBQVk7UUFDWixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTO1lBQ2pDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUM5RSxDQUFDLENBQUMsSUFBSSxDQUNiLENBQUM7UUFFRixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBWTtRQUNsQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQWMsRUFBRSxLQUFxQjtRQUNsRSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pDLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuQixNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ2QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDeEMsQ0FBQzt5QkFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUN0QyxDQUFDO29CQUNELElBQUksWUFBWSxFQUFFLENBQUM7d0JBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEIsQ0FBQztvQkFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNaLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDbkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQztvQkFDM0QsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUNELElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFvQyxFQUFFLFlBQW9CLEVBQUUsU0FBa0IsS0FBSztRQUMzRixPQUFPLENBQ0gsQ0FBQyxNQUFNO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBRSxNQUF3QixDQUFDLG1CQUFtQixDQUFDLFlBQVksV0FBVztnQkFDdEYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsWUFBWSxXQUFXLENBQUMsWUFBWSxXQUFXO2dCQUNuRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsbUJBQW1CLENBQUMsWUFBWSxXQUFXO2dCQUM1RCxJQUFJLENBQUMsaUJBQWlCLFlBQVksV0FBVztZQUMvQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ1osSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxXQUFXO1lBQzFELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxXQUFXO1lBQ3JELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxXQUFXO1lBQ25ELElBQUksQ0FBQyxTQUFTLFlBQVksV0FBVztZQUNyQyxLQUFLLENBQ1IsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBb0MsRUFBRSxZQUFvQixFQUFFLFNBQWtCLEtBQUs7UUFDM0YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDLE1BQU07Z0JBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBRSxNQUF3QixDQUFDLG1CQUFtQixDQUFDO29CQUMvRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxZQUFZLFdBQVcsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLG1CQUFtQixDQUFDO29CQUNyQyxJQUFJLENBQUMsaUJBQWlCO2dCQUN4QixDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNaLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUM1QixJQUFJLENBQUMsU0FBUztZQUNwQixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYTtZQUM3QyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUU7WUFDckQsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwQixDQUFDO0lBRUQsUUFBUSxDQUFDLENBQU07UUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQztJQUNsRSxDQUFDO0lBRUQsU0FBUztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxPQUFPLEdBQW9CLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUMxQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDbEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0NBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3BCLENBQUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDaEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEIsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDcEIsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDbkIsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNsQixJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDekIsT0FBTyxFQUFFLENBQUM7d0JBQ2QsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDO3FCQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNoQyxPQUFPLEVBQUUsQ0FBQztnQkFDZCxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLE9BQU8sQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFxQjtRQUN2QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsT0FBTyxDQUNILENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDZCxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQ3BCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUMzRSxDQUFDO0lBQ04sQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUEwQixFQUFFLE1BQTBCO1FBQzFFLElBQ0ksQ0FBQyxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUM7WUFDeEYsTUFBTSxLQUFLLE1BQU0sRUFDbkIsQ0FBQztZQUNDLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxJQUNJLElBQUksQ0FBQyxRQUFRO1lBQ1osTUFBeUIsRUFBRSxNQUFNO1lBQ2pDLE1BQXlCLEVBQUUsTUFBTTtZQUNqQyxNQUF5QixDQUFDLE1BQU0sS0FBTSxNQUF5QixDQUFDLE1BQU0sRUFDekUsQ0FBQztZQUNDLEtBQUssTUFBTSxFQUFFLElBQUksTUFBd0IsRUFBRSxDQUFDO2dCQUN4QyxNQUFNLElBQUksR0FBSSxNQUF5QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNSLE9BQU8sSUFBSSxDQUFDO2dCQUNoQixDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sa0JBQWtCLENBQUMsVUFBVSxHQUFHLEtBQUs7UUFDekMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuRyxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDckYsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUNyQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMxQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztZQUNwQyxDQUFDO1lBRUQsSUFBSSxZQUFZLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUM7WUFFRCxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxRCxpQ0FBaUM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RSxDQUFDO1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFOUIsNENBQTRDO1lBRTVDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNwRSxNQUFNLE9BQU8sR0FBb0IsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUMxQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDbEIsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dDQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNwQixDQUFDO3dCQUNMLENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7eUJBQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwQixDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNILDJCQUEyQjtnQkFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9FLENBQUM7aUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxNQUFNLEdBQWtCLFNBQVMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25CLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUMxQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDbEIsSUFBSyxJQUFJLENBQUMsTUFBd0IsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUNuRCxNQUFNLEdBQUcsQ0FBQyxDQUFDOzRCQUNmLENBQUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQzt5QkFBTSxJQUFLLElBQUksQ0FBQyxNQUF3QixDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQzFELE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ2YsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN6QixDQUFDO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLFNBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxVQUFVLENBQUMsR0FBWTtRQUMzQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBZ0IsRUFBRSxRQUFnQjtRQUM1RCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDO0lBQ3BFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxPQUFnQixFQUFFLEVBQVU7UUFDbkQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsT0FBZ0IsRUFBRSxRQUFnQjtRQUM5RCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0QsQ0FBQyxDQUFDLE9BQU87WUFDVCxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWE7Z0JBQ3JCLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUM7Z0JBQy9ELENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakIsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQWdCLEVBQUUsRUFBVTtRQUNyRCxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRTtZQUNwQixDQUFDLENBQUMsT0FBTztZQUNULENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYTtnQkFDckIsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqQixDQUFDO0lBRU8sY0FBYyxDQUFDLE9BQWdCLEVBQUUsVUFBb0I7UUFDekQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sdUJBQXVCLENBQUMsT0FBb0IsRUFBRSxVQUFvQjtRQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM3QixLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQztJQUM1QixDQUFDO0lBRU8scUJBQXFCLENBQUMsT0FBb0I7UUFDOUMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFO1lBQ3pDLDBCQUEwQjtZQUMxQix1QkFBdUI7WUFDdkIsNkJBQTZCO1lBQzdCLHlCQUF5QjtTQUM1QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQXNCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBaUI7UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUF3QixDQUFDLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUE0QixFQUFFLE9BQWdCLElBQUk7UUFDckQsSUFBSSxLQUFVLENBQUM7UUFDZixJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBeUIsQ0FBQztnQkFDL0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7cUJBQU0sQ0FBQztvQkFDSixPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztnQkFFRCxLQUFLLEdBQUksSUFBSSxDQUFDLE1BQTBCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLENBQUM7Z0JBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMxQixJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQztnQkFDaEMsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLG9CQUFvQjtZQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqRSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELElBQUksS0FBSyxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDO1lBQzVCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ2IsU0FBUyxFQUFFLElBQUk7b0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNsQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUN6RixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQXdCLEVBQUUsSUFBUztRQUNyRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQVcsRUFBRSxNQUFNLEtBQUssSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQztJQUN2RixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQW9CLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFDeEMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDckUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMzQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBb0IsRUFBRSxNQUFNLEdBQUcsS0FBSztRQUN4QyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN0QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZLENBQUMsQ0FBUTtRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFJLENBQUMsQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDYixTQUFTLEVBQUUsSUFBSTtnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ2xCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNoQixZQUFZLEVBQUUsQ0FBQyxJQUFpQixFQUFFLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzNDLENBQUM7YUFDSixDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sQ0FBQyxNQUFjLEVBQUUsSUFBa0M7UUFDdEQsT0FBUSxJQUFzQixDQUFDLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDakQsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFxQjtRQUM1QixPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxVQUFVLENBQUMsTUFBcUI7UUFDNUIsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM5QyxDQUFDO0lBRUQsZUFBZSxDQUFDLENBQTZCLEVBQUUsTUFBcUI7UUFDaEUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxPQUFPO1FBQ1gsQ0FBQztRQUVELFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFJLElBQUksQ0FBQyxNQUEwQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEtBQUs7WUFDWixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQ3pGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEtBQUs7WUFDWixhQUFhLEVBQUUsTUFBTTtTQUN4QixDQUFDLENBQUM7UUFFSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXBCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBd0I7UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUFDLEVBQWM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFtQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQWtCO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2IsU0FBUyxFQUFFLElBQUk7WUFDZixHQUFHO1lBQ0gsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSztTQUNuQixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsYUFBYTtRQUNULE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7UUFDcEYsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLElBQUksT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN4QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO2FBQ3pGLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQXdDO1FBQ2pELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLE9BQVEsR0FBcUIsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFGLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBaUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVwQyxJQUFJLGFBQWEsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsQ0FBQztpQkFBTSxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNULE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFdBQVc7UUFDZixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLE9BQU8sQ0FBQyxLQUFhO1FBQ3pCLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLElBQUksR0FBRztnQkFDSCxLQUFLO2dCQUNMLEtBQUssRUFBRSxLQUFLO2FBQ2YsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sWUFBWSxDQUFDLENBQWdCO1FBQ2pDLE1BQU0sS0FBSyxHQUFJLENBQUMsQ0FBQyxNQUEyQixDQUFDLEtBQUssQ0FBQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLENBQUMsQ0FBQyxNQUEyQixDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFNBQVMsRUFBRSxJQUFJO2dCQUNmLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7YUFDekYsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEcsQ0FBQztJQUNMLENBQUM7SUFFTyxTQUFTO1FBQ2IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE1BQXFCO1FBQ2hELElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RixJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNuRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUM7WUFDOUUsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNMLENBQUM7SUFFTyxRQUFRLENBQUMsS0FBb0IsRUFBRSxPQUE2QixFQUFFO1FBQ2xFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixPQUFPLEdBQUcsS0FBSyxHQUFHLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDcEQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQixDQUFDLEtBQWtCO1FBQzNDLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN4QyxDQUFDO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNwQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxpREFBaUQ7b0JBQ25FLElBQUksT0FBTyxFQUFFLENBQUM7d0JBQ1YscUNBQXFDO3dCQUNyQyxNQUFNLGNBQWMsR0FBUSxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM3RixjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUM7d0JBRXRCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dDQUNiLFNBQVMsRUFBRSxJQUFJO2dDQUNmLEtBQUssRUFBRSxLQUFLO2dDQUNaLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7NkJBQ3pGLENBQUMsQ0FBQzt3QkFDUCxDQUFDO29CQUNMLENBQUM7eUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQ3hCLHVCQUF1Qjt3QkFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7d0JBQ2hCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFFekIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7NEJBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dDQUNiLFNBQVMsRUFBRSxJQUFJO2dDQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtnQ0FDbEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTs2QkFDekYsQ0FBQyxDQUFDO3dCQUNQLENBQUM7b0JBQ0wsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDbEUsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDRFQUE0RTtJQUNwRSxzQkFBc0I7UUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU1QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBSyxHQUFHLElBQUk7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDM0MsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBYyxFQUFFLE9BQXNCO1FBQ2pELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixNQUFNLFVBQVUsR0FDWixDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDM0csSUFBSSxRQUFRLENBQUMsYUFBYSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN4QyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFDSCxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYTtZQUN4RCxRQUFRLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUM1RCxDQUFDO1lBQ0UsUUFBUSxDQUFDLGFBQTZCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sZUFBZTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssTUFBTTtZQUN4RSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLEtBQUs7WUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDO0lBQ3hDLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxLQUFjO1FBQ3RDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLENBQUM7YUFBTSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0wsQ0FBQztrSUE3cUNRLE9BQU8sNk5BdVJELFVBQVU7c0hBdlJoQixPQUFPLHdTQVNJLGVBQWUsOGJBSWYsZUFBZSw0UUFHZixnQkFBZ0IsMkhBVWhCLGdCQUFnQixnYUFVaEIsZUFBZSxxVUFNZixlQUFlLHdLQUdmLGVBQWUsZ0pBR2YsZ0JBQWdCLG9JQUdoQixnQkFBZ0IsbUpBR2hCLGdCQUFnQixtdUJBZWhCLGdCQUFnQix5SkFHaEIsZUFBZSwrOEJBdUJmLGdCQUFnQiw4SEFHaEIsZ0JBQWdCLHlKQVNoQixnQkFBZ0IsOEhBR2hCLGdCQUFnQix1UEFtQmhCLGVBQWUsb0lBU2YsZ0JBQWdCLHNrQkFzQmhCLGdCQUFnQiw2SUFJaEIsZ0JBQWdCLHUzQkErRXpCLG1CQUFtQiwrZUN4VGxDLHNyaEJBdVZBOzs0RkRsUmEsT0FBTztrQkFSbkIsU0FBUzsrQkFDSSxTQUFTLFFBR2I7d0JBQ0YsTUFBTSxFQUFFLE1BQU07cUJBQ2pCOzswQkFzUkksUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsSUFBSTs7MEJBQUksUUFBUTs7MEJBQ2hCLFNBQVM7MkJBQUMsVUFBVTt5Q0FsUk0sSUFBSTtzQkFBbEMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7Z0JBSWMsZ0JBQWdCO3NCQUF0RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFDNUIsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRWlDLGNBQWM7c0JBQXBELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUM1QixZQUFZO3NCQUFwQixLQUFLO2dCQUdGLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFXdEMsT0FBTztzQkFETixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUk3QixTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBR2lDLFVBQVU7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUc1QixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR2lDLHNCQUFzQjtzQkFBNUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBR0Usc0JBQXNCO3NCQUE1RCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFHRyxjQUFjO3NCQUFyRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUdFLFVBQVU7c0JBQWpELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBR0UsZUFBZTtzQkFBdEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFHN0IsV0FBVztzQkFBbkIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxlQUFlO3NCQUF2QixLQUFLO2dCQUdrQyxtQkFBbUI7c0JBQTFELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSWxDLGlCQUFpQjtzQkFEcEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBdUJHLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSWxDLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFTRSxpQkFBaUI7c0JBQXhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBR0UsUUFBUTtzQkFBL0MsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJbEMsS0FBSztzQkFEUixLQUFLO2dCQWlCRixRQUFRO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQVVyQyxVQUFVO3NCQURULEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSTdCLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBT0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUtOLGVBQWU7c0JBRmQsV0FBVzt1QkFBQyxnQ0FBZ0M7O3NCQUM1QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUt0QyxhQUFhO3NCQURaLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBS3RDLGFBQWE7c0JBRFosS0FBSztnQkFLTixhQUFhO3NCQURaLEtBQUs7Z0JBR0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkE0QkgsYUFBYTtzQkFEaEIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBTXpCLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyxlQUFlO2dCQU14QixlQUFlO3NCQURsQixXQUFXO3VCQUFDLGtCQUFrQjtnQkFNM0IsWUFBWTtzQkFEZixXQUFXO3VCQUFDLHFCQUFxQjtnQkFrQk0sbUJBQW1CO3NCQUExRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFDb0IsU0FBUztzQkFBMUQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNWLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsU0FBUztnQkFDWSxPQUFPO3NCQUF0QyxZQUFZO3VCQUFDLFFBQVE7Z0JBQ1ksV0FBVztzQkFBNUMsU0FBUzt1QkFBQyxhQUFhO2dCQUNPLFFBQVE7c0JBQXRDLFNBQVM7dUJBQUMsVUFBVTtnQkF5Q3JCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsXG4gICAgQ29ubmVjdGVkUG9zaXRpb24sXG4gICAgVmVydGljYWxDb25uZWN0aW9uUG9zLFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRSZWYsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2VsZixcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgY29tcHV0ZWQsXG4gICAgaW5wdXQsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxuICAgIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUdyb3VwRGlyZWN0aXZlLCBOZ0NvbnRyb2wsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgIFNlbGVjdDJBdXRvQ3JlYXRlRXZlbnQsXG4gICAgU2VsZWN0MkRhdGEsXG4gICAgU2VsZWN0Mkdyb3VwLFxuICAgIFNlbGVjdDJPcHRpb24sXG4gICAgU2VsZWN0MlJlbW92ZUV2ZW50LFxuICAgIFNlbGVjdDJTY3JvbGxFdmVudCxcbiAgICBTZWxlY3QyU2VhcmNoRXZlbnQsXG4gICAgU2VsZWN0MlNlbGVjdGlvbk92ZXJyaWRlLFxuICAgIFNlbGVjdDJVcGRhdGVFdmVudCxcbiAgICBTZWxlY3QyVXBkYXRlVmFsdWUsXG4gICAgU2VsZWN0MlZhbHVlLFxufSBmcm9tICcuL3NlbGVjdDItaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTZWxlY3QyVXRpbHMgfSBmcm9tICcuL3NlbGVjdDItdXRpbHMnO1xuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuaW50ZXJmYWNlIEtleUluZm8ge1xuICAgIGtleTogc3RyaW5nO1xuICAgIGFsdEtleTogYm9vbGVhbjtcbn1cblxuY29uc3QgT1BFTl9LRVlTOiAoc3RyaW5nIHwgS2V5SW5mbylbXSA9IFsnQXJyb3dEb3duJywgJ0Fycm93VXAnLCAnRW50ZXInLCAnICcsICdIb21lJywgJ0VuZCcsICdQYWdlVXAnLCAnUGFnZURvd24nXTtcbmNvbnN0IE9OX09QRU5fS0VZUzogKHN0cmluZyB8IEtleUluZm8pW10gPSBbJ0hvbWUnLCAnRW5kJywgJ1BhZ2VVcCcsICdQYWdlRG93biddO1xuY29uc3QgQ0xPU0VfS0VZUzogKHN0cmluZyB8IEtleUluZm8pW10gPSBbJ0VzY2FwZScsICdUYWInLCB7IGtleTogJ0Fycm93VXAnLCBhbHRLZXk6IHRydWUgfV07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2VsZWN0MicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdDIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlbGVjdDIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbaWRdJzogJ2lkKCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdDIgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcbiAgICByZWFkb25seSBfdWlkID0gYHNlbGVjdDItJHtuZXh0VW5pcXVlSWQrK31gO1xuICAgIF9kYXRhOiBTZWxlY3QyRGF0YTtcblxuICAgIC8qKiBkYXRhIG9mIG9wdGlvbnMgJiBvcHRpb25ncnBzICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgc2V0IGRhdGEoZGF0YTogU2VsZWN0MkRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKHRydWUpO1xuICAgIH1cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBtaW5DaGFyRm9yU2VhcmNoID0gMDtcbiAgICBASW5wdXQoKSBkaXNwbGF5U2VhcmNoU3RhdHVzOiAnZGVmYXVsdCcgfCAnaGlkZGVuJyB8ICdhbHdheXMnO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBsaW1pdFNlbGVjdGlvbiA9IDA7XG4gICAgQElucHV0KCkgbGlzdFBvc2l0aW9uOiAnYWJvdmUnIHwgJ2JlbG93JyB8ICdhdXRvJyA9ICdiZWxvdyc7XG5cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aXBsZTtcbiAgICB9XG4gICAgc2V0IG11bHRpcGxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubmdPbkluaXQoKTtcbiAgICB9XG5cbiAgICAvKiogdXNlIHRoZSBtYXRlcmlhbCBzdHlsZSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIG92ZXJsYXkgPSBmYWxzZTtcblxuICAgIC8qKiB1c2UgdGhlIG1hdGVyaWFsIHN0eWxlICovXG4gICAgQElucHV0KCkgc3R5bGVNb2RlOiAnbWF0ZXJpYWwnIHwgJ25vU3R5bGUnIHwgJ2JvcmRlcmxlc3MnIHwgJ2RlZmF1bHQnID0gJ2RlZmF1bHQnO1xuXG4gICAgLyoqIG1lc3NhZ2Ugd2hlbiBubyByZXN1bHQgKi9cbiAgICBASW5wdXQoKSBub1Jlc3VsdE1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBtYXhpbXVtIHJlc3VsdHMgbGltaXQgKDAgPSBubyBsaW1pdCkgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBtYXhSZXN1bHRzID0gMDtcblxuICAgIC8qKiBtZXNzYWdlIHdoZW4gbWF4aW11bSByZXN1bHRzICovXG4gICAgQElucHV0KCkgbWF4UmVzdWx0c01lc3NhZ2UgPSAnVG9vIG1hbnkgcmVzdWx0c+KApic7XG5cbiAgICAvKiogaW5maW5pdGUgc2Nyb2xsIGRpc3RhbmNlICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSkgaW5maW5pdGVTY3JvbGxEaXN0YW5jZSA9IDEuNTtcblxuICAgIC8qKiBpbmZpbml0ZSBzY3JvbGwgZGlzdGFuY2UgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KSBpbmZpbml0ZVNjcm9sbFRocm90dGxlID0gMTUwO1xuXG4gICAgLyoqIGluZmluaXRlIHNjcm9sbCBhY3RpdmF0ZWQgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgaW5maW5pdGVTY3JvbGwgPSBmYWxzZTtcblxuICAgIC8qKiBhdXRvIGNyZWF0ZSBpZiBub3QgZXhpc3QgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgYXV0b0NyZWF0ZSA9IGZhbHNlO1xuXG4gICAgLyoqIG5vIHRlbXBsYXRlIGZvciBsYWJlbCBzZWxlY3Rpb24gKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbm9MYWJlbFRlbXBsYXRlID0gZmFsc2U7XG5cbiAgICAvKiogdXNlIGl0IGZvciBjaGFuZ2UgdGhlIHBhdHRlcm4gb2YgdGhlIGZpbHRlciBzZWFyY2ggKi9cbiAgICBASW5wdXQoKSBlZGl0UGF0dGVybjogKHN0cjogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgICAvKiogdGVtcGxhdGUocykgZm9yIGZvcm1hdHRpbmcgKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZXM6IFRlbXBsYXRlUmVmPGFueT4gfCB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT4gfTtcblxuICAgIC8qKiB0ZW1wbGF0ZSBmb3IgZm9ybWF0dGluZyBzZWxlY3RlZCBvcHRpb24gKi9cbiAgICBASW5wdXQoKSB0ZW1wbGF0ZVNlbGVjdGlvbjogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKiB0aGUgbWF4IGhlaWdodCBvZiB0aGUgcmVzdWx0cyBjb250YWluZXIgd2hlbiBvcGVuaW5nIHRoZSBzZWxlY3QgKi9cbiAgICBASW5wdXQoKSByZXN1bHRNYXhIZWlnaHQgPSAnMjAwcHgnO1xuXG4gICAgLyoqIEFjdGl2ZSBTZWFyY2ggZXZlbnQgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgY3VzdG9tU2VhcmNoRW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqIG1pbmltYWwgZGF0YSBvZiBzaG93IHRoZSBzZWFyY2ggZmllbGQgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICAgIGdldCBtaW5Db3VudEZvclNlYXJjaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluQ291bnRGb3JTZWFyY2g7XG4gICAgfVxuICAgIHNldCBtaW5Db3VudEZvclNlYXJjaCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX21pbkNvdW50Rm9yU2VhcmNoID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoQm94KCk7XG4gICAgfVxuXG4gICAgLyoqIFVuaXF1ZSBpZCBvZiB0aGUgZWxlbWVudC4gKi9cbiAgICBpZCA9IGlucHV0PHN0cmluZz4odGhpcy5fdWlkKTtcbiAgICBpZExhYmVsID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pZCgpfS1sYWJlbGApO1xuICAgIGlkQ29tYm8gPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLmlkKCl9LWNvbWJvYCk7XG4gICAgaWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pZCgpfS1vcHRpb25zYCk7XG4gICAgaWRPdmVybGF5ID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5pZCgpfS1vdmVybGF5YCk7XG5cbiAgICB0aXRsZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBhcmlhTGFiZWxsZWRieSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBhcmlhRGVzY3JpYmVkYnkgPSBpbnB1dDxzdHJpbmc+KCk7XG4gICAgYXJpYUludmFsaWQgPSBpbnB1dDxib29sZWFuLCB1bmtub3duPihmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG4gICAgYXJpYVJlc2V0QnV0dG9uRGVzY3JpcHRpb24gPSBpbnB1dDxzdHJpbmc+KCdSZXNldCcpO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgcmVxdWlyZWQuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgaGlkZGVuLiAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIGdldCBkaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLmRpc2FibGVkIDogdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuICAgIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGl0ZW1zIGFyZSBoaWRkZW4gd2hlbiBoYXMuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGhpZGVTZWxlY3RlZEl0ZW1zID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0aGUgZWxlbWVudCBpcyByZWFkb25seS4gKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcblxuICAgIC8qKiBUaGUgaW5wdXQgZWxlbWVudCdzIHZhbHVlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuICAgIHNldCB2YWx1ZSh2YWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RWYWx1ZUNoYW5nZSh0aGlzLl92YWx1ZSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBzZWxlY3QyIGVsZW1lbnQuICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgICBnZXQgdGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMuX3RhYkluZGV4O1xuICAgIH1cbiAgICBzZXQgdGFiSW5kZXgodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiByZXNldCB3aXRoIG5vIHNlbGVjdGVkIHZhbHVlICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcmVzZXR0YWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqIHNlbGVjdGVkIHZhbHVlIHdoZW4gw5cgaXMgY2xpY2tlZCAqL1xuICAgIEBJbnB1dCgpIHJlc2V0U2VsZWN0ZWRWYWx1ZTogYW55O1xuXG4gICAgLyoqIGdyaWQ6IGl0ZW0gYnkgbGluZVxuICAgICAqICogMCA9IG5vIGdyaWRcbiAgICAgKiAqIG51bWJlciA9IGl0ZW0gYnkgbGluZSAoNClcbiAgICAgKiAqIHN0cmluZyA9IG1pbmltYWwgc2l6ZSBpdGVtICgxMDBweClcbiAgICAgKi9cbiAgICBASW5wdXQoKSBncmlkID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHNlbGVjdGlvbiBieSBhIHRleHRcbiAgICAgKiAqIGlmIHN0cmluZzogYCVzaXplJWAgPSB0b3RhbCBzZWxlY3RlZCBvcHRpb25zXG4gICAgICogKiBpZiBmdW5jdGlvbjoganVzdGUgc2hvdyB0aGUgc3RyaW5nXG4gICAgICovXG4gICAgQElucHV0KCkgc2VsZWN0aW9uT3ZlcnJpZGU6IFNlbGVjdDJTZWxlY3Rpb25PdmVycmlkZTtcblxuICAgIC8qKiBmb3JjZSBzZWxlY3Rpb24gb24gb25lIGxpbmUgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uLW5vd3JhcCcpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgc2VsZWN0aW9uTm9XcmFwID0gZmFsc2U7XG5cbiAgICAvKiogQWRkIGFuIG9wdGlvbiB0byBzZWxlY3Qgb3IgcmVtb3ZlIGFsbCAoaWYgYWxsIGlzIHNlbGVjdGVkKSAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHNob3dTZWxlY3RBbGwgPSBmYWxzZTtcblxuICAgIC8qKiBUZXh0IGZvciByZW1vdmUgYWxsIG9wdGlvbnMgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlbW92ZUFsbFRleHQgPSAnUmVtb3ZlIGFsbCc7XG5cbiAgICAvKiogVGV4dCBmb3Igc2VsZWN0IGFsbCBvcHRpb25zICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RBbGxUZXh0ID0gJ1NlbGVjdCBhbGwnO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlVwZGF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIGF1dG9DcmVhdGVJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyQXV0b0NyZWF0ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG4gICAgQE91dHB1dCgpIG9wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdDI+KCk7XG4gICAgQE91dHB1dCgpIGNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0Mj4oKTtcbiAgICBAT3V0cHV0KCkgc2VhcmNoID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2VhcmNoRXZlbnQ8U2VsZWN0MlVwZGF0ZVZhbHVlPj4oKTtcbiAgICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3QyU2Nyb2xsRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZU9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0MlJlbW92ZUV2ZW50PFNlbGVjdDJVcGRhdGVWYWx1ZT4+KCk7XG5cbiAgICBvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyT3B0aW9uW10gfCBudWxsID0gbnVsbDtcbiAgICBpc09wZW4gPSBmYWxzZTtcbiAgICBzZWFyY2hTdHlsZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZm9jdXNlZCBvciBub3QuICovXG4gICAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gICAgZmlsdGVyZWREYXRhID0gc2lnbmFsPFNlbGVjdDJEYXRhIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgZ2V0IHNlbGVjdDJPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pIDogbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc2VsZWN0Mk9wdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyBudWxsIDogKHRoaXMub3B0aW9uIGFzIFNlbGVjdDJPcHRpb24pO1xuICAgIH1cblxuICAgIGdldCBzZWFyY2hUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclNlYXJjaFRleHQ7XG4gICAgfVxuXG4gICAgc2V0IHNlYXJjaFRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gdGV4dDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1hdGVyaWFsJylcbiAgICBnZXQgY2xhc3NNYXRlcmlhbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnbWF0ZXJpYWwnO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubm9zdHlsZScpXG4gICAgZ2V0IGNsYXNzTm9zdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVNb2RlID09PSAnbm9TdHlsZSc7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5ib3JkZXJsZXNzJylcbiAgICBnZXQgY2xhc3NCb3JkZXJsZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZU1vZGUgPT09ICdib3JkZXJsZXNzJztcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNlbGVjdDItYWJvdmUnKVxuICAgIGdldCBzZWxlY3QyYWJvdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5vdmVybGF5ID8gdGhpcy5saXN0UG9zaXRpb24gPT09ICdhYm92ZScgOiB0aGlzLl9pc0Fib2JlT3ZlcmxheSgpO1xuICAgIH1cblxuICAgIG92ZXJsYXlXaWR0aDogbnVtYmVyO1xuICAgIG92ZXJsYXlIZWlnaHQ6IG51bWJlcjtcbiAgICBfdHJpZ2dlclJlY3Q6IERPTVJlY3Q7XG4gICAgX2Ryb3Bkb3duUmVjdDogRE9NUmVjdDtcblxuICAgIGdldCBfcG9zaXRpb25zKCk6IENvbm5lY3RlZFBvc2l0aW9uW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJyA/IHVuZGVmaW5lZCA6IG51bGw7XG4gICAgfVxuXG4gICAgbWF4UmVzdWx0c0V4Y2VlZGVkOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBfbWluQ291bnRGb3JTZWFyY2g/OiBudW1iZXI7XG5cbiAgICBAVmlld0NoaWxkKENka0Nvbm5lY3RlZE92ZXJsYXkpIHByaXZhdGUgY2RrQ29ubmVjdGVkT3ZlcmxheTogQ2RrQ29ubmVjdGVkT3ZlcmxheTtcbiAgICBAVmlld0NoaWxkKCdzZWxlY3Rpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHNlbGVjdGlvbjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgncmVzdWx0cycpIHByaXZhdGUgcmVzdWx0Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkcmVuKCdyZXN1bHQnKSBwcml2YXRlIHJlc3VsdHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJykgcHJpdmF0ZSBkcm9wZG93bjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBwcml2YXRlIGhvdmVyaW5nT3B0aW9uID0gc2lnbmFsPFNlbGVjdDJPcHRpb24gfCBudWxsPihudWxsKTtcbiAgICBob3ZlcmluZ09wdGlvbklkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5nZXRFbGVtZW50SWQodGhpcy5ob3ZlcmluZ09wdGlvbigpKSk7XG5cbiAgICBwcml2YXRlIGlubmVyU2VhcmNoVGV4dCA9ICcnO1xuICAgIHByaXZhdGUgaXNTZWFyY2hib3hIaWRkZW46IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHNlbGVjdGlvbkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSBnZXQgcmVzdWx0c0VsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBUYWIgaW5kZXggZm9yIHRoZSBlbGVtZW50LiAqL1xuICAgIHByaXZhdGUgX3RhYkluZGV4OiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX211bHRpcGxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfdmFsdWU6IFNlbGVjdDJVcGRhdGVWYWx1ZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNOYXRpdmVWYWx1ZTogU2VsZWN0MlVwZGF0ZVZhbHVlO1xuICAgIHByaXZhdGUgX292ZXJsYXlQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBfdmlld3BvcnRSdWxlcjogVmlld3BvcnRSdWxlcixcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9wYXJlbnRGb3JtOiBOZ0Zvcm0sXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX3BhcmVudEZvcm1Hcm91cDogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBfY29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBAQXR0cmlidXRlKCd0YWJpbmRleCcpIHRhYkluZGV4OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX3RhYkluZGV4ID0gcGFyc2VJbnQodGFiSW5kZXgsIDEwKSB8fCAwO1xuXG4gICAgICAgIGlmICh0aGlzLl9jb250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLl9jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICAgIGNsaWNrRGV0ZWN0aW9uKGU6IE1vdXNlRXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIGZvY3VzKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zQ2xhc3ModGFyZ2V0LCAnc2VsZWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaWZQYXJlbnRDb250YWluc0NsYXNzKHRhcmdldCwgJ3NlbGVjdDItZHJvcGRvd24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU9wZW5BbmRDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheSAmJiAhdGhpcy5pZlBhcmVudENvbnRhaW5zSWQodGFyZ2V0LCB0aGlzLmlkKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tFeGl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pZlBhcmVudENvbnRhaW5zSWQodGFyZ2V0LCB0aGlzLmlkKCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrRXhpdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0aGlzLmNsaWNrT25TZWxlY3QyRWxlbWVudCh0YXJnZXQpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkICovXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIC8qKiBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHZhbHVlIGNoYW5nZXMgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9O1xuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKDEwMCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKFxuICAgICAgICAgICAgdGhpcy5fZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy52YWx1ZSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChTZWxlY3QyVXRpbHMuZ2V0T3B0aW9uQnlWYWx1ZSh0aGlzLl9kYXRhLCB0aGlzLnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVTZWFyY2hCb3goKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheS5wb3NpdGlvbkNoYW5nZS5zdWJzY3JpYmUoKHBvc0NoYW5nZTogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJyAmJlxuICAgICAgICAgICAgICAgIHBvc0NoYW5nZS5jb25uZWN0aW9uUGFpcj8ub3JpZ2luWSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlQb3NpdGlvbiAhPT0gcG9zQ2hhbmdlLmNvbm5lY3Rpb25QYWlyLm9yaWdpbllcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UG9zaXRpb24gPSBwb3NDaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudCA9IHRoaXMuc2VsZWN0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHRoaXMudHJpZ2dlclJlY3QoKTtcbiAgICB9XG5cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2VhcmNoQm94KCk7XG4gICAgICAgIHRoaXMuX2RpcnR5Q2hlY2tOYXRpdmVWYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5fdHJpZ2dlclJlY3QpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJsYXlXaWR0aCAhPT0gdGhpcy5fdHJpZ2dlclJlY3Qud2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlXaWR0aCA9IHRoaXMuX3RyaWdnZXJSZWN0LndpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3Bkb3duUmVjdD8uaGVpZ2h0ID4gMCAmJiB0aGlzLm92ZXJsYXlIZWlnaHQgIT09IHRoaXMuX2Ryb3Bkb3duUmVjdC5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlIZWlnaHQgPSB0aGlzLmxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nID8gdGhpcy5fZHJvcGRvd25SZWN0LmhlaWdodCA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVTZWFyY2hCb3goKSB7XG4gICAgICAgIGNvbnN0IGhpZGRlbiA9XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlTZWFyY2hTdGF0dXMgPT09ICdoaWRkZW4nIHx8XG4gICAgICAgICAgICAodGhpcy5kaXNwbGF5U2VhcmNoU3RhdHVzICE9PSAnYWx3YXlzJyAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICBTZWxlY3QyVXRpbHMuaXNTZWFyY2hib3hIaWRkZW4odGhpcy5fZGF0YSwgdGhpcy5fbWluQ291bnRGb3JTZWFyY2gpKTtcblxuICAgICAgICBpZiAodGhpcy5pc1NlYXJjaGJveEhpZGRlbiAhPT0gaGlkZGVuKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2VhcmNoYm94SGlkZGVuID0gaGlkZGVuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0T3B0aW9uU3R5bGUob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24gJyArXG4gICAgICAgICAgICAob3B0aW9uLmhpZGUgPyAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZGUgJyA6ICcnKSArXG4gICAgICAgICAgICAob3B0aW9uID09PSB0aGlzLmhvdmVyaW5nT3B0aW9uKCkgPyAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZ2hsaWdodGVkICcgOiAnJykgK1xuICAgICAgICAgICAgKG9wdGlvbi5jbGFzc2VzIHx8ICcnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG1vdXNlZW50ZXIob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChvcHRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xpY2sob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLnRlc3RTZWxlY3Rpb24ob3B0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Qob3B0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0KGV2ZW50PzogTW91c2VFdmVudCkge1xuICAgICAgICAvLyBjb25zdCB0ZXN0ID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdGhpcy5yZXNldFNlbGVjdGVkVmFsdWUpO1xuICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgdGhpcy5zZWxlY3QoXG4gICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyAoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdGhpcy5yZXNldFNlbGVjdGVkVmFsdWUpID8/IG51bGwpXG4gICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgIH1cblxuICAgIHByZXZDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHN0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlT3BlbkFuZENsb3NlKGZvY3VzID0gdHJ1ZSwgb3Blbj86IGJvb2xlYW4sIGV2ZW50PzogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9jdXMoZm9jdXMpO1xuXG4gICAgICAgIGNvbnN0IG9uT3BlbkFjdGlvbiA9IGV2ZW50ICYmIHRoaXMuX3Rlc3RLZXkoZXZlbnQsIE9OX09QRU5fS0VZUyk7XG4gICAgICAgIGNvbnN0IGNoYW5nZUVtaXQgPSB0aGlzLmlzT3BlbiAhPT0gKG9wZW4gPz8gIXRoaXMuaXNPcGVuKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBvcGVuID8/ICF0aGlzLmlzT3BlbjtcblxuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NlYXJjaGJveEhpZGRlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJTZWFyY2hUZXh0ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZERhdGEoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlYXJjaGJveChmb2N1cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICYmICFjaGFuZ2VFbWl0ICYmIGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlEb3duKGV2ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvblswXSA6IHRoaXMub3B0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbk9wZW5BY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2V5RG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJSZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXk/Lm92ZXJsYXlSZWY/LnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlRW1pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3Blbi5lbWl0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUVtaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UuZW1pdCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGhhc1RlbXBsYXRlKG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IFNlbGVjdDJHcm91cCwgZGVmYXVsdFZhbHVlOiBzdHJpbmcsIHNlbGVjdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2VsZWN0XG4gICAgICAgICAgICAgICAgPyB0aGlzLnRlbXBsYXRlcz8uWyhvcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudGVtcGxhdGVTZWxlY3Rpb25JZF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltgJHtkZWZhdWx0VmFsdWV9U2VsZWN0aW9uYF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltgdGVtcGxhdGVTZWxlY3Rpb25gXSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmIHx8XG4gICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlU2VsZWN0aW9uIGluc3RhbmNlb2YgVGVtcGxhdGVSZWZcbiAgICAgICAgICAgICAgICA6IGZhbHNlKSB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltvcHRpb24udGVtcGxhdGVJZF0gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltkZWZhdWx0VmFsdWVdIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYgfHxcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bJ3RlbXBsYXRlJ10gaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXMgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiB8fFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRUZW1wbGF0ZShvcHRpb246IFNlbGVjdDJPcHRpb24gfCBTZWxlY3QyR3JvdXAsIGRlZmF1bHRWYWx1ZTogc3RyaW5nLCBzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNUZW1wbGF0ZShvcHRpb24sIGRlZmF1bHRWYWx1ZSwgc2VsZWN0KVxuICAgICAgICAgICAgPyAoc2VsZWN0XG4gICAgICAgICAgICAgICAgICA/IHRoaXMudGVtcGxhdGVzPy5bKG9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uKS50ZW1wbGF0ZVNlbGVjdGlvbklkXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcz8uW2Ake2RlZmF1bHRWYWx1ZX1TZWxlY3Rpb25gXSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlcz8uW2B0ZW1wbGF0ZVNlbGVjdGlvbmBdIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVTZWxlY3Rpb25cbiAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LltvcHRpb24udGVtcGxhdGVJZF0gfHxcbiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzPy5bZGVmYXVsdFZhbHVlXSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXM/LlsndGVtcGxhdGUnXSB8fFxuICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZXNcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRyaWdnZXJSZWN0KCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMuc2VsZWN0aW9uRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5fZHJvcGRvd25SZWN0ID0gdGhpcy5kcm9wZG93bj8ubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgPyB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzTnVtYmVyKG86IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIWlzTmFOKG8gLSAwKSAmJiBvICE9PSBudWxsICYmIG8gIT09ICcnICYmIG8gIT09IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdEFsbCgpIHtcbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RBbGxUZXN0KCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zOiBTZWxlY3QyT3B0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMuaXNHcm91cChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5vcHRpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmRpc2FibGVkICYmICFmLmhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFlLmRpc2FibGVkICYmICFlLmhpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9ucztcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gb3B0aW9ucy5tYXAoZSA9PiBlLnZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3RBbGxUZXN0KCkge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSAmJiB0aGlzLm9wdGlvbi5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBvcHRpb25zID0gMDtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoU2VsZWN0MlV0aWxzLmlzR3JvdXAoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5vcHRpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYuZGlzYWJsZWQgJiYgIWYuaGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZS5kaXNhYmxlZCAmJiAhZS5oaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbi5sZW5ndGggPT09IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdFNlbGVjdGlvbihvcHRpb246IFNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgaWYgKG9wdGlvbi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLm11bHRpcGxlIHx8XG4gICAgICAgICAgICAhdGhpcy5saW1pdFNlbGVjdGlvbiB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkodGhpcy5fdmFsdWUpICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA8IHRoaXMubGltaXRTZWxlY3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0ZXN0VmFsdWVDaGFuZ2UodmFsdWUxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbHVlMjogU2VsZWN0MlVwZGF0ZVZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICgodmFsdWUxID09PSBudWxsIHx8IHZhbHVlMSA9PT0gdW5kZWZpbmVkKSAmJiAodmFsdWUyID09PSBudWxsIHx8IHZhbHVlMiA9PT0gdW5kZWZpbmVkKSkgfHxcbiAgICAgICAgICAgIHZhbHVlMSA9PT0gdmFsdWUyXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGUgJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTIgYXMgU2VsZWN0MlZhbHVlW10pPy5sZW5ndGggJiZcbiAgICAgICAgICAgICh2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pLmxlbmd0aCA9PT0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlMSBvZiB2YWx1ZTEgYXMgU2VsZWN0MlZhbHVlW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ID0gKHZhbHVlMiBhcyBTZWxlY3QyVmFsdWVbXSkuaW5kZXhPZihlMSkgPiAtMTtcbiAgICAgICAgICAgICAgICBpZiAoIXRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsdGVyZWREYXRhKHdyaXRlVmFsdWUgPSBmYWxzZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9kYXRhO1xuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdGhpcy5oaWRlU2VsZWN0ZWRJdGVtcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZFNlbGVjdGVkRGF0YShyZXN1bHQsIHRoaXMub3B0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmN1c3RvbVNlYXJjaEVuYWJsZWQgJiYgdGhpcy5zZWFyY2hUZXh0ICYmIHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggPj0gK3RoaXMubWluQ2hhckZvclNlYXJjaCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbGVjdDJVdGlscy5nZXRGaWx0ZXJlZERhdGEocmVzdWx0LCB0aGlzLnNlYXJjaFRleHQsIHRoaXMuZWRpdFBhdHRlcm4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tYXhSZXN1bHRzID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBTZWxlY3QyVXRpbHMuZ2V0UmVkdWNlRGF0YShyZXN1bHQsICt0aGlzLm1heFJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGEucmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZGF0YS5yZWR1Y2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubWF4UmVzdWx0c0V4Y2VlZGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMub3B0aW9uSXNOb3RJbkZpbHRlcmVkRGF0YShyZXN1bHQsIHRoaXMuaG92ZXJpbmdPcHRpb24oKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChTZWxlY3QyVXRpbHMuZ2V0Rmlyc3RBdmFpbGFibGVPcHRpb24ocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3cml0ZVZhbHVlICYmIHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVmcmVzaCBjdXJyZW50IHNlbGVjdGVkIHZhbHVlXG4gICAgICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX2NvbnRyb2wgPyB0aGlzLl9jb250cm9sLnZhbHVlIDogdGhpcy5fdmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGF0YS5zZXQocmVzdWx0KTtcblxuICAgICAgICAgICAgLy8gcmVwbGFjZSBzZWxlY3RlZCBvcHRpb25zIHdoZW4gZGF0YSBjaGFuZ2VcblxuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgJiYgdGhpcy5vcHRpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uczogU2VsZWN0Mk9wdGlvbltdID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm9wdGlvbi5tYXAoZSA9PiBlLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChTZWxlY3QyVXRpbHMuaXNHcm91cChlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5vcHRpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKGYudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcyhlLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXNoKGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gcHJlc2VydmUgc2VsZWN0aW9uIG9yZGVyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb24gPSB0aGlzLm9wdGlvbi5tYXAoZSA9PiBvcHRpb25zLmZpbmQoZiA9PiBmLnZhbHVlID09PSBlLnZhbHVlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSAmJiB0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBvcHRpb246IFNlbGVjdDJPcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoU2VsZWN0MlV0aWxzLmlzR3JvdXAoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUub3B0aW9ucy5mb3JFYWNoKGYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudmFsdWUgPT09IGYudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5vcHRpb24gYXMgU2VsZWN0Mk9wdGlvbikudmFsdWUgPT09IGUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGlja0V4aXQoKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5TZWxlY3QoZWx0OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlmUGFyZW50Q29udGFpbnNJZChlbHQsIHRoaXMuaWQoKSkgfHwgdGhpcy5pZlBhcmVudENvbnRhaW5zSWQoZWx0LCB0aGlzLmlkT3ZlcmxheSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNDbGFzcyhlbGVtZW50OiBFbGVtZW50LCBjc3NDbGFzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQsIGNzc0NsYXNzKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlmUGFyZW50Q29udGFpbnNJZChlbGVtZW50OiBFbGVtZW50LCBpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcmVudEVsZW1lbnRCeUlkKGVsZW1lbnQsIGlkKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudEVsZW1lbnRCeUNsYXNzKGVsZW1lbnQ6IEVsZW1lbnQsIGNzc0NsYXNzOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5DbGFzc2VzKGVsZW1lbnQsIGNzc0NsYXNzLnRyaW0oKS5zcGxpdCgvXFxzKy8pKVxuICAgICAgICAgICAgPyBlbGVtZW50XG4gICAgICAgICAgICA6IGVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgICA/IHRoaXMuZ2V0UGFyZW50RWxlbWVudEJ5Q2xhc3MoZWxlbWVudC5wYXJlbnRFbGVtZW50LCBjc3NDbGFzcylcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50RWxlbWVudEJ5SWQoZWxlbWVudDogRWxlbWVudCwgaWQ6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IGlkXG4gICAgICAgICAgICA/IGVsZW1lbnRcbiAgICAgICAgICAgIDogZWxlbWVudC5wYXJlbnRFbGVtZW50XG4gICAgICAgICAgICAgID8gdGhpcy5nZXRQYXJlbnRFbGVtZW50QnlJZChlbGVtZW50LnBhcmVudEVsZW1lbnQsIGlkKVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQ2xhc3NlcyhlbGVtZW50OiBFbGVtZW50LCBjc3NDbGFzc2VzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW1lbnQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNzc0NsYXNzIG9mIGNzc0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb250YWluQWxtb3N0T25lQ2xhc3NlcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY3NzQ2xhc3Nlczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNvbnRhaW5BbG1vc3RPbmUgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjb25zdCBjc3NDbGFzcyBvZiBjc3NDbGFzc2VzKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbkFsbW9zdE9uZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udGFpbkFsbW9zdE9uZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsaWNrT25TZWxlY3QyRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluQWxtb3N0T25lQ2xhc3NlcyhlbGVtZW50LCBbXG4gICAgICAgICAgICAnc2VsZWN0Mi1vdmVybGF5LWJhY2tkcm9wJyxcbiAgICAgICAgICAgICdzZWxlY3QyLWxhYmVsLWNvbnRlbnQnLFxuICAgICAgICAgICAgJ3NlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZCcsXG4gICAgICAgICAgICAnc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24nLFxuICAgICAgICBdKTtcbiAgICB9XG5cbiAgICBmb2N1c2luKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyh0cnVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3Vzb3V0KGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgICAgIGlmICghZXZlbnQucmVsYXRlZFRhcmdldCB8fCAhdGhpcy5pc0luU2VsZWN0KGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0KG9wdGlvbjogU2VsZWN0Mk9wdGlvbiB8IG51bGwsIGVtaXQ6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGxldCB2YWx1ZTogYW55O1xuICAgICAgICBpZiAob3B0aW9uICE9PSBudWxsICYmIG9wdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW107XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcCA9PiBvcC52YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uID0gb3B0aW9uO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlLmVtaXQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLm9wdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbiAmJiB0aGlzLl92YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8/IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2hlbiByZW1vdmUgdmFsdWVcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uPy5sZW5ndGggOiB0aGlzLm9wdGlvbikge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9wdGlvbiA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLmhpZGVTZWxlY3RlZEl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZW1pdCAmJj0gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKTtcblxuICAgICAgICBpZiAodGhpcy5fY29udHJvbCkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVtaXQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPz8gbnVsbDtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdGVzdERpZmZWYWx1ZSh2YWwxOiBTZWxlY3QyVXBkYXRlVmFsdWUsIHZhbDI6IGFueSkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwxKSA/ICh2YWwxIGFzIFtdKT8ubGVuZ3RoICE9PSB2YWwyPy5sZW5ndGggOiB2YWwxICE9PSB2YWwyO1xuICAgIH1cblxuICAgIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNyZWF0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChjcmVhdGUgJiYgdGhpcy5fdGVzdEtleShldmVudCwgWydFbnRlciddKSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbmRBZGQoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFt7IGtleTogJ0Fycm93RG93bicsIGFsdEtleTogZmFsc2UgfV0pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVEb3duKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFt7IGtleTogJ0Fycm93VXAnLCBhbHRLZXk6IGZhbHNlIH1dKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlVXAoKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShldmVudCwgWydIb21lJ10pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVTdGFydCgpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VuZCddKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlRW5kKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnUGFnZVVwJ10pKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVVcCgxMCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnUGFnZURvd24nXSkpIHtcbiAgICAgICAgICAgIHRoaXMubW92ZURvd24oMTApO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VudGVyJ10pIHx8ICh0aGlzLmlzU2VhcmNoYm94SGlkZGVuICYmIHRoaXMuX3Rlc3RLZXkoZXZlbnQsIFsnICddKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QnlFbnRlcigpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBDTE9TRV9LRVlTKSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbktleShldmVudDogS2V5Ym9hcmRFdmVudCwgY3JlYXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGNyZWF0ZSAmJiB0aGlzLl90ZXN0S2V5KGV2ZW50LCBbJ0VudGVyJ10pKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFuZEFkZChldmVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGVzdEtleShldmVudCwgT1BFTl9LRVlTKSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UodHJ1ZSwgdHJ1ZSwgZXZlbnQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90ZXN0S2V5KGV2ZW50LCBDTE9TRV9LRVlTKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVPcGVuQW5kQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlYXJjaFVwZGF0ZShlOiBFdmVudCkge1xuICAgICAgICB0aGlzLnNlYXJjaFRleHQgPSAoZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGlmICghdGhpcy5jdXN0b21TZWFyY2hFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkRGF0YSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2guZW1pdCh7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YTogKGRhdGE6IFNlbGVjdDJEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWREYXRhLnNldChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhY2tCeShfaW5kZXg6IG51bWJlciwgaXRlbTogU2VsZWN0Mkdyb3VwIHwgU2VsZWN0Mk9wdGlvbik6IGFueSB7XG4gICAgICAgIHJldHVybiAoaXRlbSBhcyBTZWxlY3QyT3B0aW9uKS52YWx1ZSA/PyBpdGVtO1xuICAgIH1cblxuICAgIGlzU2VsZWN0ZWQob3B0aW9uOiBTZWxlY3QyT3B0aW9uKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3QyVXRpbHMuaXNTZWxlY3RlZCh0aGlzLm9wdGlvbiwgb3B0aW9uLCB0aGlzLm11bHRpcGxlKTtcbiAgICB9XG5cbiAgICBpc0Rpc2FibGVkKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICByZXR1cm4gb3B0aW9uLmRpc2FibGVkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgICB9XG5cbiAgICByZW1vdmVTZWxlY3Rpb24oZTogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQsIG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBTZWxlY3QyVXRpbHMucmVtb3ZlU2VsZWN0aW9uKHRoaXMub3B0aW9uLCBvcHRpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMuaGlkZVNlbGVjdGVkSXRlbXMpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWREYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9ICh0aGlzLm9wdGlvbiBhcyBTZWxlY3QyT3B0aW9uW10pLm1hcChvcCA9PiBvcC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgPz8gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlbW92ZU9wdGlvbi5lbWl0KHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIHJlbW92ZWRPcHRpb246IG9wdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNTZWFyY2hib3goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbW9kZWwgdmFsdWUuIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNhdmVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBzZWxlY3QncyB2YWx1ZVxuICAgICAqIGNoYW5nZXMgZnJvbSB1c2VyIGlucHV0LiBQYXJ0IG9mIHRoZSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgICAgKiByZXF1aXJlZCB0byBpbnRlZ3JhdGUgd2l0aCBBbmd1bGFyJ3MgY29yZSBmb3JtcyBBUEkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0IGlzIGJsdXJyZWRcbiAgICAgKiBieSB0aGUgdXNlci4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlIHJlcXVpcmVkXG4gICAgICogdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICAgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICAgKiBAcGFyYW0gaXNEaXNhYmxlZFxuICAgICAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBvblNjcm9sbCh3YXk6ICd1cCcgfCAnZG93bicpIHtcbiAgICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICB3YXksXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuaW5uZXJTZWFyY2hUZXh0LFxuICAgICAgICAgICAgZGF0YTogdGhpcy5fZGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2lzRXJyb3JTdGF0ZSgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5fY29udHJvbD8uaW52YWxpZDtcbiAgICAgICAgY29uc3QgaXNUb3VjaGVkID0gdGhpcy5fY29udHJvbD8udG91Y2hlZDtcbiAgICAgICAgY29uc3QgaXNTdWJtaXR0ZWQgPSB0aGlzLl9wYXJlbnRGb3JtR3JvdXA/LnN1Ym1pdHRlZCB8fCB0aGlzLl9wYXJlbnRGb3JtPy5zdWJtaXR0ZWQ7XG4gICAgICAgIHJldHVybiAhIShpc0ludmFsaWQgJiYgKGlzVG91Y2hlZCB8fCBpc1N1Ym1pdHRlZCkpO1xuICAgIH1cblxuICAgIF9zZWxlY3Rpb25PdmVycmlkZUxhYmVsKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2VsZWN0aW9uT3ZlcnJpZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk92ZXJyaWRlKHtcbiAgICAgICAgICAgICAgICBzaXplOiB0aGlzLm9wdGlvbnNTaXplKCksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5zZWxlY3Rpb25PdmVycmlkZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbk92ZXJyaWRlLnJlcGxhY2VBbGwoJyVzaXplJScsIGAke3RoaXMub3B0aW9uc1NpemUoKX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEVsZW1lbnRJZChlbHQ6IFNlbGVjdDJHcm91cCB8IFNlbGVjdDJPcHRpb24gfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghZWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtpLCBqXSA9IHRoaXMuX2dldEVsZW1lbnRQYXRoKGVsdCk7XG4gICAgICAgIGNvbnN0IHRvU3VmZml4ID0gaW5kZXggPT4gKGluZGV4ICE9PSB1bmRlZmluZWQgPyBgLSR7aW5kZXh9YCA6ICcnKTtcbiAgICAgICAgcmV0dXJuIChlbHQgYXMgU2VsZWN0Mk9wdGlvbikuaWQgPz8gYCR7dGhpcy5pZCgpfS1vcHRpb24ke3RvU3VmZml4KGkpfSR7dG9TdWZmaXgoail9YDtcbiAgICB9XG5cbiAgICBfZ2V0RWxlbWVudFBhdGgoZWx0OiBTZWxlY3QyR3JvdXAgfCBTZWxlY3QyT3B0aW9uKTogbnVtYmVyW10ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbk9yR3JvdXAgPSB0aGlzLl9kYXRhW2ldO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9uT3JHcm91cCA9PT0gZWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtpXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoU2VsZWN0MlV0aWxzLmlzR3JvdXAob3B0aW9uT3JHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBqID0gb3B0aW9uT3JHcm91cC5vcHRpb25zLmZpbmRJbmRleChvID0+IG8gPT09IGVsdCk7XG4gICAgICAgICAgICAgICAgaWYgKGogPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2ksIGpdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9wdGlvbnNTaXplKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbi5sZW5ndGggOiB0aGlzLm9wdGlvbiA/IDEgOiAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkSXRlbSh2YWx1ZTogc3RyaW5nKTogU2VsZWN0Mk9wdGlvbiB7XG4gICAgICAgIGxldCBpdGVtID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2RhdGEucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUFuZEFkZChlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUudHJpbSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5hZGRJdGVtKHZhbHVlLnRyaW0oKSk7XG4gICAgICAgICAgICB0aGlzLmNsaWNrKGl0ZW0pO1xuICAgICAgICAgICAgKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gJyc7XG4gICAgICAgICAgICB0aGlzLmF1dG9DcmVhdGVJdGVtLmVtaXQoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RvcEV2ZW50KGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZVVwKHRpbWVzID0gMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0UHJldmlvdXNPcHRpb24odGhpcy5maWx0ZXJlZERhdGEoKSwgdGhpcy5ob3ZlcmluZ09wdGlvbigpKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVEb3duKHRpbWVzID0gMSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRpbWVzOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0TmV4dE9wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSgpLCB0aGlzLmhvdmVyaW5nT3B0aW9uKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZVN0YXJ0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEZyb21PcHRpb24oU2VsZWN0MlV0aWxzLmdldEZpcnN0T3B0aW9uKHRoaXMuZmlsdGVyZWREYXRhKCkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1vdmVFbmQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsRnJvbU9wdGlvbihTZWxlY3QyVXRpbHMuZ2V0TGFzdE9wdGlvbih0aGlzLmZpbHRlcmVkRGF0YSgpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxGcm9tT3B0aW9uKG9wdGlvbjogU2VsZWN0Mk9wdGlvbikge1xuICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmhvdmVyaW5nT3B0aW9uLnNldChvcHRpb24pO1xuICAgICAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IHRoaXMucmVzdWx0cy5maW5kKHIgPT4gci5uYXRpdmVFbGVtZW50LmlubmVyVGV4dC50cmltKCkgPT09IG9wdGlvbi5sYWJlbCk7XG4gICAgICAgICAgICBpZiAoZG9tRWxlbWVudCAmJiB0aGlzLnJlc3VsdHNFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RDbGllbnRSZWN0ID0gdGhpcy5yZXN1bHRzRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25DbGllbnRSZWN0ID0gZG9tRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0c0VsZW1lbnQuc2Nyb2xsVG9wID0gb3B0aW9uQ2xpZW50UmVjdC50b3AgLSBsaXN0Q2xpZW50UmVjdC50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEJ5RW50ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmhvdmVyaW5nT3B0aW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuaG92ZXJpbmdPcHRpb24oKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF90ZXN0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCByZWZzOiAoc3RyaW5nIHwgS2V5SW5mbylbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBhbHRLZXkgfSA9IGV2ZW50O1xuICAgICAgICByZXR1cm4gcmVmcy5zb21lKHJlZiA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmID09PSBrZXk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXkgPT09IHJlZi5rZXkgJiYgYWx0S2V5ID09PSByZWYuYWx0S2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBvcHRpb24gYmFzZWQgb24gYSB2YWx1ZS4gSWYgbm8gb3B0aW9uIGNhbiBiZVxuICAgICAqIGZvdW5kIHdpdGggdGhlIGRlc2lnbmF0ZWQgdmFsdWUsIHRoZSBzZWxlY3QgdHJpZ2dlciBpcyBjbGVhcmVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWU6IGFueSB8IGFueVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbiB8fCAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHZhbHVlICYmICFpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb24gYXJyYXkgdmFsdWUuJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbiA9IFtdOyAvLyBpZiB2YWx1ZSBpcyBudWxsLCB0aGVuIGVtcHR5IG9wdGlvbiBhbmQgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyBub3QgbnVsbC4gUHJlc2VsZWN0IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlczogYW55ID0gU2VsZWN0MlV0aWxzLmdldE9wdGlvbnNCeVZhbHVlKHRoaXMuX2RhdGEsIHZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVmFsdWVzLm1hcChpdGVtID0+IHRoaXMuc2VsZWN0KGl0ZW0sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA/Pz0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbikgPyB0aGlzLm9wdGlvbiA6IHRoaXMub3B0aW9uID8gW3RoaXMub3B0aW9uXSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpeCBpZiB2YWx1ZSBpcyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdChudWxsLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRlc3REaWZmVmFsdWUodGhpcy5fdmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9uKSA/IHRoaXMub3B0aW9uIDogdGhpcy5vcHRpb24gPyBbdGhpcy5vcHRpb25dIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID8/PSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoU2VsZWN0MlV0aWxzLmdldE9wdGlvbkJ5VmFsdWUodGhpcy5fZGF0YSwgdmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250cm9sLnZpZXdUb01vZGVsVXBkYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRG9lcyBzb21lIG1hbnVhbCBkaXJ0eSBjaGVja2luZyBvbiB0aGUgbmF0aXZlIGlucHV0IGB2YWx1ZWAgcHJvcGVydHkuICovXG4gICAgcHJpdmF0ZSBfZGlydHlDaGVja05hdGl2ZVZhbHVlKCkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHRoaXMudmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c05hdGl2ZVZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXNTZWFyY2hib3goZm9jdXMgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlYXJjaGJveEhpZGRlbikge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQgJiYgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50ICYmIGZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZm9jdXMoc3RhdGU6IGJvb2xlYW4sIG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpIHtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0ZvY3VzID1cbiAgICAgICAgICAgICAgICAhdGhpcy5pc1NlYXJjaGJveEhpZGRlbiAmJiB0aGlzLmlzT3BlbiA/IHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudCA6IHRoaXMuc2VsZWN0aW9uLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gZWx0VG9Gb2N1cykge1xuICAgICAgICAgICAgICAgIGVsdFRvRm9jdXMuZm9jdXMob3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnNlbGVjdGlvbj8ubmF0aXZlRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5zZWFyY2hJbnB1dD8ubmF0aXZlRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICAgIChkb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVGb2N1c1N0YXRlKHN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc0Fib2JlT3ZlcmxheSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheSAmJiB0aGlzLl9vdmVybGF5UG9zaXRpb24gJiYgdGhpcy5saXN0UG9zaXRpb24gPT09ICdhdXRvJ1xuICAgICAgICAgICAgPyB0aGlzLl9vdmVybGF5UG9zaXRpb24gPT09ICd0b3AnXG4gICAgICAgICAgICA6IHRoaXMubGlzdFBvc2l0aW9uID09PSAnYWJvdmUnO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfdXBkYXRlRm9jdXNTdGF0ZShzdGF0ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXN0YXRlICYmIHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gc3RhdGU7XG4gICAgICAgICAgICB0aGlzLmJsdXIuZW1pdCh0aGlzKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAmJiAhdGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBzdGF0ZTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMuZW1pdCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxsYWJlbCBjbGFzcz1cInNlbGVjdDItbGFiZWxcIiAoY2xpY2spPVwidG9nZ2xlT3BlbkFuZENsb3NlKClcIiBbaWRdPVwiaWRMYWJlbCgpXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1sYWJlbFwiPjwvbmctY29udGVudD5cbiAgICBAaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0Mi1yZXF1aXJlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICB9XG48L2xhYmVsPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJzZWxlY3QyIHNlbGVjdDItY29udGFpbmVyIHNlbGVjdDItY29udGFpbmVyLS1kZWZhdWx0XCJcbiAgICBbY2xhc3Muc2VsZWN0Mi1jb250YWluZXItLWZvY3VzXT1cImZvY3VzZWRcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tYmVsb3ddPVwiIXNlbGVjdDJhYm92ZVwiXG4gICAgW2NsYXNzLnNlbGVjdDItY29udGFpbmVyLS1hYm92ZV09XCJzZWxlY3QyYWJvdmVcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tb3Blbl09XCJpc09wZW5cIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImlkQ29tYm8oKVwiXG4gICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgIGNsYXNzPVwic2VsZWN0aW9uXCJcbiAgICAgICAgI3NlbGVjdGlvblxuICAgICAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgICAgICBbdGFiaW5kZXhdPVwiIXRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5KCkgPz8gaWRMYWJlbCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICAgICAgICBhcmlhLWhhc3BvcHVwPVwibGlzdGJveFwiXG4gICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiaWRPcHRpb25zKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiaXNPcGVuID8gaG92ZXJpbmdPcHRpb25JZCgpIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiYXJpYURlc2NyaWJlZGJ5KClcIlxuICAgICAgICBbYXR0ci50aXRsZV09XCJ0aXRsZSgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIl9pc0Vycm9yU3RhdGUoKSB8fCBhcmlhSW52YWxpZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWQgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoKVwiXG4gICAgICAgIChmb2N1cyk9XCJmb2N1c2luKClcIlxuICAgICAgICAoZm9jdXNvdXQpPVwiZm9jdXNvdXQoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cIm9wZW5LZXkoJGV2ZW50KVwiXG4gICAgICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAgICAgW2NsYXNzLnNlbGVjdDItZm9jdXNlZF09XCJmb2N1c2VkXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25cIlxuICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItc2VsZWN0aW9uLS1tdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1zZWxlY3Rpb24tLXNpbmdsZV09XCIhbXVsdGlwbGVcIlxuICAgICAgICA+XG4gICAgICAgICAgICBAaWYgKHNlbGVjdGlvbk92ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fb3ZlcnJpZGVcIiBbaW5uZXJIVE1MXT1cIl9zZWxlY3Rpb25PdmVycmlkZUxhYmVsKClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgIW11bHRpcGxlICYmIHJlc2V0dGFibGUgJiYgcmVzZXRTZWxlY3RlZFZhbHVlICE9PSB2YWx1ZSAmJiBzZWxlY3QyT3B0aW9uICYmICEoZGlzYWJsZWQgfHwgcmVhZG9ubHkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZXNldEJ1dHRvblwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKCFtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkXCIgW3RpdGxlXT1cInNlbGVjdDJPcHRpb24/LmxhYmVsIHx8ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIXNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdDJPcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWhhc1RlbXBsYXRlKHNlbGVjdDJPcHRpb24sICdvcHRpb24nLCB0cnVlKSB8fCBub0xhYmVsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cInNlbGVjdDJPcHRpb24ubGFiZWxcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoc2VsZWN0Mk9wdGlvbiwgJ29wdGlvbicsIHRydWUpOyBjb250ZXh0OiBzZWxlY3QyT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJfX29wdGlvbl09XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IHBsYWNlaG9sZGVyIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgQGlmIChyZXNldHRhYmxlICYmIHJlc2V0U2VsZWN0ZWRWYWx1ZSAhPT0gdmFsdWUgJiYgc2VsZWN0Mk9wdGlvbiAmJiAhKGRpc2FibGVkIHx8IHJlYWRvbmx5KSkge1xuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVzZXRCdXR0b25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fYXJyb3dcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+IDwvc3Bhbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFhdXRvQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJfX29wdGlvbl09XCJzZWxlY3QyT3B0aW9ucz8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBwbGFjZWhvbGRlciB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wIG9mIG9wdGlvbiB8fCBbXTsgdHJhY2sgdHJhY2tCeSgkaW5kZXgsIG9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwib3AubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIl91cGRhdGVGb2N1c1N0YXRlKHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJyZW1vdmVTZWxlY3Rpb24oJGV2ZW50LCBvcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIShkaXNhYmxlZCB8fCByZWFkb25seSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTZWxlY3Rpb24oJGV2ZW50LCBvcClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlX19yZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPsOXPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUob3AsICdvcHRpb24nLCB0cnVlKSB8fCBub0xhYmVsVGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJvcC5sYWJlbFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRUZW1wbGF0ZShvcCwgJ29wdGlvbicsIHRydWUpOyBjb250ZXh0OiBvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoYXV0b0NyZWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fYXV0by1jcmVhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2N1cyk9XCJzdG9wRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic3RvcEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWQoKSArICctY3JlYXRlLWZpZWxkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoZmFsc2UsIHRydWUpOyBzdG9wRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleURvd24oJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJzZWFyY2hVcGRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicHJldkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWNyZWF0ZV9fZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cInRleHRib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29ycmVjdD1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jYXBpdGFsaXplPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIEBpZiAoIW92ZXJsYXkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuXG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdDItc3Vic2NyaXB0LXdyYXBwZXJcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2VsZWN0Mi1oaW50XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcz1cInNlbGVjdDItb3ZlcmxheS1iYWNrZHJvcFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInRoaXMuaXNPcGVuICYmIG92ZXJsYXlcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGhdPVwib3ZlcmxheVdpZHRoXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodF09XCJvdmVybGF5SGVpZ2h0XCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJfcG9zaXRpb25zXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJ0b2dnbGVPcGVuQW5kQ2xvc2UoKVwiXG4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRhaW5lclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRhaW5lclRlbXBsYXRlPlxuICAgIDxkaXZcbiAgICAgICAgW2lkXT1cImlkT3ZlcmxheSgpXCJcbiAgICAgICAgY2xhc3M9XCJzZWxlY3QyLWNvbnRhaW5lciBzZWxlY3QyLWNvbnRhaW5lci0tZGVmYXVsdCBzZWxlY3QyLWNvbnRhaW5lci1kcm9wZG93blwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3QyLWNvbnRhaW5lci0tb3Blbl09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1vdmVybGF5XT1cIm92ZXJsYXlcIlxuICAgICAgICBbY2xhc3Muc2VsZWN0Mi1wb3NpdGlvbi1hdXRvXT1cImxpc3RQb3NpdGlvbiA9PT0gJ2F1dG8nXCJcbiAgICAgICAgW2NsYXNzLnNlbGVjdDItc3R5bGUtYm9yZGVybGVzc109XCJzdHlsZU1vZGUgPT09ICdib3JkZXJsZXNzJ1wiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjZHJvcGRvd25cbiAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1kcm9wZG93blwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1kcm9wZG93bi0tYmVsb3ddPVwiIXNlbGVjdDJhYm92ZVwiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0Mi1kcm9wZG93bi0tYWJvdmVdPVwic2VsZWN0MmFib3ZlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdDItc2VhcmNoIHNlbGVjdDItc2VhcmNoLS1kcm9wZG93blwiIFtjbGFzcy5zZWxlY3QyLXNlYXJjaC0taGlkZV09XCJpc1NlYXJjaGJveEhpZGRlblwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAjc2VhcmNoSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW2lkXT1cImlkKCkgKyAnLXNlYXJjaC1maWVsZCdcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleURvd24oJGV2ZW50LCBhdXRvQ3JlYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJzZWFyY2hVcGRhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwicHJldkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlYXJjaF9fZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwic2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImNvbWJvYm94XCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgYXV0b2NvcnJlY3Q9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRoaXMuaXNPcGVuID8gdGFiSW5kZXggOiAnLTEnXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5KCkgPz8gaWRMYWJlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpZE9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImhvdmVyaW5nT3B0aW9uSWQoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzXCI+XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJpZE9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICAgICNyZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItZ3JpZF09XCJncmlkICYmIGlzTnVtYmVyKGdyaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdDItZ3JpZC1hdXRvXT1cImdyaWQgJiYgIWlzTnVtYmVyKGdyaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwicmVzdWx0TWF4SGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tZ3JpZC1zaXplXT1cImdyaWQgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIGluZmluaXRlU2Nyb2xsXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbERpc2FibGVkXT1cIiFpbmZpbml0ZVNjcm9sbCAmJiAhaXNPcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsRGlzdGFuY2VdPVwiaW5maW5pdGVTY3JvbGxEaXN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cImluZmluaXRlU2Nyb2xsVGhyb3R0bGVcIlxuICAgICAgICAgICAgICAgICAgICBbaW5maW5pdGVTY3JvbGxDb250YWluZXJdPVwicmVzdWx0c1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRieSgpID8/IGlkTGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cImhvdmVyaW5nT3B0aW9uSWQoKVwiXG4gICAgICAgICAgICAgICAgICAgIChzY3JvbGxlZCk9XCJvblNjcm9sbCgnZG93bicpXCJcbiAgICAgICAgICAgICAgICAgICAgKHNjcm9sbGVkVXApPVwib25TY3JvbGwoJ3VwJylcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzaG93U2VsZWN0QWxsICYmIG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uIHNlbGVjdDItc2VsZWN0YWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QWxsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc2VsZWN0QWxsVGVzdCgpID8gcmVtb3ZlQWxsVGV4dCA6IHNlbGVjdEFsbFRleHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAZm9yIChncm91cE9yT3B0aW9uIG9mIGZpbHRlcmVkRGF0YSgpOyB0cmFjayB0cmFja0J5KGksIGdyb3VwT3JPcHRpb24pOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChncm91cE9yT3B0aW9uLm9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uIHNlbGVjdDItcmVzdWx0c19fZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lkXT1cImdldEVsZW1lbnRJZChncm91cE9yT3B0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ2dyb3VwJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGVjdDItcmVzdWx0c19fZ3JvdXAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cE9yT3B0aW9uLmNsYXNzZXMgPyAnICcgKyBncm91cE9yT3B0aW9uLmNsYXNzZXMgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJncm91cE9yT3B0aW9uLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZW1wbGF0ZShncm91cE9yT3B0aW9uLCAnZ3JvdXAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGdyb3VwT3JPcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9ucyBzZWxlY3QyLXJlc3VsdHNfX29wdGlvbnMtLW5lc3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImdldEVsZW1lbnRJZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBncm91cE9yT3B0aW9uLm9wdGlvbnM7IHRyYWNrIHRyYWNrQnkoaiwgb3B0aW9uKTsgbGV0IGogPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0RWxlbWVudElkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0T3B0aW9uU3R5bGUob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwibW91c2VlbnRlcihvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUob3B0aW9uLCAnb3B0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QyLWxhYmVsLWNvbnRlbnRcIiBbaW5uZXJIVE1MXT1cIm9wdGlvbi5sYWJlbFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImdldFRlbXBsYXRlKG9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0RWxlbWVudElkKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldE9wdGlvblN0eWxlKGdyb3VwT3JPcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZChncm91cE9yT3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm1vdXNlZW50ZXIoZ3JvdXBPck9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2soZ3JvdXBPck9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghaGFzVGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ29wdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiZ3JvdXBPck9wdGlvbi5sYWJlbFwiIGNsYXNzPVwic2VsZWN0Mi1sYWJlbC1jb250ZW50XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBncm91cE9yT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ2V0VGVtcGxhdGUoZ3JvdXBPck9wdGlvbiwgJ29wdGlvbicpOyBjb250ZXh0OiBncm91cE9yT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIWZpbHRlcmVkRGF0YSgpPy5sZW5ndGggJiYgbm9SZXN1bHRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJzZWxlY3QyLW5vLXJlc3VsdCBzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiIFtpbm5lckhUTUxdPVwibm9SZXN1bHRNZXNzYWdlXCI+PC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1heFJlc3VsdHNFeGNlZWRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXRvby1tdWNoLXJlc3VsdCBzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJtYXhSZXN1bHRzTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9saT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Jlc2V0QnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChmb2N1cyk9XCJfdXBkYXRlRm9jdXNTdGF0ZSh0cnVlKVwiXG4gICAgICAgIChjbGljayk9XCJyZXNldCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcmVzZXRcIlxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaXB0aW9uXT1cImFyaWFSZXNldEJ1dHRvbkRlc2NyaXB0aW9uKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cImlkQ29tYm8oKVwiXG4gICAgPlxuICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Dlzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=