@colijnit/homedecorator 255.1.4 → 255.1.6
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/app/core/enum/message-type.enum.d.ts +3 -1
- package/app/core/interface/message-with-payload.interface.d.ts +6 -0
- package/app/core/model/homedecorator-settings-options.d.ts +2 -0
- package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
- package/app/core/service/homedecorator-connector-adapter.service.d.ts +2 -0
- package/app/core/service/homedecorator-connector.service.d.ts +5 -4
- package/app/core/service/homedecorator-settings.service.d.ts +2 -1
- package/app/core/service/presets.service.d.ts +3 -1
- package/app/homedecorator.component.d.ts +3 -1
- package/app/homedecorator.module.d.ts +2 -1
- package/app/plugins/core3d/service/floor-pattern.service.d.ts +1 -1
- package/app/plugins/core3d/service/floor-tile-intersection.service.d.ts +2 -1
- package/app/plugins/core3d/service/floor.service.d.ts +3 -1
- package/app/plugins/core3d/service/post-processing.service.d.ts +21 -7
- package/app/plugins/core3d/service/scene.service.d.ts +1 -1
- package/app/plugins/core3d/service/ssr.service.d.ts +0 -1
- package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +11 -2
- package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +185 -15
- package/app/plugins/model-uploader/model-uploader.module.d.ts +5 -1
- package/app/plugins/render/render-dialog/render-dialog.component.d.ts +4 -1
- package/app/plugins/render/render-dialog/render-dialog.component.scss +5 -5
- package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +3 -1
- package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +1 -0
- package/app/plugins/room-planner/components/settings/settings.component.d.ts +5 -1
- package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +4 -1
- package/app/plugins/room-planner/room-planner/room-planner.component.scss +1 -0
- package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +1 -3
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +2 -0
- package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
- package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +2 -0
- package/assets/icons/dash-button.svg +7 -0
- package/assets/icons/pen-ruler.svg +1 -0
- package/assets/icons/retry-button.svg +7 -0
- package/bundles/colijnit-homedecorator.umd.js +822 -601
- package/bundles/colijnit-homedecorator.umd.js.map +1 -1
- package/esm2015/app/app.version.js +3 -3
- package/esm2015/app/core/enum/message-type.enum.js +3 -1
- package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
- package/esm2015/app/core/model/homedecorator-settings-options.js +3 -1
- package/esm2015/app/core/service/3dm-api.js +4 -4
- package/esm2015/app/core/service/homedecorator-app-event.service.js +2 -1
- package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +25 -2
- package/esm2015/app/core/service/homedecorator-connector.service.js +25 -22
- package/esm2015/app/core/service/homedecorator-settings.service.js +3 -2
- package/esm2015/app/core/service/presets.service.js +13 -5
- package/esm2015/app/core/utils/material.utils.js +3 -3
- package/esm2015/app/homedecorator.component.js +26 -19
- package/esm2015/app/homedecorator.module.js +8 -4
- package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +5 -5
- package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +2 -2
- package/esm2015/app/plugins/core3d/items/factory.js +3 -2
- package/esm2015/app/plugins/core3d/service/ar.service.js +2 -1
- package/esm2015/app/plugins/core3d/service/floor-pattern.service.js +24 -18
- package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +13 -8
- package/esm2015/app/plugins/core3d/service/floor.service.js +9 -4
- package/esm2015/app/plugins/core3d/service/light-presets.service.js +10 -8
- package/esm2015/app/plugins/core3d/service/lights.service.js +8 -1
- package/esm2015/app/plugins/core3d/service/outline.service.js +4 -6
- package/esm2015/app/plugins/core3d/service/post-processing.service.js +148 -51
- package/esm2015/app/plugins/core3d/service/scene-event.service.js +14 -7
- package/esm2015/app/plugins/core3d/service/scene.service.js +84 -74
- package/esm2015/app/plugins/core3d/service/ssr.service.js +2 -53
- package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +10 -5
- package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +2 -2
- package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +281 -166
- package/esm2015/app/plugins/model-uploader/model-uploader.module.js +22 -3
- package/esm2015/app/plugins/render/render-controls/render-controls.component.js +3 -2
- package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +19 -14
- package/esm2015/app/plugins/render/service/new-render.service.js +4 -2
- package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +4 -2
- package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +2 -2
- package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +29 -15
- package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +5 -2
- package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +12 -5
- package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +31 -15
- package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +691 -683
- package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +43 -41
- package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1 -1
- package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +26 -20
- package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +2 -2
- package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +15 -8
- package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +4 -2
- package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +3 -3
- package/fesm2015/colijnit-homedecorator.js +1656 -1322
- package/fesm2015/colijnit-homedecorator.js.map +1 -1
- package/package.json +1 -1
|
@@ -86,51 +86,55 @@ export class SceneService {
|
|
|
86
86
|
return this._arMode;
|
|
87
87
|
}
|
|
88
88
|
init(element) {
|
|
89
|
-
this
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
this.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
this.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
this.domElement = element;
|
|
91
|
+
this._initScene();
|
|
92
|
+
this._initRenderer();
|
|
93
|
+
this._initCamera();
|
|
94
|
+
this._initOutline();
|
|
95
|
+
this._initPostProcessing();
|
|
96
|
+
this._animate();
|
|
97
|
+
this._subs.push(this._cameraService.cameraMovementChanged.subscribe(() => {
|
|
98
|
+
this.needsRender = true;
|
|
99
|
+
}), this._messageBusService.subscribe(MessageType.TakeScreenshot, () => __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
if (this._viewModeService.is3dViewActive() || this._viewModeService.isTopViewActive()) {
|
|
101
|
+
this.renderer.render(this.scene, this._cameraService.camera);
|
|
102
|
+
const dataUrl = this.renderer.domElement.toDataURL('image/jpeg');
|
|
103
|
+
FileUtils.DownloadFromDataUri(dataUrl, `MyRoomplan${new Date().toISOString()}.jpeg`);
|
|
104
|
+
}
|
|
105
|
+
})), this._arService.shouldAddObjectToScene.subscribe((object) => {
|
|
106
|
+
this.arMode = false;
|
|
107
|
+
this.addObject(object);
|
|
108
|
+
}), this._viewModeService.viewModeChanged.subscribe((mode) => {
|
|
109
|
+
// if (this._is3DMode(mode)) {
|
|
110
|
+
// this._animate();
|
|
111
|
+
// } else {
|
|
112
|
+
// this._pauseAnimation();
|
|
113
|
+
// }
|
|
114
|
+
if (mode === ViewMode.VR) {
|
|
115
|
+
this._vrService.init(this.scene, this.renderer);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this._vrService.endSession();
|
|
119
|
+
}
|
|
120
|
+
}), this._settingsService.settingsLoaded.subscribe((loaded) => {
|
|
121
|
+
if (loaded) {
|
|
122
|
+
this._initPathTracer();
|
|
123
|
+
this._maxRenderSamples = this._settingsService.settings.options.maxRenderSamples;
|
|
124
|
+
this._ssrService.enabled = this._settingsService.settings.options.ssrEnabled;
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
// this._xrService.sessionStarted.subscribe((mode: XrMode) => {
|
|
128
|
+
// if (mode === XrMode.ArMode) {
|
|
129
|
+
// this._animateAr();
|
|
130
|
+
// }
|
|
131
|
+
// })
|
|
132
|
+
);
|
|
133
|
+
this._xrService.init(this.renderer, this.scene, this._cameraService.camera);
|
|
134
|
+
// const hdriPath: string = '/assets/hdri/TSStudio3Point.hdr';
|
|
135
|
+
// await ObjectUtils.LoadHDRI(hdriPath, this.scene);
|
|
136
|
+
this.sceneInitialized.next(true);
|
|
137
|
+
});
|
|
134
138
|
}
|
|
135
139
|
addObject(obj, forceRender = true) {
|
|
136
140
|
if (this._arMode) {
|
|
@@ -241,7 +245,7 @@ export class SceneService {
|
|
|
241
245
|
// throw new Error('No WebGPU or WebGL2 support');
|
|
242
246
|
// }
|
|
243
247
|
const canvasElement = document.createElement('canvas');
|
|
244
|
-
const context = canvasElement.getContext('webgl2'
|
|
248
|
+
const context = canvasElement.getContext('webgl2');
|
|
245
249
|
this.webGL2Available = context !== undefined;
|
|
246
250
|
// this.renderer = new WebGPURenderer({ alpha: true, antialias: true });
|
|
247
251
|
// this.renderer =
|
|
@@ -255,15 +259,21 @@ export class SceneService {
|
|
|
255
259
|
// logarithmicDepthBuffer: true*/
|
|
256
260
|
// });
|
|
257
261
|
// this.renderer = new WebGLRenderer({alpha: true, antialias: false, preserveDrawingBuffer: true, premultipliedAlpha: true});
|
|
258
|
-
this.renderer = new WebGLRenderer(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
262
|
+
this.renderer = new WebGLRenderer({
|
|
263
|
+
/*
|
|
264
|
+
precision: 'highp',
|
|
265
|
+
powerPreference: 'high-performance',
|
|
266
|
+
*/
|
|
267
|
+
/*
|
|
268
|
+
antialias: true,
|
|
269
|
+
*/
|
|
270
|
+
/*
|
|
271
|
+
stencil: false,
|
|
272
|
+
depth: false
|
|
273
|
+
*/
|
|
274
|
+
});
|
|
265
275
|
this.renderer.outputColorSpace = SRGBColorSpace;
|
|
266
|
-
this.renderer.autoClear =
|
|
276
|
+
this.renderer.autoClear = true;
|
|
267
277
|
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
268
278
|
this.renderer.toneMapping = NoToneMapping; // ACESFilmicToneMapping; // LinearToneMapping;
|
|
269
279
|
this.renderer.shadowMap.enabled = true;
|
|
@@ -311,29 +321,29 @@ export class SceneService {
|
|
|
311
321
|
this._numberOfSamplesRendered = Math.floor(this.pathTracer.samples);
|
|
312
322
|
}
|
|
313
323
|
else {
|
|
314
|
-
if (this._needsRender || this.arMode || this._viewModeService.isVRViewActive() || this._outlineService.needsRender) {
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
324
|
+
// if (this._needsRender || this.arMode || this._viewModeService.isVRViewActive() || this._outlineService.needsRender) {
|
|
325
|
+
this.renderer.clear();
|
|
326
|
+
if (this._arMode && frame) {
|
|
327
|
+
this._arService.handleFrame(frame);
|
|
328
|
+
}
|
|
329
|
+
else if (this._viewModeService.isVRViewActive()) {
|
|
330
|
+
this._vrService.render();
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
this.onBeforeRender.next({ renderer: this.renderer, scene: this.scene });
|
|
334
|
+
if (!this._settingsService.settings.options.aaEnabled && !this._settingsService.settings.options.aoEnabled) {
|
|
335
|
+
// this.renderer.render(this.scene, this._cameraService.camera);
|
|
336
|
+
this._outlineService.render();
|
|
321
337
|
}
|
|
322
338
|
else {
|
|
323
|
-
this.
|
|
324
|
-
|
|
325
|
-
this.renderer.render(this.scene, this._cameraService.camera);
|
|
326
|
-
}
|
|
327
|
-
else {
|
|
328
|
-
this._postProcessing.render();
|
|
329
|
-
this._outlineService.render();
|
|
330
|
-
}
|
|
331
|
-
// this.renderer.render(this.scene, this._cameraService.camera);
|
|
339
|
+
this._postProcessing.render();
|
|
340
|
+
// this._outlineService.render();
|
|
332
341
|
}
|
|
333
|
-
this.onAfterRender.next({ renderer: this.renderer, scene: this.scene });
|
|
334
|
-
this._outlineService.needsRender = false;
|
|
335
|
-
this.needsRender = false;
|
|
336
342
|
}
|
|
343
|
+
this.onAfterRender.next({ renderer: this.renderer, scene: this.scene });
|
|
344
|
+
this._outlineService.needsRender = false;
|
|
345
|
+
this.needsRender = false;
|
|
346
|
+
// }
|
|
337
347
|
}
|
|
338
348
|
}
|
|
339
349
|
_animate() {
|
|
@@ -380,4 +390,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
380
390
|
providedIn: 'root'
|
|
381
391
|
}]
|
|
382
392
|
}], ctorParameters: function () { return [{ type: i1.CameraService }, { type: i2.ConfigurationService }, { type: i3.XrService }, { type: i4.VrService }, { type: i5.ArService }, { type: i6.MessageBusService }, { type: i7.ViewModeService }, { type: i8.OutlineService }, { type: i9.HomedecoratorSettingsService }, { type: i10.PostProcessingService }, { type: i11.SsrService }]; } });
|
|
383
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFDTCxLQUFLLEVBQ0wsYUFBYSxFQUViLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUdiLGFBQWEsRUFDZCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7QUFVM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDckYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsK0RBQStEO0FBQy9ELDZEQUE2RDtBQUM3RCxtRkFBbUY7QUFDbkYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBTzFGLE1BQU0sT0FBTyxZQUFZO0lBa0N2QixZQUNVLGNBQTZCLEVBQzdCLHFCQUEyQyxFQUMzQyxVQUFxQixFQUNy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QUFPLENBQUMsRUFBRTtpQkFDWDthQUNGO1FBQ0gsQ0FBQyxDQUNGLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7OzBHQWhZVSxZQUFZOzhHQUFaLFlBQVksY0FGWCxNQUFNOzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENvbG9yLFxyXG4gIE5vVG9uZU1hcHBpbmcsXHJcbiAgT2JqZWN0M0QsXHJcbiAgT3J0aG9ncmFwaGljQ2FtZXJhLFxyXG4gIFBDRlNvZnRTaGFkb3dNYXAsXHJcbiAgUGVyc3BlY3RpdmVDYW1lcmEsXHJcbiAgU2NlbmUsXHJcbiAgU1JHQkNvbG9yU3BhY2UsXHJcbiAgVGV4dHVyZUxvYWRlcixcclxuICBWZWN0b3IyLFxyXG4gIFZlY3RvcjMsXHJcbiAgV2ViR0xSZW5kZXJlclxyXG59IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIFRXRUVOIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcclxuaW1wb3J0IHtDYW1lcmFTZXJ2aWNlfSBmcm9tICcuL2NhbWVyYS5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb25maWd1cmF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7WHJTZXJ2aWNlfSBmcm9tICcuL3hyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZyU2VydmljZX0gZnJvbSAnLi92ci5zZXJ2aWNlJztcclxuaW1wb3J0IHtBclNlcnZpY2V9IGZyb20gJy4vYXIuc2VydmljZSc7XHJcbmltcG9ydCB7TWVzc2FnZUJ1c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9tZXNzYWdlLWJ1cy5zZXJ2aWNlJztcclxuaW1wb3J0IHtWaWV3TW9kZVNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS92aWV3LW1vZGUuc2VydmljZSc7XHJcbmltcG9ydCB7T3V0bGluZVNlcnZpY2V9IGZyb20gJy4vb3V0bGluZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtWaWV3TW9kZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL3ZpZXctbW9kZS5lbnVtJztcclxuaW1wb3J0IHtNZXNzYWdlVHlwZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbnVtL21lc3NhZ2UtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtGaWxlVXRpbHN9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvZmlsZS51dGlscyc7XHJcbmltcG9ydCB7VXRpbHN9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xyXG5pbXBvcnQge1NjZW5lM0RVdGlsfSBmcm9tICcuLi8uLi90aHJlZWRzZWxlY3Rvci90aHJlZWRzZWxlY3Rvci91dGlscy9zY2VuZS0zZC51dGlscyc7XHJcbmltcG9ydCB7UmVsYXRpdmVQb3NpdGlvblV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL3JlbGF0aXZlLXBvc2l0aW9uLnV0aWxzJztcclxuLy8gaW1wb3J0IFdlYkdQVSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY2FwYWJpbGl0aWVzL1dlYkdQVSc7XHJcbi8vIGltcG9ydCBXZWJHTCBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY2FwYWJpbGl0aWVzL1dlYkdMJztcclxuLy8gaW1wb3J0IFdlYkdQVVJlbmRlcmVyIGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9yZW5kZXJlcnMvd2ViZ3B1L1dlYkdQVVJlbmRlcmVyJztcclxuaW1wb3J0IHtXZWJHTFBhdGhUcmFjZXJ9IGZyb20gJ3RocmVlLWdwdS1wYXRodHJhY2VyJztcclxuaW1wb3J0IHtQYXJhbGxlbE1lc2hCVkhXb3JrZXJ9IGZyb20gJ3RocmVlLW1lc2gtYnZoL3NyYy93b3JrZXJzL1BhcmFsbGVsTWVzaEJWSFdvcmtlci5qcyc7XHJcbmltcG9ydCB7UG9zdFByb2Nlc3NpbmdTZXJ2aWNlfSBmcm9tICcuL3Bvc3QtcHJvY2Vzc2luZy5zZXJ2aWNlJztcclxuaW1wb3J0IHtTc3JTZXJ2aWNlfSBmcm9tICcuL3Nzci5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNjZW5lU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBzZXQgbmVlZHNSZW5kZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX25lZWRzUmVuZGVyID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5wYXRoVHJhY2VyKSB7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci51cGRhdGVDYW1lcmEoKTtcclxuICAgICAgdGhpcy5wYXRoVHJhY2VyLnVwZGF0ZUxpZ2h0cygpO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIudXBkYXRlTWF0ZXJpYWxzKCk7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci51cGRhdGVFbnZpcm9ubWVudCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fbnVtYmVyT2ZTYW1wbGVzUmVuZGVyZWQgPSAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBuZWVkc1JlbmRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9uZWVkc1JlbmRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY2VuZTogU2NlbmU7XHJcbiAgcHVibGljIHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLyogfCBXZWJHUFVSZW5kZXJlciovO1xyXG4gIHB1YmxpYyBwYXRoVHJhY2VyOiBXZWJHTFBhdGhUcmFjZXI7XHJcblxyXG4gIHB1YmxpYyBvbkJlZm9yZVJlbmRlcjogU3ViamVjdDx7IHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUgfT4gPSBuZXcgU3ViamVjdDx7IHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUgfT4oKTtcclxuICBwdWJsaWMgb25BZnRlclJlbmRlcjogU3ViamVjdDx7IHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUgfT4gPSBuZXcgU3ViamVjdDx7IHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUgfT4oKTtcclxuICBwdWJsaWMgc2NlbmVJbml0aWFsaXplZDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XHJcbiAgcHVibGljIHJlbmRlcmluZ1Rocm91Z2hQb3N0UHJvY2Vzc2luZ1BpcGVsaW5lOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgd2ViR0wyQXZhaWxhYmxlOiBib29sZWFuO1xyXG4gIHB1YmxpYyBkb21FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgcHJpdmF0ZSBfbmVlZHNSZW5kZXI6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfYXJNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF9tYXhSZW5kZXJTYW1wbGVzOiBudW1iZXI7XHJcbiAgcHJpdmF0ZSBfbnVtYmVyT2ZTYW1wbGVzUmVuZGVyZWQ6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9jYW1lcmFTZXJ2aWNlOiBDYW1lcmFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY29uZmlndXJhdGlvblNlcnZpY2U6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfeHJTZXJ2aWNlOiBYclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF92clNlcnZpY2U6IFZyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FyU2VydmljZTogQXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUJ1c1NlcnZpY2U6IE1lc3NhZ2VCdXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdmlld01vZGVTZXJ2aWNlOiBWaWV3TW9kZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9vdXRsaW5lU2VydmljZTogT3V0bGluZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wb3N0UHJvY2Vzc2luZzogUG9zdFByb2Nlc3NpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc3NyU2VydmljZTogU3NyU2VydmljZVxyXG4gICkge1xyXG4gICAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gKCkgPT4gdGhpcy5uZ09uRGVzdHJveSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRvbUVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNjZW5lKCk6IFNjZW5lIHtcclxuICAgIHJldHVybiB0aGlzLmFyTW9kZSA/IHRoaXMuX2FyU2VydmljZS5zY2VuZSA6IHRoaXMuc2NlbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGFyTW9kZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fYXJNb2RlID0gdmFsdWU7XHJcbiAgICBpZiAodGhpcy5fYXJNb2RlKSB7XHJcbiAgICAgIHRoaXMuX2FyU2VydmljZS5pbml0KHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlcik7XHJcbiAgICAgIHRoaXMuX3ZpZXdNb2RlU2VydmljZS52aWV3TW9kZSA9IFZpZXdNb2RlLkFSO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhck1vZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXJNb2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZG9tRWxlbWVudCA9IGVsZW1lbnQ7XHJcbiAgICB0aGlzLl9pbml0U2NlbmUoKTtcclxuICAgIHRoaXMuX2luaXRSZW5kZXJlcigpO1xyXG4gICAgdGhpcy5faW5pdENhbWVyYSgpO1xyXG4gICAgdGhpcy5faW5pdE91dGxpbmUoKTtcclxuICAgIHRoaXMuX2luaXRQb3N0UHJvY2Vzc2luZygpO1xyXG4gICAgdGhpcy5fYW5pbWF0ZSgpO1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fbWVzc2FnZUJ1c1NlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlRha2VTY3JlZW5zaG90LCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdNb2RlU2VydmljZS5pczNkVmlld0FjdGl2ZSgpIHx8IHRoaXMuX3ZpZXdNb2RlU2VydmljZS5pc1RvcFZpZXdBY3RpdmUoKSkge1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEpO1xyXG4gICAgICAgICAgY29uc3QgZGF0YVVybCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnKTtcclxuICAgICAgICAgIEZpbGVVdGlscy5Eb3dubG9hZEZyb21EYXRhVXJpKGRhdGFVcmwsIGBNeVJvb21wbGFuJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9LmpwZWdgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9hclNlcnZpY2Uuc2hvdWxkQWRkT2JqZWN0VG9TY2VuZS5zdWJzY3JpYmUoKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXJNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hZGRPYmplY3Qob2JqZWN0KTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX3ZpZXdNb2RlU2VydmljZS52aWV3TW9kZUNoYW5nZWQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuX2lzM0RNb2RlKG1vZGUpKSB7XHJcbiAgICAgICAgLy8gICB0aGlzLl9hbmltYXRlKCk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgIHRoaXMuX3BhdXNlQW5pbWF0aW9uKCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGlmIChtb2RlID09PSBWaWV3TW9kZS5WUikge1xyXG4gICAgICAgICAgdGhpcy5fdnJTZXJ2aWNlLmluaXQodGhpcy5zY2VuZSwgdGhpcy5yZW5kZXJlciBhcyBXZWJHTFJlbmRlcmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fdnJTZXJ2aWNlLmVuZFNlc3Npb24oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3NMb2FkZWQuc3Vic2NyaWJlKChsb2FkZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAobG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbml0UGF0aFRyYWNlcigpO1xyXG4gICAgICAgICAgdGhpcy5fbWF4UmVuZGVyU2FtcGxlcyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLm1heFJlbmRlclNhbXBsZXM7XHJcbiAgICAgICAgICB0aGlzLl9zc3JTZXJ2aWNlLmVuYWJsZWQgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5zc3JFbmFibGVkO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLy8gdGhpcy5feHJTZXJ2aWNlLnNlc3Npb25TdGFydGVkLnN1YnNjcmliZSgobW9kZTogWHJNb2RlKSA9PiB7XHJcbiAgICAgIC8vICAgaWYgKG1vZGUgPT09IFhyTW9kZS5Bck1vZGUpIHtcclxuICAgICAgLy8gICAgIHRoaXMuX2FuaW1hdGVBcigpO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfSlcclxuICAgICk7XHJcbiAgICB0aGlzLl94clNlcnZpY2UuaW5pdCh0aGlzLnJlbmRlcmVyIGFzIFdlYkdMUmVuZGVyZXIsIHRoaXMuc2NlbmUsIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhKTtcclxuICAgIHRoaXMuc2NlbmVJbml0aWFsaXplZC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZE9iamVjdChvYmo6IE9iamVjdDNELCBmb3JjZVJlbmRlcjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9hck1vZGUpIHtcclxuICAgICAgdGhpcy5fYXJTZXJ2aWNlLmFkZE9iamVjdFRvQVJTY2VuZShvYmopO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zY2VuZS5hZGQob2JqKTtcclxuICAgICAgdGhpcy51cGRhdGVQYXRoVHJhY2VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcmNlUmVuZGVyKSB7XHJcbiAgICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZU9iamVjdChvYmo6IE9iamVjdDNELCBmb3JjZVJlbmRlcjogYm9vbGVhbiA9IHRydWUsIGNsZWFuVXA6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmopO1xyXG4gICAgaWYgKGZvcmNlUmVuZGVyKSB7XHJcbiAgICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGNsZWFuVXApIHtcclxuICAgICAgVXRpbHMuRGlzcG9zZU9iamVjdChvYmopO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZVBhdGhUcmFjZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMucGF0aFRyYWNlciAmJiB0aGlzLnBhdGhUcmFjZXIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLnBhdGhUcmFjZXIuc2V0U2NlbmUodGhpcy5zY2VuZSwgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHBvc2l0aW9uSW5TY2VuZVRvU2NyZWVuKHBvczogVmVjdG9yMyk6IFZlY3RvcjIge1xyXG4gICAgcmV0dXJuIFNjZW5lM0RVdGlsLkNvbnZlcnQzRFBvaW50VG9TY3JlZW5Qb2ludChcclxuICAgICAgcG9zLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSwgdGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoLCB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW5kZXJlclByb3BzQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY2VuZS50cmF2ZXJzZSgobm9kZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghbm9kZS5pc01lc2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZS5tYXRlcmlhbCkpIHtcclxuICAgICAgICBub2RlLm1hdGVyaWFsLmZvckVhY2goZnVuY3Rpb24gKG1hdGVyaWFsKSB7XHJcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbm9kZS5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlUmVuZGVyV2l0aE9ydGhvZ3JhcGhpY0NhbWVyYSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYXNwZWN0OiBudW1iZXIgPSB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgIGNvbnN0IGZydXN0dW1TaXplOiBudW1iZXIgPSAxMDtcclxuICAgIGNvbnN0IG9ydGhvZ3JhcGhpY0NhbWVyYTogT3J0aG9ncmFwaGljQ2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYShcclxuICAgICAgZnJ1c3R1bVNpemUgKiBhc3BlY3QgLyAtMixcclxuICAgICAgZnJ1c3R1bVNpemUgKiBhc3BlY3QgLyAyLFxyXG4gICAgICBmcnVzdHVtU2l6ZSAvIDIsXHJcbiAgICAgIGZydXN0dW1TaXplIC8gLTIsXHJcbiAgICAgIDAuMSxcclxuICAgICAgMTAwXHJcbiAgICApO1xyXG4gICAgb3J0aG9ncmFwaGljQ2FtZXJhLnBvc2l0aW9uLnNldCgwLCAzLCAtMik7XHJcbiAgICBvcnRob2dyYXBoaWNDYW1lcmEubG9va0F0KDAsIDAsIC0yKTtcclxuICAgIG9ydGhvZ3JhcGhpY0NhbWVyYS5uYW1lID0gJ29ydGhvZ3JhcGhpY2NhbWVyYSc7XHJcbiAgICB0aGlzLnNjZW5lLmFkZChvcnRob2dyYXBoaWNDYW1lcmEpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgb3J0aG9ncmFwaGljQ2FtZXJhKTtcclxuICAgIGNvbnN0IHJlbmRlcjogc3RyaW5nID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpO1xyXG4gICAgdGhpcy5zY2VuZS5nZXRPYmplY3RCeU5hbWUoJ29ydGhvZ3JhcGhpY2NhbWVyYScpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEpO1xyXG4gICAgcmV0dXJuIHJlbmRlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTY2VuZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcclxuICAgIHRoaXMuX3NldFNjZW5lQmFja2dyb3VuZCgpO1xyXG4gICAgLy8gY29uc3QgYm94MWdlbyA9IG5ldyBCb3hHZW9tZXRyeSgxLCAxLCAxKTtcclxuICAgIC8vIGNvbnN0IGJveDEgPSBuZXcgTWVzaChib3gxZ2VvLCBuZXcgTWVzaFBob25nTWF0ZXJpYWwoe2NvbG9yOiAnZ3JlZW4nfSkpO1xyXG4gICAgLy8gYm94MS5wb3NpdGlvbi5zZXQoLTAuNSwgMC43LCAtMC41KTtcclxuICAgIC8vIGJveDEuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICAvLyBib3gxLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gICAgLy8gdGhpcy5zY2VuZS5hZGQoYm94MSk7XHJcbiAgICAvLyBjb25zdCBib3gyZ2VvID0gbmV3IEJveEdlb21ldHJ5KDAuNiwgMC42LCAwLjYpO1xyXG4gICAgLy8gY29uc3QgYm94MiA9IG5ldyBNZXNoKGJveDJnZW8sIG5ldyBNZXNoUGhvbmdNYXRlcmlhbCh7Y29sb3I6ICdyZWQnfSkpO1xyXG4gICAgLy8gYm94Mi5wb3NpdGlvbi5zZXQoMC41LCAxLjUsIDAuNSk7XHJcbiAgICAvLyBib3gyLmNhc3RTaGFkb3cgPSB0cnVlO1xyXG4gICAgLy8gYm94Mi5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcclxuICAgIC8vIHRoaXMuc2NlbmUuYWRkKGJveDIpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdENhbWVyYSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UuaW5pdCh0aGlzLmRvbUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdE91dGxpbmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9vdXRsaW5lU2VydmljZS5pbml0KHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlciwgdGhpcy5zY2VuZSwgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEsXHJcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxyXG4gICAgICB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFBvc3RQcm9jZXNzaW5nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcG9zdFByb2Nlc3NpbmcuaW5pdCh0aGlzLnJlbmRlcmVyIGFzIFdlYkdMUmVuZGVyZXIsIHRoaXMuc2NlbmUsIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLFxyXG4gICAgICB0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGggKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyxcclxuICAgICAgdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQYXRoVHJhY2VyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnBhdGhUcmFjZXIpIHtcclxuICAgICAgdGhpcy5wYXRoVHJhY2VyID0gbmV3IFdlYkdMUGF0aFRyYWNlcih0aGlzLnJlbmRlcmVyIGFzIFdlYkdMUmVuZGVyZXIpO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIuc2V0QlZIV29ya2VyKG5ldyBQYXJhbGxlbE1lc2hCVkhXb3JrZXIoKSk7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci5maWx0ZXJHbG9zc3lGYWN0b3IgPSAxO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIudGlsZXMuc2V0KDMsIDMpO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIubXVsdGlwbGVJbXBvcnRhbmNlU2FtcGxpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIudHJhbnNtaXNzaXZlQm91bmNlcyA9IDEwO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIucmVuZGVyU2NhbGUgPSAxO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIuc2V0U2NlbmUodGhpcy5zY2VuZSwgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEpO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIuZW5hYmxlUGF0aFRyYWNpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfaW5pdFJlbmRlcmVyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gaWYgKFdlYkdQVS5pc0F2YWlsYWJsZSgpID09PSBmYWxzZSAmJiBXZWJHTC5pc1dlYkdMMkF2YWlsYWJsZSgpID09PSBmYWxzZSkge1xyXG4gICAgLy8gICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBXZWJHUFUuZ2V0RXJyb3JNZXNzYWdlKCkgKTtcclxuICAgIC8vICAgdGhyb3cgbmV3IEVycm9yKCdObyBXZWJHUFUgb3IgV2ViR0wyIHN1cHBvcnQnKTtcclxuICAgIC8vIH1cclxuICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQ6IEhUTUxDYW52YXNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICBjb25zdCBjb250ZXh0OiBhbnkgPSBjYW52YXNFbGVtZW50LmdldENvbnRleHQoJ3dlYmdsMicsIHthbnRpYWxpYXM6IHRydWV9KTtcclxuICAgIHRoaXMud2ViR0wyQXZhaWxhYmxlID0gY29udGV4dCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgLy8gdGhpcy5yZW5kZXJlciA9IG5ldyBXZWJHUFVSZW5kZXJlcih7IGFscGhhOiB0cnVlLCBhbnRpYWxpYXM6IHRydWUgfSk7XHJcbiAgICAvLyB0aGlzLnJlbmRlcmVyID1cclxuICAgIC8vICAgbmV3IFdlYkdMUmVuZGVyZXIoe1xyXG4gICAgLy8gICAgIGNhbnZhczogY2FudmFzRWxlbWVudCxcclxuICAgIC8vICAgICBjb250ZXh0OiBjb250ZXh0LFxyXG4gICAgLy8gICAgIGFscGhhOiB0cnVlLFxyXG4gICAgLy8gICAgIGFudGlhbGlhczogdHJ1ZSxcclxuICAgIC8vICAgICBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsXHJcbiAgICAvLyAgICAgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZS8qLFxyXG4gICAgLy8gICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IHRydWUqL1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIHRoaXMucmVuZGVyZXIgPSBuZXcgV2ViR0xSZW5kZXJlcih7YWxwaGE6IHRydWUsIGFudGlhbGlhczogZmFsc2UsIHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogdHJ1ZSwgcHJlbXVsdGlwbGllZEFscGhhOiB0cnVlfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFdlYkdMUmVuZGVyZXIoLyp7XHJcbiAgICAgIHByZWNpc2lvbjogJ2hpZ2hwJyxcclxuICAgICAgcG93ZXJQcmVmZXJlbmNlOiAnaGlnaC1wZXJmb3JtYW5jZScsXHJcbiAgICAgIGFudGlhbGlhczogdHJ1ZSxcclxuICAgICAgc3RlbmNpbDogZmFsc2UsXHJcbiAgICAgIGRlcHRoOiBmYWxzZVxyXG4gICAgfSovKTtcclxuICAgIHRoaXMucmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZzsgLy8gQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOyAvLyBMaW5lYXJUb25lTWFwcGluZztcclxuICAgIHRoaXMucmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zaGFkb3dNYXAudHlwZSA9IFBDRlNvZnRTaGFkb3dNYXA7XHJcbiAgICB0aGlzLmRvbUVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ3RocmVlZF9jYW52YXMnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Jlc2l6ZVJlbmRlcmVyVG9EaXNwbGF5U2l6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQsIHRydWUpO1xyXG4gICAgdGhpcy5fb3V0bGluZVNlcnZpY2Uuc2V0U2l6ZSh0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG4gICAgdGhpcy5fcG9zdFByb2Nlc3Npbmcuc2V0U2l6ZSh0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlV2luZG93U2l6ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3Jlc2l6ZVJlbmRlcmVyVG9EaXNwbGF5U2l6ZSgpO1xyXG4gICAgUmVsYXRpdmVQb3NpdGlvblV0aWxzLlNldEFwcGxpY2F0aW9uT2Zmc2V0KHRoaXMuZG9tRWxlbWVudCk7XHJcbiAgICBpZiAodGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xyXG4gICAgICBjb25zdCBhc3BlY3QgPSB0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGggLyB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLnJlYWxBc3BlY3RSYXRpbyA9IGFzcGVjdDtcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xyXG4gICAgICAodGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEgYXMgUGVyc3BlY3RpdmVDYW1lcmEpLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgIH1cclxuICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2hlY2tDYW52YXNSZXNpemUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoICE9PSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQud2lkdGggfHxcclxuICAgICAgdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCAhPT0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmhlaWdodCkge1xyXG4gICAgICB0aGlzLl91cGRhdGVXaW5kb3dTaXplKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW5kZXIodCwgZnJhbWUpIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlci54ci5lbmFibGVkKSB7XHJcbiAgICAgIFRXRUVOLnVwZGF0ZSgpO1xyXG4gICAgICB0aGlzLl9jaGVja0NhbnZhc1Jlc2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnBhdGhUcmFjZXIgJiYgdGhpcy5wYXRoVHJhY2VyKSB7XHJcbiAgICAgIGlmICh0aGlzLl9udW1iZXJPZlNhbXBsZXNSZW5kZXJlZCA+PSB0aGlzLl9tYXhSZW5kZXJTYW1wbGVzKSB7XHJcbiAgICAgICAgdGhpcy5wYXRoVHJhY2VyLmVuYWJsZVBhdGhUcmFjaW5nID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYXRoVHJhY2VyLmVuYWJsZVBhdGhUcmFjaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5wYXRoVHJhY2VyLnJlbmRlclNhbXBsZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX251bWJlck9mU2FtcGxlc1JlbmRlcmVkID0gTWF0aC5mbG9vcih0aGlzLnBhdGhUcmFjZXIuc2FtcGxlcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5fbmVlZHNSZW5kZXIgfHwgdGhpcy5hck1vZGUgfHwgdGhpcy5fdmlld01vZGVTZXJ2aWNlLmlzVlJWaWV3QWN0aXZlKCkgfHwgdGhpcy5fb3V0bGluZVNlcnZpY2UubmVlZHNSZW5kZXIpIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyLmNsZWFyKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FyTW9kZSAmJiBmcmFtZSkge1xyXG4gICAgICAgICAgdGhpcy5fYXJTZXJ2aWNlLmhhbmRsZUZyYW1lKGZyYW1lKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3ZpZXdNb2RlU2VydmljZS5pc1ZSVmlld0FjdGl2ZSgpKSB7XHJcbiAgICAgICAgICB0aGlzLl92clNlcnZpY2UucmVuZGVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25CZWZvcmVSZW5kZXIubmV4dCh7cmVuZGVyZXI6IHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlciwgc2NlbmU6IHRoaXMuc2NlbmV9KTtcclxuICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJpbmdUaHJvdWdoUG9zdFByb2Nlc3NpbmdQaXBlbGluZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3N0UHJvY2Vzc2luZy5yZW5kZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5fb3V0bGluZVNlcnZpY2UucmVuZGVyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25BZnRlclJlbmRlci5uZXh0KHtyZW5kZXJlcjogdGhpcy5yZW5kZXJlciBhcyBXZWJHTFJlbmRlcmVyLCBzY2VuZTogdGhpcy5zY2VuZX0pO1xyXG4gICAgICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5uZWVkc1JlbmRlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9hbmltYXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBbmltYXRpb25Mb29wKCh0aW1lc3RhbXAsIGZyYW1lKSA9PiB0aGlzLl9yZW5kZXIodGltZXN0YW1wLCBmcmFtZSkpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3BhdXNlQW5pbWF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBbmltYXRpb25Mb29wKG51bGwpO1xyXG4gICAgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzM0RNb2RlKG1vZGU6IFZpZXdNb2RlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gbW9kZSAhPT0gVmlld01vZGUuRmxvb3JQbGFuMkQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zZXRTY2VuZUJhY2tncm91bmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5nc0xvYWRlZC5zdWJzY3JpYmUoKGxvYWRlZDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKGxvYWRlZCAmJiB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2NlbmVCYWNrZ3JvdW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG5ldyBUZXh0dXJlTG9hZGVyKCkubG9hZCh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2NlbmVCYWNrZ3JvdW5kLCAobWF0ZXJpYWwpID0+IHtcclxuICAgICAgICAgICAgICBtYXRlcmlhbC5jb2xvclNwYWNlID0gU1JHQkNvbG9yU3BhY2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChsb2FkZWQgJiYgdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNjZW5lQmFja2dyb3VuZENvbG9yKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKHBhcnNlSW50KHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zY2VuZUJhY2tncm91bmRDb2xvciwgMCkpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNjZW5lQ2FudmFzSW1hZ2UoKTogc3RyaW5nIHtcclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhKTtcclxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQudG9EYXRhVVJMKCdpbWFnZS9qcGVnJyk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFDTCxLQUFLLEVBQ0wsYUFBYSxFQUViLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxjQUFjLEVBQ2QsYUFBYSxFQUdiLGFBQWEsRUFDZCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7QUFVM0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDckYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsK0RBQStEO0FBQy9ELDZEQUE2RDtBQUM3RCxtRkFBbUY7QUFDbkYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFEQUFxRCxDQUFDOzs7Ozs7Ozs7Ozs7O0FBUTFGLE1BQU0sT0FBTyxZQUFZO0lBa0N2QixZQUNVLGNBQTZCLEVBQzdCLHFCQUEyQyxFQUMzQyxVQUFxQixFQUNy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Q1AsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7MEdBeFlVLFlBQVk7OEdBQVosWUFBWSxjQUZYLE1BQU07NEZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgQ29sb3IsXHJcbiAgTm9Ub25lTWFwcGluZyxcclxuICBPYmplY3QzRCxcclxuICBPcnRob2dyYXBoaWNDYW1lcmEsXHJcbiAgUENGU29mdFNoYWRvd01hcCxcclxuICBQZXJzcGVjdGl2ZUNhbWVyYSxcclxuICBTY2VuZSxcclxuICBTUkdCQ29sb3JTcGFjZSxcclxuICBUZXh0dXJlTG9hZGVyLFxyXG4gIFZlY3RvcjIsXHJcbiAgVmVjdG9yMyxcclxuICBXZWJHTFJlbmRlcmVyXHJcbn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0ICogYXMgVFdFRU4gZnJvbSAnQHR3ZWVuanMvdHdlZW4uanMnO1xyXG5pbXBvcnQge0NhbWVyYVNlcnZpY2V9IGZyb20gJy4vY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtYclNlcnZpY2V9IGZyb20gJy4veHIuc2VydmljZSc7XHJcbmltcG9ydCB7VnJTZXJ2aWNlfSBmcm9tICcuL3ZyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0FyU2VydmljZX0gZnJvbSAnLi9hci5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQnVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL21lc3NhZ2UtYnVzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ZpZXctbW9kZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtPdXRsaW5lU2VydmljZX0gZnJvbSAnLi9vdXRsaW5lLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLXNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge01lc3NhZ2VUeXBlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vbWVzc2FnZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge0ZpbGVVdGlsc30gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9maWxlLnV0aWxzJztcclxuaW1wb3J0IHtVdGlsc30gZnJvbSAnLi4vY29yZS91dGlscyc7XHJcbmltcG9ydCB7U2NlbmUzRFV0aWx9IGZyb20gJy4uLy4uL3RocmVlZHNlbGVjdG9yL3RocmVlZHNlbGVjdG9yL3V0aWxzL3NjZW5lLTNkLnV0aWxzJztcclxuaW1wb3J0IHtSZWxhdGl2ZVBvc2l0aW9uVXRpbHN9IGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvcmVsYXRpdmUtcG9zaXRpb24udXRpbHMnO1xyXG4vLyBpbXBvcnQgV2ViR1BVIGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jYXBhYmlsaXRpZXMvV2ViR1BVJztcclxuLy8gaW1wb3J0IFdlYkdMIGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jYXBhYmlsaXRpZXMvV2ViR0wnO1xyXG4vLyBpbXBvcnQgV2ViR1BVUmVuZGVyZXIgZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL3JlbmRlcmVycy93ZWJncHUvV2ViR1BVUmVuZGVyZXInO1xyXG5pbXBvcnQge1dlYkdMUGF0aFRyYWNlcn0gZnJvbSAndGhyZWUtZ3B1LXBhdGh0cmFjZXInO1xyXG5pbXBvcnQge1BhcmFsbGVsTWVzaEJWSFdvcmtlcn0gZnJvbSAndGhyZWUtbWVzaC1idmgvc3JjL3dvcmtlcnMvUGFyYWxsZWxNZXNoQlZIV29ya2VyLmpzJztcclxuaW1wb3J0IHtQb3N0UHJvY2Vzc2luZ1NlcnZpY2V9IGZyb20gJy4vcG9zdC1wcm9jZXNzaW5nLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NzclNlcnZpY2V9IGZyb20gJy4vc3NyLnNlcnZpY2UnO1xyXG5pbXBvcnQge09iamVjdFV0aWxzfSBmcm9tICcuLi8uLi8uLi9jb3JlL3V0aWxzL29iamVjdC51dGlscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTY2VuZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG5cclxuICBwdWJsaWMgc2V0IG5lZWRzUmVuZGVyKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9uZWVkc1JlbmRlciA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMucGF0aFRyYWNlcikge1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIudXBkYXRlQ2FtZXJhKCk7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci51cGRhdGVMaWdodHMoKTtcclxuICAgICAgdGhpcy5wYXRoVHJhY2VyLnVwZGF0ZU1hdGVyaWFscygpO1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIudXBkYXRlRW52aXJvbm1lbnQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuX251bWJlck9mU2FtcGxlc1JlbmRlcmVkID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgbmVlZHNSZW5kZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmVlZHNSZW5kZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2NlbmU6IFNjZW5lO1xyXG4gIHB1YmxpYyByZW5kZXJlcjogV2ViR0xSZW5kZXJlci8qIHwgV2ViR1BVUmVuZGVyZXIqLztcclxuICBwdWJsaWMgcGF0aFRyYWNlcjogV2ViR0xQYXRoVHJhY2VyO1xyXG5cclxuICBwdWJsaWMgb25CZWZvcmVSZW5kZXI6IFN1YmplY3Q8eyByZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgc2NlbmU6IFNjZW5lIH0+ID0gbmV3IFN1YmplY3Q8eyByZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgc2NlbmU6IFNjZW5lIH0+KCk7XHJcbiAgcHVibGljIG9uQWZ0ZXJSZW5kZXI6IFN1YmplY3Q8eyByZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgc2NlbmU6IFNjZW5lIH0+ID0gbmV3IFN1YmplY3Q8eyByZW5kZXJlcjogV2ViR0xSZW5kZXJlciwgc2NlbmU6IFNjZW5lIH0+KCk7XHJcbiAgcHVibGljIHNjZW5lSW5pdGlhbGl6ZWQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xyXG4gIHB1YmxpYyByZW5kZXJpbmdUaHJvdWdoUG9zdFByb2Nlc3NpbmdQaXBlbGluZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIHdlYkdMMkF2YWlsYWJsZTogYm9vbGVhbjtcclxuICBwdWJsaWMgZG9tRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIHByaXZhdGUgX25lZWRzUmVuZGVyOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2FyTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfbWF4UmVuZGVyU2FtcGxlczogbnVtYmVyO1xyXG4gIHByaXZhdGUgX251bWJlck9mU2FtcGxlc1JlbmRlcmVkOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfY2FtZXJhU2VydmljZTogQ2FtZXJhU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX3hyU2VydmljZTogWHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdnJTZXJ2aWNlOiBWclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hclNlcnZpY2U6IEFyU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCdXNTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3ZpZXdNb2RlU2VydmljZTogVmlld01vZGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfb3V0bGluZVNlcnZpY2U6IE91dGxpbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcG9zdFByb2Nlc3Npbmc6IFBvc3RQcm9jZXNzaW5nU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NzclNlcnZpY2U6IFNzclNlcnZpY2VcclxuICApIHtcclxuICAgIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9ICgpID0+IHRoaXMubmdPbkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kb21FbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTY2VuZSgpOiBTY2VuZSB7XHJcbiAgICByZXR1cm4gdGhpcy5hck1vZGUgPyB0aGlzLl9hclNlcnZpY2Uuc2NlbmUgOiB0aGlzLnNjZW5lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhck1vZGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2FyTW9kZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX2FyTW9kZSkge1xyXG4gICAgICB0aGlzLl9hclNlcnZpY2UuaW5pdCh0aGlzLnJlbmRlcmVyIGFzIFdlYkdMUmVuZGVyZXIpO1xyXG4gICAgICB0aGlzLl92aWV3TW9kZVNlcnZpY2Uudmlld01vZGUgPSBWaWV3TW9kZS5BUjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgYXJNb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FyTW9kZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRvbUVsZW1lbnQgPSBlbGVtZW50O1xyXG4gICAgdGhpcy5faW5pdFNjZW5lKCk7XHJcbiAgICB0aGlzLl9pbml0UmVuZGVyZXIoKTtcclxuICAgIHRoaXMuX2luaXRDYW1lcmEoKTtcclxuICAgIHRoaXMuX2luaXRPdXRsaW5lKCk7XHJcbiAgICB0aGlzLl9pbml0UG9zdFByb2Nlc3NpbmcoKTtcclxuICAgIHRoaXMuX2FuaW1hdGUoKTtcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXNTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5UYWtlU2NyZWVuc2hvdCwgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl92aWV3TW9kZVNlcnZpY2UuaXMzZFZpZXdBY3RpdmUoKSB8fCB0aGlzLl92aWV3TW9kZVNlcnZpY2UuaXNUb3BWaWV3QWN0aXZlKCkpIHtcclxuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhKTtcclxuICAgICAgICAgIGNvbnN0IGRhdGFVcmwgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQudG9EYXRhVVJMKCdpbWFnZS9qcGVnJyk7XHJcbiAgICAgICAgICBGaWxlVXRpbHMuRG93bmxvYWRGcm9tRGF0YVVyaShkYXRhVXJsLCBgTXlSb29tcGxhbiR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfS5qcGVnYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fYXJTZXJ2aWNlLnNob3VsZEFkZE9iamVjdFRvU2NlbmUuc3Vic2NyaWJlKChvYmplY3QpID0+IHtcclxuICAgICAgICB0aGlzLmFyTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWRkT2JqZWN0KG9iamVjdCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl92aWV3TW9kZVNlcnZpY2Uudmlld01vZGVDaGFuZ2VkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl9pczNETW9kZShtb2RlKSkge1xyXG4gICAgICAgIC8vICAgdGhpcy5fYW5pbWF0ZSgpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICB0aGlzLl9wYXVzZUFuaW1hdGlvbigpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBpZiAobW9kZSA9PT0gVmlld01vZGUuVlIpIHtcclxuICAgICAgICAgIHRoaXMuX3ZyU2VydmljZS5pbml0KHRoaXMuc2NlbmUsIHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3ZyU2VydmljZS5lbmRTZXNzaW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzTG9hZGVkLnN1YnNjcmliZSgobG9hZGVkOiBib29sZWFuKSA9PiB7XHJcbiAgICAgICAgaWYgKGxvYWRlZCkge1xyXG4gICAgICAgICAgdGhpcy5faW5pdFBhdGhUcmFjZXIoKTtcclxuICAgICAgICAgIHRoaXMuX21heFJlbmRlclNhbXBsZXMgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5tYXhSZW5kZXJTYW1wbGVzO1xyXG4gICAgICAgICAgdGhpcy5fc3NyU2VydmljZS5lbmFibGVkID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMuc3NyRW5hYmxlZDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC8vIHRoaXMuX3hyU2VydmljZS5zZXNzaW9uU3RhcnRlZC5zdWJzY3JpYmUoKG1vZGU6IFhyTW9kZSkgPT4ge1xyXG4gICAgICAvLyAgIGlmIChtb2RlID09PSBYck1vZGUuQXJNb2RlKSB7XHJcbiAgICAgIC8vICAgICB0aGlzLl9hbmltYXRlQXIoKTtcclxuICAgICAgLy8gICB9XHJcbiAgICAgIC8vIH0pXHJcbiAgICApO1xyXG4gICAgdGhpcy5feHJTZXJ2aWNlLmluaXQodGhpcy5yZW5kZXJlciBhcyBXZWJHTFJlbmRlcmVyLCB0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICAvLyBjb25zdCBoZHJpUGF0aDogc3RyaW5nID0gJy9hc3NldHMvaGRyaS9UU1N0dWRpbzNQb2ludC5oZHInO1xyXG4gICAgLy8gYXdhaXQgT2JqZWN0VXRpbHMuTG9hZEhEUkkoaGRyaVBhdGgsIHRoaXMuc2NlbmUpO1xyXG4gICAgdGhpcy5zY2VuZUluaXRpYWxpemVkLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkT2JqZWN0KG9iajogT2JqZWN0M0QsIGZvcmNlUmVuZGVyOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2FyTW9kZSkge1xyXG4gICAgICB0aGlzLl9hclNlcnZpY2UuYWRkT2JqZWN0VG9BUlNjZW5lKG9iaik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNjZW5lLmFkZChvYmopO1xyXG4gICAgICB0aGlzLnVwZGF0ZVBhdGhUcmFjZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZm9yY2VSZW5kZXIpIHtcclxuICAgICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlT2JqZWN0KG9iajogT2JqZWN0M0QsIGZvcmNlUmVuZGVyOiBib29sZWFuID0gdHJ1ZSwgY2xlYW5VcDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgIHRoaXMuc2NlbmUucmVtb3ZlKG9iaik7XHJcbiAgICBpZiAoZm9yY2VSZW5kZXIpIHtcclxuICAgICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY2xlYW5VcCkge1xyXG4gICAgICBVdGlscy5EaXNwb3NlT2JqZWN0KG9iaik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlUGF0aFRyYWNlcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5wYXRoVHJhY2VyICYmIHRoaXMucGF0aFRyYWNlcikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMucGF0aFRyYWNlci5zZXRTY2VuZSh0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcG9zaXRpb25JblNjZW5lVG9TY3JlZW4ocG9zOiBWZWN0b3IzKTogVmVjdG9yMiB7XHJcbiAgICByZXR1cm4gU2NlbmUzRFV0aWwuQ29udmVydDNEUG9pbnRUb1NjcmVlblBvaW50KFxyXG4gICAgICBwb3MsIHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhLCB0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGgsIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcmVyUHJvcHNDaGFuZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNjZW5lLnRyYXZlcnNlKChub2RlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFub2RlLmlzTWVzaCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlLm1hdGVyaWFsKSkge1xyXG4gICAgICAgIG5vZGUubWF0ZXJpYWwuZm9yRWFjaChmdW5jdGlvbiAobWF0ZXJpYWwpIHtcclxuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub2RlLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVSZW5kZXJXaXRoT3J0aG9ncmFwaGljQ2FtZXJhKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBhc3BlY3Q6IG51bWJlciA9IHdpbmRvdy5pbm5lcldpZHRoIC8gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgY29uc3QgZnJ1c3R1bVNpemU6IG51bWJlciA9IDEwO1xyXG4gICAgY29uc3Qgb3J0aG9ncmFwaGljQ2FtZXJhOiBPcnRob2dyYXBoaWNDYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKFxyXG4gICAgICBmcnVzdHVtU2l6ZSAqIGFzcGVjdCAvIC0yLFxyXG4gICAgICBmcnVzdHVtU2l6ZSAqIGFzcGVjdCAvIDIsXHJcbiAgICAgIGZydXN0dW1TaXplIC8gMixcclxuICAgICAgZnJ1c3R1bVNpemUgLyAtMixcclxuICAgICAgMC4xLFxyXG4gICAgICAxMDBcclxuICAgICk7XHJcbiAgICBvcnRob2dyYXBoaWNDYW1lcmEucG9zaXRpb24uc2V0KDAsIDMsIC0yKTtcclxuICAgIG9ydGhvZ3JhcGhpY0NhbWVyYS5sb29rQXQoMCwgMCwgLTIpO1xyXG4gICAgb3J0aG9ncmFwaGljQ2FtZXJhLm5hbWUgPSAnb3J0aG9ncmFwaGljY2FtZXJhJztcclxuICAgIHRoaXMuc2NlbmUuYWRkKG9ydGhvZ3JhcGhpY0NhbWVyYSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCBvcnRob2dyYXBoaWNDYW1lcmEpO1xyXG4gICAgY29uc3QgcmVuZGVyOiBzdHJpbmcgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQudG9EYXRhVVJMKCdpbWFnZS9qcGVnJyk7XHJcbiAgICB0aGlzLnNjZW5lLmdldE9iamVjdEJ5TmFtZSgnb3J0aG9ncmFwaGljY2FtZXJhJykucmVtb3ZlKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICByZXR1cm4gcmVuZGVyO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFNjZW5lKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBTY2VuZSgpO1xyXG4gICAgdGhpcy5fc2V0U2NlbmVCYWNrZ3JvdW5kKCk7XHJcbiAgICAvLyBjb25zdCBib3gxZ2VvID0gbmV3IEJveEdlb21ldHJ5KDEsIDEsIDEpO1xyXG4gICAgLy8gY29uc3QgYm94MSA9IG5ldyBNZXNoKGJveDFnZW8sIG5ldyBNZXNoUGhvbmdNYXRlcmlhbCh7Y29sb3I6ICdncmVlbid9KSk7XHJcbiAgICAvLyBib3gxLnBvc2l0aW9uLnNldCgtMC41LCAwLjcsIC0wLjUpO1xyXG4gICAgLy8gYm94MS5jYXN0U2hhZG93ID0gdHJ1ZTtcclxuICAgIC8vIGJveDEucmVjZWl2ZVNoYWRvdyA9IHRydWU7XHJcbiAgICAvLyB0aGlzLnNjZW5lLmFkZChib3gxKTtcclxuICAgIC8vIGNvbnN0IGJveDJnZW8gPSBuZXcgQm94R2VvbWV0cnkoMC42LCAwLjYsIDAuNik7XHJcbiAgICAvLyBjb25zdCBib3gyID0gbmV3IE1lc2goYm94MmdlbywgbmV3IE1lc2hQaG9uZ01hdGVyaWFsKHtjb2xvcjogJ3JlZCd9KSk7XHJcbiAgICAvLyBib3gyLnBvc2l0aW9uLnNldCgwLjUsIDEuNSwgMC41KTtcclxuICAgIC8vIGJveDIuY2FzdFNoYWRvdyA9IHRydWU7XHJcbiAgICAvLyBib3gyLnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xyXG4gICAgLy8gdGhpcy5zY2VuZS5hZGQoYm94Mik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0Q2FtZXJhKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FtZXJhU2VydmljZS5pbml0KHRoaXMuZG9tRWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0T3V0bGluZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLmluaXQodGhpcy5yZW5kZXJlciBhcyBXZWJHTFJlbmRlcmVyLCB0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSxcclxuICAgICAgdGhpcy5kb21FbGVtZW50LmNsaWVudFdpZHRoICogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXHJcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQgKiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UG9zdFByb2Nlc3NpbmcoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wb3N0UHJvY2Vzc2luZy5pbml0KHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlciwgdGhpcy5zY2VuZSwgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmEsXHJcbiAgICAgIHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aCAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxyXG4gICAgICB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0ICogd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFBhdGhUcmFjZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMucGF0aFRyYWNlcikge1xyXG4gICAgICB0aGlzLnBhdGhUcmFjZXIgPSBuZXcgV2ViR0xQYXRoVHJhY2VyKHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlcik7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci5zZXRCVkhXb3JrZXIobmV3IFBhcmFsbGVsTWVzaEJWSFdvcmtlcigpKTtcclxuICAgICAgdGhpcy5wYXRoVHJhY2VyLmZpbHRlckdsb3NzeUZhY3RvciA9IDE7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci50aWxlcy5zZXQoMywgMyk7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci5tdWx0aXBsZUltcG9ydGFuY2VTYW1wbGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci50cmFuc21pc3NpdmVCb3VuY2VzID0gMTA7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci5yZW5kZXJTY2FsZSA9IDE7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci5zZXRTY2VuZSh0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICAgIHRoaXMucGF0aFRyYWNlci5lbmFibGVQYXRoVHJhY2luZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9pbml0UmVuZGVyZXIoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBpZiAoV2ViR1BVLmlzQXZhaWxhYmxlKCkgPT09IGZhbHNlICYmIFdlYkdMLmlzV2ViR0wyQXZhaWxhYmxlKCkgPT09IGZhbHNlKSB7XHJcbiAgICAvLyAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIFdlYkdQVS5nZXRFcnJvck1lc3NhZ2UoKSApO1xyXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoJ05vIFdlYkdQVSBvciBXZWJHTDIgc3VwcG9ydCcpO1xyXG4gICAgLy8gfVxyXG4gICAgY29uc3QgY2FudmFzRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNvbnN0IGNvbnRleHQ6IGFueSA9IGNhbnZhc0VsZW1lbnQuZ2V0Q29udGV4dCgnd2ViZ2wyJyk7XHJcbiAgICB0aGlzLndlYkdMMkF2YWlsYWJsZSA9IGNvbnRleHQgIT09IHVuZGVmaW5lZDtcclxuICAgIC8vIHRoaXMucmVuZGVyZXIgPSBuZXcgV2ViR1BVUmVuZGVyZXIoeyBhbHBoYTogdHJ1ZSwgYW50aWFsaWFzOiB0cnVlIH0pO1xyXG4gICAgLy8gdGhpcy5yZW5kZXJlciA9XHJcbiAgICAvLyAgIG5ldyBXZWJHTFJlbmRlcmVyKHtcclxuICAgIC8vICAgICBjYW52YXM6IGNhbnZhc0VsZW1lbnQsXHJcbiAgICAvLyAgICAgY29udGV4dDogY29udGV4dCxcclxuICAgIC8vICAgICBhbHBoYTogdHJ1ZSxcclxuICAgIC8vICAgICBhbnRpYWxpYXM6IHRydWUsXHJcbiAgICAvLyAgICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLFxyXG4gICAgLy8gICAgIHByZW11bHRpcGxpZWRBbHBoYTogZmFsc2UvKixcclxuICAgIC8vICAgICBsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiB0cnVlKi9cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB0aGlzLnJlbmRlcmVyID0gbmV3IFdlYkdMUmVuZGVyZXIoe2FscGhhOiB0cnVlLCBhbnRpYWxpYXM6IGZhbHNlLCBwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IHRydWUsIHByZW11bHRpcGxpZWRBbHBoYTogdHJ1ZX0pO1xyXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBXZWJHTFJlbmRlcmVyKHtcclxuLypcclxuICAgICAgcHJlY2lzaW9uOiAnaGlnaHAnLFxyXG4gICAgICBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJyxcclxuKi9cclxuLypcclxuICAgICAgYW50aWFsaWFzOiB0cnVlLFxyXG4qL1xyXG4vKlxyXG4gICAgICBzdGVuY2lsOiBmYWxzZSxcclxuICAgICAgZGVwdGg6IGZhbHNlXHJcbiovXHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVuZGVyZXIub3V0cHV0Q29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSB0cnVlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcclxuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmcgPSBOb1RvbmVNYXBwaW5nOyAvLyBBQ0VTRmlsbWljVG9uZU1hcHBpbmc7IC8vIExpbmVhclRvbmVNYXBwaW5nO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNoYWRvd01hcC50eXBlID0gUENGU29mdFNoYWRvd01hcDtcclxuICAgIHRoaXMuZG9tRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCAndGhyZWVkX2NhbnZhcycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplUmVuZGVyZXJUb0Rpc3BsYXlTaXplKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aCwgdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCwgdHJ1ZSk7XHJcbiAgICB0aGlzLl9vdXRsaW5lU2VydmljZS5zZXRTaXplKHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aCwgdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgICB0aGlzLl9wb3N0UHJvY2Vzc2luZy5zZXRTaXplKHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aCwgdGhpcy5kb21FbGVtZW50LmNsaWVudEhlaWdodCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVXaW5kb3dTaXplKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVzaXplUmVuZGVyZXJUb0Rpc3BsYXlTaXplKCk7XHJcbiAgICBSZWxhdGl2ZVBvc2l0aW9uVXRpbHMuU2V0QXBwbGljYXRpb25PZmZzZXQodGhpcy5kb21FbGVtZW50KTtcclxuICAgIGlmICh0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMuZG9tRWxlbWVudC5jbGllbnRXaWR0aCAvIHRoaXMuZG9tRWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIHRoaXMuX2NhbWVyYVNlcnZpY2UucmVhbEFzcGVjdFJhdGlvID0gYXNwZWN0O1xyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7XHJcbiAgICAgICh0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSBhcyBQZXJzcGVjdGl2ZUNhbWVyYSkudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaGVja0NhbnZhc1Jlc2l6ZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRvbUVsZW1lbnQuY2xpZW50V2lkdGggIT09IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC53aWR0aCB8fFxyXG4gICAgICB0aGlzLmRvbUVsZW1lbnQuY2xpZW50SGVpZ2h0ICE9PSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuaGVpZ2h0KSB7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZVdpbmRvd1NpemUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlbmRlcih0LCBmcmFtZSkge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyLnhyLmVuYWJsZWQpIHtcclxuICAgICAgVFdFRU4udXBkYXRlKCk7XHJcbiAgICAgIHRoaXMuX2NoZWNrQ2FudmFzUmVzaXplKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMucGF0aFRyYWNlciAmJiB0aGlzLnBhdGhUcmFjZXIpIHtcclxuICAgICAgaWYgKHRoaXMuX251bWJlck9mU2FtcGxlc1JlbmRlcmVkID49IHRoaXMuX21heFJlbmRlclNhbXBsZXMpIHtcclxuICAgICAgICB0aGlzLnBhdGhUcmFjZXIuZW5hYmxlUGF0aFRyYWNpbmcgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBhdGhUcmFjZXIuZW5hYmxlUGF0aFRyYWNpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLnBhdGhUcmFjZXIucmVuZGVyU2FtcGxlKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbnVtYmVyT2ZTYW1wbGVzUmVuZGVyZWQgPSBNYXRoLmZsb29yKHRoaXMucGF0aFRyYWNlci5zYW1wbGVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGlmICh0aGlzLl9uZWVkc1JlbmRlciB8fCB0aGlzLmFyTW9kZSB8fCB0aGlzLl92aWV3TW9kZVNlcnZpY2UuaXNWUlZpZXdBY3RpdmUoKSB8fCB0aGlzLl9vdXRsaW5lU2VydmljZS5uZWVkc1JlbmRlcikge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcclxuICAgICAgICBpZiAodGhpcy5fYXJNb2RlICYmIGZyYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLl9hclNlcnZpY2UuaGFuZGxlRnJhbWUoZnJhbWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fdmlld01vZGVTZXJ2aWNlLmlzVlJWaWV3QWN0aXZlKCkpIHtcclxuICAgICAgICAgIHRoaXMuX3ZyU2VydmljZS5yZW5kZXIoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5vbkJlZm9yZVJlbmRlci5uZXh0KHtyZW5kZXJlcjogdGhpcy5yZW5kZXJlciBhcyBXZWJHTFJlbmRlcmVyLCBzY2VuZTogdGhpcy5zY2VuZX0pO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5hYUVuYWJsZWQgJiYgIXRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLmFvRW5hYmxlZCkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICAgICAgICAgIHRoaXMuX291dGxpbmVTZXJ2aWNlLnJlbmRlcigpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9zdFByb2Nlc3NpbmcucmVuZGVyKCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX291dGxpbmVTZXJ2aWNlLnJlbmRlcigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uQWZ0ZXJSZW5kZXIubmV4dCh7cmVuZGVyZXI6IHRoaXMucmVuZGVyZXIgYXMgV2ViR0xSZW5kZXJlciwgc2NlbmU6IHRoaXMuc2NlbmV9KTtcclxuICAgICAgICB0aGlzLl9vdXRsaW5lU2VydmljZS5uZWVkc1JlbmRlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubmVlZHNSZW5kZXIgPSBmYWxzZTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfYW5pbWF0ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QW5pbWF0aW9uTG9vcCgodGltZXN0YW1wLCBmcmFtZSkgPT4gdGhpcy5fcmVuZGVyKHRpbWVzdGFtcCwgZnJhbWUpKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wYXVzZUFuaW1hdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QW5pbWF0aW9uTG9vcChudWxsKTtcclxuICAgIH0sIDIwMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pczNETW9kZShtb2RlOiBWaWV3TW9kZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG1vZGUgIT09IFZpZXdNb2RlLkZsb29yUGxhbjJEO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0U2NlbmVCYWNrZ3JvdW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3NMb2FkZWQuc3Vic2NyaWJlKChsb2FkZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgIGlmIChsb2FkZWQgJiYgdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNjZW5lQmFja2dyb3VuZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVGV4dHVyZUxvYWRlcigpLmxvYWQodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLnNjZW5lQmFja2dyb3VuZCwgKG1hdGVyaWFsKSA9PiB7XHJcbiAgICAgICAgICAgICAgbWF0ZXJpYWwuY29sb3JTcGFjZSA9IFNSR0JDb2xvclNwYWNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobG9hZGVkICYmIHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zY2VuZUJhY2tncm91bmRDb2xvcikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG5ldyBDb2xvcihwYXJzZUludCh0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2NlbmVCYWNrZ3JvdW5kQ29sb3IsIDApKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTY2VuZUNhbnZhc0ltYWdlKCk6IHN0cmluZyB7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYSk7XHJcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { Injectable } from '@angular/core';
|
|
11
2
|
import * as i0 from "@angular/core";
|
|
12
3
|
import * as i1 from "../../../core/service/homedecorator-settings.service";
|
|
@@ -28,48 +19,6 @@ export class SsrService {
|
|
|
28
19
|
ngOnDestroy() {
|
|
29
20
|
this._subs.forEach(s => s.unsubscribe());
|
|
30
21
|
}
|
|
31
|
-
init() {
|
|
32
|
-
const socket = new WebSocket('ws://localhost:7005');
|
|
33
|
-
const peerConnection = new RTCPeerConnection({
|
|
34
|
-
iceServers: [{ urls: 'stun:stun.1.google.com:19302' }]
|
|
35
|
-
});
|
|
36
|
-
peerConnection.onicecandidate = (event) => {
|
|
37
|
-
if (event.candidate) {
|
|
38
|
-
socket.send(JSON.stringify({ candidate: event.candidate }));
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
peerConnection.ontrack = (event) => {
|
|
42
|
-
const remoteVideo = document.getElementById('remoteVideo');
|
|
43
|
-
// @ts-ignore
|
|
44
|
-
if (remoteVideo.srcObject !== event.streams[0]) {
|
|
45
|
-
// @ts-ignore
|
|
46
|
-
remoteVideo.srcObject = event.streams[0];
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
socket.onmessage = (message) => __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
try {
|
|
51
|
-
const text = yield message.data.text();
|
|
52
|
-
const data = JSON.parse(text);
|
|
53
|
-
if (data.offer) {
|
|
54
|
-
yield peerConnection.setRemoteDescription(new RTCSessionDescription(data.offer));
|
|
55
|
-
const answer = yield peerConnection.createAnswer();
|
|
56
|
-
yield peerConnection.setLocalDescription(answer);
|
|
57
|
-
socket.send(JSON.stringify({ answer: peerConnection.localDescription }));
|
|
58
|
-
}
|
|
59
|
-
else if (data.candidate) {
|
|
60
|
-
try {
|
|
61
|
-
yield peerConnection.addIceCandidate(new RTCIceCandidate(data.candidate));
|
|
62
|
-
}
|
|
63
|
-
catch (e) {
|
|
64
|
-
console.error('Error adding ICE-Candidate', e);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch (e) {
|
|
69
|
-
console.error(e);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
22
|
sceneChanged(scene) {
|
|
74
23
|
if (this._websocket.readyState === WebSocket.OPEN) {
|
|
75
24
|
const sceneClone = scene.clone(true);
|
|
@@ -77,7 +26,7 @@ export class SsrService {
|
|
|
77
26
|
}
|
|
78
27
|
}
|
|
79
28
|
_prepareWebsocket() {
|
|
80
|
-
if (!this._settingsService.settings.newRenderParameters.websocket) {
|
|
29
|
+
if (!this._settingsService.settings.options.useRenderWebsocket || !this._settingsService.settings.newRenderParameters.websocket) {
|
|
81
30
|
return;
|
|
82
31
|
}
|
|
83
32
|
const webSocketConnection = this._settingsService.settings.newRenderParameters.websocket;
|
|
@@ -101,4 +50,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
101
50
|
providedIn: 'root'
|
|
102
51
|
}]
|
|
103
52
|
}], ctorParameters: function () { return [{ type: i1.HomedecoratorSettingsService }]; } });
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvY2xpZW50L2FwcC9wbHVnaW5zL2NvcmUzZC9zZXJ2aWNlL3Nzci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7OztBQVFwRCxNQUFNLE9BQU8sVUFBVTtJQWlCckIsWUFDVSxnQkFBOEM7UUFBOUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUE4QjtRQUxoRCxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFVBQUssR0FBbUIsRUFBRSxDQUFDO0lBTW5DLENBQUM7SUFsQkQsSUFBVyxPQUFPLENBQUMsS0FBYztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBV0QsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLFlBQVksQ0FBQyxLQUFlO1FBQ2pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLElBQUksRUFBRTtZQUNqRCxNQUFNLFVBQVUsR0FBYSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNsRDtJQUNILENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUU7WUFDL0gsT0FBTztTQUNSO1FBQ0QsTUFBTSxtQkFBbUIsR0FBVyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztRQUNqRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckQsNkJBQTZCO1FBQzdCLDBDQUEwQztRQUMxQyxLQUFLO1FBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QyxJQUFJLE1BQU0sRUFBRTtnQkFDVixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7d0dBaERVLFVBQVU7NEdBQVYsVUFBVSxjQUZULE1BQU07NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2hvbWVkZWNvcmF0b3Itc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtPYmplY3QzRH0gZnJvbSAndGhyZWUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU3NyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBzZXQgZW5hYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZW5hYmxlZCA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX2VuYWJsZWQpIHtcclxuICAgICAgdGhpcy5fcHJlcGFyZVdlYnNvY2tldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBlbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9lbmFibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICBwcml2YXRlIF93ZWJzb2NrZXQ6IFdlYlNvY2tldDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nc1NlcnZpY2U6IEhvbWVkZWNvcmF0b3JTZXR0aW5nc1NlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY2VuZUNoYW5nZWQoc2NlbmU6IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5fd2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XHJcbiAgICAgIGNvbnN0IHNjZW5lQ2xvbmU6IE9iamVjdDNEID0gc2NlbmUuY2xvbmUodHJ1ZSk7XHJcbiAgICAgIHRoaXMuX3dlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHNjZW5lQ2xvbmUpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVXZWJzb2NrZXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnVzZVJlbmRlcldlYnNvY2tldCB8fCAhdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm5ld1JlbmRlclBhcmFtZXRlcnMud2Vic29ja2V0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHdlYlNvY2tldENvbm5lY3Rpb246IHN0cmluZyA9IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5uZXdSZW5kZXJQYXJhbWV0ZXJzLndlYnNvY2tldDtcclxuICAgIHRoaXMuX3dlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQod2ViU29ja2V0Q29ubmVjdGlvbik7XHJcbiAgICAvLyB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xyXG4gICAgLy8gICB3ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAvLyB9O1xyXG4gICAgdGhpcy5fd2Vic29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xyXG4gICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
|