cps-ui-kit 0.22.0 → 0.23.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.
package/README.md CHANGED
@@ -20,6 +20,7 @@
20
20
  - Select
21
21
  - Tag
22
22
  - Textarea
23
+ - Tree autocomplete
23
24
  - Tree select
24
25
 
25
26
  ### License
@@ -0,0 +1,423 @@
1
+ import { Component, EventEmitter, Input, Optional, Output, Self } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import { convertSize } from '../utils/size-utils';
4
+ import { isEqual } from 'lodash-es';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ export class CpsTreeDropdownBaseComponent {
8
+ set options(options) {
9
+ if (options?.some((o) => o.inner)) {
10
+ this._options = options;
11
+ return;
12
+ }
13
+ this._options = this._toInnerOptions(options);
14
+ }
15
+ get options() {
16
+ return this._options;
17
+ }
18
+ set value(value) {
19
+ this._value = value;
20
+ this.onChange(value);
21
+ }
22
+ get value() {
23
+ return this._value;
24
+ }
25
+ constructor(control, cdRef) {
26
+ this.control = control;
27
+ this.cdRef = cdRef;
28
+ this.label = '';
29
+ this.placeholder = 'Please enter';
30
+ this.hint = '';
31
+ this.multiple = false;
32
+ this.disabled = false;
33
+ this.width = '100%';
34
+ this.chips = true;
35
+ this.closableChips = true;
36
+ this.clearable = false;
37
+ this.openOnClear = true;
38
+ this.optionLabel = 'label';
39
+ this.optionInfo = 'info';
40
+ this.hideDetails = false;
41
+ this.persistentClear = false;
42
+ this.prefixIcon = '';
43
+ this.prefixIconSize = '18px';
44
+ this.loading = false;
45
+ this.virtualScroll = false;
46
+ this._value = undefined;
47
+ this.valueChanged = new EventEmitter();
48
+ this._statusChangesSubscription = new Subscription();
49
+ this._options = [];
50
+ this.optionsMap = new Map();
51
+ this.originalOptionsMap = new Map();
52
+ this.virtualListHeight = 240;
53
+ this.virtualScrollItemSize = 40;
54
+ this.error = '';
55
+ this.cvtWidth = '';
56
+ this.isOpened = false;
57
+ this.optionFocused = false;
58
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
59
+ this.onChange = (event) => { };
60
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
61
+ this.onTouched = () => { };
62
+ if (this.control) {
63
+ this.control.valueAccessor = this;
64
+ }
65
+ }
66
+ ngOnInit() {
67
+ this.cvtWidth = convertSize(this.width);
68
+ if (!this._value) {
69
+ if (this.multiple) {
70
+ this._value = [];
71
+ this.treeSelection = [];
72
+ }
73
+ }
74
+ else {
75
+ this.treeSelection = this._valueToTreeSelection(this.value);
76
+ }
77
+ this._statusChangesSubscription = this.control?.statusChanges?.subscribe(() => {
78
+ this._checkErrors();
79
+ });
80
+ }
81
+ ngAfterViewInit() {
82
+ this._initContainerClickListener();
83
+ this.recalcVirtualListHeight();
84
+ this.cdRef.detectChanges();
85
+ }
86
+ ngOnDestroy() {
87
+ this._statusChangesSubscription?.unsubscribe();
88
+ if (this.treeContainerElement)
89
+ this.treeContainerElement.removeEventListener('click', this._handleOnContainerClick.bind(this));
90
+ }
91
+ _initContainerClickListener() {
92
+ this.treeContainerElement =
93
+ this.treeList?.el?.nativeElement?.querySelector('.p-tree-container');
94
+ if (this.treeContainerElement) {
95
+ this.treeContainerElement.addEventListener('click', this._handleOnContainerClick.bind(this));
96
+ }
97
+ }
98
+ _handleOnContainerClick(event) {
99
+ function getParentWithClass(element, className) {
100
+ let currentElement = element;
101
+ while (currentElement) {
102
+ if (currentElement.classList.contains(className)) {
103
+ return currentElement;
104
+ }
105
+ currentElement = currentElement.parentElement;
106
+ }
107
+ return null;
108
+ }
109
+ this.optionFocused = true;
110
+ const parent = event.target.classList.contains('p-treenode-content')
111
+ ? event.target
112
+ : getParentWithClass(event.target, 'p-treenode-content');
113
+ if (parent?.parentElement?.classList?.contains('cps-tree-node-fully-expandable')) {
114
+ this.onClickFullyExpandable(event, parent.parentElement);
115
+ }
116
+ }
117
+ registerOnChange(fn) {
118
+ this.onChange = fn;
119
+ }
120
+ registerOnTouched(fn) {
121
+ this.onTouched = fn;
122
+ }
123
+ writeValue(value) {
124
+ this.value = value;
125
+ }
126
+ updateValue(value) {
127
+ this.writeValue(value);
128
+ this.onChange(value);
129
+ this.valueChanged.emit(value);
130
+ }
131
+ onSelectNode() {
132
+ if (!this.multiple) {
133
+ this.toggleOptions(this.treeContainer?.nativeElement, false);
134
+ }
135
+ }
136
+ onClickFullyExpandable(event, elem) {
137
+ const key = this._getHTMLElementKey(elem);
138
+ if (!key)
139
+ return;
140
+ const treeNode = this.options.find((o) => o.key === key);
141
+ if (!treeNode)
142
+ return;
143
+ treeNode.expanded = !treeNode.expanded;
144
+ this._updateOptions();
145
+ setTimeout(() => {
146
+ this.recalcVirtualListHeight();
147
+ });
148
+ }
149
+ _getHTMLElementKey(elem) {
150
+ if (!elem?.classList)
151
+ return '';
152
+ const classList = [...elem.classList];
153
+ const key = classList.find((className) => {
154
+ return className.startsWith('key-');
155
+ });
156
+ if (!key)
157
+ return '';
158
+ return key.replace('key-', '');
159
+ }
160
+ treeSelectionChanged(selection) {
161
+ this.updateValue(this.treeSelectionToValue(selection));
162
+ }
163
+ recalcVirtualListHeight() {
164
+ if (!this.virtualScroll)
165
+ return;
166
+ const currentLen = this.treeList?.serializedValue?.length || 0;
167
+ this.virtualListHeight = Math.min(this.virtualScrollItemSize * currentLen, 240);
168
+ }
169
+ toggleOptions(dd, show) {
170
+ if (this.disabled || !dd)
171
+ return;
172
+ if (typeof show === 'boolean') {
173
+ if (show)
174
+ dd.classList.add('active');
175
+ else
176
+ dd.classList.remove('active');
177
+ }
178
+ else
179
+ dd.classList.toggle('active');
180
+ this.isOpened = dd.classList.contains('active');
181
+ this.optionFocused = false;
182
+ if (this.isOpened && this.treeSelection) {
183
+ this._expandToNodes(this.multiple ? this.treeSelection : [this.treeSelection]);
184
+ this._updateOptions();
185
+ setTimeout(() => {
186
+ this.recalcVirtualListHeight();
187
+ const selected = this.treeContainer.nativeElement.querySelector('.p-highlight');
188
+ if (selected) {
189
+ selected.scrollIntoView({
190
+ behavior: 'instant',
191
+ block: 'nearest',
192
+ inline: 'center'
193
+ });
194
+ }
195
+ else if (this.virtualScroll && this.treeSelection) {
196
+ let key = '';
197
+ if (this.multiple) {
198
+ if (this.treeSelection.length > 0)
199
+ key = this.treeSelection[0].key;
200
+ }
201
+ else
202
+ key = this.treeSelection.key;
203
+ if (key) {
204
+ const idx = this.treeList?.serializedValue?.findIndex((v) => v.node.key === key) || -1;
205
+ if (idx >= 0)
206
+ this.treeList.scrollToVirtualIndex(idx);
207
+ }
208
+ }
209
+ });
210
+ }
211
+ }
212
+ remove(option) {
213
+ if (!this.multiple)
214
+ return;
215
+ this.treeSelection = this.treeSelection.filter((v) => !isEqual(v, option));
216
+ this.updateValue(this.treeSelectionToValue(this.treeSelection));
217
+ }
218
+ initArrowsNavigaton() {
219
+ if (!this.isOpened)
220
+ return;
221
+ if (!this.optionFocused) {
222
+ const firstElem = this.treeContainerElement?.querySelector('.p-treenode-content');
223
+ if (firstElem)
224
+ firstElem.focus();
225
+ this.optionFocused = true;
226
+ }
227
+ }
228
+ clear(dd, event) {
229
+ event.stopPropagation();
230
+ if ((!this.multiple && this.treeSelection) ||
231
+ (this.multiple && this.treeSelection?.length > 0)) {
232
+ if (this.openOnClear) {
233
+ this.toggleOptions(dd, true);
234
+ }
235
+ const val = this.multiple ? [] : undefined;
236
+ this.treeSelection = val;
237
+ this.updateValue(val);
238
+ }
239
+ this.optionFocused = false;
240
+ }
241
+ _checkErrors() {
242
+ const errors = this.control?.errors;
243
+ if (!this.control?.control?.touched || !errors) {
244
+ this.error = '';
245
+ return;
246
+ }
247
+ if ('required' in errors) {
248
+ this.error = 'Field is required';
249
+ return;
250
+ }
251
+ const errArr = Object.values(errors);
252
+ if (errArr.length < 1) {
253
+ this.error = '';
254
+ return;
255
+ }
256
+ const message = errArr.find((msg) => typeof msg === 'string');
257
+ console.log('message', message);
258
+ this.error = message || 'Unknown error';
259
+ }
260
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
261
+ setDisabledState(disabled) { }
262
+ onBlur() {
263
+ this.control?.control?.markAsTouched();
264
+ this._checkErrors();
265
+ }
266
+ focus() {
267
+ this.treeContainer?.nativeElement?.focus();
268
+ this.toggleOptions(this.treeContainer?.nativeElement, true);
269
+ }
270
+ _expandToNodes(nodes) {
271
+ function getParentKey(key) {
272
+ const lastSeparatorIndex = key.lastIndexOf('-');
273
+ if (lastSeparatorIndex !== -1) {
274
+ return key.substring(0, lastSeparatorIndex);
275
+ }
276
+ return '';
277
+ }
278
+ nodes.forEach((node) => {
279
+ const parentNodeKey = getParentKey(node.key);
280
+ const parentNode = this.optionsMap.get(parentNodeKey) || null;
281
+ if (parentNode) {
282
+ parentNode.expanded = true;
283
+ this._expandToNodes([parentNode]);
284
+ }
285
+ });
286
+ }
287
+ _toInnerOptions(_options) {
288
+ function mapOption(o, optionLabel, optionInfo, key, originalOptionsMap) {
289
+ const inner = {
290
+ inner: true,
291
+ label: o[optionLabel],
292
+ info: o[optionInfo],
293
+ key,
294
+ styleClass: 'key-' + key
295
+ };
296
+ if (o.isDirectory) {
297
+ inner.type = 'directory';
298
+ inner.selectable = false;
299
+ inner.styleClass += ' cps-tree-node-fully-expandable';
300
+ }
301
+ if (o.children) {
302
+ inner.children = o.children.map((c, index) => {
303
+ return mapOption(c, optionLabel, optionInfo, key + '-' + index, originalOptionsMap);
304
+ });
305
+ }
306
+ originalOptionsMap.set(key, o);
307
+ return inner;
308
+ }
309
+ const res = _options.map((option, index) => {
310
+ return mapOption(option, this.optionLabel, this.optionInfo, '' + index, this.originalOptionsMap);
311
+ });
312
+ this.optionsMap = this._buildOptionsMap(res);
313
+ return res;
314
+ }
315
+ _buildOptionsMap(options) {
316
+ const nodeMap = new Map();
317
+ for (const option of options) {
318
+ nodeMap.set(option.key, option);
319
+ if (option.children) {
320
+ const childNodeMap = this._buildOptionsMap(option.children);
321
+ childNodeMap.forEach((value, key) => nodeMap.set(key, value));
322
+ }
323
+ }
324
+ return nodeMap;
325
+ }
326
+ treeSelectionToValue(selection) {
327
+ if (!selection)
328
+ return this.multiple ? [] : undefined;
329
+ if (this.multiple) {
330
+ return selection.map((s) => this.originalOptionsMap.get(s.key));
331
+ }
332
+ else {
333
+ return this.originalOptionsMap.get(selection.key);
334
+ }
335
+ }
336
+ _valueToTreeSelection(value) {
337
+ function getKey(v, map) {
338
+ for (const [key, val] of map.entries()) {
339
+ if (isEqual(v, val)) {
340
+ return key;
341
+ }
342
+ }
343
+ return '';
344
+ }
345
+ if (!value)
346
+ return this.multiple ? [] : undefined;
347
+ if (this.multiple) {
348
+ const res = [];
349
+ value.forEach((v) => {
350
+ const key = getKey(v, this.originalOptionsMap);
351
+ if (key)
352
+ res.push(this.optionsMap.get(key));
353
+ });
354
+ return res;
355
+ }
356
+ else {
357
+ const key = getKey(value, this.originalOptionsMap);
358
+ return key ? this.optionsMap.get(key) : undefined;
359
+ }
360
+ }
361
+ // this is a fix of primeng change detection bug when virtual scroller is enabled
362
+ _updateOptions() {
363
+ if (!this.virtualScroll)
364
+ return;
365
+ this.options = [...this.options];
366
+ }
367
+ }
368
+ CpsTreeDropdownBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CpsTreeDropdownBaseComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
369
+ CpsTreeDropdownBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: CpsTreeDropdownBaseComponent, selector: "ng-component", inputs: { label: "label", placeholder: "placeholder", hint: "hint", multiple: "multiple", disabled: "disabled", width: "width", chips: "chips", closableChips: "closableChips", clearable: "clearable", openOnClear: "openOnClear", optionLabel: "optionLabel", optionInfo: "optionInfo", hideDetails: "hideDetails", persistentClear: "persistentClear", prefixIcon: "prefixIcon", prefixIconSize: "prefixIconSize", loading: "loading", virtualScroll: "virtualScroll", options: "options", _value: ["value", "_value"] }, outputs: { valueChanged: "valueChanged" }, ngImport: i0, template: '', isInline: true });
370
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CpsTreeDropdownBaseComponent, decorators: [{
371
+ type: Component,
372
+ args: [{
373
+ template: ''
374
+ }]
375
+ }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{
376
+ type: Self
377
+ }, {
378
+ type: Optional
379
+ }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { label: [{
380
+ type: Input
381
+ }], placeholder: [{
382
+ type: Input
383
+ }], hint: [{
384
+ type: Input
385
+ }], multiple: [{
386
+ type: Input
387
+ }], disabled: [{
388
+ type: Input
389
+ }], width: [{
390
+ type: Input
391
+ }], chips: [{
392
+ type: Input
393
+ }], closableChips: [{
394
+ type: Input
395
+ }], clearable: [{
396
+ type: Input
397
+ }], openOnClear: [{
398
+ type: Input
399
+ }], optionLabel: [{
400
+ type: Input
401
+ }], optionInfo: [{
402
+ type: Input
403
+ }], hideDetails: [{
404
+ type: Input
405
+ }], persistentClear: [{
406
+ type: Input
407
+ }], prefixIcon: [{
408
+ type: Input
409
+ }], prefixIconSize: [{
410
+ type: Input
411
+ }], loading: [{
412
+ type: Input
413
+ }], virtualScroll: [{
414
+ type: Input
415
+ }], options: [{
416
+ type: Input
417
+ }], _value: [{
418
+ type: Input,
419
+ args: ['value']
420
+ }], valueChanged: [{
421
+ type: Output
422
+ }] } });
423
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3BzLXRyZWUtZHJvcGRvd24tYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jcHMtdWkta2l0L3NyYy9saWIvYmFzZV9jb21wb25lbnRzL2Nwcy10cmVlLWRyb3Bkb3duLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFDTCxNQUFNLGVBQWUsQ0FBQztBQU92QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7QUFLcEMsTUFBTSxPQUFPLDRCQUE0QjtJQXNCdkMsSUFBYSxPQUFPLENBQUMsT0FBYztRQUNqQyxJQUFJLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUN4QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBSUQsSUFBSSxLQUFLLENBQUMsS0FBVTtRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FB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LEtBQUs7Z0JBYVUsTUFBTTtzQkFBckIsS0FBSzt1QkFBQyxPQUFPO2dCQVdKLFlBQVk7c0JBQXJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2VsZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7XG4gIEljb25UeXBlLFxuICBpY29uU2l6ZVR5cGVcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9jcHMtaWNvbi9jcHMtaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb252ZXJ0U2l6ZSB9IGZyb20gJy4uL3V0aWxzL3NpemUtdXRpbHMnO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gJ3ByaW1lbmcvdHJlZSc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBjbGFzcyBDcHNUcmVlRHJvcGRvd25CYXNlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1BsZWFzZSBlbnRlcic7XG4gIEBJbnB1dCgpIGhpbnQgPSAnJztcbiAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgd2lkdGg6IG51bWJlciB8IHN0cmluZyA9ICcxMDAlJztcbiAgQElucHV0KCkgY2hpcHMgPSB0cnVlO1xuICBASW5wdXQoKSBjbG9zYWJsZUNoaXBzID0gdHJ1ZTtcbiAgQElucHV0KCkgY2xlYXJhYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5PbkNsZWFyID0gdHJ1ZTtcbiAgQElucHV0KCkgb3B0aW9uTGFiZWwgPSAnbGFiZWwnO1xuICBASW5wdXQoKSBvcHRpb25JbmZvID0gJ2luZm8nO1xuICBASW5wdXQoKSBoaWRlRGV0YWlscyA9IGZhbHNlO1xuICBASW5wdXQoKSBwZXJzaXN0ZW50Q2xlYXIgPSBmYWxzZTtcbiAgQElucHV0KCkgcHJlZml4SWNvbjogSWNvblR5cGUgPSAnJztcbiAgQElucHV0KCkgcHJlZml4SWNvblNpemU6IGljb25TaXplVHlwZSA9ICcxOHB4JztcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuICBASW5wdXQoKSB2aXJ0dWFsU2Nyb2xsID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IG9wdGlvbnMob3B0aW9uczogYW55W10pIHtcbiAgICBpZiAob3B0aW9ucz8uc29tZSgobykgPT4gby5pbm5lcikpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX29wdGlvbnMgPSB0aGlzLl90b0lubmVyT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIGdldCBvcHRpb25zKCk6IFRyZWVOb2RlW10ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICB9XG5cbiAgQElucHV0KCd2YWx1ZScpIF92YWx1ZTogYW55ID0gdW5kZWZpbmVkO1xuXG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwcml2YXRlIF9zdGF0dXNDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgdHJlZUNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIHRyZWVMaXN0ITogVHJlZTtcblxuICBfb3B0aW9uczogVHJlZU5vZGVbXSA9IFtdO1xuICBvcHRpb25zTWFwID0gbmV3IE1hcDxzdHJpbmcsIFRyZWVOb2RlPigpO1xuICBvcmlnaW5hbE9wdGlvbnNNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG4gIHRyZWVTZWxlY3Rpb246IGFueTtcblxuICB2aXJ0dWFsTGlzdEhlaWdodCA9IDI0MDtcbiAgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gNDA7XG5cbiAgZXJyb3IgPSAnJztcbiAgY3Z0V2lkdGggPSAnJztcbiAgaXNPcGVuZWQgPSBmYWxzZTtcbiAgdHJlZUNvbnRhaW5lckVsZW1lbnQhOiBIVE1MRWxlbWVudDtcbiAgb3B0aW9uRm9jdXNlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIGNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBwdWJsaWMgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIGlmICh0aGlzLmNvbnRyb2wpIHtcbiAgICAgIHRoaXMuY29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmN2dFdpZHRoID0gY29udmVydFNpemUodGhpcy53aWR0aCk7XG4gICAgaWYgKCF0aGlzLl92YWx1ZSkge1xuICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBbXTtcbiAgICAgICAgdGhpcy50cmVlU2VsZWN0aW9uID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJlZVNlbGVjdGlvbiA9IHRoaXMuX3ZhbHVlVG9UcmVlU2VsZWN0aW9uKHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLmNvbnRyb2w/LnN0YXR1c0NoYW5nZXM/LnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5fY2hlY2tFcnJvcnMoKTtcbiAgICAgIH1cbiAgICApIGFzIFN1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9pbml0Q29udGFpbmVyQ2xpY2tMaXN0ZW5lcigpO1xuICAgIHRoaXMucmVjYWxjVmlydHVhbExpc3RIZWlnaHQoKTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKHRoaXMudHJlZUNvbnRhaW5lckVsZW1lbnQpXG4gICAgICB0aGlzLnRyZWVDb250YWluZXJFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgICdjbGljaycsXG4gICAgICAgIHRoaXMuX2hhbmRsZU9uQ29udGFpbmVyQ2xpY2suYmluZCh0aGlzKVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRDb250YWluZXJDbGlja0xpc3RlbmVyKCkge1xuICAgIHRoaXMudHJlZUNvbnRhaW5lckVsZW1lbnQgPVxuICAgICAgdGhpcy50cmVlTGlzdD8uZWw/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoJy5wLXRyZWUtY29udGFpbmVyJyk7XG4gICAgaWYgKHRoaXMudHJlZUNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIHRoaXMudHJlZUNvbnRhaW5lckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgdGhpcy5faGFuZGxlT25Db250YWluZXJDbGljay5iaW5kKHRoaXMpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIGZ1bmN0aW9uIGdldFBhcmVudFdpdGhDbGFzcyhcbiAgICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCxcbiAgICAgIGNsYXNzTmFtZTogc3RyaW5nXG4gICAgKSB7XG4gICAgICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbkZvY3VzZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgcGFyZW50ID0gZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygncC10cmVlbm9kZS1jb250ZW50JylcbiAgICAgID8gZXZlbnQudGFyZ2V0XG4gICAgICA6IGdldFBhcmVudFdpdGhDbGFzcyhldmVudC50YXJnZXQsICdwLXRyZWVub2RlLWNvbnRlbnQnKTtcblxuICAgIGlmIChcbiAgICAgIHBhcmVudD8ucGFyZW50RWxlbWVudD8uY2xhc3NMaXN0Py5jb250YWlucyhcbiAgICAgICAgJ2Nwcy10cmVlLW5vZGUtZnVsbHktZXhwYW5kYWJsZSdcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRoaXMub25DbGlja0Z1bGx5RXhwYW5kYWJsZShldmVudCwgcGFyZW50LnBhcmVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25DaGFuZ2UgPSAoZXZlbnQ6IGFueSkgPT4ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIHRoaXMudmFsdWVDaGFuZ2VkLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgb25TZWxlY3ROb2RlKCkge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy50b2dnbGVPcHRpb25zKHRoaXMudHJlZUNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xpY2tGdWxseUV4cGFuZGFibGUoZXZlbnQ6IGFueSwgZWxlbTogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLl9nZXRIVE1MRWxlbWVudEtleShlbGVtKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJlZU5vZGUgPSB0aGlzLm9wdGlvbnMuZmluZCgobykgPT4gby5rZXkgPT09IGtleSk7XG4gICAgaWYgKCF0cmVlTm9kZSkgcmV0dXJuO1xuXG4gICAgdHJlZU5vZGUuZXhwYW5kZWQgPSAhdHJlZU5vZGUuZXhwYW5kZWQ7XG4gICAgdGhpcy5fdXBkYXRlT3B0aW9ucygpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWNhbGNWaXJ0dWFsTGlzdEhlaWdodCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SFRNTEVsZW1lbnRLZXkoZWxlbTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoIWVsZW0/LmNsYXNzTGlzdCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGNsYXNzTGlzdCA9IFsuLi5lbGVtLmNsYXNzTGlzdF07XG4gICAgY29uc3Qga2V5ID0gY2xhc3NMaXN0LmZpbmQoKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ2tleS0nKTtcbiAgICB9KTtcbiAgICBpZiAoIWtleSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBrZXkucmVwbGFjZSgna2V5LScsICcnKTtcbiAgfVxuXG4gIHRyZWVTZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbjogYW55KSB7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLnRyZWVTZWxlY3Rpb25Ub1ZhbHVlKHNlbGVjdGlvbikpO1xuICB9XG5cbiAgcmVjYWxjVmlydHVhbExpc3RIZWlnaHQoKSB7XG4gICAgaWYgKCF0aGlzLnZpcnR1YWxTY3JvbGwpIHJldHVybjtcbiAgICBjb25zdCBjdXJyZW50TGVuID0gdGhpcy50cmVlTGlzdD8uc2VyaWFsaXplZFZhbHVlPy5sZW5ndGggfHwgMDtcbiAgICB0aGlzLnZpcnR1YWxMaXN0SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICB0aGlzLnZpcnR1YWxTY3JvbGxJdGVtU2l6ZSAqIGN1cnJlbnRMZW4sXG4gICAgICAyNDBcbiAgICApO1xuICB9XG5cbiAgdG9nZ2xlT3B0aW9ucyhkZDogSFRNTEVsZW1lbnQsIHNob3c/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIWRkKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBzaG93ID09PSAnYm9vbGVhbicpIHtcbiAgICAgIGlmIChzaG93KSBkZC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgIGVsc2UgZGQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgfSBlbHNlIGRkLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpO1xuXG4gICAgdGhpcy5pc09wZW5lZCA9IGRkLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJyk7XG4gICAgdGhpcy5vcHRpb25Gb2N1c2VkID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy5pc09wZW5lZCAmJiB0aGlzLnRyZWVTZWxlY3Rpb24pIHtcbiAgICAgIHRoaXMuX2V4cGFuZFRvTm9kZXMoXG4gICAgICAgIHRoaXMubXVsdGlwbGUgPyB0aGlzLnRyZWVTZWxlY3Rpb24gOiBbdGhpcy50cmVlU2VsZWN0aW9uXVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3VwZGF0ZU9wdGlvbnMoKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjYWxjVmlydHVhbExpc3RIZWlnaHQoKTtcblxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9XG4gICAgICAgICAgdGhpcy50cmVlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtaGlnaGxpZ2h0Jyk7XG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgIHNlbGVjdGVkLnNjcm9sbEludG9WaWV3KHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAgICAgICBibG9jazogJ25lYXJlc3QnLFxuICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlydHVhbFNjcm9sbCAmJiB0aGlzLnRyZWVTZWxlY3Rpb24pIHtcbiAgICAgICAgICBsZXQga2V5ID0gJyc7XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVTZWxlY3Rpb24ubGVuZ3RoID4gMCkga2V5ID0gdGhpcy50cmVlU2VsZWN0aW9uWzBdLmtleTtcbiAgICAgICAgICB9IGVsc2Uga2V5ID0gdGhpcy50cmVlU2VsZWN0aW9uLmtleTtcbiAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPVxuICAgICAgICAgICAgICB0aGlzLnRyZWVMaXN0Py5zZXJpYWxpemVkVmFsdWU/LmZpbmRJbmRleChcbiAgICAgICAgICAgICAgICAodikgPT4gdi5ub2RlLmtleSA9PT0ga2V5XG4gICAgICAgICAgICAgICkgfHwgLTE7XG4gICAgICAgICAgICBpZiAoaWR4ID49IDApIHRoaXMudHJlZUxpc3Quc2Nyb2xsVG9WaXJ0dWFsSW5kZXgoaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZShvcHRpb246IFRyZWVOb2RlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSByZXR1cm47XG5cbiAgICB0aGlzLnRyZWVTZWxlY3Rpb24gPSB0aGlzLnRyZWVTZWxlY3Rpb24uZmlsdGVyKFxuICAgICAgKHY6IFRyZWVOb2RlKSA9PiAhaXNFcXVhbCh2LCBvcHRpb24pXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMudHJlZVNlbGVjdGlvblRvVmFsdWUodGhpcy50cmVlU2VsZWN0aW9uKSk7XG4gIH1cblxuICBpbml0QXJyb3dzTmF2aWdhdG9uKCkge1xuICAgIGlmICghdGhpcy5pc09wZW5lZCkgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLm9wdGlvbkZvY3VzZWQpIHtcbiAgICAgIGNvbnN0IGZpcnN0RWxlbSA9IHRoaXMudHJlZUNvbnRhaW5lckVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICcucC10cmVlbm9kZS1jb250ZW50J1xuICAgICAgKTtcbiAgICAgIGlmIChmaXJzdEVsZW0pIChmaXJzdEVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB0aGlzLm9wdGlvbkZvY3VzZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKGRkOiBIVE1MRWxlbWVudCwgZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgaWYgKFxuICAgICAgKCF0aGlzLm11bHRpcGxlICYmIHRoaXMudHJlZVNlbGVjdGlvbikgfHxcbiAgICAgICh0aGlzLm11bHRpcGxlICYmIHRoaXMudHJlZVNlbGVjdGlvbj8ubGVuZ3RoID4gMClcbiAgICApIHtcbiAgICAgIGlmICh0aGlzLm9wZW5PbkNsZWFyKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlT3B0aW9ucyhkZCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLm11bHRpcGxlID8gW10gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnRyZWVTZWxlY3Rpb24gPSB2YWw7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHZhbCk7XG4gICAgfVxuICAgIHRoaXMub3B0aW9uRm9jdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tFcnJvcnMoKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5jb250cm9sPy5lcnJvcnM7XG5cbiAgICBpZiAoIXRoaXMuY29udHJvbD8uY29udHJvbD8udG91Y2hlZCB8fCAhZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9yID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCdyZXF1aXJlZCcgaW4gZXJyb3JzKSB7XG4gICAgICB0aGlzLmVycm9yID0gJ0ZpZWxkIGlzIHJlcXVpcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJBcnIgPSBPYmplY3QudmFsdWVzKGVycm9ycyk7XG4gICAgaWYgKGVyckFyci5sZW5ndGggPCAxKSB7XG4gICAgICB0aGlzLmVycm9yID0gJyc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJBcnIuZmluZCgobXNnKSA9PiB0eXBlb2YgbXNnID09PSAnc3RyaW5nJyk7XG4gICAgY29uc29sZS5sb2coJ21lc3NhZ2UnLCBtZXNzYWdlKTtcbiAgICB0aGlzLmVycm9yID0gbWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcic7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pIHt9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMuY29udHJvbD8uY29udHJvbD8ubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuX2NoZWNrRXJyb3JzKCk7XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICB0aGlzLnRyZWVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgdGhpcy50b2dnbGVPcHRpb25zKHRoaXMudHJlZUNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIF9leHBhbmRUb05vZGVzKG5vZGVzOiBhbnlbXSkge1xuICAgIGZ1bmN0aW9uIGdldFBhcmVudEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICBjb25zdCBsYXN0U2VwYXJhdG9ySW5kZXggPSBrZXkubGFzdEluZGV4T2YoJy0nKTtcbiAgICAgIGlmIChsYXN0U2VwYXJhdG9ySW5kZXggIT09IC0xKSB7XG4gICAgICAgIHJldHVybiBrZXkuc3Vic3RyaW5nKDAsIGxhc3RTZXBhcmF0b3JJbmRleCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgY29uc3QgcGFyZW50Tm9kZUtleSA9IGdldFBhcmVudEtleShub2RlLmtleSk7XG4gICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5vcHRpb25zTWFwLmdldChwYXJlbnROb2RlS2V5KSB8fCBudWxsO1xuXG4gICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICBwYXJlbnROb2RlLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fZXhwYW5kVG9Ob2RlcyhbcGFyZW50Tm9kZV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdG9Jbm5lck9wdGlvbnMoX29wdGlvbnM6IGFueVtdKTogVHJlZU5vZGVbXSB7XG4gICAgZnVuY3Rpb24gbWFwT3B0aW9uKFxuICAgICAgbzogYW55LFxuICAgICAgb3B0aW9uTGFiZWw6IHN0cmluZyxcbiAgICAgIG9wdGlvbkluZm86IHN0cmluZyxcbiAgICAgIGtleTogc3RyaW5nLFxuICAgICAgb3JpZ2luYWxPcHRpb25zTWFwOiBhbnlcbiAgICApIHtcbiAgICAgIGNvbnN0IGlubmVyID0ge1xuICAgICAgICBpbm5lcjogdHJ1ZSxcbiAgICAgICAgbGFiZWw6IG9bb3B0aW9uTGFiZWxdLFxuICAgICAgICBpbmZvOiBvW29wdGlvbkluZm9dLFxuICAgICAgICBrZXksXG4gICAgICAgIHN0eWxlQ2xhc3M6ICdrZXktJyArIGtleVxuICAgICAgfSBhcyBUcmVlTm9kZTtcbiAgICAgIGlmIChvLmlzRGlyZWN0b3J5KSB7XG4gICAgICAgIGlubmVyLnR5cGUgPSAnZGlyZWN0b3J5JztcbiAgICAgICAgaW5uZXIuc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICBpbm5lci5zdHlsZUNsYXNzICs9ICcgY3BzLXRyZWUtbm9kZS1mdWxseS1leHBhbmRhYmxlJztcbiAgICAgIH1cbiAgICAgIGlmIChvLmNoaWxkcmVuKSB7XG4gICAgICAgIGlubmVyLmNoaWxkcmVuID0gby5jaGlsZHJlbi5tYXAoKGM6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBtYXBPcHRpb24oXG4gICAgICAgICAgICBjLFxuICAgICAgICAgICAgb3B0aW9uTGFiZWwsXG4gICAgICAgICAgICBvcHRpb25JbmZvLFxuICAgICAgICAgICAga2V5ICsgJy0nICsgaW5kZXgsXG4gICAgICAgICAgICBvcmlnaW5hbE9wdGlvbnNNYXBcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsT3B0aW9uc01hcC5zZXQoa2V5LCBvKTtcbiAgICAgIHJldHVybiBpbm5lcjtcbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBfb3B0aW9ucy5tYXAoKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBtYXBPcHRpb24oXG4gICAgICAgIG9wdGlvbixcbiAgICAgICAgdGhpcy5vcHRpb25MYWJlbCxcbiAgICAgICAgdGhpcy5vcHRpb25JbmZvLFxuICAgICAgICAnJyArIGluZGV4LFxuICAgICAgICB0aGlzLm9yaWdpbmFsT3B0aW9uc01hcFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRoaXMub3B0aW9uc01hcCA9IHRoaXMuX2J1aWxkT3B0aW9uc01hcChyZXMpO1xuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkT3B0aW9uc01hcChvcHRpb25zOiBhbnlbXSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgIG5vZGVNYXAuc2V0KG9wdGlvbi5rZXksIG9wdGlvbik7XG4gICAgICBpZiAob3B0aW9uLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZU1hcCA9IHRoaXMuX2J1aWxkT3B0aW9uc01hcChvcHRpb24uY2hpbGRyZW4pO1xuICAgICAgICBjaGlsZE5vZGVNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gbm9kZU1hcC5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbm9kZU1hcDtcbiAgfVxuXG4gIHRyZWVTZWxlY3Rpb25Ub1ZhbHVlKHNlbGVjdGlvbjogYW55KSB7XG4gICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiB0aGlzLm11bHRpcGxlID8gW10gOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBzZWxlY3Rpb24ubWFwKChzOiBhbnkpID0+IHRoaXMub3JpZ2luYWxPcHRpb25zTWFwLmdldChzLmtleSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbE9wdGlvbnNNYXAuZ2V0KHNlbGVjdGlvbi5rZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3ZhbHVlVG9UcmVlU2VsZWN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICBmdW5jdGlvbiBnZXRLZXkodjogYW55LCBtYXA6IE1hcDxzdHJpbmcsIGFueT4pOiBzdHJpbmcge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIG1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGlzRXF1YWwodiwgdmFsKSkge1xuICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IFtdIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIGNvbnN0IHJlcyA9IFtdIGFzIFRyZWVOb2RlW107XG4gICAgICB2YWx1ZS5mb3JFYWNoKCh2OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0S2V5KHYsIHRoaXMub3JpZ2luYWxPcHRpb25zTWFwKTtcbiAgICAgICAgaWYgKGtleSkgcmVzLnB1c2godGhpcy5vcHRpb25zTWFwLmdldChrZXkpIGFzIFRyZWVOb2RlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0S2V5KHZhbHVlLCB0aGlzLm9yaWdpbmFsT3B0aW9uc01hcCk7XG4gICAgICByZXR1cm4ga2V5ID8gdGhpcy5vcHRpb25zTWFwLmdldChrZXkpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMgaXMgYSBmaXggb2YgcHJpbWVuZyBjaGFuZ2UgZGV0ZWN0aW9uIGJ1ZyB3aGVuIHZpcnR1YWwgc2Nyb2xsZXIgaXMgZW5hYmxlZFxuICBwcml2YXRlIF91cGRhdGVPcHRpb25zKCkge1xuICAgIGlmICghdGhpcy52aXJ0dWFsU2Nyb2xsKSByZXR1cm47XG4gICAgdGhpcy5vcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XG4gIH1cbn1cbiJdfQ==