ngx-bimplus-components 0.0.84-draggable → 0.0.84-draggable-2
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/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.mjs +2 -2
- package/esm2022/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.mjs +2 -2
- package/esm2022/lib/components/bimplus-floating-bar-project-navigator/bimplus-floating-bar-project-navigator.component.mjs +3 -3
- package/esm2022/lib/services/layout-manager.service.mjs +32 -15
- package/fesm2022/ngx-bimplus-components.mjs +35 -18
- package/fesm2022/ngx-bimplus-components.mjs.map +1 -1
- package/lib/components/bimplus-floating-bar-hide-objects/bimplus-floating-bar-hide-objects.component.d.ts +3 -3
- package/lib/components/bimplus-floating-bar-isolation-objects/bimplus-floating-bar-isolation-objects.component.d.ts +3 -3
- package/lib/services/layout-manager.service.d.ts +2 -1
- package/package.json +1 -1
|
@@ -71,17 +71,18 @@ export class LayoutManagerService {
|
|
|
71
71
|
if (!config) {
|
|
72
72
|
return;
|
|
73
73
|
}
|
|
74
|
-
const
|
|
75
|
-
|
|
74
|
+
const parentElement = this._getDomParentElement(obj);
|
|
75
|
+
const internalElement = this._getDomInternalElement(obj, '');
|
|
76
|
+
if (!parentElement || !internalElement) {
|
|
76
77
|
return;
|
|
77
78
|
}
|
|
78
|
-
|
|
79
|
-
|
|
79
|
+
parentElement.style.left = (config.left) + 'px';
|
|
80
|
+
parentElement.style.top = (config.top) + 'px';
|
|
80
81
|
if (config.width && config.width > 0) {
|
|
81
|
-
|
|
82
|
+
internalElement.style.width = config.width + 'px';
|
|
82
83
|
}
|
|
83
84
|
if (config.height && config.height > 0) {
|
|
84
|
-
|
|
85
|
+
internalElement.style.height = config.height + 'px';
|
|
85
86
|
}
|
|
86
87
|
this.checkPosition(obj.id, "", undefined, 0, 0, true);
|
|
87
88
|
}
|
|
@@ -135,18 +136,31 @@ export class LayoutManagerService {
|
|
|
135
136
|
config[objId] = newItem;
|
|
136
137
|
this.localStorageService.setObject(this.CONFIG, config);
|
|
137
138
|
}
|
|
138
|
-
|
|
139
|
+
_getDomParentElement(item) {
|
|
140
|
+
const element = item.element?.nativeElement; //?.shadowRoot || item.element?.nativeElement;
|
|
141
|
+
if (!element) {
|
|
142
|
+
console.error('_getDomParentElement: missing element');
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return element;
|
|
146
|
+
}
|
|
147
|
+
_getDomInternalElement(item, selector) {
|
|
139
148
|
const element = item.element?.nativeElement?.shadowRoot || item.element?.nativeElement;
|
|
140
149
|
if (!element) {
|
|
141
|
-
console.error('
|
|
150
|
+
console.error('_getDomInternalElement: missing element');
|
|
142
151
|
return null;
|
|
143
152
|
}
|
|
144
153
|
const mySelector = selector && selector?.length > 0 ? selector : item.selector;
|
|
145
|
-
|
|
154
|
+
const retval = mySelector ? element.querySelector(mySelector) : element;
|
|
155
|
+
if (!retval) {
|
|
156
|
+
console.error(`_getDomInternalElement: selection of element ${element} failed with selector ${mySelector}`);
|
|
157
|
+
}
|
|
158
|
+
return retval;
|
|
146
159
|
}
|
|
147
160
|
_getElementRect(item, selector, parentRectangle) {
|
|
148
|
-
const selectedObj = this.
|
|
161
|
+
const selectedObj = this._getDomInternalElement(item, selector);
|
|
149
162
|
if (!selectedObj) {
|
|
163
|
+
console.error('_getElementRect: missing selected object');
|
|
150
164
|
return null;
|
|
151
165
|
}
|
|
152
166
|
const parentRect = parentRectangle || this.resizeObserverService.getParentAppRect();
|
|
@@ -155,6 +169,9 @@ export class LayoutManagerService {
|
|
|
155
169
|
return null;
|
|
156
170
|
}
|
|
157
171
|
const elementRect = selectedObj.getBoundingClientRect();
|
|
172
|
+
if (!elementRect) {
|
|
173
|
+
console.error('_getElementRect: missing bounding rect');
|
|
174
|
+
}
|
|
158
175
|
return elementRect;
|
|
159
176
|
}
|
|
160
177
|
// checks whether element or element with additional selection of subelement is placed within the give rectangle
|
|
@@ -170,11 +187,11 @@ export class LayoutManagerService {
|
|
|
170
187
|
const parentRect = parentRectangle || this.resizeObserverService.getParentAppRect();
|
|
171
188
|
const elementRect = this._getElementRect(e1, selector, parentRect);
|
|
172
189
|
if (!elementRect) {
|
|
173
|
-
console.error('checkPosition: missing
|
|
190
|
+
console.error('checkPosition: missing elementRect');
|
|
174
191
|
return { deltaX: 0, deltaY: 0 };
|
|
175
192
|
}
|
|
176
193
|
if (!elementRect?.width || !elementRect?.height) {
|
|
177
|
-
console.error('checkPosition:
|
|
194
|
+
console.error('checkPosition:element rect empty ');
|
|
178
195
|
return { deltaX: 0, deltaY: 0 };
|
|
179
196
|
}
|
|
180
197
|
let checkBoundaries = true;
|
|
@@ -201,7 +218,7 @@ export class LayoutManagerService {
|
|
|
201
218
|
this._translateRectangle(elementDOMRect, deltaX, deltaY);
|
|
202
219
|
}
|
|
203
220
|
}
|
|
204
|
-
const selectedElement = this.
|
|
221
|
+
const selectedElement = this._getDomParentElement(e1);
|
|
205
222
|
if (!selectedElement) {
|
|
206
223
|
return;
|
|
207
224
|
}
|
|
@@ -312,7 +329,7 @@ export class LayoutManagerService {
|
|
|
312
329
|
if (!item) {
|
|
313
330
|
return;
|
|
314
331
|
}
|
|
315
|
-
const element = this.
|
|
332
|
+
const element = this._getDomParentElement(item);
|
|
316
333
|
if (!element) {
|
|
317
334
|
return;
|
|
318
335
|
}
|
|
@@ -331,4 +348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImpo
|
|
|
331
348
|
providedIn: 'root'
|
|
332
349
|
}]
|
|
333
350
|
}], ctorParameters: () => [{ type: i1.ResizeObserverService }, { type: i2.LocalStorageService }] });
|
|
334
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy9sYXlvdXQtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlDdkMsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFvQixxQkFBMkMsRUFDM0MsbUJBQXdDO1FBRHhDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0Msd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUY1RCxxQkFBZ0IsR0FBeUMsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFBO1FBSTdGLG9CQUFlLEdBQXVCLEVBQUUsQ0FBQztRQUtqRCxXQUFNLEdBQVUscUJBQXFCLENBQUM7SUFObEMsQ0FBQztJQUdMLElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUlIOztrRkFFOEU7SUFDNUUsY0FBYyxDQUFDLEdBQWMsRUFBRSxFQUFTLEVBQUUsUUFBMkIsRUFBRSxnQkFBd0IsRUFBQyxPQUFjLEdBQUcsRUFBRSxNQUFhLEdBQUcsRUFBQyxRQUFlLENBQUMsRUFBRSxTQUFnQixDQUFDO1FBQ3JLLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBRyxNQUFNLEVBQUMsQ0FBQztnQkFDVCxVQUFVLEdBQUcsS0FB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QUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBQyxTQUFTLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsR0FBRyxFQUNiLFdBQVcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUEsQ0FBQyxFQUMxRCxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7K0dBMVZVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemUtb2JzZXJ2ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UgfSAgIGZyb20gJy4vbG9jYWwtc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbi8vaW1wb3J0IHsgSXRlbXNMaXN0IH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QvbGliL2l0ZW1zLWxpc3QnO1xyXG4vL2ltcG9ydCB7IE5vdEZvdW5kRXJyb3IgfSBmcm9tICdyeGpzJztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE1hbmFnZXJJdGVtIHtcclxuICBlbGVtZW50OkVsZW1lbnRSZWY7XHJcbiAgaWQ6IHN0cmluZztcclxuICBzZWxlY3Rvcj86c3RyaW5nO1xyXG4gIGlzQ29sbGFwc2VkOmJvb2xlYW47XHJcbiAgcmVtZW1iZXJQb3NpdGlvbj86Ym9vbGVhblxyXG4gIGxlZnQ/OiBudW1iZXI7XHJcbiAgdG9wPzpudW1iZXI7XHJcbiAgd2lkdGg/Om51bWJlcjtcclxuICBoZWlnaHQ/Om51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBpc0NvbGxhcHNlZDpib29sZWFuOyAgXHJcbiAgbGVmdD86IG51bWJlcjtcclxuICB0b3A/Om51bWJlcjsgIFxyXG4gIHdpZHRoPzpudW1iZXI7XHJcbiAgaGVpZ2h0PzpudW1iZXI7XHJcbn1cclxuXHJcblxyXG5pbnRlcmZhY2UgTGF5b3V0TWFuYWdlckNvbmZpZyB7XHJcbiAgW2tleTpzdHJpbmddOiBMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbVxyXG59XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExheW91dE1hbmFnZXJTZXJ2aWNlIHtcclxuXHJcbiAgcmVnaXN0ZXJlZEl0ZW1zJDogQmVoYXZpb3JTdWJqZWN0PExheW91dE1hbmFnZXJJdGVtW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYXlvdXRNYW5hZ2VySXRlbVtdPihbXSlcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlc2l6ZU9ic2VydmVyU2VydmljZTpSZXNpemVPYnNlcnZlclNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlIDpMb2NhbFN0b3JhZ2VTZXJ2aWNlIFxyXG4gICkgeyB9XHJcbiAgcHJpdmF0ZSByZWdpc3RlcmVkSXRlbXM6TGF5b3V0TWFuYWdlckl0ZW1bXSA9IFtdO1xyXG4gIFxyXG4gIGdldCBSZWdpc3RlcmVkSXRlbXMoKTogTGF5b3V0TWFuYWdlckl0ZW1bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlcmVkSXRlbXM7XHJcbiAgfVxyXG4gIENPTkZJRzpzdHJpbmcgPSAnbGF5b3V0TWFuYWdlckNvbmZpZyc7XHJcblxyXG4gIFxyXG4vKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogcmVnaXN0ZXIgb2JqZWN0LiBvYmplY3QgbXVzdCBoYXZlIHVuaXF1ZSBpZCBvciBlbGVtZW50SWRcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgcmVnaXN0ZXJPYmplY3Qob2JqOkVsZW1lbnRSZWYsIGlkOnN0cmluZywgc2VsZWN0b3I6c3RyaW5nIHwgdW5kZWZpbmVkLCByZW1lbWJlclBvc2l0aW9uOmJvb2xlYW4sbGVmdDpudW1iZXIgPSAxMDAsIHRvcDpudW1iZXIgPSAxMDAsd2lkdGg6bnVtYmVyID0gMCwgaGVpZ2h0Om51bWJlciA9IDApIHtcclxuICAgIGxldCBmb3VuZEluZGV4ID0gLTE7XHJcbiAgICBpZih0aGlzLnJlZ2lzdGVyZWRJdGVtcy5zb21lKChpdGVtLGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmV0dmFsID0gaXRlbS5pZCA9PT0gaWQ7XHJcbiAgICAgICAgaWYocmV0dmFsKXtcclxuICAgICAgICAgIGZvdW5kSW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgfSkpe1xyXG4gICAgICBpZihmb3VuZEluZGV4ID49IDApe1xyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZEl0ZW1zLnNwbGljZShmb3VuZEluZGV4LDEpO1xyXG4gICAgICB9ICAgICAgXHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdJdGVtOiBMYXlvdXRNYW5hZ2VySXRlbSA9IHsgXHJcbiAgICAgIGVsZW1lbnQ6b2JqLFxyXG4gICAgICBpZDppZCxcclxuICAgICAgc2VsZWN0b3I6c2VsZWN0b3IsXHJcbiAgICAgIHJlbWVtYmVyUG9zaXRpb246ISFyZW1lbWJlclBvc2l0aW9uLFxyXG4gICAgICBsZWZ0OmxlZnQsXHJcbiAgICAgIHRvcDp0b3AsXHJcbiAgICAgIHdpZHRoOndpZHRoLFxyXG4gICAgICBoZWlnaHQ6aGVpZ2h0LFxyXG4gICAgICBpc0NvbGxhcHNlZDogZmFsc2UgICAgXHJcbiAgICAgfTtcclxuXHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcy5wdXNoKG5ld0l0ZW0pO1xyXG4gICAgdGhpcy5yZWdpc3RlcmVkSXRlbXMkLm5leHQodGhpcy5yZWdpc3RlcmVkSXRlbXMpO1xyXG4gICAgdGhpcy5faW5pdE9iamVjdChuZXdJdGVtKTtcclxuICB9XHJcbiAgXHJcbiAgX2luaXRPYmplY3Qob2JqOkxheW91dE1hbmFnZXJJdGVtKXtcclxuICAgIHRoaXMuX2FkanVzdE9iamVjdEJ5Q29uZmlnKG9iaik7XHJcbiAgICB0aGlzLl9hZGp1c3RPYmplY3RCeVdpbmRvd1NpemUob2JqKTtcclxuICAgIFxyXG4gIH1cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZ2V0IG9iamVjdCBjb25maWd1cmF0aW9uXHJcbiAgKiByZXR1cm4ge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWd0aH1cclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2dldE9iamVjdENvbmZpZyhvYmo6TGF5b3V0TWFuYWdlckl0ZW0pOkxheW91dE1hbmFnZXJDb25maWdJdGVtfG51bGwge1xyXG4gICAgaWYoIW9iail7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLkNPTkZJRyk7XHJcbiAgICBjb25zdCAgY29uZmlnID0gY29uZmlnVmFsdWUgPyBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKSA6IHt9O1xyXG4gICAgY29uc3QgIG9iaklkID0gb2JqLmlkIDtcclxuICAgIGxldCBjb25maWdPYmogPSBjb25maWdbb2JqSWRdO1xyXG4gICAgaWYoIWNvbmZpZ09iaikge1xyXG4gICAgICBjb25maWdPYmogPSB7aWQ6b2JqSWQsbGVmdDpvYmoubGVmdCx0b3A6b2JqLnRvcCx3aWR0aDpvYmoud2lkdGgsaGVpZ2h0Om9iai5oZWlnaHR9OyAgICAgICAgXHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZmlnT2JqO1xyXG4gIH1cclxuXHJcbiAgX2FkanVzdE9iamVjdEJ5Q29uZmlnKG9iajpMYXlvdXRNYW5hZ2VySXRlbSl7XHJcbiAgICBjb25zdCBjb25maWc6TGF5b3V0TWFuYWdlckNvbmZpZ0l0ZW18bnVsbCA9IHRoaXMuX2dldE9iamVjdENvbmZpZyhvYmopO1xyXG4gICAgaWYoIWNvbmZpZyl7XHJcbiAgICAgIHJldHVybjsgICAgICBcclxuICAgIH1cclxuICAgIGNvbnN0ICBlbGVtZW50ID0gdGhpcy5fZ2V0RG9tRWxlbWVudChvYmosJycpO1xyXG4gICAgaWYoIWVsZW1lbnQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSAoY29uZmlnLmxlZnQpICsgJ3B4JztcclxuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gKGNvbmZpZy50b3ApICsgJ3B4JztcclxuICAgIGlmKGNvbmZpZy53aWR0aCAmJiBjb25maWcud2lkdGggPiAwKXtcclxuICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGNvbmZpZy53aWR0aCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZihjb25maWcuaGVpZ2h0ICYmIGNvbmZpZy5oZWlnaHQgPiAwKXtcclxuICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjb25maWcuaGVpZ2h0ICsgJ3B4JztcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKG9iai5pZCxcIlwiLHVuZGVmaW5lZCwwLDAsdHJ1ZSk7ICAgIFxyXG4gIH1cclxuXHJcbiAgX2FkanVzdE9iamVjdEJ5V2luZG93U2l6ZShvYmo6TGF5b3V0TWFuYWdlckl0ZW0pe1xyXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKG9iai5pZCxcIlwiLHVuZGVmaW5lZCwwLDAsdHJ1ZSk7ICBcclxuICB9XHJcbiAgXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIHJldHVybnMgb2JqZWN0ICByZWdpc3RlcmVkIGluIHRoZSBsYXlvdXQgbWFuYWdlciBcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgZ2V0SXRlbShpZDogc3RyaW5nICk6TGF5b3V0TWFuYWdlckl0ZW18bnVsbCB7ICAgXHJcbiAgICBsZXQgZm91bmRJdGVtOkxheW91dE1hbmFnZXJJdGVtfG51bGwgPSBudWxsO1xyXG4gICAgdGhpcy5yZWdpc3RlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+e1xyXG4gICAgICBpZihpdGVtLmlkID09PSBpZCl7XHJcbiAgICAgICAgZm91bmRJdGVtID0gaXRlbTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZm91bmRJdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIHNldCBvYmplY3QgY29uZmlndXJhdGlvblxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBfc2V0T2JqZWN0Q29uZmlnKG9iajpMYXlvdXRNYW5hZ2VySXRlbSwgbGVmdDpudW1iZXIsdG9wOm51bWJlcix3aWR0aDpudW1iZXIsaGVpZ2h0Om51bWJlcikge1xyXG4gICAgY29uc3Qgb2JqSWQgPSBvYmo/LmlkIDtcclxuICAgIGlmICghb2JqSWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGNvbmZpZyA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXRPYmplY3QodGhpcy5DT05GSUcpIGFzIExheW91dE1hbmFnZXJDb25maWc7XHJcbiAgICAvL2xldCBjb25maWcgPSBjb25maWdWYWx1ZSAmJiBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKSBhcyBMYXlvdXRNYW5hZ2VyQ29uZmlnO1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgY29uZmlnID0ge307XHJcbiAgICB9XHJcbiAgICBpZihvYmo/LmlzQ29sbGFwc2VkKXsgIC8vIGRvIG5vdCBvdmVydGFrZSBjb2xsYXBzZWQgc2l6ZVxyXG4gICAgICBpZiAoIWNvbmZpZ1tvYmpJZF0pIHsgICAgICAgIFxyXG4gICAgICAgIGNvbmZpZ1tvYmpJZF0gPSBvYmo7XHJcbiAgICAgIH1cclxuICAgICAgY29uZmlnW29iaklkXS5sZWZ0ID0gbGVmdDtcclxuICAgICAgY29uZmlnW29iaklkXS50b3AgID0gdG9wO1xyXG4gICAgICAvL2NvbmZpZ1tvYmpJZF0ud2lkdGggPSB3aWR0aDtcclxuICAgICAgLy9jb25maWdbb2JqSWRdLmhlaWdodCA9IGhlaWdodCA7XHJcbiAgICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5zZXRPYmplY3QodGhpcy5DT05GSUcsIGNvbmZpZyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBuZXdJdGVtIDpMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbSA9IHtcclxuICAgICAgaWQ6IG9iaklkLFxyXG4gICAgICBpc0NvbGxhcHNlZDogZmFsc2UsXHJcbiAgICAgIGxlZnQ6IGxlZnQsXHJcbiAgICAgIHRvcDogdG9wLFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0XHJcbiAgICB9O1xyXG4gICAgY29uZmlnW29iaklkXSA9IG5ld0l0ZW07XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0T2JqZWN0KHRoaXMuQ09ORklHLGNvbmZpZyk7XHJcbiAgfVxyXG4gIF9nZXREb21FbGVtZW50KGl0ZW06TGF5b3V0TWFuYWdlckl0ZW0sc2VsZWN0b3I6c3RyaW5nIHwgdW5kZWZpbmVkICk6SFRNTEVsZW1lbnR8bnVsbCB7XHJcbiAgICBjb25zdCBlbGVtZW50OkhUTUxFbGVtZW50ID0gaXRlbS5lbGVtZW50Py5uYXRpdmVFbGVtZW50Py5zaGFkb3dSb290IHx8IGl0ZW0uZWxlbWVudD8ubmF0aXZlRWxlbWVudDsgICAgXHJcbiAgICBpZighZWxlbWVudCl7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19nZXREb21FbGVtZW50OiBtaXNzaW5nIGVsZW1lbnQnKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBteVNlbGVjdG9yID1zZWxlY3RvciAmJiBzZWxlY3Rvcj8ubGVuZ3RoID4gMCA/c2VsZWN0b3I6aXRlbS5zZWxlY3RvcjsgICBcclxuICAgIHJldHVybiBteVNlbGVjdG9yP2VsZW1lbnQucXVlcnlTZWxlY3RvcihteVNlbGVjdG9yKTplbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgX2dldEVsZW1lbnRSZWN0KGl0ZW06TGF5b3V0TWFuYWdlckl0ZW0sc2VsZWN0b3I6c3RyaW5nIHwgdW5kZWZpbmVkICxwYXJlbnRSZWN0YW5nbGU6RE9NUmVjdCB8dW5kZWZpbmVkICk6RE9NUmVjdCB8IG51bGx7XHJcbiAgICBjb25zdCBzZWxlY3RlZE9iaiA6IEhUTUxFbGVtZW50fG51bGwgPSB0aGlzLl9nZXREb21FbGVtZW50KGl0ZW0sc2VsZWN0b3IpO1xyXG4gICAgaWYoIXNlbGVjdGVkT2JqKXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGFyZW50UmVjdDpET01SZWN0ID0gIHBhcmVudFJlY3RhbmdsZSB8fCAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2UuZ2V0UGFyZW50QXBwUmVjdCgpO1xyXG4gICAgaWYoICFwYXJlbnRSZWN0IHx8ICBwYXJlbnRSZWN0Py53aWR0aDw9MSB8fCBwYXJlbnRSZWN0Py5oZWlnaHQ8PTEgKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19nZXRFbGVtZW50UmVjdDogbWlzc2luZyBwYXJlbnQgcmVjdCcpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0ICBlbGVtZW50UmVjdDpET01SZWN0fG51bGwgPSBzZWxlY3RlZE9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHJldHVybiBlbGVtZW50UmVjdDtcclxuICB9XHJcblxyXG4gIC8vIGNoZWNrcyB3aGV0aGVyIGVsZW1lbnQgb3IgZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgc2VsZWN0aW9uIG9mIHN1YmVsZW1lbnQgaXMgcGxhY2VkIHdpdGhpbiB0aGUgZ2l2ZSByZWN0YW5nbGVcclxuICAvLyBpZiBub3QgdGhlbiBjYWxjdWxhdGVzIHRoZSBvZmZzZXQgdG8gYmUgbW92ZWQgdG8gZml0IGluXHJcbiAgY2hlY2tQb3NpdGlvbihpZDpzdHJpbmcsc2VsZWN0b3I6c3RyaW5nLHBhcmVudFJlY3RhbmdsZTpET01SZWN0fHVuZGVmaW5lZCAsZGVsdGFYOm51bWJlcixkZWx0YVk6bnVtYmVyLGZvcmNlQ2hlY2s6Ym9vbGVhbiA9IGZhbHNlKXtcclxuICAgIGlmKCFpZCl7XHJcbiAgICAgIHJldHVybiB7ZGVsdGFYOjAsZGVsdGFZOjB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZTEgPSB0aGlzLmdldEl0ZW0oaWQpO1xyXG4gICAgaWYoIWUxKXtcclxuICAgICAgcmV0dXJuIHtkZWx0YVg6MCxkZWx0YVk6MH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnRSZWN0OkRPTVJlY3QgPSAgcGFyZW50UmVjdGFuZ2xlIHx8ICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5nZXRQYXJlbnRBcHBSZWN0KCk7XHJcbiAgICBjb25zdCBlbGVtZW50UmVjdDpET01SZWN0IHwgbnVsbCA9IHRoaXMuX2dldEVsZW1lbnRSZWN0KGUxLHNlbGVjdG9yLHBhcmVudFJlY3QpO1xyXG4gICAgaWYoIWVsZW1lbnRSZWN0KXtcclxuICAgICAgY29uc29sZS5lcnJvcignY2hlY2tQb3NpdGlvbjogbWlzc2luZyBlbGVtZW50Jyk7XHJcbiAgICAgIHJldHVybiB7ZGVsdGFYOjAsZGVsdGFZOjB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZighZWxlbWVudFJlY3Q/LndpZHRoIHx8ICFlbGVtZW50UmVjdD8uaGVpZ2h0KXtcclxuICAgICAgY29uc29sZS5lcnJvcignY2hlY2tQb3NpdGlvbjptaXNzaW5nIGVsZW1lbnQgcmVjdCcpO1xyXG4gICAgICByZXR1cm4ge2RlbHRhWDowLGRlbHRhWTowfTtcclxuICAgIH0gXHJcbiAgICBsZXQgY2hlY2tCb3VuZGFyaWVzID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMuX2lzSW5zaWRlUmVjdChlbGVtZW50UmVjdCwgcGFyZW50UmVjdCkgPT09IGZhbHNlICYmICFmb3JjZUNoZWNrKSB7XHJcbiAgICAgIGNoZWNrQm91bmRhcmllcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gXHJcbiAgICAvLyBjb3B5IG9mIHJlYWwgZWxlbWVudCByZWN0YW5nbGUgdG8gcGVyZm9ybSBjYWxjdWxhdGlvbiBvdmVyIGJlZm9yZSBzZXQgdG8gdGhlIHJlYWwgZWxlbWVudFxyXG4gICAgY29uc3QgZWxlbWVudERPTVJlY3QgPSBET01SZWN0LmZyb21SZWN0KGVsZW1lbnRSZWN0KTtcclxuXHJcbiAgICAvL3NldCB0aGUgZWxlbWVudCByZWN0YW5nbGUgYnkgZGVsdGFzXHJcbiAgICB0aGlzLl90cmFuc2xhdGVSZWN0YW5nbGUoZWxlbWVudERPTVJlY3QsIGRlbHRhWCwgZGVsdGFZKTtcclxuXHJcbiAgICBpZihjaGVja0JvdW5kYXJpZXMpIHtcclxuICAgICAgaWYodGhpcy5faXNJbnNpZGVSZWN0KGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCAgbmV3RWxlbWVudFBvcyA9IHRoaXMuZ2V0QWxpZ25lZFBvc2l0aW9uKGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KTtcclxuICAgICAgICBkZWx0YVggPSBuZXdFbGVtZW50UG9zLnggLSBlbGVtZW50UmVjdC54O1xyXG4gICAgICAgIGRlbHRhWSA9IG5ld0VsZW1lbnRQb3MueSAtIGVsZW1lbnRSZWN0Lnk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlUmVjdGFuZ2xlKGVsZW1lbnRET01SZWN0LCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9pc0luc2lkZUxlZnRUb3BSZWN0KHBhcmVudFJlY3QsIGVsZW1lbnRET01SZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBuZXdFbGVtZW50UG9zID0gdGhpcy5fZ2V0QWxpZ25lZExlZnRUb3BQb3NpdGlvbihlbGVtZW50RE9NUmVjdCwgcGFyZW50UmVjdCk7XHJcbiAgICAgICAgZGVsdGFYID0gbmV3RWxlbWVudFBvcy54IC0gZWxlbWVudFJlY3QueDtcclxuICAgICAgICBkZWx0YVkgPSBuZXdFbGVtZW50UG9zLnkgLSBlbGVtZW50UmVjdC55O1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVJlY3RhbmdsZShlbGVtZW50RE9NUmVjdCwgZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLl9nZXREb21FbGVtZW50KGUxLCcnKTsvL2UxLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGlmKCFzZWxlY3RlZEVsZW1lbnQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZWN0ZWRFbGVtZW50KTtcclxuICAgIGNvbnN0IHRvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUudG9wLCAxMCk7XHJcbiAgICBjb25zdCBsZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5sZWZ0LCAxMCk7XHJcbiAgICBzZWxlY3RlZEVsZW1lbnQuc3R5bGUudG9wID0gKHRvcCArIGRlbHRhWSkgKyAncHgnO1xyXG4gICAgc2VsZWN0ZWRFbGVtZW50LnN0eWxlLmxlZnQgPSAobGVmdCArIGRlbHRhWCkgKyAncHgnO1xyXG4gICAgcmV0dXJuIHtkZWx0YVgsZGVsdGFZfTtcclxuICB9XHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGZpbmQgaWYgcmVjdGFuZ2xlIDEgaXMgaW5zaWRlIHJlY3RhbmdsZSAyXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9pc0luc2lkZVJlY3QocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIHIyLmxlZnQgPD0gcjEubGVmdCAgJiYgcjIudG9wIDw9IHIxLnRvcCAmJiByMi5yaWdodCA+PSByMS5yaWdodCAmJiByMi5ib3R0b20gPj0gcjEuYm90dG9tO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGZpbmQgaWYgcmVjdGFuZ2xlcyBkbyBub3Qgb3ZlcmxhcCB0aGUgbGVmdCBhbmQgdG9wIHNpZGVzXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9pc0luc2lkZUxlZnRUb3BSZWN0KHIxOkRPTVJlY3QsIHIyOkRPTVJlY3QpIHtcclxuICAgIGlmKCFyMSB8fCAhcjIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgIHIxSW5zaWRlID0gcjIubGVmdCA8PSByMS5sZWZ0ICAmJiByMi50b3AgPD0gcjEudG9wO1xyXG4gICAgY29uc3QgIHIySW5zaWRlID0gcjEubGVmdCA8PSByMi5sZWZ0ICAmJiByMS50b3AgPD0gcjIudG9wO1xyXG4gICAgcmV0dXJuIHIxSW5zaWRlIHx8IHIySW5zaWRlO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGdldCBwb3NpdGlvbiBvZiByMSBhbGlnbmVkIHdpdGggdGhlIHIyIHNpZGVzXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIGdldEFsaWduZWRQb3NpdGlvbihyMTpET01SZWN0LCByMjpET01SZWN0KSB7XHJcbiAgICBpZighcjEgfHwgIXIyKSB7XHJcbiAgICAgIHJldHVybiB7eDowLHk6MH07XHJcbiAgICB9XHJcbiAgICBjb25zdCB0byA9IHsgeDogcjEueCwgeTogcjEueSB9O1xyXG4gICAgLy9hbGlnbiBsZWZ0IG9yIHJpZ2h0IHNpZGVzLiBwcmVmZXJhYmx5IGxlZnRcclxuICAgIGlmKHIxLmxlZnQgPCByMi5sZWZ0KSB7XHJcbiAgICAgIHRvLnggPSByMi54O1xyXG4gICAgfSBlbHNlIGlmKHIxLnJpZ2h0ID4gcjIucmlnaHQpIHtcclxuICAgICAgdG8ueCA9IHIyLnJpZ2h0IC0gcjEud2lkdGg7XHJcbiAgICB9XHJcbiAgICAvL2FsaWduIHRvcCBvciBib3R0b20uIHByZWZlcmFibHkgdG9wXHJcbiAgICBpZihyMS50b3AgPCByMi50b3ApIHtcclxuICAgICAgdG8ueSA9IHIyLnk7XHJcbiAgICB9IGVsc2UgaWYocjEuYm90dG9tID4gcjIuYm90dG9tKSB7XHJcbiAgICAgIHRvLnkgPSByMi5ib3R0b20gLSByMS5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG87XHJcbiAgfVxyXG4gIFxyXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiBnZXQgcG9zaXRpb24gb2YgcjEgYWxpZ25lZCB3aXRoIHRoZSByMiBsZWZ0LCB0b3Agc2lkZXNcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2dldEFsaWduZWRMZWZ0VG9wUG9zaXRpb24ocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gIHt4OjAseTowfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAgdG8gPSB7IHg6IHIxLngsIHk6IHIxLnkgfTtcclxuICAgIC8vYWxpZ24gbGVmdFxyXG4gICAgaWYocjEubGVmdCA8IHIyLmxlZnQpIHtcclxuICAgICAgdG8ueCA9IHIyLng7XHJcbiAgICB9XHJcbiAgICAvL2FsaWduIHRvcFxyXG4gICAgaWYocjEudG9wIDwgcjIudG9wKSB7XHJcbiAgICAgIHRvLnkgPSByMi55O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvO1xyXG4gIH1cclxuXHJcbiAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiB0cmFuc2xhdGUgcmVjdGFuZ2xlIGJ5IHgsIHlcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX3RyYW5zbGF0ZVJlY3RhbmdsZShyZWN0OkRPTVJlY3QsIHRyYW5zbGF0ZVg6bnVtYmVyLCB0cmFuc2xhdGVZOm51bWJlcikge1xyXG4gICAgaWYoIXJlY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmVjdC54ICs9IHRyYW5zbGF0ZVg7XHJcbiAgICByZWN0LnkgKz0gdHJhbnNsYXRlWTtcclxuICAgIHJldHVybiByZWN0O1xyXG4gIH1cclxuICBcclxuICB1cGRhdGVDb2xsYXBzZWQodmFsdWU6Ym9vbGVhbiwgaWQ6c3RyaW5nID0gJycpOnZvaWR7ICAgIFxyXG4gICAgY29uc3QgIGZvdW5kSXRlbSA9IHRoaXMuZ2V0SXRlbShpZCk7XHJcbiAgICBpZighZm91bmRJdGVtKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm91bmRJdGVtLmlzQ29sbGFwc2VkID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcyQubmV4dCh0aGlzLnJlZ2lzdGVyZWRJdGVtcyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57ICAgICAgXHJcbiAgICAgIHRoaXMuY2hlY2tQb3NpdGlvbihmb3VuZEl0ZW0uaWQsXCJcIix1bmRlZmluZWQsMCwwLHRydWUpOyAgICAgIFxyXG4gICAgfSk7XHJcbiAgICBsZXQgczE6c3RyaW5nID0nJztcclxuICAgIHRoaXMucmVnaXN0ZXJlZEl0ZW1zLmZvckVhY2goKGl0ZW0pPT57XHJcbiAgICAgIHMxID0gczEgKyBgJHtpdGVtLmlkfTo8JHtpdGVtLmlzQ29sbGFwc2VkPzE6MH0+IGA7XHJcbiAgICB9KTtcclxuICB9ICBcclxuXHJcblxyXG4gIGhhbmRsZURyYWdFbmQoaWQ6c3RyaW5nKXsvL30sbGVmdDpudW1iZXIsdG9wOm51bWJlcil7XHJcbiAgICB0aGlzLmZpbmFsaXplT2JqZWN0Q2hhbmdlcyhpZCk7XHJcbiAgfVxyXG5cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZmluYWxpemUgb2JqZWN0IGNoYW5nZXMgKHBvc2l0aW9uKS4gb2JqZWN0IG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgbGF5b3V0IG1hbmFnZXJcclxuICAqIG9iamVjdDogb2JqZWN0IHRvIGZpbmFsaXplICBcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgZmluYWxpemVPYmplY3RDaGFuZ2VzKGlkOnN0cmluZyk6dm9pZCB7XHJcbiAgICBjb25zdCBpdGVtOkxheW91dE1hbmFnZXJJdGVtfG51bGwgID0gdGhpcy5nZXRJdGVtKGlkKTtcclxuICAgIGlmKCFpdGVtKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldERvbUVsZW1lbnQoaXRlbSwnJyk7XHJcbiAgICBpZighZWxlbWVudCl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTsgIFxyXG4gICAgY29uc3QgdG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS50b3AsIDEwKTtcclxuICAgIGNvbnN0IGxlZnQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmxlZnQsIDEwKTtcclxuICAgIFxyXG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLl9nZXRFbGVtZW50UmVjdChpdGVtLHVuZGVmaW5lZCx1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5fc2V0T2JqZWN0Q29uZmlnKGl0ZW0sbGVmdCx0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3QgJiYgZWxlbWVudFJlY3Qud2lkdGggPiAwID8gZWxlbWVudFJlY3Qud2lkdGg6MCAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3QgJiYgZWxlbWVudFJlY3QuaGVpZ2h0ID4gMCA/IGVsZW1lbnRSZWN0LmhlaWdodDowKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
351
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1iaW1wbHVzLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy9sYXlvdXQtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQWlDdkMsTUFBTSxPQUFPLG9CQUFvQjtJQUcvQixZQUFvQixxQkFBMkMsRUFDM0MsbUJBQXdDO1FBRHhDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBc0I7UUFDM0Msd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUY1RCxxQkFBZ0IsR0FBeUMsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFBO1FBSTdGLG9CQUFlLEdBQXVCLEVBQUUsQ0FBQztRQUtqRCxXQUFNLEdBQVUscUJBQXFCLENBQUM7SUFObEMsQ0FBQztJQUdMLElBQUksZUFBZTtRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUlIOztrRkFFOEU7SUFDNUUsY0FBYyxDQUFDLEdBQWMsRUFBRSxFQUFTLEVBQUUsUUFBMkIsRUFBRSxnQkFBd0IsRUFBQyxPQUFjLEdBQUcsRUFBRSxNQUFhLEdBQUcsRUFBQyxRQUFlLENBQUMsRUFBRSxTQUFnQixDQUFDO1FBQ3JLLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUMsS0FBSyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBRyxNQUFNLEVBQUMsQ0FBQztnQkFDVCxVQUFVLEdBQUcsS0FB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QUMsS0FBSyxDQUFBLENBQUMsQ0FBQSxDQUFDLEVBQzFELFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQSxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQzsrR0E3V1Usb0JBQW9CO21IQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXNpemVPYnNlcnZlclNlcnZpY2UgfSBmcm9tICcuL3Jlc2l6ZS1vYnNlcnZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9ICAgZnJvbSAnLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuLy9pbXBvcnQgeyBJdGVtc0xpc3QgfSBmcm9tICdAbmctc2VsZWN0L25nLXNlbGVjdC9saWIvaXRlbXMtbGlzdCc7XHJcbi8vaW1wb3J0IHsgTm90Rm91bmRFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0TWFuYWdlckl0ZW0ge1xyXG4gIGVsZW1lbnQ6RWxlbWVudFJlZjtcclxuICBpZDogc3RyaW5nO1xyXG4gIHNlbGVjdG9yPzpzdHJpbmc7XHJcbiAgaXNDb2xsYXBzZWQ6Ym9vbGVhbjtcclxuICByZW1lbWJlclBvc2l0aW9uPzpib29sZWFuXHJcbiAgbGVmdD86IG51bWJlcjtcclxuICB0b3A/Om51bWJlcjtcclxuICB3aWR0aD86bnVtYmVyO1xyXG4gIGhlaWdodD86bnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE1hbmFnZXJDb25maWdJdGVtIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGlzQ29sbGFwc2VkOmJvb2xlYW47ICBcclxuICBsZWZ0PzogbnVtYmVyO1xyXG4gIHRvcD86bnVtYmVyOyAgXHJcbiAgd2lkdGg/Om51bWJlcjtcclxuICBoZWlnaHQ/Om51bWJlcjtcclxufVxyXG5cclxuXHJcbmludGVyZmFjZSBMYXlvdXRNYW5hZ2VyQ29uZmlnIHtcclxuICBba2V5OnN0cmluZ106IExheW91dE1hbmFnZXJDb25maWdJdGVtXHJcbn1cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGF5b3V0TWFuYWdlclNlcnZpY2Uge1xyXG5cclxuICByZWdpc3RlcmVkSXRlbXMkOiBCZWhhdmlvclN1YmplY3Q8TGF5b3V0TWFuYWdlckl0ZW1bXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExheW91dE1hbmFnZXJJdGVtW10+KFtdKVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJTZXJ2aWNlOlJlc2l6ZU9ic2VydmVyU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIGxvY2FsU3RvcmFnZVNlcnZpY2UgOkxvY2FsU3RvcmFnZVNlcnZpY2UgXHJcbiAgKSB7IH1cclxuICBwcml2YXRlIHJlZ2lzdGVyZWRJdGVtczpMYXlvdXRNYW5hZ2VySXRlbVtdID0gW107XHJcbiAgXHJcbiAgZ2V0IFJlZ2lzdGVyZWRJdGVtcygpOiBMYXlvdXRNYW5hZ2VySXRlbVtdIHtcclxuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyZWRJdGVtcztcclxuICB9XHJcbiAgQ09ORklHOnN0cmluZyA9ICdsYXlvdXRNYW5hZ2VyQ29uZmlnJztcclxuXHJcbiAgXHJcbi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiByZWdpc3RlciBvYmplY3QuIG9iamVjdCBtdXN0IGhhdmUgdW5pcXVlIGlkIG9yIGVsZW1lbnRJZFxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICByZWdpc3Rlck9iamVjdChvYmo6RWxlbWVudFJlZiwgaWQ6c3RyaW5nLCBzZWxlY3RvcjpzdHJpbmcgfCB1bmRlZmluZWQsIHJlbWVtYmVyUG9zaXRpb246Ym9vbGVhbixsZWZ0Om51bWJlciA9IDEwMCwgdG9wOm51bWJlciA9IDEwMCx3aWR0aDpudW1iZXIgPSAwLCBoZWlnaHQ6bnVtYmVyID0gMCkge1xyXG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMTtcclxuICAgIGlmKHRoaXMucmVnaXN0ZXJlZEl0ZW1zLnNvbWUoKGl0ZW0saW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCByZXR2YWwgPSBpdGVtLmlkID09PSBpZDtcclxuICAgICAgICBpZihyZXR2YWwpe1xyXG4gICAgICAgICAgZm91bmRJbmRleCA9IGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICB9KSl7XHJcbiAgICAgIGlmKGZvdW5kSW5kZXggPj0gMCl7XHJcbiAgICAgICAgdGhpcy5yZWdpc3RlcmVkSXRlbXMuc3BsaWNlKGZvdW5kSW5kZXgsMSk7XHJcbiAgICAgIH0gICAgICBcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0l0ZW06IExheW91dE1hbmFnZXJJdGVtID0geyBcclxuICAgICAgZWxlbWVudDpvYmosXHJcbiAgICAgIGlkOmlkLFxyXG4gICAgICBzZWxlY3RvcjpzZWxlY3RvcixcclxuICAgICAgcmVtZW1iZXJQb3NpdGlvbjohIXJlbWVtYmVyUG9zaXRpb24sXHJcbiAgICAgIGxlZnQ6bGVmdCxcclxuICAgICAgdG9wOnRvcCxcclxuICAgICAgd2lkdGg6d2lkdGgsXHJcbiAgICAgIGhlaWdodDpoZWlnaHQsXHJcbiAgICAgIGlzQ29sbGFwc2VkOiBmYWxzZSAgICBcclxuICAgICB9O1xyXG5cclxuICAgIHRoaXMucmVnaXN0ZXJlZEl0ZW1zLnB1c2gobmV3SXRlbSk7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcyQubmV4dCh0aGlzLnJlZ2lzdGVyZWRJdGVtcyk7XHJcbiAgICB0aGlzLl9pbml0T2JqZWN0KG5ld0l0ZW0pO1xyXG4gIH1cclxuICBcclxuICBfaW5pdE9iamVjdChvYmo6TGF5b3V0TWFuYWdlckl0ZW0pe1xyXG4gICAgdGhpcy5fYWRqdXN0T2JqZWN0QnlDb25maWcob2JqKTtcclxuICAgIHRoaXMuX2FkanVzdE9iamVjdEJ5V2luZG93U2l6ZShvYmopO1xyXG4gICAgXHJcbiAgfVxyXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiBnZXQgb2JqZWN0IGNvbmZpZ3VyYXRpb25cclxuICAqIHJldHVybiB7bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ3RofVxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBfZ2V0T2JqZWN0Q29uZmlnKG9iajpMYXlvdXRNYW5hZ2VySXRlbSk6TGF5b3V0TWFuYWdlckNvbmZpZ0l0ZW18bnVsbCB7XHJcbiAgICBpZighb2JqKXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5nZXRJdGVtKHRoaXMuQ09ORklHKTtcclxuICAgIGNvbnN0ICBjb25maWcgPSBjb25maWdWYWx1ZSA/IEpTT04ucGFyc2UoY29uZmlnVmFsdWUpIDoge307XHJcbiAgICBjb25zdCAgb2JqSWQgPSBvYmouaWQgO1xyXG4gICAgbGV0IGNvbmZpZ09iaiA9IGNvbmZpZ1tvYmpJZF07XHJcbiAgICBpZighY29uZmlnT2JqKSB7XHJcbiAgICAgIGNvbmZpZ09iaiA9IHtpZDpvYmpJZCxsZWZ0Om9iai5sZWZ0LHRvcDpvYmoudG9wLHdpZHRoOm9iai53aWR0aCxoZWlnaHQ6b2JqLmhlaWdodH07ICAgICAgICBcclxuICAgIH1cclxuICAgIHJldHVybiBjb25maWdPYmo7XHJcbiAgfVxyXG5cclxuICBfYWRqdXN0T2JqZWN0QnlDb25maWcob2JqOkxheW91dE1hbmFnZXJJdGVtKXtcclxuICAgIGNvbnN0IGNvbmZpZzpMYXlvdXRNYW5hZ2VyQ29uZmlnSXRlbXxudWxsID0gdGhpcy5fZ2V0T2JqZWN0Q29uZmlnKG9iaik7XHJcbiAgICBpZighY29uZmlnKXtcclxuICAgICAgcmV0dXJuOyAgICAgIFxyXG4gICAgfVxyXG4gICAgY29uc3QgIHBhcmVudEVsZW1lbnQgPSB0aGlzLl9nZXREb21QYXJlbnRFbGVtZW50KG9iaik7XHJcbiAgICBjb25zdCAgaW50ZXJuYWxFbGVtZW50ID0gdGhpcy5fZ2V0RG9tSW50ZXJuYWxFbGVtZW50KG9iaiwnJyk7XHJcbiAgICBpZighcGFyZW50RWxlbWVudCB8fCAhaW50ZXJuYWxFbGVtZW50KXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcGFyZW50RWxlbWVudC5zdHlsZS5sZWZ0ID0gKGNvbmZpZy5sZWZ0KSArICdweCc7XHJcbiAgICBwYXJlbnRFbGVtZW50LnN0eWxlLnRvcCA9IChjb25maWcudG9wKSArICdweCc7XHJcbiAgICBpZihjb25maWcud2lkdGggJiYgY29uZmlnLndpZHRoID4gMCl7XHJcbiAgICAgIGludGVybmFsRWxlbWVudC5zdHlsZS53aWR0aCA9IGNvbmZpZy53aWR0aCArICdweCc7XHJcbiAgICB9XHJcbiAgICBpZihjb25maWcuaGVpZ2h0ICYmIGNvbmZpZy5oZWlnaHQgPiAwKXtcclxuICAgICAgaW50ZXJuYWxFbGVtZW50LnN0eWxlLmhlaWdodCA9IGNvbmZpZy5oZWlnaHQgKyAncHgnO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLmNoZWNrUG9zaXRpb24ob2JqLmlkLFwiXCIsdW5kZWZpbmVkLDAsMCx0cnVlKTsgICAgXHJcbiAgfVxyXG5cclxuICBfYWRqdXN0T2JqZWN0QnlXaW5kb3dTaXplKG9iajpMYXlvdXRNYW5hZ2VySXRlbSl7XHJcbiAgICB0aGlzLmNoZWNrUG9zaXRpb24ob2JqLmlkLFwiXCIsdW5kZWZpbmVkLDAsMCx0cnVlKTsgIFxyXG4gIH1cclxuICBcclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogcmV0dXJucyBvYmplY3QgIHJlZ2lzdGVyZWQgaW4gdGhlIGxheW91dCBtYW5hZ2VyIFxyXG4gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICBnZXRJdGVtKGlkOiBzdHJpbmcgKTpMYXlvdXRNYW5hZ2VySXRlbXxudWxsIHsgICBcclxuICAgIGxldCBmb3VuZEl0ZW06TGF5b3V0TWFuYWdlckl0ZW18bnVsbCA9IG51bGw7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT57XHJcbiAgICAgIGlmKGl0ZW0uaWQgPT09IGlkKXtcclxuICAgICAgICBmb3VuZEl0ZW0gPSBpdGVtO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmb3VuZEl0ZW07XHJcbiAgfVxyXG5cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogc2V0IG9iamVjdCBjb25maWd1cmF0aW9uXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9zZXRPYmplY3RDb25maWcob2JqOkxheW91dE1hbmFnZXJJdGVtLCBsZWZ0Om51bWJlcix0b3A6bnVtYmVyLHdpZHRoOm51bWJlcixoZWlnaHQ6bnVtYmVyKSB7XHJcbiAgICBjb25zdCBvYmpJZCA9IG9iaj8uaWQgO1xyXG4gICAgaWYgKCFvYmpJZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgY29uZmlnID0gdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldE9iamVjdCh0aGlzLkNPTkZJRykgYXMgTGF5b3V0TWFuYWdlckNvbmZpZztcclxuICAgIC8vbGV0IGNvbmZpZyA9IGNvbmZpZ1ZhbHVlICYmIEpTT04ucGFyc2UoY29uZmlnVmFsdWUpIGFzIExheW91dE1hbmFnZXJDb25maWc7XHJcbiAgICBpZiAoIWNvbmZpZykge1xyXG4gICAgICBjb25maWcgPSB7fTtcclxuICAgIH1cclxuICAgIGlmKG9iaj8uaXNDb2xsYXBzZWQpeyAgLy8gZG8gbm90IG92ZXJ0YWtlIGNvbGxhcHNlZCBzaXplXHJcbiAgICAgIGlmICghY29uZmlnW29iaklkXSkgeyAgICAgICAgXHJcbiAgICAgICAgY29uZmlnW29iaklkXSA9IG9iajtcclxuICAgICAgfVxyXG4gICAgICBjb25maWdbb2JqSWRdLmxlZnQgPSBsZWZ0O1xyXG4gICAgICBjb25maWdbb2JqSWRdLnRvcCAgPSB0b3A7XHJcbiAgICAgIC8vY29uZmlnW29iaklkXS53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAvL2NvbmZpZ1tvYmpJZF0uaGVpZ2h0ID0gaGVpZ2h0IDtcclxuICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldE9iamVjdCh0aGlzLkNPTkZJRywgY29uZmlnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0l0ZW0gOkxheW91dE1hbmFnZXJDb25maWdJdGVtID0ge1xyXG4gICAgICBpZDogb2JqSWQsXHJcbiAgICAgIGlzQ29sbGFwc2VkOiBmYWxzZSxcclxuICAgICAgbGVmdDogbGVmdCxcclxuICAgICAgdG9wOiB0b3AsXHJcbiAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgaGVpZ2h0OiBoZWlnaHRcclxuICAgIH07XHJcbiAgICBjb25maWdbb2JqSWRdID0gbmV3SXRlbTtcclxuICAgIHRoaXMubG9jYWxTdG9yYWdlU2VydmljZS5zZXRPYmplY3QodGhpcy5DT05GSUcsY29uZmlnKTtcclxuICB9XHJcbiAgX2dldERvbVBhcmVudEVsZW1lbnQoaXRlbTpMYXlvdXRNYW5hZ2VySXRlbSApOkhUTUxFbGVtZW50fG51bGwge1xyXG4gICAgY29uc3QgZWxlbWVudDpIVE1MRWxlbWVudCA9IGl0ZW0uZWxlbWVudD8ubmF0aXZlRWxlbWVudDsvLz8uc2hhZG93Um9vdCB8fCBpdGVtLmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7ICAgIFxyXG4gICAgaWYoIWVsZW1lbnQpe1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdfZ2V0RG9tUGFyZW50RWxlbWVudDogbWlzc2luZyBlbGVtZW50Jyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGVsZW1lbnQ7ICAgIFxyXG4gIH1cclxuXHJcbiAgX2dldERvbUludGVybmFsRWxlbWVudChpdGVtOkxheW91dE1hbmFnZXJJdGVtLHNlbGVjdG9yOnN0cmluZyB8IHVuZGVmaW5lZCApOkhUTUxFbGVtZW50fG51bGwge1xyXG4gICAgY29uc3QgZWxlbWVudDpIVE1MRWxlbWVudCA9IGl0ZW0uZWxlbWVudD8ubmF0aXZlRWxlbWVudD8uc2hhZG93Um9vdCB8fCBpdGVtLmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7ICAgIFxyXG4gICAgaWYoIWVsZW1lbnQpe1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdfZ2V0RG9tSW50ZXJuYWxFbGVtZW50OiBtaXNzaW5nIGVsZW1lbnQnKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBjb25zdCBteVNlbGVjdG9yID1zZWxlY3RvciAmJiBzZWxlY3Rvcj8ubGVuZ3RoID4gMCA/c2VsZWN0b3I6aXRlbS5zZWxlY3RvcjsgICBcclxuICAgIGNvbnN0IHJldHZhbDogSFRNTEVsZW1lbnR8bnVsbD0gbXlTZWxlY3Rvcj9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IobXlTZWxlY3Rvcik6ZWxlbWVudDtcclxuICAgIGlmKCFyZXR2YWwpe1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBfZ2V0RG9tSW50ZXJuYWxFbGVtZW50OiBzZWxlY3Rpb24gb2YgZWxlbWVudCAke2VsZW1lbnR9ICBmYWlsZWQgd2l0aCBzZWxlY3RvciAke215U2VsZWN0b3J9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG4gIH1cclxuXHJcblxyXG4gIF9nZXRFbGVtZW50UmVjdChpdGVtOkxheW91dE1hbmFnZXJJdGVtLHNlbGVjdG9yOnN0cmluZyB8IHVuZGVmaW5lZCAscGFyZW50UmVjdGFuZ2xlOkRPTVJlY3QgfHVuZGVmaW5lZCApOkRPTVJlY3QgfCBudWxse1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRPYmogOiBIVE1MRWxlbWVudHxudWxsID0gdGhpcy5fZ2V0RG9tSW50ZXJuYWxFbGVtZW50KGl0ZW0sc2VsZWN0b3IpO1xyXG4gICAgaWYoIXNlbGVjdGVkT2JqKXtcclxuICAgICAgY29uc29sZS5lcnJvcignX2dldEVsZW1lbnRSZWN0OiBtaXNzaW5nIHNlbGVjdGVkIG9iamVjdCcpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJlbnRSZWN0OkRPTVJlY3QgPSAgcGFyZW50UmVjdGFuZ2xlIHx8ICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5nZXRQYXJlbnRBcHBSZWN0KCk7XHJcbiAgICBpZiggIXBhcmVudFJlY3QgfHwgIHBhcmVudFJlY3Q/LndpZHRoPD0xIHx8IHBhcmVudFJlY3Q/LmhlaWdodDw9MSApIHtcclxuICAgICAgY29uc29sZS5lcnJvcignX2dldEVsZW1lbnRSZWN0OiBtaXNzaW5nIHBhcmVudCByZWN0Jyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgIGVsZW1lbnRSZWN0OkRPTVJlY3R8bnVsbCA9IHNlbGVjdGVkT2JqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgaWYoIWVsZW1lbnRSZWN0KXtcclxuICAgICAgY29uc29sZS5lcnJvcignX2dldEVsZW1lbnRSZWN0OiBtaXNzaW5nIGJvdW5kaW5nIHJlY3QnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBlbGVtZW50UmVjdDtcclxuICB9XHJcblxyXG4gIC8vIGNoZWNrcyB3aGV0aGVyIGVsZW1lbnQgb3IgZWxlbWVudCB3aXRoIGFkZGl0aW9uYWwgc2VsZWN0aW9uIG9mIHN1YmVsZW1lbnQgaXMgcGxhY2VkIHdpdGhpbiB0aGUgZ2l2ZSByZWN0YW5nbGVcclxuICAvLyBpZiBub3QgdGhlbiBjYWxjdWxhdGVzIHRoZSBvZmZzZXQgdG8gYmUgbW92ZWQgdG8gZml0IGluXHJcbiAgY2hlY2tQb3NpdGlvbihpZDpzdHJpbmcsc2VsZWN0b3I6c3RyaW5nLHBhcmVudFJlY3RhbmdsZTpET01SZWN0fHVuZGVmaW5lZCAsZGVsdGFYOm51bWJlcixkZWx0YVk6bnVtYmVyLGZvcmNlQ2hlY2s6Ym9vbGVhbiA9IGZhbHNlKXtcclxuICAgIGlmKCFpZCl7XHJcbiAgICAgIHJldHVybiB7ZGVsdGFYOjAsZGVsdGFZOjB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgZTEgPSB0aGlzLmdldEl0ZW0oaWQpO1xyXG4gICAgaWYoIWUxKXtcclxuICAgICAgcmV0dXJuIHtkZWx0YVg6MCxkZWx0YVk6MH07XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnRSZWN0OkRPTVJlY3QgPSAgcGFyZW50UmVjdGFuZ2xlIHx8ICB0aGlzLnJlc2l6ZU9ic2VydmVyU2VydmljZS5nZXRQYXJlbnRBcHBSZWN0KCk7XHJcbiAgICBjb25zdCBlbGVtZW50UmVjdDpET01SZWN0IHwgbnVsbCA9IHRoaXMuX2dldEVsZW1lbnRSZWN0KGUxLHNlbGVjdG9yLHBhcmVudFJlY3QpO1xyXG4gICAgaWYoIWVsZW1lbnRSZWN0KXtcclxuICAgICAgY29uc29sZS5lcnJvcignY2hlY2tQb3NpdGlvbjogbWlzc2luZyBlbGVtZW50UmVjdCcpO1xyXG4gICAgICByZXR1cm4ge2RlbHRhWDowLGRlbHRhWTowfTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYoIWVsZW1lbnRSZWN0Py53aWR0aCB8fCAhZWxlbWVudFJlY3Q/LmhlaWdodCl7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2NoZWNrUG9zaXRpb246ZWxlbWVudCByZWN0IGVtcHR5ICcpO1xyXG4gICAgICByZXR1cm4ge2RlbHRhWDowLGRlbHRhWTowfTtcclxuICAgIH0gXHJcbiAgICBsZXQgY2hlY2tCb3VuZGFyaWVzID0gdHJ1ZTtcclxuICAgIGlmKHRoaXMuX2lzSW5zaWRlUmVjdChlbGVtZW50UmVjdCwgcGFyZW50UmVjdCkgPT09IGZhbHNlICYmICFmb3JjZUNoZWNrKSB7XHJcbiAgICAgIGNoZWNrQm91bmRhcmllcyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gXHJcbiAgICAvLyBjb3B5IG9mIHJlYWwgZWxlbWVudCByZWN0YW5nbGUgdG8gcGVyZm9ybSBjYWxjdWxhdGlvbiBvdmVyIGJlZm9yZSBzZXQgdG8gdGhlIHJlYWwgZWxlbWVudFxyXG4gICAgY29uc3QgZWxlbWVudERPTVJlY3QgPSBET01SZWN0LmZyb21SZWN0KGVsZW1lbnRSZWN0KTtcclxuXHJcbiAgICAvL3NldCB0aGUgZWxlbWVudCByZWN0YW5nbGUgYnkgZGVsdGFzXHJcbiAgICB0aGlzLl90cmFuc2xhdGVSZWN0YW5nbGUoZWxlbWVudERPTVJlY3QsIGRlbHRhWCwgZGVsdGFZKTtcclxuXHJcbiAgICBpZihjaGVja0JvdW5kYXJpZXMpIHtcclxuICAgICAgaWYodGhpcy5faXNJbnNpZGVSZWN0KGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCAgbmV3RWxlbWVudFBvcyA9IHRoaXMuZ2V0QWxpZ25lZFBvc2l0aW9uKGVsZW1lbnRET01SZWN0LCBwYXJlbnRSZWN0KTtcclxuICAgICAgICBkZWx0YVggPSBuZXdFbGVtZW50UG9zLnggLSBlbGVtZW50UmVjdC54O1xyXG4gICAgICAgIGRlbHRhWSA9IG5ld0VsZW1lbnRQb3MueSAtIGVsZW1lbnRSZWN0Lnk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlUmVjdGFuZ2xlKGVsZW1lbnRET01SZWN0LCBkZWx0YVgsIGRlbHRhWSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl9pc0luc2lkZUxlZnRUb3BSZWN0KHBhcmVudFJlY3QsIGVsZW1lbnRET01SZWN0KSA9PT0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBuZXdFbGVtZW50UG9zID0gdGhpcy5fZ2V0QWxpZ25lZExlZnRUb3BQb3NpdGlvbihlbGVtZW50RE9NUmVjdCwgcGFyZW50UmVjdCk7XHJcbiAgICAgICAgZGVsdGFYID0gbmV3RWxlbWVudFBvcy54IC0gZWxlbWVudFJlY3QueDtcclxuICAgICAgICBkZWx0YVkgPSBuZXdFbGVtZW50UG9zLnkgLSBlbGVtZW50UmVjdC55O1xyXG4gICAgICAgIHRoaXMuX3RyYW5zbGF0ZVJlY3RhbmdsZShlbGVtZW50RE9NUmVjdCwgZGVsdGFYLCBkZWx0YVkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLl9nZXREb21QYXJlbnRFbGVtZW50KGUxKTtcclxuICAgIGlmKCFzZWxlY3RlZEVsZW1lbnQpe1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoc2VsZWN0ZWRFbGVtZW50KTtcclxuICAgIGNvbnN0IHRvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUudG9wLCAxMCk7XHJcbiAgICBjb25zdCBsZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5sZWZ0LCAxMCk7XHJcbiAgICBzZWxlY3RlZEVsZW1lbnQuc3R5bGUudG9wID0gKHRvcCArIGRlbHRhWSkgKyAncHgnO1xyXG4gICAgc2VsZWN0ZWRFbGVtZW50LnN0eWxlLmxlZnQgPSAobGVmdCArIGRlbHRhWCkgKyAncHgnO1xyXG4gICAgcmV0dXJuIHtkZWx0YVgsZGVsdGFZfTtcclxuICB9XHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGZpbmQgaWYgcmVjdGFuZ2xlIDEgaXMgaW5zaWRlIHJlY3RhbmdsZSAyXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9pc0luc2lkZVJlY3QocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIHIyLmxlZnQgPD0gcjEubGVmdCAgJiYgcjIudG9wIDw9IHIxLnRvcCAmJiByMi5yaWdodCA+PSByMS5yaWdodCAmJiByMi5ib3R0b20gPj0gcjEuYm90dG9tO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGZpbmQgaWYgcmVjdGFuZ2xlcyBkbyBub3Qgb3ZlcmxhcCB0aGUgbGVmdCBhbmQgdG9wIHNpZGVzXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIF9pc0luc2lkZUxlZnRUb3BSZWN0KHIxOkRPTVJlY3QsIHIyOkRPTVJlY3QpIHtcclxuICAgIGlmKCFyMSB8fCAhcjIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgIHIxSW5zaWRlID0gcjIubGVmdCA8PSByMS5sZWZ0ICAmJiByMi50b3AgPD0gcjEudG9wO1xyXG4gICAgY29uc3QgIHIySW5zaWRlID0gcjEubGVmdCA8PSByMi5sZWZ0ICAmJiByMS50b3AgPD0gcjIudG9wO1xyXG4gICAgcmV0dXJuIHIxSW5zaWRlIHx8IHIySW5zaWRlO1xyXG4gIH1cclxuXHJcbiAgLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAqIGdldCBwb3NpdGlvbiBvZiByMSBhbGlnbmVkIHdpdGggdGhlIHIyIHNpZGVzXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xyXG4gIGdldEFsaWduZWRQb3NpdGlvbihyMTpET01SZWN0LCByMjpET01SZWN0KSB7XHJcbiAgICBpZighcjEgfHwgIXIyKSB7XHJcbiAgICAgIHJldHVybiB7eDowLHk6MH07XHJcbiAgICB9XHJcbiAgICBjb25zdCB0byA9IHsgeDogcjEueCwgeTogcjEueSB9O1xyXG4gICAgLy9hbGlnbiBsZWZ0IG9yIHJpZ2h0IHNpZGVzLiBwcmVmZXJhYmx5IGxlZnRcclxuICAgIGlmKHIxLmxlZnQgPCByMi5sZWZ0KSB7XHJcbiAgICAgIHRvLnggPSByMi54O1xyXG4gICAgfSBlbHNlIGlmKHIxLnJpZ2h0ID4gcjIucmlnaHQpIHtcclxuICAgICAgdG8ueCA9IHIyLnJpZ2h0IC0gcjEud2lkdGg7XHJcbiAgICB9XHJcbiAgICAvL2FsaWduIHRvcCBvciBib3R0b20uIHByZWZlcmFibHkgdG9wXHJcbiAgICBpZihyMS50b3AgPCByMi50b3ApIHtcclxuICAgICAgdG8ueSA9IHIyLnk7XHJcbiAgICB9IGVsc2UgaWYocjEuYm90dG9tID4gcjIuYm90dG9tKSB7XHJcbiAgICAgIHRvLnkgPSByMi5ib3R0b20gLSByMS5oZWlnaHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG87XHJcbiAgfVxyXG4gIFxyXG4gIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiBnZXQgcG9zaXRpb24gb2YgcjEgYWxpZ25lZCB3aXRoIHRoZSByMiBsZWZ0LCB0b3Agc2lkZXNcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX2dldEFsaWduZWRMZWZ0VG9wUG9zaXRpb24ocjE6RE9NUmVjdCwgcjI6RE9NUmVjdCkge1xyXG4gICAgaWYoIXIxIHx8ICFyMikge1xyXG4gICAgICByZXR1cm4gIHt4OjAseTowfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAgdG8gPSB7IHg6IHIxLngsIHk6IHIxLnkgfTtcclxuICAgIC8vYWxpZ24gbGVmdFxyXG4gICAgaWYocjEubGVmdCA8IHIyLmxlZnQpIHtcclxuICAgICAgdG8ueCA9IHIyLng7XHJcbiAgICB9XHJcbiAgICAvL2FsaWduIHRvcFxyXG4gICAgaWYocjEudG9wIDwgcjIudG9wKSB7XHJcbiAgICAgIHRvLnkgPSByMi55O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvO1xyXG4gIH1cclxuXHJcbiAgIC8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgKiB0cmFuc2xhdGUgcmVjdGFuZ2xlIGJ5IHgsIHlcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgX3RyYW5zbGF0ZVJlY3RhbmdsZShyZWN0OkRPTVJlY3QsIHRyYW5zbGF0ZVg6bnVtYmVyLCB0cmFuc2xhdGVZOm51bWJlcikge1xyXG4gICAgaWYoIXJlY3QpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgcmVjdC54ICs9IHRyYW5zbGF0ZVg7XHJcbiAgICByZWN0LnkgKz0gdHJhbnNsYXRlWTtcclxuICAgIHJldHVybiByZWN0O1xyXG4gIH1cclxuICBcclxuICB1cGRhdGVDb2xsYXBzZWQodmFsdWU6Ym9vbGVhbiwgaWQ6c3RyaW5nID0gJycpOnZvaWR7ICAgIFxyXG4gICAgY29uc3QgIGZvdW5kSXRlbSA9IHRoaXMuZ2V0SXRlbShpZCk7XHJcbiAgICBpZighZm91bmRJdGVtKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm91bmRJdGVtLmlzQ29sbGFwc2VkID0gdmFsdWU7XHJcbiAgICB0aGlzLnJlZ2lzdGVyZWRJdGVtcyQubmV4dCh0aGlzLnJlZ2lzdGVyZWRJdGVtcyk7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT57ICAgICAgXHJcbiAgICAgIHRoaXMuY2hlY2tQb3NpdGlvbihmb3VuZEl0ZW0uaWQsXCJcIix1bmRlZmluZWQsMCwwLHRydWUpOyAgICAgIFxyXG4gICAgfSk7XHJcbiAgICBsZXQgczE6c3RyaW5nID0nJztcclxuICAgIHRoaXMucmVnaXN0ZXJlZEl0ZW1zLmZvckVhY2goKGl0ZW0pPT57XHJcbiAgICAgIHMxID0gczEgKyBgJHtpdGVtLmlkfTo8JHtpdGVtLmlzQ29sbGFwc2VkPzE6MH0+IGA7XHJcbiAgICB9KTtcclxuICB9ICBcclxuXHJcblxyXG4gIGhhbmRsZURyYWdFbmQoaWQ6c3RyaW5nKXsvL30sbGVmdDpudW1iZXIsdG9wOm51bWJlcil7XHJcbiAgICB0aGlzLmZpbmFsaXplT2JqZWN0Q2hhbmdlcyhpZCk7XHJcbiAgfVxyXG5cclxuICAvKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICogZmluYWxpemUgb2JqZWN0IGNoYW5nZXMgKHBvc2l0aW9uKS4gb2JqZWN0IG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgbGF5b3V0IG1hbmFnZXJcclxuICAqIG9iamVjdDogb2JqZWN0IHRvIGZpbmFsaXplICBcclxuICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXHJcbiAgZmluYWxpemVPYmplY3RDaGFuZ2VzKGlkOnN0cmluZyk6dm9pZCB7XHJcbiAgICBjb25zdCBpdGVtOkxheW91dE1hbmFnZXJJdGVtfG51bGwgID0gdGhpcy5nZXRJdGVtKGlkKTtcclxuICAgIGlmKCFpdGVtKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldERvbVBhcmVudEVsZW1lbnQoaXRlbSk7XHJcbiAgICBpZighZWxlbWVudCl7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTsgIFxyXG4gICAgY29uc3QgdG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS50b3AsIDEwKTtcclxuICAgIGNvbnN0IGxlZnQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmxlZnQsIDEwKTtcclxuICAgIFxyXG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSB0aGlzLl9nZXRFbGVtZW50UmVjdChpdGVtLHVuZGVmaW5lZCx1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5fc2V0T2JqZWN0Q29uZmlnKGl0ZW0sbGVmdCx0b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3QgJiYgZWxlbWVudFJlY3Qud2lkdGggPiAwID8gZWxlbWVudFJlY3Qud2lkdGg6MCAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3QgJiYgZWxlbWVudFJlY3QuaGVpZ2h0ID4gMCA/IGVsZW1lbnRSZWN0LmhlaWdodDowKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|