ngx-histaff-alpha 1.6.6 → 1.6.8
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/esm2022/lib/app/interfaces/IAuthData.mjs +1 -1
- package/esm2022/lib/app/libraries/core-topic-tree/core-topic-tree.component.mjs +452 -0
- package/esm2022/lib/app/services/topic-permission.service.mjs +18 -0
- package/esm2022/lib/app/services/topic-tree.service.mjs +72 -0
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/ngx-histaff-alpha.mjs +515 -2
- package/fesm2022/ngx-histaff-alpha.mjs.map +1 -1
- package/lib/app/interfaces/IAuthData.d.ts +1 -0
- package/lib/app/libraries/core-topic-tree/core-topic-tree.component.d.ts +77 -0
- package/lib/app/services/topic-permission.service.d.ts +18 -0
- package/lib/app/services/topic-tree.service.d.ts +36 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUF1dGhEYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWhpc3RhZmYtYWxwaGEvc3JjL2xpYi9hcHAvaW50ZXJmYWNlcy9JQXV0aERhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IElPcmdUcmVlTGluZXJJdGVtIH0gZnJvbSBcIi4uL2xpYnJhcmllcy9jb3JlLW9yZy10cmVlL2NvcmUtb3JnLXRyZWUvSU9yZ1RyZWVJdGVtXCI7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElQZXJtaXNzaW9uQWN0aW9uIHtcclxuXHJcbiAgICAvLyBUSEUgQ09SRSBUV09cclxuICAgIGZ1bmN0aW9uSWQ6IG51bWJlcjtcclxuICAgIGFsbG93ZWRBY3Rpb25JZHM6IG51bWJlcltdO1xyXG5cclxuICAgIC8vIFRIRSBPVEhFUlNcclxuICAgIG1vZHVsZUNvZGU6IHN0cmluZztcclxuICAgIGZ1bmN0aW9uQ29kZTogc3RyaW5nO1xyXG4gICAgZnVuY3Rpb25Vcmw6IHN0cmluZztcclxuICAgIGFsbG93ZWRBY3Rpb25Db2Rlczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhEYXRhIHtcclxuICAgIGF2YXRhcjogc3RyaW5nO1xyXG4gICAgZW1wbG95ZWVJZD86IG51bWJlcjtcclxuICAgIGZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgaXNBZG1pbjogYm9vbGVhbjtcclxuICAgIGlzUm9vdDogYm9vbGVhbjtcclxuICAgIGlzTG9vazogYm9vbGVhbjtcclxuICAgIGlzRmlyc3RMb2dpbjogYW55O1xyXG4gICAgcGVybWlzc2lvblBhcmFtczogYW55O1xyXG4gICAgcmVmcmVzaFRva2VuOiBhbnk7XHJcbiAgICB0ZW5hbnRJZDogbnVtYmVyO1xyXG4gICAgdG9rZW46IHN0cmluZztcclxuICAgIHVzZXJOYW1lOiBzdHJpbmc7XHJcbiAgICBncm91cElkPzogbnVtYmVyLCBcclxuICAgIGxvZ2luVGltZTogbnVtYmVyO1xyXG4gICAgb3JnSWRzOiBJT3JnVHJlZUxpbmVySXRlbVtdO1xyXG4gICAgb3JnUGVybWlzc2lvbkNoYW5nZUZsYWckOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XHJcbiAgICBwZXJtaXNzaW9uQWN0aW9uczogSVBlcm1pc3Npb25BY3Rpb25bXTtcclxufSJdfQ==
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output, ViewChild, isDevMode } from '@angular/core';
|
|
2
|
+
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { CoreLoadingSurfaceComponent } from '../core-loading-surface/core-loading-surface/core-loading-surface.component';
|
|
4
|
+
import { CoreReducerIconComponent } from '../core-reducer-icon/core-reducer-icon/core-reducer-icon.component';
|
|
5
|
+
import { TranslatePipe } from '../../app-pipes/translate.pipe';
|
|
6
|
+
import { TooltipDirective } from '../tooltip/tooltip.directive';
|
|
7
|
+
import { CoreFormControlBaseComponent } from '../core-form-control-base/core-form-control-base.component';
|
|
8
|
+
import { BehaviorSubject, Subject, debounceTime, distinctUntilChanged, filter, switchMap } from 'rxjs';
|
|
9
|
+
import { CommonModule, NgTemplateOutlet } from '@angular/common';
|
|
10
|
+
import { EnumTranslateKey } from 'alpha-global-constants';
|
|
11
|
+
import { liner_to_nested_array_script } from '../../../assets/js/rescusive_wk';
|
|
12
|
+
import { CoreCheckboxComponent } from '../core-checkbox/core-checkbox/core-checkbox.component';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "../../services/auth.service";
|
|
15
|
+
import * as i2 from "../services/recursive.service";
|
|
16
|
+
import * as i3 from "../../services/multi-language.service";
|
|
17
|
+
import * as i4 from "../../services/layout.service";
|
|
18
|
+
import * as i5 from "../../services/topic-tree.service";
|
|
19
|
+
import * as i6 from "../alert/alert.service";
|
|
20
|
+
import * as i7 from "@angular/common";
|
|
21
|
+
import * as i8 from "@angular/forms";
|
|
22
|
+
export var EnumCoreArticleCategoryTreeaAccessorMode;
|
|
23
|
+
(function (EnumCoreArticleCategoryTreeaAccessorMode) {
|
|
24
|
+
EnumCoreArticleCategoryTreeaAccessorMode["ACTIVATED_SINGLE"] = "ACTIVATED_SINGLE";
|
|
25
|
+
EnumCoreArticleCategoryTreeaAccessorMode["ACTIVATED_INHERITANCE"] = "ACTIVATED_INHERITANCE";
|
|
26
|
+
EnumCoreArticleCategoryTreeaAccessorMode["CHECKED"] = "CHECKED";
|
|
27
|
+
})(EnumCoreArticleCategoryTreeaAccessorMode || (EnumCoreArticleCategoryTreeaAccessorMode = {}));
|
|
28
|
+
export class CoreTopicTreeComponent extends CoreFormControlBaseComponent {
|
|
29
|
+
writeValue(obj) {
|
|
30
|
+
this.value = obj;
|
|
31
|
+
switch (this.accessorMode) {
|
|
32
|
+
case EnumCoreArticleCategoryTreeaAccessorMode.CHECKED:
|
|
33
|
+
if (!!obj) {
|
|
34
|
+
const checkedKeys = [];
|
|
35
|
+
this.checkedIds = obj; // <=== 24/10/2023
|
|
36
|
+
obj.map(x => checkedKeys.push(x.toString()));
|
|
37
|
+
this.loading = true;
|
|
38
|
+
this.recursiveService.writeValueChecked(checkedKeys, this.data, this.disabledLoopExpand).subscribe(_ => {
|
|
39
|
+
this.loading = false;
|
|
40
|
+
if (!!this.data && !!this.data?.length)
|
|
41
|
+
this.data[0].tree$Expanded = true;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
break;
|
|
45
|
+
case EnumCoreArticleCategoryTreeaAccessorMode.ACTIVATED_SINGLE:
|
|
46
|
+
case EnumCoreArticleCategoryTreeaAccessorMode.ACTIVATED_INHERITANCE:
|
|
47
|
+
if (!!obj) {
|
|
48
|
+
const activatedKeys = [];
|
|
49
|
+
obj.map(x => activatedKeys.push(x.toString()));
|
|
50
|
+
this.loading = true;
|
|
51
|
+
this.recursiveService.writeValueActivated(activatedKeys, this.data, this.disabledLoopExpand).subscribe(_ => {
|
|
52
|
+
this.loading = false;
|
|
53
|
+
if (!!this.data && !!this.data?.length)
|
|
54
|
+
this.data[0].tree$Expanded = true;
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
if (this.accessorMode === EnumCoreArticleCategoryTreeaAccessorMode.CHECKED) {
|
|
62
|
+
}
|
|
63
|
+
else /* EnumCoreOrgTreeaAccessorMode.ACTIVATED_SINGLE or EnumCoreOrgTreeaAccessorMode.ACTIVATED_INHERITANCE */ {
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setDisabledState(disabled) {
|
|
67
|
+
this.disabled = disabled;
|
|
68
|
+
}
|
|
69
|
+
constructor(
|
|
70
|
+
//public override injector: Injector,
|
|
71
|
+
authService, recursiveService, mls, layoutService, topicTreeService, alertService) {
|
|
72
|
+
super( /*injector*/);
|
|
73
|
+
this.authService = authService;
|
|
74
|
+
this.recursiveService = recursiveService;
|
|
75
|
+
this.mls = mls;
|
|
76
|
+
this.layoutService = layoutService;
|
|
77
|
+
this.topicTreeService = topicTreeService;
|
|
78
|
+
this.alertService = alertService;
|
|
79
|
+
this.lineColor = 'transparent';
|
|
80
|
+
this.itemDoubleClick = new EventEmitter();
|
|
81
|
+
this.itemClick = new EventEmitter();
|
|
82
|
+
this.activeIds = [];
|
|
83
|
+
this.checkedIds = [];
|
|
84
|
+
this.subscriptions = [];
|
|
85
|
+
this.search$ = new Subject();
|
|
86
|
+
this.searchPlaceholder = EnumTranslateKey.UI_COMMON_PLACE_HOLDER_SEARCH_HERE;
|
|
87
|
+
this.checkInheritance = true; // default value is true
|
|
88
|
+
this.showDissolved = true; // default value is false
|
|
89
|
+
this.initializing = true;
|
|
90
|
+
// this.reduced$ = this.coreOrgTreeState.coreOrgTreeReduced$;
|
|
91
|
+
this.initializing = false;
|
|
92
|
+
}
|
|
93
|
+
ngOnChanges(changes) {
|
|
94
|
+
if (changes['height']) {
|
|
95
|
+
this.resizeHeight();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
ngOnInit() {
|
|
99
|
+
this.instanceNumber = new Date().getTime();
|
|
100
|
+
const newInstance = {
|
|
101
|
+
instanceNumber: this.instanceNumber,
|
|
102
|
+
selectedKey$: new BehaviorSubject(undefined),
|
|
103
|
+
activeKeys$: new BehaviorSubject([]),
|
|
104
|
+
checkedKeys$: new BehaviorSubject([]),
|
|
105
|
+
expandedKeys$: new BehaviorSubject([]),
|
|
106
|
+
checkInheritance$: new BehaviorSubject(true)
|
|
107
|
+
};
|
|
108
|
+
this.topicTreeService.instances.push(newInstance);
|
|
109
|
+
// Check xem chiều cao height có được truyền vào hay không
|
|
110
|
+
if (this.height === undefined) {
|
|
111
|
+
if (isDevMode()) {
|
|
112
|
+
//this.alertService.warn("CoreOrgTree không nhận được chiều cao (height) truyền vào từ lớp ngoài. Chiều cao mặc định sẽ được tính toán dựa vào bố cục chính.", alertOptions);
|
|
113
|
+
}
|
|
114
|
+
this.subscriptions.push(this.layoutService.contentContainerHeight$.subscribe(x => {
|
|
115
|
+
// basicSpacing là paddingBottom của lớp content-container
|
|
116
|
+
this.height = x - this.layoutService.corePageHeaderHeight - this.layoutService.basicSpacing;
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
this.subscriptions.push(this.topicTreeService.linearData$.subscribe((x) => {
|
|
120
|
+
this.linearArticleCategoryArray = x;
|
|
121
|
+
}));
|
|
122
|
+
this.subscriptions.push(this.topicTreeService.status$.subscribe((x) => {
|
|
123
|
+
console.log("this.TopicTreeService.status$ changes", x);
|
|
124
|
+
const newActiveIds = [];
|
|
125
|
+
x.activeKeys.map((k) => {
|
|
126
|
+
newActiveIds.push(Number(k));
|
|
127
|
+
});
|
|
128
|
+
this.activeIds = newActiveIds;
|
|
129
|
+
if (this.accessorMode !== EnumCoreArticleCategoryTreeaAccessorMode.CHECKED) {
|
|
130
|
+
this.value = this.activeIds;
|
|
131
|
+
this.onChange(this.activeIds);
|
|
132
|
+
}
|
|
133
|
+
this.selectedKey = x.selectedKey;
|
|
134
|
+
}));
|
|
135
|
+
this.subscriptions.push(this.search$
|
|
136
|
+
.pipe(filter((x) => x !== null), debounceTime(500), distinctUntilChanged(), switchMap((text) => {
|
|
137
|
+
console.log('switchMap works');
|
|
138
|
+
this.loading = true;
|
|
139
|
+
return this.recursiveService.findItem(text, this.data);
|
|
140
|
+
}))
|
|
141
|
+
.subscribe((x) => {
|
|
142
|
+
this.loading = false;
|
|
143
|
+
}));
|
|
144
|
+
this.subscriptions.push(this.topicTreeService.status$
|
|
145
|
+
.pipe(filter((value) => !!!this.initializing && !!value))
|
|
146
|
+
.subscribe((x) => {
|
|
147
|
+
if (!!localStorage) {
|
|
148
|
+
localStorage.setItem('coreOrgTreeStatus', JSON.stringify(x));
|
|
149
|
+
}
|
|
150
|
+
}));
|
|
151
|
+
this.subscriptions.push(this.mls.lang$.subscribe((x) => (this.lang = x)));
|
|
152
|
+
}
|
|
153
|
+
resizeHeight() {
|
|
154
|
+
// height is not given and the tree resize as standard
|
|
155
|
+
if (!!!this.height) {
|
|
156
|
+
const sizeHeaderHeight = Number(getComputedStyle(document.documentElement)
|
|
157
|
+
.getPropertyValue('--size-header-height')
|
|
158
|
+
.replace('px', ''));
|
|
159
|
+
const sizeCorePageHeaderHeight = Number(getComputedStyle(document.documentElement)
|
|
160
|
+
.getPropertyValue('--size-core-page-header-height')
|
|
161
|
+
.replace('px', ''));
|
|
162
|
+
const containerHeight = window.innerHeight - sizeHeaderHeight - sizeCorePageHeaderHeight;
|
|
163
|
+
const pageHeaderHeight = Number(getComputedStyle(document.documentElement)
|
|
164
|
+
.getPropertyValue('--size-core-page-header-height')
|
|
165
|
+
.replace('px', ''));
|
|
166
|
+
const paginationHeight = Number(getComputedStyle(document.documentElement)
|
|
167
|
+
.getPropertyValue('--size-core-pagination-height')
|
|
168
|
+
.replace('px', ''));
|
|
169
|
+
const sizeMarginCorePaginationFull = Number(getComputedStyle(document.documentElement)
|
|
170
|
+
.getPropertyValue('--size-margin-core-pagination')
|
|
171
|
+
.replace('px', ''));
|
|
172
|
+
const height = containerHeight - pageHeaderHeight - paginationHeight + sizeMarginCorePaginationFull;
|
|
173
|
+
console.log(height);
|
|
174
|
+
this.container?.nativeElement.style.setProperty('--height', height + 'px');
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
this.container?.nativeElement.style.setProperty('--height', this.height + 'px');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
ngAfterViewInit() {
|
|
181
|
+
setTimeout(() => {
|
|
182
|
+
this.subscriptions.push(this.topicTreeService.articleCategoryTreeData$.subscribe((x) => {
|
|
183
|
+
this.data = x;
|
|
184
|
+
console.log("new Data coming", this.data, new Date().getTime());
|
|
185
|
+
if (!!this.data) {
|
|
186
|
+
if (!!this.data.length)
|
|
187
|
+
this.data[0].tree$Expanded = true;
|
|
188
|
+
}
|
|
189
|
+
}));
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
onItemClickLocal(e) {
|
|
193
|
+
this.linearArticleCategoryArray.map((x) => (x.active = false));
|
|
194
|
+
setTimeout(() => this.buildTreeData());
|
|
195
|
+
}
|
|
196
|
+
onToggleItem(e) {
|
|
197
|
+
const cloneCopy = JSON.parse(JSON.stringify(this.linearArticleCategoryArray));
|
|
198
|
+
const filter = cloneCopy.filter((x) => x.id === e.id);
|
|
199
|
+
if (filter.length === 1) {
|
|
200
|
+
filter[0].expanded = !!!e.expanded;
|
|
201
|
+
}
|
|
202
|
+
this.linearArticleCategoryArray = cloneCopy;
|
|
203
|
+
setTimeout(() => this.buildTreeData());
|
|
204
|
+
}
|
|
205
|
+
buildTreeData() {
|
|
206
|
+
this.loading = true;
|
|
207
|
+
const cloneCopy = JSON.parse(JSON.stringify(this.linearArticleCategoryArray));
|
|
208
|
+
if (typeof Worker !== 'undefined') {
|
|
209
|
+
// Create a new
|
|
210
|
+
console.log("🟢🟢 Worker works");
|
|
211
|
+
const worker = new Worker(liner_to_nested_array_script);
|
|
212
|
+
worker.addEventListener('message', ({ data }) => {
|
|
213
|
+
this.data = data.list;
|
|
214
|
+
if (!!this.data && !!this.data?.length)
|
|
215
|
+
this.data[0].tree$Expanded = true;
|
|
216
|
+
this.loading = false;
|
|
217
|
+
});
|
|
218
|
+
worker.postMessage({
|
|
219
|
+
list: cloneCopy,
|
|
220
|
+
keyField: 'id',
|
|
221
|
+
titleField: 'name',
|
|
222
|
+
parentField: 'parentId',
|
|
223
|
+
activeField: 'active',
|
|
224
|
+
//inheritantActiveField: 'inheritantActive',
|
|
225
|
+
checkedField: 'checked',
|
|
226
|
+
expandedField: 'expand',
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// Web workers are not supported in this environment.
|
|
231
|
+
// You should add a fallback so that your program still executes correctly.
|
|
232
|
+
const status = this.topicTreeService.status$.value;
|
|
233
|
+
this.subscriptions.push(this.recursiveService
|
|
234
|
+
.linerArrayToNestedArray(cloneCopy, 'id', 'name', 'parentId', 'active', 'checked', 'expand')
|
|
235
|
+
.subscribe((obj) => {
|
|
236
|
+
this.data = obj.list;
|
|
237
|
+
if (!!this.data && !!this.data?.length)
|
|
238
|
+
this.data[0].tree$Expanded = true;
|
|
239
|
+
this.loading = false;
|
|
240
|
+
}));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
onExpandTogglerClick(e, event) {
|
|
244
|
+
event.stopPropagation();
|
|
245
|
+
const newValue = !e.tree$Expanded;
|
|
246
|
+
e.tree$Expanded = newValue;
|
|
247
|
+
// updating status with newValue
|
|
248
|
+
const currentExpandedIds = this.topicTreeService.status$.value?.expandedKeys;
|
|
249
|
+
let newExpandedIds = currentExpandedIds?.filter((_) => !!!currentExpandedIds.includes(e.id.toString()));
|
|
250
|
+
if (newValue) {
|
|
251
|
+
newExpandedIds?.push(e.id.toString());
|
|
252
|
+
}
|
|
253
|
+
newExpandedIds?.sort();
|
|
254
|
+
const newExpandedKeys = [];
|
|
255
|
+
newExpandedIds.map((x) => newExpandedKeys.push(x.toString()));
|
|
256
|
+
this.topicTreeService.status$.next({
|
|
257
|
+
...this.topicTreeService.status$.value,
|
|
258
|
+
expandedKeys: newExpandedKeys,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
onItemCheck(e, newValue) {
|
|
262
|
+
this.itemClick?.emit(e);
|
|
263
|
+
if (this.accessorMode !== EnumCoreArticleCategoryTreeaAccessorMode.CHECKED)
|
|
264
|
+
return;
|
|
265
|
+
// We have this var to hold nodes that are being changed
|
|
266
|
+
let toggledIds;
|
|
267
|
+
// We should calculate a new state into this var:
|
|
268
|
+
const newCheckedIds = JSON.parse(JSON.stringify(this.checkedIds));
|
|
269
|
+
// We will call this function after toggledIds changed
|
|
270
|
+
const changeValue = () => {
|
|
271
|
+
// If newValue === true, we will disctintly push changed ids to the state
|
|
272
|
+
// Otherwise we will remove them from the state
|
|
273
|
+
if (!!newValue) {
|
|
274
|
+
toggledIds.map(x => {
|
|
275
|
+
if (!!!newCheckedIds.includes(x)) {
|
|
276
|
+
newCheckedIds.push(x);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
// Then asign the state to the newCheckedIds
|
|
280
|
+
this.checkedIds = newCheckedIds;
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
const filter = newCheckedIds.filter(x => !!!toggledIds.includes(x));
|
|
284
|
+
// Then asign the state to the filter
|
|
285
|
+
this.checkedIds = filter;
|
|
286
|
+
}
|
|
287
|
+
// After the cases of if/else, make the control change with onChange
|
|
288
|
+
this.value = this.checkedIds;
|
|
289
|
+
this.onChange(this.checkedIds);
|
|
290
|
+
this.markAsTouched();
|
|
291
|
+
};
|
|
292
|
+
/* start: THIS CODE SCOPE calculates toggledIds */
|
|
293
|
+
if (this.checkInheritance) {
|
|
294
|
+
// If true, all the nested items will be checked/unchecked
|
|
295
|
+
this.recursiveService
|
|
296
|
+
.nestedToggleCheck(e, newValue)
|
|
297
|
+
.then((x) => {
|
|
298
|
+
// The ids have been changed
|
|
299
|
+
toggledIds = x;
|
|
300
|
+
// Now toggledIds were set. We call the function we declared
|
|
301
|
+
changeValue();
|
|
302
|
+
})
|
|
303
|
+
.catch((x) => {
|
|
304
|
+
console.error(x);
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
// Otherwise we simply toggle check for current item only
|
|
309
|
+
toggledIds = [e.id];
|
|
310
|
+
// Now toggledIds were set. We call the function we declared
|
|
311
|
+
changeValue();
|
|
312
|
+
}
|
|
313
|
+
/* end: THIS CODE SCOPE calculates toggledIds */
|
|
314
|
+
// That is. Happy debugging!
|
|
315
|
+
}
|
|
316
|
+
onCheckIncludeDissolvedChange(value) {
|
|
317
|
+
console.log("onCheckIncludeDissolvedChange", value);
|
|
318
|
+
}
|
|
319
|
+
onCheckInheritanceChange(value) {
|
|
320
|
+
this.topicTreeService.status$.next({
|
|
321
|
+
...this.topicTreeService.status$.value,
|
|
322
|
+
checkInheritance: value,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
onObjectClick(e, event) {
|
|
326
|
+
// remove highlight class
|
|
327
|
+
// TO DO
|
|
328
|
+
if (!!e.protected)
|
|
329
|
+
return;
|
|
330
|
+
this.itemClick?.emit(e);
|
|
331
|
+
if (this.accessorMode === EnumCoreArticleCategoryTreeaAccessorMode.CHECKED)
|
|
332
|
+
return;
|
|
333
|
+
let activeIds = [];
|
|
334
|
+
this.recursiveService.nestedResetActive(this.data, false).then(falseAll => {
|
|
335
|
+
console.log("falseAll", falseAll);
|
|
336
|
+
if (this.accessorMode ===
|
|
337
|
+
EnumCoreArticleCategoryTreeaAccessorMode.ACTIVATED_INHERITANCE || !this.accessorMode) {
|
|
338
|
+
// If true, all the nested items will be active, the others are inactive
|
|
339
|
+
this.recursiveService
|
|
340
|
+
.nestedResetActive(e, true)
|
|
341
|
+
.then((x) => {
|
|
342
|
+
activeIds = x;
|
|
343
|
+
activeIds.sort();
|
|
344
|
+
const newActiveKeys = [];
|
|
345
|
+
activeIds.map((x) => newActiveKeys.push(x.toString()));
|
|
346
|
+
this.topicTreeService.status$.next({
|
|
347
|
+
...this.topicTreeService.status$.value,
|
|
348
|
+
activeKeys: newActiveKeys,
|
|
349
|
+
selectedKey: e.id.toString()
|
|
350
|
+
});
|
|
351
|
+
this.activeIds = activeIds;
|
|
352
|
+
console.log(this.activeIds);
|
|
353
|
+
this.onChange(activeIds);
|
|
354
|
+
})
|
|
355
|
+
.catch((x) => {
|
|
356
|
+
console.error(x);
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
// ACTIVATED_SINGLE
|
|
361
|
+
// Otherwise we simply set current item to be active only
|
|
362
|
+
activeIds = [e.id];
|
|
363
|
+
this.activeIds = activeIds;
|
|
364
|
+
this.topicTreeService.status$.next({
|
|
365
|
+
...this.topicTreeService.status$.value,
|
|
366
|
+
activeKeys: [e.id.toString()],
|
|
367
|
+
selectedKey: e.id.toString(),
|
|
368
|
+
});
|
|
369
|
+
this.onChange(activeIds);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
const { detail } = event;
|
|
373
|
+
if (detail === 2) {
|
|
374
|
+
console.log('This was a dblclick');
|
|
375
|
+
this.itemDoubleClick.emit(e);
|
|
376
|
+
}
|
|
377
|
+
this.selectedItem = e;
|
|
378
|
+
}
|
|
379
|
+
onSearchChange(text) {
|
|
380
|
+
this.search$.next(text);
|
|
381
|
+
}
|
|
382
|
+
ngAfterContentInit() {
|
|
383
|
+
console.log("ngAfterContentInit");
|
|
384
|
+
}
|
|
385
|
+
ngOnDestroy() {
|
|
386
|
+
this.subscriptions.map((x) => x?.unsubscribe());
|
|
387
|
+
if (!!this.instanceNumber) {
|
|
388
|
+
const tryToFind = this.topicTreeService.instances.filter((x) => x.instanceNumber === this.instanceNumber);
|
|
389
|
+
if (!!tryToFind.length) {
|
|
390
|
+
const newInstances = this.topicTreeService.instances.filter((x) => x.instanceNumber !== this.instanceNumber);
|
|
391
|
+
this.topicTreeService.instances = newInstances;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreTopicTreeComponent, deps: [{ token: i1.AuthService }, { token: i2.RecursiveService }, { token: i3.MultiLanguageService }, { token: i4.LayoutService }, { token: i5.TopicTreeService }, { token: i6.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
396
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.3", type: CoreTopicTreeComponent, isStandalone: true, selector: "core-topic-tree", inputs: { lineColor: "lineColor", fullWidthMode: "fullWidthMode", accessorMode: "accessorMode", fullRendering: "fullRendering", height: "height", disabledLoopExpand: "disabledLoopExpand", showCheckInheritance: "showCheckInheritance", inlineExtraTemplateRef: "inlineExtraTemplateRef" }, outputs: { itemDoubleClick: "itemDoubleClick", itemClick: "itemClick" }, providers: [
|
|
397
|
+
{
|
|
398
|
+
provide: NG_VALUE_ACCESSOR,
|
|
399
|
+
multi: true,
|
|
400
|
+
useExisting: CoreTopicTreeComponent,
|
|
401
|
+
},
|
|
402
|
+
], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "displayContent", first: true, predicate: ["displayContent"], descendants: true }, { propertyName: "reducedIconWrapper", first: true, predicate: ["reducedIconWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div #container class=\"core-topic-tree-container\" [class.full-width]=\"!!fullWidthMode\" *ngIf=\"!!data\"\n [ngStyle]=\"{\n position : 'relative',\n width: '100%',\n height: height + 'px'\n }\">\n <div #displayContent class=\"custom-org-tree\">\n <div class=\"core-org-tree-header d-flex-between\">\n <div>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchPlaceholder | translate: lang\" [class.full-width]=\"!!fullWidthMode\">\n </div>\n </div>\n\n <ng-container>\n\n <div class=\"scroll-container\" [ngStyle]=\"{\n height: height - layoutService.coreOrgTreeTopHeight - layoutService.coreOrgTreeBottomHeight + 'px'\n }\">\n <core-loading-surface [loading]=\"loading\" [height]=\"scrollContainerHeight\"></core-loading-surface>\n @for (root of data; track $index) {\n <ul class=\"root\" [class.collapsed]=\"!!!root.tree$Expanded\">\n <ng-container *ngTemplateOutlet=\"item; context: { context: root }\"></ng-container>\n </ul>\n }\n </div>\n\n\n <div [ngStyle]=\"{\n display: 'block',\n position: 'absolute',\n bottom: '0px',\n left: '0px',\n right: '0px',\n height: layoutService.corePaginationHeight + 'px',\n paddingLeft: layoutService.basicSpacing + 'px',\n paddingRight: layoutService.basicSpacing + 'px',\n lineHeight: layoutService.corePaginationHeight + 'px',\n overflow: 'hidden'\n }\">\n <div [ngStyle]=\"{\n height: layoutService.corePaginationHeight + 'px',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\">\n <!-- <div>\n <core-checkbox [(ngModel)]=\"showDissolved\"\n (ngModelChange)=\"onCheckIncludeDissolvedChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS_ABBREVIATED'\"\n [tooltip]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS'\" tooltipPosition=\"above\"></core-checkbox>\n </div> -->\n <div class=\"check-inheritance-wrapper\" *ngIf=\"accessorMode === 'CHECKED'\">\n <core-checkbox *ngIf=\"showCheckInheritance\" [(ngModel)]=\"checkInheritance\"\n (ngModelChange)=\"onCheckInheritanceChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.CHECK_INHERITANCE'\"></core-checkbox>\n </div>\n </div>\n </div>\n\n <ng-template #item let-context=\"context\" let-id=\"context.id\" let-title=\"context.tree$Title\"\n let-highlighted=\"context.tree$Highlighted\" let-hasChildren=\"context.tree$HasChildren\"\n let-hasActiveChildren=\"context.tree$HasActiveChildren\" let-children=\"context.tree$Children\"\n let-expanded=\"context.tree$Expanded\" let-isActive=\"context.isActive\" let-active=\"context.tree$Active\"\n let-checked=\"context.tree$Checked\" let-protected=\"context.protected\">\n\n @if ((!showDissolved && !!isActive) || (!!showDissolved)) {\n <li [class.has-children]=\"!!hasChildren\" [class.collapsed]=\"!!hasChildren && !!!expanded\">\n <span (click)=\"onObjectClick(context, $event)\">\n @if ((!!showDissolved && !!hasChildren) || (!showDissolved && !!hasActiveChildren)) {\n <i class=\"expand-toggler feather-chevron-down\"\n (click)=\"onExpandTogglerClick(context, $event)\"></i>\n }\n @if (accessorMode === 'CHECKED' && !!!protected) {\n <core-checkbox (onClick)=\"onItemCheck(context, $event)\" [inputValue]=\"checked\"\n [disabled]=\"disabled\"></core-checkbox>\n }\n <object [class.active]=\"activeIds.includes(id)\" [class.highlighted]=\"highlighted\"\n [class.dissolved]=\"!isActive\" [class.protected]=\"protected\"\n [appTooltip]=\"title\">\n {{ title | translate: lang }}\n </object>\n\n @if (!!inlineExtraTemplateRef) {\n <ng-container *ngTemplateOutlet=\"inlineExtraTemplateRef; context: { context: context }\">\n </ng-container>\n }\n\n </span>\n @if (children.length) {\n <ul [class.collapsed]=\" !!!expanded\">\n @for (child of children; track $index) {\n @if (!!expanded || !!fullRendering) {\n <ng-container *ngTemplateOutlet=\"item; context: { context: child }\"></ng-container>\n }\n }\n </ul>\n }\n </li>\n }\n\n </ng-template>\n\n </ng-container>\n </div>\n\n\n</div>", styles: [".core-topic-tree-container{--background: var(--color-bg-core-org-tree);--height: 545px;border-radius:5px;--item-height: 50px;--ul-padding: 20px;--display: \"block\";--square-color: darkgray;--square-size: 30px;--line-color: \"transparent\";--active-item-color: var(--color-bg-pagination-button);--line-size: 1px;--reduced-icon-wrapper-height: 50px;--reduced-panel-height: calc(var(--height) - var(--reduced-icon-wrapper-height));--scroll-container-height: calc(var(--height) - var(--size-core-reducer-icon-wrapper-height) - var(--size-pagination-height));color:#000;background-color:var(--color-bg-core-org-tree)!important;height:var(--height);background:var(--background);width:var(--size-core-org-tree-width);transition:width .5s ease-out}@keyframes reducedPanelOn{0%{opacity:0;transform:rotate(-90deg)}to{opacity:1;transform:rotate(0)}}.core-topic-tree-container .custom-org-tree{display:var(--display)}.core-topic-tree-container .core-org-tree-header{height:var(--size-core-org-tree-header-height)}.core-topic-tree-container .core-org-tree-header input{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2 - var(--size-scrollbar-width) + 6px)}.core-topic-tree-container .core-org-tree-header input.full-width{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2)}.core-topic-tree-container .check-inheritance-wrapper{padding:15px}.core-topic-tree-container .form-control{border:none}.core-topic-tree-container .core-reducer-icon-wrapper{height:var(--size-core-reducer-icon-wrapper-height);padding:var(--size-layout-block-cell-spacing)}.core-topic-tree-container .scroll-container{background:var(--background);height:var(--scroll-container-height);overflow-y:auto;overflow-x:auto;position:relative;width:100%;border-radius:5px}.core-topic-tree-container .scroll-container *{box-sizing:border-box;padding:0;margin:0}@media (max-width: 575px){.core-topic-tree-container .scroll-container ::-webkit-slider-runnable-track{width:0px}}.core-topic-tree-container .scroll-container ul{display:table;vertical-align:top;padding-left:var(--ul-padding);transition:all .5s ease-out;width:100%}.core-topic-tree-container .scroll-container ul>li>span:hover{background-color:#fff;width:100%}.core-topic-tree-container .scroll-container ul>li>span:active{background-color:#f1f1f1}.core-topic-tree-container .scroll-container ul>li>span>object.active{color:var(--active-item-color)}.core-topic-tree-container .scroll-container ul .highlighted{color:var(--color-core-org-tree-highlighted);font-weight:700}.core-topic-tree-container .scroll-container ul .dissolved{color:#848484;text-decoration:line-through dashed}.core-topic-tree-container .scroll-container ul .dissolved.active{color:#c9252b!important}.core-topic-tree-container .scroll-container ul>li{display:block;position:relative}.core-topic-tree-container .scroll-container ul>li:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -1);top:calc(var(--item-height) / 2);height:calc(var(--item-height) / 2);border-top:solid var(--line-size) var(--line-color);border-right:none;border-bottom:none;border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li>span{display:flex;align-items:center;height:var(--item-height);white-space:nowrap;padding-left:8px;cursor:pointer}.core-topic-tree-container .scroll-container ul>li>span>i{color:var(--square-color);cursor:pointer;font-size:var(--square-size);width:var(--square-size);height:var(--square-size)}.core-topic-tree-container .scroll-container ul>li>span>.expand-toggler{position:absolute;z-index:1;transform:translate(-100%) rotate(0);transition:.5s ease-out;display:flex;align-items:center;justify-content:center}.core-topic-tree-container .scroll-container ul>li>span>.check-toggler{margin-left:5px;margin-right:5px}.core-topic-tree-container .scroll-container ul>li>ul>li>span:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);height:var(--line-size);border-top:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li.collapsed>span>.expand-toggler{transform:translate(-100%) rotate(-90deg);transition:.5s ease-out}.core-topic-tree-container .scroll-container ul>li.collapsed:before{border-left:none}.core-topic-tree-container .scroll-container ul>li:not(.collapsed):not(.has-children):before{border-left:none}.core-topic-tree-container .scroll-container ul:not(.root):before{content:\"\";display:block;position:absolute;width:var(--line-size);left:calc(var(--ul-padding) * -1);height:calc(100% - var(--item-height) * 1.5);border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul:not(.root)>li:last-child:not(.collapsed).has-children:after{content:\"\";display:block;position:absolute;height:calc(100% - var(--item-height));width:calc(var(--ul-padding) / 2);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);border-left:solid var(--line-size) var(--background);z-index:0}.core-topic-tree-container .scroll-container ul.collapsed:not(.root){display:none}.core-topic-tree-container .collapsed>li:before{display:none!important}.core-org-tree-container.full-width .scroll-container{width:auto}.core-org-tree-container.reduced{width:50px;padding:0;transition:width .5s ease-out}.core-org-tree-container.reduced .scroll-container{overflow:hidden}.core-org-tree-container.reduced .scroll-container>ul.root{display:none}.core-org-tree-container.reduced .scroll-container>.reduced-panel{color:var(--active-item-color);width:50px;height:var(--reduced-panel-height);writing-mode:vertical-rl;text-orientation:mixed;display:flex;align-items:center;justify-content:center;font-weight:700;animation:reducedPanelOn .5s ease-out}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CoreLoadingSurfaceComponent, selector: "core-loading-surface", inputs: ["loading", "height"] }, { kind: "component", type: CoreCheckboxComponent, selector: "core-checkbox", inputs: ["text", "tooltipPosition", "tooltip", "inputValue", "disabled"], outputs: ["onClick"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "directive", type: TooltipDirective, selector: "[appTooltip]", inputs: ["appTooltip", "showAnyway", "position"] }] }); }
|
|
403
|
+
}
|
|
404
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreTopicTreeComponent, decorators: [{
|
|
405
|
+
type: Component,
|
|
406
|
+
args: [{ selector: 'core-topic-tree', standalone: true, imports: [
|
|
407
|
+
CommonModule,
|
|
408
|
+
FormsModule,
|
|
409
|
+
CoreLoadingSurfaceComponent,
|
|
410
|
+
CoreReducerIconComponent,
|
|
411
|
+
CoreCheckboxComponent,
|
|
412
|
+
TranslatePipe,
|
|
413
|
+
TooltipDirective,
|
|
414
|
+
NgTemplateOutlet
|
|
415
|
+
], providers: [
|
|
416
|
+
{
|
|
417
|
+
provide: NG_VALUE_ACCESSOR,
|
|
418
|
+
multi: true,
|
|
419
|
+
useExisting: CoreTopicTreeComponent,
|
|
420
|
+
},
|
|
421
|
+
], template: "<div #container class=\"core-topic-tree-container\" [class.full-width]=\"!!fullWidthMode\" *ngIf=\"!!data\"\n [ngStyle]=\"{\n position : 'relative',\n width: '100%',\n height: height + 'px'\n }\">\n <div #displayContent class=\"custom-org-tree\">\n <div class=\"core-org-tree-header d-flex-between\">\n <div>\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchPlaceholder | translate: lang\" [class.full-width]=\"!!fullWidthMode\">\n </div>\n </div>\n\n <ng-container>\n\n <div class=\"scroll-container\" [ngStyle]=\"{\n height: height - layoutService.coreOrgTreeTopHeight - layoutService.coreOrgTreeBottomHeight + 'px'\n }\">\n <core-loading-surface [loading]=\"loading\" [height]=\"scrollContainerHeight\"></core-loading-surface>\n @for (root of data; track $index) {\n <ul class=\"root\" [class.collapsed]=\"!!!root.tree$Expanded\">\n <ng-container *ngTemplateOutlet=\"item; context: { context: root }\"></ng-container>\n </ul>\n }\n </div>\n\n\n <div [ngStyle]=\"{\n display: 'block',\n position: 'absolute',\n bottom: '0px',\n left: '0px',\n right: '0px',\n height: layoutService.corePaginationHeight + 'px',\n paddingLeft: layoutService.basicSpacing + 'px',\n paddingRight: layoutService.basicSpacing + 'px',\n lineHeight: layoutService.corePaginationHeight + 'px',\n overflow: 'hidden'\n }\">\n <div [ngStyle]=\"{\n height: layoutService.corePaginationHeight + 'px',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between'\n }\">\n <!-- <div>\n <core-checkbox [(ngModel)]=\"showDissolved\"\n (ngModelChange)=\"onCheckIncludeDissolvedChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS_ABBREVIATED'\"\n [tooltip]=\"'UI.CORE_ORG_TREE.SHOW_OUTDATED_UNITS'\" tooltipPosition=\"above\"></core-checkbox>\n </div> -->\n <div class=\"check-inheritance-wrapper\" *ngIf=\"accessorMode === 'CHECKED'\">\n <core-checkbox *ngIf=\"showCheckInheritance\" [(ngModel)]=\"checkInheritance\"\n (ngModelChange)=\"onCheckInheritanceChange($event)\"\n [text]=\"'UI.CORE_ORG_TREE.CHECK_INHERITANCE'\"></core-checkbox>\n </div>\n </div>\n </div>\n\n <ng-template #item let-context=\"context\" let-id=\"context.id\" let-title=\"context.tree$Title\"\n let-highlighted=\"context.tree$Highlighted\" let-hasChildren=\"context.tree$HasChildren\"\n let-hasActiveChildren=\"context.tree$HasActiveChildren\" let-children=\"context.tree$Children\"\n let-expanded=\"context.tree$Expanded\" let-isActive=\"context.isActive\" let-active=\"context.tree$Active\"\n let-checked=\"context.tree$Checked\" let-protected=\"context.protected\">\n\n @if ((!showDissolved && !!isActive) || (!!showDissolved)) {\n <li [class.has-children]=\"!!hasChildren\" [class.collapsed]=\"!!hasChildren && !!!expanded\">\n <span (click)=\"onObjectClick(context, $event)\">\n @if ((!!showDissolved && !!hasChildren) || (!showDissolved && !!hasActiveChildren)) {\n <i class=\"expand-toggler feather-chevron-down\"\n (click)=\"onExpandTogglerClick(context, $event)\"></i>\n }\n @if (accessorMode === 'CHECKED' && !!!protected) {\n <core-checkbox (onClick)=\"onItemCheck(context, $event)\" [inputValue]=\"checked\"\n [disabled]=\"disabled\"></core-checkbox>\n }\n <object [class.active]=\"activeIds.includes(id)\" [class.highlighted]=\"highlighted\"\n [class.dissolved]=\"!isActive\" [class.protected]=\"protected\"\n [appTooltip]=\"title\">\n {{ title | translate: lang }}\n </object>\n\n @if (!!inlineExtraTemplateRef) {\n <ng-container *ngTemplateOutlet=\"inlineExtraTemplateRef; context: { context: context }\">\n </ng-container>\n }\n\n </span>\n @if (children.length) {\n <ul [class.collapsed]=\" !!!expanded\">\n @for (child of children; track $index) {\n @if (!!expanded || !!fullRendering) {\n <ng-container *ngTemplateOutlet=\"item; context: { context: child }\"></ng-container>\n }\n }\n </ul>\n }\n </li>\n }\n\n </ng-template>\n\n </ng-container>\n </div>\n\n\n</div>", styles: [".core-topic-tree-container{--background: var(--color-bg-core-org-tree);--height: 545px;border-radius:5px;--item-height: 50px;--ul-padding: 20px;--display: \"block\";--square-color: darkgray;--square-size: 30px;--line-color: \"transparent\";--active-item-color: var(--color-bg-pagination-button);--line-size: 1px;--reduced-icon-wrapper-height: 50px;--reduced-panel-height: calc(var(--height) - var(--reduced-icon-wrapper-height));--scroll-container-height: calc(var(--height) - var(--size-core-reducer-icon-wrapper-height) - var(--size-pagination-height));color:#000;background-color:var(--color-bg-core-org-tree)!important;height:var(--height);background:var(--background);width:var(--size-core-org-tree-width);transition:width .5s ease-out}@keyframes reducedPanelOn{0%{opacity:0;transform:rotate(-90deg)}to{opacity:1;transform:rotate(0)}}.core-topic-tree-container .custom-org-tree{display:var(--display)}.core-topic-tree-container .core-org-tree-header{height:var(--size-core-org-tree-header-height)}.core-topic-tree-container .core-org-tree-header input{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2 - var(--size-scrollbar-width) + 6px)}.core-topic-tree-container .core-org-tree-header input.full-width{width:calc(var(--size-core-org-tree-width) - var(--size-layout-block-cell-spacing) * 2)}.core-topic-tree-container .check-inheritance-wrapper{padding:15px}.core-topic-tree-container .form-control{border:none}.core-topic-tree-container .core-reducer-icon-wrapper{height:var(--size-core-reducer-icon-wrapper-height);padding:var(--size-layout-block-cell-spacing)}.core-topic-tree-container .scroll-container{background:var(--background);height:var(--scroll-container-height);overflow-y:auto;overflow-x:auto;position:relative;width:100%;border-radius:5px}.core-topic-tree-container .scroll-container *{box-sizing:border-box;padding:0;margin:0}@media (max-width: 575px){.core-topic-tree-container .scroll-container ::-webkit-slider-runnable-track{width:0px}}.core-topic-tree-container .scroll-container ul{display:table;vertical-align:top;padding-left:var(--ul-padding);transition:all .5s ease-out;width:100%}.core-topic-tree-container .scroll-container ul>li>span:hover{background-color:#fff;width:100%}.core-topic-tree-container .scroll-container ul>li>span:active{background-color:#f1f1f1}.core-topic-tree-container .scroll-container ul>li>span>object.active{color:var(--active-item-color)}.core-topic-tree-container .scroll-container ul .highlighted{color:var(--color-core-org-tree-highlighted);font-weight:700}.core-topic-tree-container .scroll-container ul .dissolved{color:#848484;text-decoration:line-through dashed}.core-topic-tree-container .scroll-container ul .dissolved.active{color:#c9252b!important}.core-topic-tree-container .scroll-container ul>li{display:block;position:relative}.core-topic-tree-container .scroll-container ul>li:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -1);top:calc(var(--item-height) / 2);height:calc(var(--item-height) / 2);border-top:solid var(--line-size) var(--line-color);border-right:none;border-bottom:none;border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li>span{display:flex;align-items:center;height:var(--item-height);white-space:nowrap;padding-left:8px;cursor:pointer}.core-topic-tree-container .scroll-container ul>li>span>i{color:var(--square-color);cursor:pointer;font-size:var(--square-size);width:var(--square-size);height:var(--square-size)}.core-topic-tree-container .scroll-container ul>li>span>.expand-toggler{position:absolute;z-index:1;transform:translate(-100%) rotate(0);transition:.5s ease-out;display:flex;align-items:center;justify-content:center}.core-topic-tree-container .scroll-container ul>li>span>.check-toggler{margin-left:5px;margin-right:5px}.core-topic-tree-container .scroll-container ul>li>ul>li>span:before{content:\"\";display:block;position:absolute;width:var(--ul-padding);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);height:var(--line-size);border-top:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul>li.collapsed>span>.expand-toggler{transform:translate(-100%) rotate(-90deg);transition:.5s ease-out}.core-topic-tree-container .scroll-container ul>li.collapsed:before{border-left:none}.core-topic-tree-container .scroll-container ul>li:not(.collapsed):not(.has-children):before{border-left:none}.core-topic-tree-container .scroll-container ul:not(.root):before{content:\"\";display:block;position:absolute;width:var(--line-size);left:calc(var(--ul-padding) * -1);height:calc(100% - var(--item-height) * 1.5);border-left:solid var(--line-size) var(--line-color);z-index:0}.core-topic-tree-container .scroll-container ul:not(.root)>li:last-child:not(.collapsed).has-children:after{content:\"\";display:block;position:absolute;height:calc(100% - var(--item-height));width:calc(var(--ul-padding) / 2);left:calc(var(--ul-padding) * -2);top:calc(var(--item-height) / 2);border-left:solid var(--line-size) var(--background);z-index:0}.core-topic-tree-container .scroll-container ul.collapsed:not(.root){display:none}.core-topic-tree-container .collapsed>li:before{display:none!important}.core-org-tree-container.full-width .scroll-container{width:auto}.core-org-tree-container.reduced{width:50px;padding:0;transition:width .5s ease-out}.core-org-tree-container.reduced .scroll-container{overflow:hidden}.core-org-tree-container.reduced .scroll-container>ul.root{display:none}.core-org-tree-container.reduced .scroll-container>.reduced-panel{color:var(--active-item-color);width:50px;height:var(--reduced-panel-height);writing-mode:vertical-rl;text-orientation:mixed;display:flex;align-items:center;justify-content:center;font-weight:700;animation:reducedPanelOn .5s ease-out}\n"] }]
|
|
422
|
+
}], ctorParameters: () => [{ type: i1.AuthService }, { type: i2.RecursiveService }, { type: i3.MultiLanguageService }, { type: i4.LayoutService }, { type: i5.TopicTreeService }, { type: i6.AlertService }], propDecorators: { lineColor: [{
|
|
423
|
+
type: Input
|
|
424
|
+
}], fullWidthMode: [{
|
|
425
|
+
type: Input
|
|
426
|
+
}], accessorMode: [{
|
|
427
|
+
type: Input
|
|
428
|
+
}], fullRendering: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], height: [{
|
|
431
|
+
type: Input
|
|
432
|
+
}], disabledLoopExpand: [{
|
|
433
|
+
type: Input
|
|
434
|
+
}], showCheckInheritance: [{
|
|
435
|
+
type: Input
|
|
436
|
+
}], inlineExtraTemplateRef: [{
|
|
437
|
+
type: Input
|
|
438
|
+
}], itemDoubleClick: [{
|
|
439
|
+
type: Output
|
|
440
|
+
}], itemClick: [{
|
|
441
|
+
type: Output
|
|
442
|
+
}], container: [{
|
|
443
|
+
type: ViewChild,
|
|
444
|
+
args: ['container']
|
|
445
|
+
}], displayContent: [{
|
|
446
|
+
type: ViewChild,
|
|
447
|
+
args: ['displayContent']
|
|
448
|
+
}], reducedIconWrapper: [{
|
|
449
|
+
type: ViewChild,
|
|
450
|
+
args: ['reducedIconWrapper']
|
|
451
|
+
}] } });
|
|
452
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS10b3BpYy10cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLXRvcGljLXRyZWUvY29yZS10b3BpYy10cmVlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaXN0YWZmLWFscGhhL3NyYy9saWIvYXBwL2xpYnJhcmllcy9jb3JlLXRvcGljLXRyZWUvY29yZS10b3BpYy10cmVlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBOEIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwTSxPQUFPLEVBQXdCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZFQUE2RSxDQUFDO0FBQzFILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUUxRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckgsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBS2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDOzs7Ozs7Ozs7O0FBRS9GLE1BQU0sQ0FBTixJQUFZLHdDQUlYO0FBSkQsV0FBWSx3Q0FBd0M7SUFDbEQsaUZBQXFDLENBQUE7SUFDckMsMkZBQStDLENBQUE7SUFDL0MsK0RBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUpXLHdDQUF3QyxLQUF4Qyx3Q0FBd0MsUUFJbkQ7QUF5QkQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLDRCQUE0QjtJQW9CN0QsVUFBVSxDQUFDLEdBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFFakIsUUFBUSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3pCLEtBQUssd0NBQXdDLENBQUMsT0FBTztnQkFDbkQsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFO29CQUNULE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyxrQkFBa0I7b0JBQ3pDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUNyRyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzt3QkFDckIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNOzRCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDNUUsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssd0NBQXdDLENBQUMsZ0JBQWdCLENBQUM7WUFDL0QsS0FBSyx3Q0FBd0MsQ0FBQyxxQkFBcUI7Z0JBQ2pFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRTtvQkFDVCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7b0JBQ25DLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN6RyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzt3QkFDckIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNOzRCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztvQkFDNUUsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsTUFBTTtZQUNSO2dCQUNFLE1BQU07U0FDVDtRQUdELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyx3Q0FBd0MsQ0FBQyxPQUFPLEVBQUU7U0FFM0U7YUFBTSx5R0FBeUcsQ0FBQztTQUVoSDtJQUNILENBQUM7SUFFUSxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUN6QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBNEJEO0lBQ0UscUNBQXFDO0lBQzdCLFdBQXdCLEVBQ3hCLGdCQUFrQyxFQUNsQyxHQUF5QixFQUMxQixhQUE0QixFQUMzQixnQkFBa0MsRUFDbEMsWUFBMEI7UUFFbEMsS0FBSyxFQUFDLFlBQVksQ0FBQyxDQUFDO1FBUFosZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxRQUFHLEdBQUgsR0FBRyxDQUFzQjtRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBaEczQixjQUFTLEdBQVcsYUFBYSxDQUFDO1FBVWpDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQW9EekMsY0FBUyxHQUFhLEVBQUUsQ0FBQztRQUV6QixlQUFVLEdBQWEsRUFBRSxDQUFDO1FBTTFCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQUduQyxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztRQUVoQyxzQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsQ0FBQztRQUd4RSxxQkFBZ0IsR0FBWSxJQUFJLENBQUMsQ0FBQyx3QkFBd0I7UUFDMUQsa0JBQWEsR0FBWSxJQUFJLENBQUMsQ0FBQyx5QkFBeUI7UUFtQnRELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLDZEQUE2RDtRQUU3RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUU1QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxRQUFRO1FBRU4sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUF1QjtZQUN0QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsWUFBWSxFQUFFLElBQUksZUFBZSxDQUFxQixTQUFTLENBQUM7WUFDaEUsV0FBVyxFQUFFLElBQUksZUFBZSxDQUFXLEVBQUUsQ0FBQztZQUM5QyxZQUFZLEVBQUUsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDO1lBQy9DLGFBQWEsRUFBRSxJQUFJLGVBQWUsQ0FBVyxFQUFFLENBQUM7WUFDaEQsaUJBQWlCLEVBQUUsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDO1NBQ3RELENBQUE7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUVqRCwwREFBMEQ7UUFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QixJQUFJLFNBQVMsRUFBRSxFQUFFO2dCQUNmLDZLQUE2SzthQUM5SztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkQsMERBQTBEO2dCQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQzlGLENBQUMsQ0FBQyxDQUNILENBQUE7U0FDRjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQywwQkFBMEIsR0FBRyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBRTVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFFdkQsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JCLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssd0NBQXdDLENBQUMsT0FBTyxFQUFFO2dCQUMxRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLE9BQU87YUFDVCxJQUFJLENBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQ3pCLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FDTCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPO2FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hELFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFO2dCQUNsQixZQUFZLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5RDtRQUNILENBQUMsQ0FBQyxDQUNMLENBQUM7UUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUUsQ0FBQztJQUVPLFlBQVk7UUFFbEIsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FDN0IsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDdkMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUM7aUJBQ3hDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQ3JCLENBQUM7WUFDRixNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FDckMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztpQkFDdkMsZ0JBQWdCLENBQUMsZ0NBQWdDLENBQUM7aUJBQ2xELE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQ3JCLENBQUM7WUFFRixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDO1lBRXpGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUM3QixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2lCQUN2QyxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsQ0FBQztpQkFDbEQsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FDckIsQ0FBQztZQUVGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUM3QixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2lCQUN2QyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQztpQkFDakQsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FDckIsQ0FBQztZQUNGLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUN6QyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO2lCQUN2QyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQztpQkFDakQsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FDckIsQ0FBQztZQUdGLE1BQU0sTUFBTSxHQUFHLGVBQWUsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyw0QkFBNEIsQ0FBQztZQUNwRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBCLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQzdDLFVBQVUsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUMxQixDQUFDO1NBRUg7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQzdDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FDL0IsQ0FBQztTQUNIO0lBRUgsQ0FBQztJQUVELGVBQWU7UUFFYixVQUFVLENBQUMsR0FBRyxFQUFFO1lBRWQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtnQkFDL0QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDZixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07d0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2lCQUMzRDtZQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxDQUEyQjtRQUMxQyxJQUFJLENBQUMsMEJBQTBCLENBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVksQ0FBQyxDQUEyQjtRQUN0QyxNQUFNLFNBQVMsR0FBK0IsSUFBSSxDQUFDLEtBQUssQ0FDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FDaEQsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixHQUFHLFNBQVMsQ0FBQztRQUM1QyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztRQUU5RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRTtZQUNqQyxlQUFlO1lBRWYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRWpDLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDeEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU07b0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxXQUFXLENBQUM7Z0JBQ2pCLElBQUksRUFBRSxTQUFTO2dCQUNmLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFVBQVUsRUFBRSxNQUFNO2dCQUNsQixXQUFXLEVBQUUsVUFBVTtnQkFDdkIsV0FBVyxFQUFFLFFBQVE7Z0JBQ3JCLDRDQUE0QztnQkFDNUMsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLGFBQWEsRUFBRSxRQUFRO2FBQ3hCLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxxREFBcUQ7WUFDckQsMkVBQTJFO1lBQzNFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsZ0JBQWdCO2lCQUNsQix1QkFBdUIsQ0FDdEIsU0FBUyxFQUNULElBQUksRUFDSixNQUFNLEVBQ04sVUFBVSxFQUNWLFFBQVEsRUFDUixTQUFTLEVBQ1QsUUFBUSxDQUVUO2lCQUNBLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTTtvQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUNMLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxDQUEyQixFQUFFLEtBQVU7UUFFMUQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUNsQyxDQUFDLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUUzQixnQ0FBZ0M7UUFDaEMsTUFBTSxrQkFBa0IsR0FDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3BELElBQUksY0FBYyxHQUFHLGtCQUFrQixFQUFFLE1BQU0sQ0FDN0MsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ3ZELENBQUM7UUFFRixJQUFJLFFBQVEsRUFBRTtZQUNaLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1FBRXZCLE1BQU0sZUFBZSxHQUFhLEVBQUUsQ0FBQztRQUNyQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDakMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQU07WUFDdkMsWUFBWSxFQUFFLGVBQWU7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUEyQixFQUFFLFFBQWlCO1FBQ3hELElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyx3Q0FBd0MsQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUVuRix3REFBd0Q7UUFDeEQsSUFBSSxVQUFvQixDQUFDO1FBQ3pCLGtEQUFrRDtRQUNsRCxNQUFNLGFBQWEsR0FBYSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFFNUUsc0RBQXNEO1FBQ3RELE1BQU0sV0FBVyxHQUFHLEdBQUcsRUFBRTtZQUV2Qix5RUFBeUU7WUFDekUsK0NBQStDO1lBQy9DLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtnQkFDZCxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ2hDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3ZCO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLDRDQUE0QztnQkFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7YUFFakM7aUJBQU07Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDbkUscUNBQXFDO2dCQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtZQUVELG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQTtRQUVELGtEQUFrRDtRQUNsRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QiwwREFBMEQ7WUFDMUQsSUFBSSxDQUFDLGdCQUFnQjtpQkFDbEIsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztpQkFDOUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBRVYsNEJBQTRCO2dCQUM1QixVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUVmLDREQUE0RDtnQkFDNUQsV0FBVyxFQUFFLENBQUM7WUFFaEIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNoQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNMLHlEQUF5RDtZQUN6RCxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFcEIsNERBQTREO1lBQzVELFdBQVcsRUFBRSxDQUFDO1NBRWY7UUFDRCxnREFBZ0Q7UUFFaEQsNEJBQTRCO0lBRTlCLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxLQUFjO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELHdCQUF3QixDQUFDLEtBQWM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDakMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQU07WUFDdkMsZ0JBQWdCLEVBQUUsS0FBSztTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLENBQTJCLEVBQUUsS0FBVTtRQUVuRCx5QkFBeUI7UUFDekIsUUFBUTtRQUVSLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUUxQixJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssd0NBQXdDLENBQUMsT0FBTztZQUFFLE9BQU87UUFDbkYsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFDO1FBRTdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN4RSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUNqQyxJQUNFLElBQUksQ0FBQyxZQUFZO2dCQUNqQix3Q0FBd0MsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQ3BGO2dCQUNBLHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLGdCQUFnQjtxQkFDbEIsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztxQkFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1YsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDZCxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztvQkFDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzt3QkFDakMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQU07d0JBQ3ZDLFVBQVUsRUFBRSxhQUFhO3dCQUN6QixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUU7cUJBQzdCLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzNCLENBQUMsQ0FBQztxQkFDRCxLQUFLLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7YUFHTjtpQkFBTTtnQkFFTCxtQkFBbUI7Z0JBQ25CLHlEQUF5RDtnQkFDekQsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztnQkFFM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQ2pDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFNO29CQUN2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUM3QixXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUU7aUJBQzdCLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQzFCO1FBRUgsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUV4QixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVk7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN6QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FDdEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FDaEQsQ0FBQztZQUVGLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3RCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUN6RCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUNoRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO2FBQ2hEO1NBQ0Y7SUFDSCxDQUFDOzhHQS9nQlUsc0JBQXNCO2tHQUF0QixzQkFBc0IscWFBUnRCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsV0FBVyxFQUFFLHNCQUFzQjthQUNwQztTQUNGLDRYQzlDSCwwOUtBNEdNLCt6TEQvRUYsWUFBWSw4WEFDWixXQUFXLCttQkFDWCwyQkFBMkIsZ0dBRTNCLHFCQUFxQixxSkFDckIsYUFBYSxrREFDYixnQkFBZ0I7OzJGQWFQLHNCQUFzQjtrQkF2QmxDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCwyQkFBMkI7d0JBQzNCLHdCQUF3Qjt3QkFDeEIscUJBQXFCO3dCQUNyQixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3FCQUNqQixhQUdVO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsd0JBQXdCO3lCQUNwQztxQkFDRjt3T0FHUSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUVHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBRWlCLFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVztnQkFDTyxjQUFjO3NCQUExQyxTQUFTO3VCQUFDLGdCQUFnQjtnQkFDTSxrQkFBa0I7c0JBQWxELFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIGlzRGV2TW9kZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1zTW9kdWxlLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvcmVMb2FkaW5nU3VyZmFjZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUtbG9hZGluZy1zdXJmYWNlL2NvcmUtbG9hZGluZy1zdXJmYWNlL2NvcmUtbG9hZGluZy1zdXJmYWNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3JlUmVkdWNlckljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlLXJlZHVjZXItaWNvbi9jb3JlLXJlZHVjZXItaWNvbi9jb3JlLXJlZHVjZXItaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL2FwcC1waXBlcy90cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgeyBUb29sdGlwRGlyZWN0aXZlIH0gZnJvbSAnLi4vdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDb3JlRm9ybUNvbnRyb2xCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29yZS1mb3JtLWNvbnRyb2wtYmFzZS9jb3JlLWZvcm0tY29udHJvbC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb3BpY1RyZWVTZXJ2aWNlLCBJVG9waWNUcmVlSW5zdGFuY2UsIElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbSwgSVRvcGljVHJlZUxpbmVhckl0ZW0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90b3BpYy10cmVlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBSZWN1cnNpdmVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcmVjdXJzaXZlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTXVsdGlMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tdWx0aS1sYW5ndWFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IExheW91dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBFbnVtVHJhbnNsYXRlS2V5IH0gZnJvbSAnYWxwaGEtZ2xvYmFsLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBsaW5lcl90b19uZXN0ZWRfYXJyYXlfc2NyaXB0IH0gZnJvbSAnLi4vLi4vLi4vYXNzZXRzL2pzL3Jlc2N1c2l2ZV93ayc7XG5pbXBvcnQgeyBDb3JlQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9jb3JlLWNoZWNrYm94L2NvcmUtY2hlY2tib3gvY29yZS1jaGVja2JveC5jb21wb25lbnQnO1xuXG5leHBvcnQgZW51bSBFbnVtQ29yZUFydGljbGVDYXRlZ29yeVRyZWVhQWNjZXNzb3JNb2RlIHtcbiAgQUNUSVZBVEVEX1NJTkdMRSA9ICdBQ1RJVkFURURfU0lOR0xFJyxcbiAgQUNUSVZBVEVEX0lOSEVSSVRBTkNFID0gJ0FDVElWQVRFRF9JTkhFUklUQU5DRScsXG4gIENIRUNLRUQgPSAnQ0hFQ0tFRCcsXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcmUtdG9waWMtdHJlZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ29yZUxvYWRpbmdTdXJmYWNlQ29tcG9uZW50LFxuICAgIENvcmVSZWR1Y2VySWNvbkNvbXBvbmVudCxcbiAgICBDb3JlQ2hlY2tib3hDb21wb25lbnQsXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBUb29sdGlwRGlyZWN0aXZlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXRcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvcmUtdG9waWMtdHJlZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb3JlLXRvcGljLXRyZWUuY29tcG9uZW50LnNjc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IENvcmVUb3BpY1RyZWVDb21wb25lbnQsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29yZVRvcGljVHJlZUNvbXBvbmVudCBleHRlbmRzIENvcmVGb3JtQ29udHJvbEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIGxpbmVDb2xvcjogc3RyaW5nID0gJ3RyYW5zcGFyZW50JztcbiAgQElucHV0KCkgZnVsbFdpZHRoTW9kZSE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFjY2Vzc29yTW9kZSE6IEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGU7XG4gIEBJbnB1dCgpIGZ1bGxSZW5kZXJpbmchOiBib29sZWFuO1xuICBASW5wdXQoKSBoZWlnaHQhOiBudW1iZXI7IC8vIENoaeG7gXUgY2FvIGPhu6dhIENvcmVPcmdUcmVlIGPhuqduIMSRxrDhu6NjIHRydXnhu4FuIHbDoG8hXG4gIEBJbnB1dCgpIGRpc2FibGVkTG9vcEV4cGFuZCE6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dDaGVja0luaGVyaXRhbmNlITogYm9vbGVhbjtcblxuICBASW5wdXQoKSBpbmxpbmVFeHRyYVRlbXBsYXRlUmVmITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KCkgaXRlbURvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaXRlbUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Rpc3BsYXlDb250ZW50JykgZGlzcGxheUNvbnRlbnQhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdyZWR1Y2VkSWNvbldyYXBwZXInKSByZWR1Y2VkSWNvbldyYXBwZXIhOiBFbGVtZW50UmVmO1xuXG4gIG92ZXJyaWRlIHZhbHVlITogbnVtYmVyW107XG5cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZShvYmo6IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IG9iajtcblxuICAgIHN3aXRjaCAodGhpcy5hY2Nlc3Nvck1vZGUpIHtcbiAgICAgIGNhc2UgRW51bUNvcmVBcnRpY2xlQ2F0ZWdvcnlUcmVlYUFjY2Vzc29yTW9kZS5DSEVDS0VEOlxuICAgICAgICBpZiAoISFvYmopIHtcbiAgICAgICAgICBjb25zdCBjaGVja2VkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICB0aGlzLmNoZWNrZWRJZHMgPSBvYmo7IC8vIDw9PT0gMjQvMTAvMjAyM1xuICAgICAgICAgIG9iai5tYXAoeCA9PiBjaGVja2VkS2V5cy5wdXNoKHgudG9TdHJpbmcoKSkpO1xuICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlLndyaXRlVmFsdWVDaGVja2VkKGNoZWNrZWRLZXlzLCB0aGlzLmRhdGEsIHRoaXMuZGlzYWJsZWRMb29wRXhwYW5kKS5zdWJzY3JpYmUoXyA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YT8ubGVuZ3RoKSB0aGlzLmRhdGFbMF0udHJlZSRFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQUNUSVZBVEVEX1NJTkdMRTpcbiAgICAgIGNhc2UgRW51bUNvcmVBcnRpY2xlQ2F0ZWdvcnlUcmVlYUFjY2Vzc29yTW9kZS5BQ1RJVkFURURfSU5IRVJJVEFOQ0U6XG4gICAgICAgIGlmICghIW9iaikge1xuICAgICAgICAgIGNvbnN0IGFjdGl2YXRlZEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgb2JqLm1hcCh4ID0+IGFjdGl2YXRlZEtleXMucHVzaCh4LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVjdXJzaXZlU2VydmljZS53cml0ZVZhbHVlQWN0aXZhdGVkKGFjdGl2YXRlZEtleXMsIHRoaXMuZGF0YSwgdGhpcy5kaXNhYmxlZExvb3BFeHBhbmQpLnN1YnNjcmliZShfID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhPy5sZW5ndGgpIHRoaXMuZGF0YVswXS50cmVlJEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuXG4gICAgaWYgKHRoaXMuYWNjZXNzb3JNb2RlID09PSBFbnVtQ29yZUFydGljbGVDYXRlZ29yeVRyZWVhQWNjZXNzb3JNb2RlLkNIRUNLRUQpIHtcblxuICAgIH0gZWxzZSAvKiBFbnVtQ29yZU9yZ1RyZWVhQWNjZXNzb3JNb2RlLkFDVElWQVRFRF9TSU5HTEUgb3IgRW51bUNvcmVPcmdUcmVlYUFjY2Vzc29yTW9kZS5BQ1RJVkFURURfSU5IRVJJVEFOQ0UgKi8ge1xuXG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuXG4gIGFjdGl2ZUlkczogbnVtYmVyW10gPSBbXTtcblxuICBjaGVja2VkSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8vIGZvciBkZWJ1Z2dpbmdcbiAgLy8gYWN0aXZlSWRzU3RyaW5nITogc3RyaW5nOyAgXG4gIGRhdGEhOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW1bXTtcbiAgbG9hZGluZyE6IGJvb2xlYW47XG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIGxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5ITogSVRvcGljVHJlZUxpbmVhckl0ZW1bXTtcbiAgc2VhcmNoITogc3RyaW5nO1xuICBzZWFyY2gkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICByZWR1Y2VkITogYm9vbGVhbjtcbiAgc2VhcmNoUGxhY2Vob2xkZXIgPSBFbnVtVHJhbnNsYXRlS2V5LlVJX0NPTU1PTl9QTEFDRV9IT0xERVJfU0VBUkNIX0hFUkU7XG5cbiAgaW5pdGlhbGl6aW5nITogYm9vbGVhbjtcbiAgY2hlY2tJbmhlcml0YW5jZTogYm9vbGVhbiA9IHRydWU7IC8vIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZVxuICBzaG93RGlzc29sdmVkOiBib29sZWFuID0gdHJ1ZTsgLy8gZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZVxuICBzZWxlY3RlZEtleSE6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc2VsZWN0ZWRJdGVtITogSVRvcGljVHJlZUxpbmVhckl0ZW07XG4gIGxhbmchOiBzdHJpbmc7XG4gIC8vcmVkdWNlZCQhOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj47XG5cbiAgaW5zdGFuY2VOdW1iZXIhOiBudW1iZXI7XG4gIHNjcm9sbENvbnRhaW5lckhlaWdodCE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvL3B1YmxpYyBvdmVycmlkZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWN1cnNpdmVTZXJ2aWNlOiBSZWN1cnNpdmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWxzOiBNdWx0aUxhbmd1YWdlU2VydmljZSxcbiAgICBwdWJsaWMgbGF5b3V0U2VydmljZTogTGF5b3V0U2VydmljZSxcbiAgICBwcml2YXRlIHRvcGljVHJlZVNlcnZpY2U6IFRvcGljVHJlZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIoLyppbmplY3RvciovKTtcbiAgICB0aGlzLmluaXRpYWxpemluZyA9IHRydWU7XG5cbiAgICAvLyB0aGlzLnJlZHVjZWQkID0gdGhpcy5jb3JlT3JnVHJlZVN0YXRlLmNvcmVPcmdUcmVlUmVkdWNlZCQ7XG5cbiAgICB0aGlzLmluaXRpYWxpemluZyA9IGZhbHNlO1xuXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2hlaWdodCddKSB7XG4gICAgICB0aGlzLnJlc2l6ZUhlaWdodCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5pbnN0YW5jZU51bWJlciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IG5ld0luc3RhbmNlOiBJVG9waWNUcmVlSW5zdGFuY2UgPSB7XG4gICAgICBpbnN0YW5jZU51bWJlcjogdGhpcy5pbnN0YW5jZU51bWJlcixcbiAgICAgIHNlbGVjdGVkS2V5JDogbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCksXG4gICAgICBhY3RpdmVLZXlzJDogbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pLFxuICAgICAgY2hlY2tlZEtleXMkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSksXG4gICAgICBleHBhbmRlZEtleXMkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSksXG4gICAgICBjaGVja0luaGVyaXRhbmNlJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKVxuICAgIH1cbiAgICB0aGlzLnRvcGljVHJlZVNlcnZpY2UuaW5zdGFuY2VzLnB1c2gobmV3SW5zdGFuY2UpXG5cbiAgICAvLyBDaGVjayB4ZW0gY2hp4buBdSBjYW8gaGVpZ2h0IGPDsyDEkcaw4bujYyB0cnV54buBbiB2w6BvIGhheSBraMO0bmdcbiAgICBpZiAodGhpcy5oZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIC8vdGhpcy5hbGVydFNlcnZpY2Uud2FybihcIkNvcmVPcmdUcmVlIGtow7RuZyBuaOG6rW4gxJHGsOG7o2MgY2hp4buBdSBjYW8gKGhlaWdodCkgdHJ1eeG7gW4gdsOgbyB04burIGzhu5twIG5nb8OgaS4gQ2hp4buBdSBjYW8gbeG6t2MgxJHhu4tuaCBz4bq9IMSRxrDhu6NjIHTDrW5oIHRvw6FuIGThu7FhIHbDoG8gYuG7kSBj4bulYyBjaMOtbmguXCIsIGFsZXJ0T3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLmNvbnRlbnRDb250YWluZXJIZWlnaHQkLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAvLyBiYXNpY1NwYWNpbmcgbMOgIHBhZGRpbmdCb3R0b20gY+G7p2EgbOG7m3AgY29udGVudC1jb250YWluZXJcbiAgICAgICAgICB0aGlzLmhlaWdodCA9IHggLSB0aGlzLmxheW91dFNlcnZpY2UuY29yZVBhZ2VIZWFkZXJIZWlnaHQgLSB0aGlzLmxheW91dFNlcnZpY2UuYmFzaWNTcGFjaW5nO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLmxpbmVhckRhdGEkLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICB0aGlzLmxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5ID0geDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQuc3Vic2NyaWJlKCh4KSA9PiB7XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLlRvcGljVHJlZVNlcnZpY2Uuc3RhdHVzJCBjaGFuZ2VzXCIsIHgpXG5cbiAgICAgICAgY29uc3QgbmV3QWN0aXZlSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICB4LmFjdGl2ZUtleXMubWFwKChrKSA9PiB7XG4gICAgICAgICAgbmV3QWN0aXZlSWRzLnB1c2goTnVtYmVyKGspKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZlSWRzID0gbmV3QWN0aXZlSWRzO1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3Nvck1vZGUgIT09IEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQ0hFQ0tFRCkge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmFjdGl2ZUlkcztcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuYWN0aXZlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkS2V5ID0geC5zZWxlY3RlZEtleTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5zZWFyY2gkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigoeCkgPT4geCAhPT0gbnVsbCksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKHRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzd2l0Y2hNYXAgd29ya3MnKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWN1cnNpdmVTZXJ2aWNlLmZpbmRJdGVtKHRleHQsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkXG4gICAgICAgIC5waXBlKGZpbHRlcigodmFsdWUpID0+ICEhIXRoaXMuaW5pdGlhbGl6aW5nICYmICEhdmFsdWUpKVxuICAgICAgICAuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICAgICAgaWYgKCEhbG9jYWxTdG9yYWdlKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY29yZU9yZ1RyZWVTdGF0dXMnLCBKU09OLnN0cmluZ2lmeSh4KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5tbHMubGFuZyQuc3Vic2NyaWJlKCh4KSA9PiAodGhpcy5sYW5nID0geCkpKTtcblxuICB9XG5cbiAgcHJpdmF0ZSByZXNpemVIZWlnaHQoKTogdm9pZCB7XG5cbiAgICAvLyBoZWlnaHQgaXMgbm90IGdpdmVuIGFuZCB0aGUgdHJlZSByZXNpemUgYXMgc3RhbmRhcmRcbiAgICBpZiAoISEhdGhpcy5oZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNpemVIZWFkZXJIZWlnaHQgPSBOdW1iZXIoXG4gICAgICAgIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCctLXNpemUtaGVhZGVyLWhlaWdodCcpXG4gICAgICAgICAgLnJlcGxhY2UoJ3B4JywgJycpXG4gICAgICApO1xuICAgICAgY29uc3Qgc2l6ZUNvcmVQYWdlSGVhZGVySGVpZ2h0ID0gTnVtYmVyKFxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaXplLWNvcmUtcGFnZS1oZWFkZXItaGVpZ2h0JylcbiAgICAgICAgICAucmVwbGFjZSgncHgnLCAnJylcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHNpemVIZWFkZXJIZWlnaHQgLSBzaXplQ29yZVBhZ2VIZWFkZXJIZWlnaHQ7XG5cbiAgICAgIGNvbnN0IHBhZ2VIZWFkZXJIZWlnaHQgPSBOdW1iZXIoXG4gICAgICAgIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCctLXNpemUtY29yZS1wYWdlLWhlYWRlci1oZWlnaHQnKVxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcGFnaW5hdGlvbkhlaWdodCA9IE51bWJlcihcbiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgLmdldFByb3BlcnR5VmFsdWUoJy0tc2l6ZS1jb3JlLXBhZ2luYXRpb24taGVpZ2h0JylcbiAgICAgICAgICAucmVwbGFjZSgncHgnLCAnJylcbiAgICAgICk7XG4gICAgICBjb25zdCBzaXplTWFyZ2luQ29yZVBhZ2luYXRpb25GdWxsID0gTnVtYmVyKFxuICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaXplLW1hcmdpbi1jb3JlLXBhZ2luYXRpb24nKVxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKVxuICAgICAgKTtcblxuXG4gICAgICBjb25zdCBoZWlnaHQgPSBjb250YWluZXJIZWlnaHQgLSBwYWdlSGVhZGVySGVpZ2h0IC0gcGFnaW5hdGlvbkhlaWdodCArIHNpemVNYXJnaW5Db3JlUGFnaW5hdGlvbkZ1bGw7XG4gICAgICBjb25zb2xlLmxvZyhoZWlnaHQpO1xuXG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0taGVpZ2h0JywgaGVpZ2h0ICsgJ3B4J1xuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcbiAgICAgICAgJy0taGVpZ2h0JywgdGhpcy5oZWlnaHQgKyAncHgnXG4gICAgICApO1xuICAgIH1cblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICB0aGlzLnRvcGljVHJlZVNlcnZpY2UuYXJ0aWNsZUNhdGVnb3J5VHJlZURhdGEkLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YSA9IHg7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJuZXcgRGF0YSBjb21pbmdcIiwgdGhpcy5kYXRhLCBuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICAgICAgICBpZiAoISF0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YS5sZW5ndGgpIHRoaXMuZGF0YVswXS50cmVlJEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pXG4gIH1cblxuICBvbkl0ZW1DbGlja0xvY2FsKGU6IElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbSk6IHZvaWQge1xuICAgIHRoaXMubGluZWFyQXJ0aWNsZUNhdGVnb3J5QXJyYXkgLm1hcCgoeCkgPT4gKHguYWN0aXZlID0gZmFsc2UpKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYnVpbGRUcmVlRGF0YSgpKTtcbiAgfVxuXG4gIG9uVG9nZ2xlSXRlbShlOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW0pIHtcbiAgICBjb25zdCBjbG9uZUNvcHk6IElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbVtdID0gSlNPTi5wYXJzZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMubGluZWFyQXJ0aWNsZUNhdGVnb3J5QXJyYXkpXG4gICAgKTtcbiAgICBjb25zdCBmaWx0ZXIgPSBjbG9uZUNvcHkuZmlsdGVyKCh4KSA9PiB4LmlkID09PSBlLmlkKTtcblxuICAgIGlmIChmaWx0ZXIubGVuZ3RoID09PSAxKSB7XG4gICAgICBmaWx0ZXJbMF0uZXhwYW5kZWQgPSAhISFlLmV4cGFuZGVkO1xuICAgIH1cbiAgICB0aGlzLmxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5ID0gY2xvbmVDb3B5O1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5idWlsZFRyZWVEYXRhKCkpO1xuICB9XG5cbiAgYnVpbGRUcmVlRGF0YSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgY2xvbmVDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmxpbmVhckFydGljbGVDYXRlZ29yeUFycmF5KSk7XG5cbiAgICBpZiAodHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ld1xuXG4gICAgICBjb25zb2xlLmxvZyhcIvCfn6Lwn5+iIFdvcmtlciB3b3Jrc1wiKTtcblxuICAgICAgY29uc3Qgd29ya2VyID0gbmV3IFdvcmtlcihsaW5lcl90b19uZXN0ZWRfYXJyYXlfc2NyaXB0KTtcbiAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGEubGlzdDtcbiAgICAgICAgaWYgKCEhdGhpcy5kYXRhICYmICEhdGhpcy5kYXRhPy5sZW5ndGgpIHRoaXMuZGF0YVswXS50cmVlJEV4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgbGlzdDogY2xvbmVDb3B5LFxuICAgICAgICBrZXlGaWVsZDogJ2lkJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgICBwYXJlbnRGaWVsZDogJ3BhcmVudElkJyxcbiAgICAgICAgYWN0aXZlRmllbGQ6ICdhY3RpdmUnLFxuICAgICAgICAvL2luaGVyaXRhbnRBY3RpdmVGaWVsZDogJ2luaGVyaXRhbnRBY3RpdmUnLFxuICAgICAgICBjaGVja2VkRmllbGQ6ICdjaGVja2VkJyxcbiAgICAgICAgZXhwYW5kZWRGaWVsZDogJ2V4cGFuZCcsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2ViIHdvcmtlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudC5cbiAgICAgIC8vIFlvdSBzaG91bGQgYWRkIGEgZmFsbGJhY2sgc28gdGhhdCB5b3VyIHByb2dyYW0gc3RpbGwgZXhlY3V0ZXMgY29ycmVjdGx5LlxuICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQudmFsdWU7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlXG4gICAgICAgICAgLmxpbmVyQXJyYXlUb05lc3RlZEFycmF5KFxuICAgICAgICAgICAgY2xvbmVDb3B5LFxuICAgICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAgICdwYXJlbnRJZCcsXG4gICAgICAgICAgICAnYWN0aXZlJyxcbiAgICAgICAgICAgICdjaGVja2VkJyxcbiAgICAgICAgICAgICdleHBhbmQnLFxuICAgICAgICAgICAgLy9zdGF0dXNcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgob2JqKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBvYmoubGlzdDtcbiAgICAgICAgICAgIGlmICghIXRoaXMuZGF0YSAmJiAhIXRoaXMuZGF0YT8ubGVuZ3RoKSB0aGlzLmRhdGFbMF0udHJlZSRFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBvbkV4cGFuZFRvZ2dsZXJDbGljayhlOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW0sIGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgY29uc3QgbmV3VmFsdWUgPSAhZS50cmVlJEV4cGFuZGVkO1xuICAgIGUudHJlZSRFeHBhbmRlZCA9IG5ld1ZhbHVlO1xuXG4gICAgLy8gdXBkYXRpbmcgc3RhdHVzIHdpdGggbmV3VmFsdWVcbiAgICBjb25zdCBjdXJyZW50RXhwYW5kZWRJZHMgPVxuICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQudmFsdWU/LmV4cGFuZGVkS2V5cztcbiAgICBsZXQgbmV3RXhwYW5kZWRJZHMgPSBjdXJyZW50RXhwYW5kZWRJZHM/LmZpbHRlcihcbiAgICAgIChfKSA9PiAhISFjdXJyZW50RXhwYW5kZWRJZHMuaW5jbHVkZXMoZS5pZC50b1N0cmluZygpKVxuICAgICk7XG5cbiAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgIG5ld0V4cGFuZGVkSWRzPy5wdXNoKGUuaWQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgbmV3RXhwYW5kZWRJZHM/LnNvcnQoKTtcblxuICAgIGNvbnN0IG5ld0V4cGFuZGVkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBuZXdFeHBhbmRlZElkcy5tYXAoKHgpID0+IG5ld0V4cGFuZGVkS2V5cy5wdXNoKHgudG9TdHJpbmcoKSkpO1xuXG4gICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQubmV4dCh7XG4gICAgICAuLi50aGlzLnRvcGljVHJlZVNlcnZpY2Uuc3RhdHVzJC52YWx1ZSEsXG4gICAgICBleHBhbmRlZEtleXM6IG5ld0V4cGFuZGVkS2V5cyxcbiAgICB9KTtcbiAgfVxuXG4gIG9uSXRlbUNoZWNrKGU6IElBcnRpY2xlQ2F0ZWdvcnlUcmVlSXRlbSwgbmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1DbGljaz8uZW1pdChlKTtcbiAgICBpZiAodGhpcy5hY2Nlc3Nvck1vZGUgIT09IEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQ0hFQ0tFRCkgcmV0dXJuO1xuXG4gICAgLy8gV2UgaGF2ZSB0aGlzIHZhciB0byBob2xkIG5vZGVzIHRoYXQgYXJlIGJlaW5nIGNoYW5nZWRcbiAgICBsZXQgdG9nZ2xlZElkczogbnVtYmVyW107XG4gICAgLy8gV2Ugc2hvdWxkIGNhbGN1bGF0ZSBhIG5ldyBzdGF0ZSBpbnRvIHRoaXMgdmFyOiBcbiAgICBjb25zdCBuZXdDaGVja2VkSWRzOiBudW1iZXJbXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jaGVja2VkSWRzKSk7XG5cbiAgICAvLyBXZSB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciB0b2dnbGVkSWRzIGNoYW5nZWRcbiAgICBjb25zdCBjaGFuZ2VWYWx1ZSA9ICgpID0+IHtcblxuICAgICAgLy8gSWYgbmV3VmFsdWUgPT09IHRydWUsIHdlIHdpbGwgZGlzY3RpbnRseSBwdXNoIGNoYW5nZWQgaWRzIHRvIHRoZSBzdGF0ZVxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIHdpbGwgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgc3RhdGVcbiAgICAgIGlmICghIW5ld1ZhbHVlKSB7XG4gICAgICAgIHRvZ2dsZWRJZHMubWFwKHggPT4ge1xuICAgICAgICAgIGlmICghISFuZXdDaGVja2VkSWRzLmluY2x1ZGVzKHgpKSB7XG4gICAgICAgICAgICBuZXdDaGVja2VkSWRzLnB1c2goeCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAvLyBUaGVuIGFzaWduIHRoZSBzdGF0ZSB0byB0aGUgbmV3Q2hlY2tlZElkc1xuICAgICAgICB0aGlzLmNoZWNrZWRJZHMgPSBuZXdDaGVja2VkSWRzO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBuZXdDaGVja2VkSWRzLmZpbHRlcih4ID0+ICEhIXRvZ2dsZWRJZHMuaW5jbHVkZXMoeCkpXG4gICAgICAgIC8vIFRoZW4gYXNpZ24gdGhlIHN0YXRlIHRvIHRoZSBmaWx0ZXJcbiAgICAgICAgdGhpcy5jaGVja2VkSWRzID0gZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciB0aGUgY2FzZXMgb2YgaWYvZWxzZSwgbWFrZSB0aGUgY29udHJvbCBjaGFuZ2Ugd2l0aCBvbkNoYW5nZVxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2hlY2tlZElkcztcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jaGVja2VkSWRzKTtcbiAgICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qIHN0YXJ0OiBUSElTIENPREUgU0NPUEUgY2FsY3VsYXRlcyB0b2dnbGVkSWRzICovXG4gICAgaWYgKHRoaXMuY2hlY2tJbmhlcml0YW5jZSkge1xuICAgICAgLy8gSWYgdHJ1ZSwgYWxsIHRoZSBuZXN0ZWQgaXRlbXMgd2lsbCBiZSBjaGVja2VkL3VuY2hlY2tlZFxuICAgICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlXG4gICAgICAgIC5uZXN0ZWRUb2dnbGVDaGVjayhlLCBuZXdWYWx1ZSlcbiAgICAgICAgLnRoZW4oKHgpID0+IHtcblxuICAgICAgICAgIC8vIFRoZSBpZHMgaGF2ZSBiZWVuIGNoYW5nZWRcbiAgICAgICAgICB0b2dnbGVkSWRzID0geDtcblxuICAgICAgICAgIC8vIE5vdyB0b2dnbGVkSWRzIHdlcmUgc2V0LiBXZSBjYWxsIHRoZSBmdW5jdGlvbiB3ZSBkZWNsYXJlZFxuICAgICAgICAgIGNoYW5nZVZhbHVlKCk7XG5cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCh4OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHgpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3RoZXJ3aXNlIHdlIHNpbXBseSB0b2dnbGUgY2hlY2sgZm9yIGN1cnJlbnQgaXRlbSBvbmx5XG4gICAgICB0b2dnbGVkSWRzID0gW2UuaWRdO1xuXG4gICAgICAvLyBOb3cgdG9nZ2xlZElkcyB3ZXJlIHNldC4gV2UgY2FsbCB0aGUgZnVuY3Rpb24gd2UgZGVjbGFyZWRcbiAgICAgIGNoYW5nZVZhbHVlKCk7XG5cbiAgICB9XG4gICAgLyogZW5kOiBUSElTIENPREUgU0NPUEUgY2FsY3VsYXRlcyB0b2dnbGVkSWRzICovXG5cbiAgICAvLyBUaGF0IGlzLiBIYXBweSBkZWJ1Z2dpbmchXG5cbiAgfVxuXG4gIG9uQ2hlY2tJbmNsdWRlRGlzc29sdmVkQ2hhbmdlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc29sZS5sb2coXCJvbkNoZWNrSW5jbHVkZURpc3NvbHZlZENoYW5nZVwiLCB2YWx1ZSk7XG4gIH1cblxuICBvbkNoZWNrSW5oZXJpdGFuY2VDaGFuZ2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnRvcGljVHJlZVNlcnZpY2Uuc3RhdHVzJC5uZXh0KHtcbiAgICAgIC4uLnRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLnZhbHVlISxcbiAgICAgIGNoZWNrSW5oZXJpdGFuY2U6IHZhbHVlLFxuICAgIH0pO1xuICB9XG5cbiAgb25PYmplY3RDbGljayhlOiBJQXJ0aWNsZUNhdGVnb3J5VHJlZUl0ZW0sIGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIC8vIHJlbW92ZSBoaWdobGlnaHQgY2xhc3NcbiAgICAvLyBUTyBET1xuXG4gICAgaWYgKCEhZS5wcm90ZWN0ZWQpIHJldHVybjtcblxuICAgIHRoaXMuaXRlbUNsaWNrPy5lbWl0KGUpO1xuXG4gICAgaWYgKHRoaXMuYWNjZXNzb3JNb2RlID09PSBFbnVtQ29yZUFydGljbGVDYXRlZ29yeVRyZWVhQWNjZXNzb3JNb2RlLkNIRUNLRUQpIHJldHVybjtcbiAgICBsZXQgYWN0aXZlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgdGhpcy5yZWN1cnNpdmVTZXJ2aWNlLm5lc3RlZFJlc2V0QWN0aXZlKHRoaXMuZGF0YSwgZmFsc2UpLnRoZW4oZmFsc2VBbGwgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJmYWxzZUFsbFwiLCBmYWxzZUFsbClcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5hY2Nlc3Nvck1vZGUgPT09XG4gICAgICAgIEVudW1Db3JlQXJ0aWNsZUNhdGVnb3J5VHJlZWFBY2Nlc3Nvck1vZGUuQUNUSVZBVEVEX0lOSEVSSVRBTkNFIHx8ICF0aGlzLmFjY2Vzc29yTW9kZVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRydWUsIGFsbCB0aGUgbmVzdGVkIGl0ZW1zIHdpbGwgYmUgYWN0aXZlLCB0aGUgb3RoZXJzIGFyZSBpbmFjdGl2ZVxuICAgICAgICB0aGlzLnJlY3Vyc2l2ZVNlcnZpY2VcbiAgICAgICAgICAubmVzdGVkUmVzZXRBY3RpdmUoZSwgdHJ1ZSlcbiAgICAgICAgICAudGhlbigoeCkgPT4ge1xuICAgICAgICAgICAgYWN0aXZlSWRzID0geDtcbiAgICAgICAgICAgIGFjdGl2ZUlkcy5zb3J0KCk7XG4gICAgICAgICAgICBjb25zdCBuZXdBY3RpdmVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgICAgYWN0aXZlSWRzLm1hcCgoeCkgPT4gbmV3QWN0aXZlS2V5cy5wdXNoKHgudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLnN0YXR1cyQubmV4dCh7XG4gICAgICAgICAgICAgIC4uLnRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLnZhbHVlISxcbiAgICAgICAgICAgICAgYWN0aXZlS2V5czogbmV3QWN0aXZlS2V5cyxcbiAgICAgICAgICAgICAgc2VsZWN0ZWRLZXk6IGUuaWQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlkcyA9IGFjdGl2ZUlkcztcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuYWN0aXZlSWRzKTtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoYWN0aXZlSWRzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoeDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHgpO1xuICAgICAgICAgIH0pO1xuICBcbiAgXG4gICAgICB9IGVsc2Uge1xuICBcbiAgICAgICAgLy8gQUNUSVZBVEVEX1NJTkdMRVxuICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugc2ltcGx5IHNldCBjdXJyZW50IGl0ZW0gdG8gYmUgYWN0aXZlIG9ubHlcbiAgICAgICAgYWN0aXZlSWRzID0gW2UuaWRdO1xuICAgICAgICB0aGlzLmFjdGl2ZUlkcyA9IGFjdGl2ZUlkcztcbiAgXG4gICAgICAgIHRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLm5leHQoe1xuICAgICAgICAgIC4uLnRoaXMudG9waWNUcmVlU2VydmljZS5zdGF0dXMkLnZhbHVlISxcbiAgICAgICAgICBhY3RpdmVLZXlzOiBbZS5pZC50b1N0cmluZygpXSxcbiAgICAgICAgICBzZWxlY3RlZEtleTogZS5pZC50b1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgXG4gICAgICAgIHRoaXMub25DaGFuZ2UoYWN0aXZlSWRzKTtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2ZW50O1xuXG4gICAgaWYgKGRldGFpbCA9PT0gMikge1xuICAgICAgY29uc29sZS5sb2coJ1RoaXMgd2FzIGEgZGJsY2xpY2snKTtcbiAgICAgIHRoaXMuaXRlbURvdWJsZUNsaWNrLmVtaXQoZSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBlO1xuXG4gIH1cblxuICBvblNlYXJjaENoYW5nZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaCQubmV4dCh0ZXh0KTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcIm5nQWZ0ZXJDb250ZW50SW5pdFwiKVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLm1hcCgoeCkgPT4geD8udW5zdWJzY3JpYmUoKSk7XG5cbiAgICBpZiAoISF0aGlzLmluc3RhbmNlTnVtYmVyKSB7XG4gICAgICBjb25zdCB0cnlUb0ZpbmQgPSB0aGlzLnRvcGljVHJlZVNlcnZpY2UuaW5zdGFuY2VzLmZpbHRlcihcbiAgICAgICAgKHgpID0+IHguaW5zdGFuY2VOdW1iZXIgPT09IHRoaXMuaW5zdGFuY2VOdW1iZXJcbiAgICAgICk7XG5cbiAgICAgIGlmICghIXRyeVRvRmluZC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2VzID0gdGhpcy50b3BpY1RyZWVTZXJ2aWNlLmluc3RhbmNlcy5maWx0ZXIoXG4gICAgICAgICAgKHgpID0+IHguaW5zdGFuY2VOdW1iZXIgIT09IHRoaXMuaW5zdGFuY2VOdW1iZXJcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50b3BpY1RyZWVTZXJ2aWNlLmluc3RhbmNlcyA9IG5ld0luc3RhbmNlcztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgI2NvbnRhaW5lciBjbGFzcz1cImNvcmUtdG9waWMtdHJlZS1jb250YWluZXJcIiBbY2xhc3MuZnVsbC13aWR0aF09XCIhIWZ1bGxXaWR0aE1vZGVcIiAqbmdJZj1cIiEhZGF0YVwiXG4gICAgW25nU3R5bGVdPVwie1xuICAgICAgICBwb3NpdGlvbiA6ICdyZWxhdGl2ZScsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogaGVpZ2h0ICsgJ3B4J1xuICAgIH1cIj5cbiAgICA8ZGl2ICNkaXNwbGF5Q29udGVudCBjbGFzcz1cImN1c3RvbS1vcmctdHJlZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29yZS1vcmctdHJlZS1oZWFkZXIgZC1mbGV4LWJldHdlZW5cIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGU6IGxhbmdcIiBbY2xhc3MuZnVsbC13aWR0aF09XCIhIWZ1bGxXaWR0aE1vZGVcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8bmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCAtIGxheW91dFNlcnZpY2UuY29yZU9yZ1RyZWVUb3BIZWlnaHQgLSBsYXlvdXRTZXJ2aWNlLmNvcmVPcmdUcmVlQm90dG9tSGVpZ2h0ICsgJ3B4J1xuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8Y29yZS1sb2FkaW5nLXN1cmZhY2UgW2xvYWRpbmddPVwibG9hZGluZ1wiIFtoZWlnaHRdPVwic2Nyb2xsQ29udGFpbmVySGVpZ2h0XCI+PC9jb3JlLWxvYWRpbmctc3VyZmFjZT5cbiAgICAgICAgICAgICAgICBAZm9yIChyb290IG9mIGRhdGE7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInJvb3RcIiBbY2xhc3MuY29sbGFwc2VkXT1cIiEhIXJvb3QudHJlZSRFeHBhbmRlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbTsgY29udGV4dDogeyBjb250ZXh0OiByb290IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnMHB4JyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMHB4JyxcbiAgICAgICAgICAgICAgICByaWdodDogJzBweCcsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBsYXlvdXRTZXJ2aWNlLmNvcmVQYWdpbmF0aW9uSGVpZ2h0ICsgJ3B4JyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogbGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmcgKyAncHgnLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogbGF5b3V0U2VydmljZS5iYXNpY1NwYWNpbmcgKyAncHgnLFxuICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGxheW91dFNlcnZpY2UuY29yZVBhZ2luYXRpb25IZWlnaHQgKyAncHgnLFxuICAgICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgW25nU3R5bGVdPVwie1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGxheW91dFNlcnZpY2UuY29yZVBhZ2luYXRpb25IZWlnaHQgKyAncHgnLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJ1xuICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNvcmUtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJzaG93RGlzc29sdmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoZWNrSW5jbHVkZURpc3NvbHZlZENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVUkuQ09SRV9PUkdfVFJFRS5TSE9XX09VVERBVEVEX1VOSVRTX0FCQlJFVklBVEVEJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1VJLkNPUkVfT1JHX1RSRUUuU0hPV19PVVREQVRFRF9VTklUUydcIiB0b29sdGlwUG9zaXRpb249XCJhYm92ZVwiPjwvY29yZS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2staW5oZXJpdGFuY2Utd3JhcHBlclwiICpuZ0lmPVwiYWNjZXNzb3JNb2RlID09PSAnQ0hFQ0tFRCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb3JlLWNoZWNrYm94ICpuZ0lmPVwic2hvd0NoZWNrSW5oZXJpdGFuY2VcIiBbKG5nTW9kZWwpXT1cImNoZWNrSW5oZXJpdGFuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hlY2tJbmhlcml0YW5jZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCInVUkuQ09SRV9PUkdfVFJFRS5DSEVDS19JTkhFUklUQU5DRSdcIj48L2NvcmUtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaXRlbSBsZXQtY29udGV4dD1cImNvbnRleHRcIiBsZXQtaWQ9XCJjb250ZXh0LmlkXCIgbGV0LXRpdGxlPVwiY29udGV4dC50cmVlJFRpdGxlXCJcbiAgICAgICAgICAgICAgICBsZXQtaGlnaGxpZ2h0ZWQ9XCJjb250ZXh0LnRyZWUkSGlnaGxpZ2h0ZWRcIiBsZXQtaGFzQ2hpbGRyZW49XCJjb250ZXh0LnRyZWUkSGFzQ2hpbGRyZW5cIlxuICAgICAgICAgICAgICAgIGxldC1oYXNBY3RpdmVDaGlsZHJlbj1cImNvbnRleHQudHJlZSRIYXNBY3RpdmVDaGlsZHJlblwiIGxldC1jaGlsZHJlbj1cImNvbnRleHQudHJlZSRDaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgbGV0LWV4cGFuZGVkPVwiY29udGV4dC50cmVlJEV4cGFuZGVkXCIgbGV0LWlzQWN0aXZlPVwiY29udGV4dC5pc0FjdGl2ZVwiIGxldC1hY3RpdmU9XCJjb250ZXh0LnRyZWUkQWN0aXZlXCJcbiAgICAgICAgICAgICAgICBsZXQtY2hlY2tlZD1cImNvbnRleHQudHJlZSRDaGVja2VkXCIgbGV0LXByb3RlY3RlZD1cImNvbnRleHQucHJvdGVjdGVkXCI+XG5cbiAgICAgICAgICAgICAgICBAaWYgKCghc2hvd0Rpc3NvbHZlZCAmJiAhIWlzQWN0aXZlKSB8fCAoISFzaG93RGlzc29sdmVkKSkge1xuICAgICAgICAgICAgICAgIDxsaSBbY2xhc3MuaGFzLWNoaWxkcmVuXT1cIiEhaGFzQ2hpbGRyZW5cIiBbY2xhc3MuY29sbGFwc2VkXT1cIiEhaGFzQ2hpbGRyZW4gJiYgISEhZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKGNsaWNrKT1cIm9uT2JqZWN0Q2xpY2soY29udGV4dCwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoISFzaG93RGlzc29sdmVkICYmICEhaGFzQ2hpbGRyZW4pIHx8ICghc2hvd0Rpc3NvbHZlZCAmJiAhIWhhc0FjdGl2ZUNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJleHBhbmQtdG9nZ2xlciBmZWF0aGVyLWNoZXZyb24tZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRXhwYW5kVG9nZ2xlckNsaWNrKGNvbnRleHQsICRldmVudClcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGFjY2Vzc29yTW9kZSA9PT0gJ0NIRUNLRUQnICYmICEhIXByb3RlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGNvcmUtY2hlY2tib3ggKG9uQ2xpY2spPVwib25JdGVtQ2hlY2soY29udGV4dCwgJGV2ZW50KVwiIFtpbnB1dFZhbHVlXT1cImNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPjwvY29yZS1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvYmplY3QgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVJZHMuaW5jbHVkZXMoaWQpXCIgW2NsYXNzLmhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZGlzc29sdmVkXT1cIiFpc0FjdGl2ZVwiIFtjbGFzcy5wcm90ZWN0ZWRdPVwicHJvdGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwVG9vbHRpcF09XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRpdGxlIHwgdHJhbnNsYXRlOiBsYW5nIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L29iamVjdD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICghIWlubGluZUV4dHJhVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbmxpbmVFeHRyYVRlbXBsYXRlUmVmOyBjb250ZXh0OiB7IGNvbnRleHQ6IGNvbnRleHQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8dWwgW2NsYXNzLmNvbGxhcHNlZF09XCIgISEhZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGNoaWxkIG9mIGNoaWxkcmVuOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFleHBhbmRlZCB8fCAhIWZ1bGxSZW5kZXJpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtOyBjb250ZXh0OiB7IGNvbnRleHQ6IGNoaWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG5cbjwvZGl2PiJdfQ==
|