@smarterplan/ngx-smarterplan-locations 0.2.7 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { Component, ViewChild } from '@angular/core';
2
- import { getDocument } from "pdfjs-dist";
3
- import { getMetaForImage } from '@smarterplan/ngx-smarterplan-core';
2
+ import { getDocument } from 'pdfjs-dist';
3
+ import { getMetaForImage, } from '@smarterplan/ngx-smarterplan-core';
4
4
  import panzoom from 'panzoom';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@smarterplan/ngx-smarterplan-core";
@@ -69,7 +69,7 @@ export class CalibrationComponent {
69
69
  this.setupMenuItems();
70
70
  this.chosenPlan = this.planService.getChosenPlan();
71
71
  if (this.chosenPlan) {
72
- this.chosenPlanIsPdf = this.chosenPlan.annexe.includes("pdf");
72
+ this.chosenPlanIsPdf = this.chosenPlan.annexe.includes('pdf');
73
73
  this.launchViewer();
74
74
  setTimeout(() => {
75
75
  this.configureCanvas().then(() => {
@@ -85,11 +85,7 @@ export class CalibrationComponent {
85
85
  }, 500);
86
86
  }
87
87
  else {
88
- this.router.navigate([
89
- "/dashboard/localisation",
90
- this.spaceID,
91
- "plans",
92
- ]);
88
+ this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);
93
89
  }
94
90
  }
95
91
  /** **********************************************************************************************
@@ -97,17 +93,17 @@ export class CalibrationComponent {
97
93
  *********************************************************************************************** */
98
94
  setupMenuItems() {
99
95
  this.menuItems = [
100
- { label: "Locations", url: "/localisation" },
96
+ { label: 'Locations', url: '/localisation' },
101
97
  {
102
98
  label: this.currentSpace.name,
103
99
  url: `/localisation/${this.spaceID}`,
104
100
  },
105
101
  {
106
- label: "Plans",
102
+ label: 'Plans',
107
103
  url: `/localisation/${this.currentSpace.id}/plans`,
108
104
  },
109
105
  {
110
- label: "Calibration",
106
+ label: 'Calibration',
111
107
  url: `/localisation/${this.currentSpace.id}/plan-calibration?spaceID=${this.currentSpace.id}`,
112
108
  },
113
109
  ];
@@ -119,7 +115,7 @@ export class CalibrationComponent {
119
115
  async configureCanvas() {
120
116
  /** Get canvas */
121
117
  if (!this.canvas) {
122
- const canvas = document.querySelector("#canvas");
118
+ const canvas = document.querySelector('#canvas');
123
119
  this.canvas = canvas;
124
120
  }
125
121
  if (!this.chosenPlanIsPdf) {
@@ -151,7 +147,7 @@ export class CalibrationComponent {
151
147
  drawImage(url, x = 0, y = 0, icone = false) {
152
148
  const image = new Image();
153
149
  const size = this.canvasSize;
154
- const context = this.canvas.getContext("2d");
150
+ const context = this.canvas.getContext('2d');
155
151
  /** Flip the context, for symmetry */
156
152
  // if (this.reflectV) {
157
153
  // context.translate(size.w, 0);
@@ -163,7 +159,7 @@ export class CalibrationComponent {
163
159
  // }
164
160
  let imageWidth = size.w;
165
161
  let imageHeight = size.h;
166
- image.addEventListener("load", () => {
162
+ image.addEventListener('load', () => {
167
163
  if (icone) {
168
164
  imageWidth = image.width;
169
165
  imageHeight = image.height;
@@ -188,10 +184,11 @@ export class CalibrationComponent {
188
184
  }
189
185
  /** [TODO] Convert a PDF to a Canvas */
190
186
  async pdfToCanvas() {
191
- const pdfjs = await import("pdfjs-dist/build/pdf");
192
- const pdfjsWorker = await import("pdfjs-dist/build/pdf.worker.entry");
187
+ const pdfjs = await import('pdfjs-dist/build/pdf');
188
+ const pdfjsWorker = await import('pdfjs-dist/build/pdf.worker.entry');
193
189
  pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker;
194
- const pdf = await getDocument(this.chosenPlan.filepath).promise;
190
+ const pdf = await getDocument(this.chosenPlan.filepath)
191
+ .promise;
195
192
  const page = await pdf.getPage(1);
196
193
  const viewPortParameters = { scale: 1 };
197
194
  const viewport = page.getViewport(viewPortParameters);
@@ -201,13 +198,13 @@ export class CalibrationComponent {
201
198
  console.log(size);
202
199
  this.canvasSize = size;
203
200
  this.canvasZoom = size.w / viewport.width;
204
- const context = this.canvas.getContext("2d");
201
+ const context = this.canvas.getContext('2d');
205
202
  const renderContext = {
206
203
  canvasContext: context,
207
204
  viewport,
208
205
  };
209
206
  const renderTask = page.render(renderContext).promise;
210
- renderTask.then(() => console.log("Page rendered"));
207
+ renderTask.then(() => console.log('Page rendered'));
211
208
  // const res = canvas.toDataURL();
212
209
  // if (pdf != null) pdf.destroy();
213
210
  // return res;
@@ -233,25 +230,28 @@ export class CalibrationComponent {
233
230
  // console.log(this.floors);
234
231
  setTimeout(async () => {
235
232
  /** Move Floor mode */
236
- await sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN);
237
- /** Display the correct floor for the plan */
238
- try {
239
- await this.matterportImportService.moveToFloor(this.chosenPlan.name);
240
- }
241
- catch {
242
- console.log("couldnot move to floor");
243
- }
233
+ await sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN).then(async (nextMode) => {
234
+ // Move successful
235
+ console.log(`Arrived at new view mode ${nextMode}`);
236
+ /** Display the correct floor for the plan */
237
+ try {
238
+ await this.matterportImportService.moveToFloor(this.chosenPlan.name);
239
+ /** When the user try to change the view mode we set it back to floorpan */
240
+ sdk.on(sdk.Mode.Event.CHANGE_END, (oldMode, newMode) => {
241
+ if (newMode !== sdk.Mode.Mode.FLOORPLAN) {
242
+ sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN, {
243
+ transition: 'transition.instant',
244
+ });
245
+ }
246
+ });
247
+ }
248
+ catch {
249
+ console.log('couldnot move to floor');
250
+ }
251
+ });
244
252
  /** We can display the matterport view now */
245
253
  this.loading = false;
246
- }, 300);
247
- /** When the user try to change the view mode we set it back to floorpan */
248
- sdk.on(sdk.Mode.Event.CHANGE_END, (oldMode, newMode) => {
249
- if (newMode !== sdk.Mode.Mode.FLOORPLAN) {
250
- sdk.Mode.moveTo(sdk.Mode.Mode.FLOORPLAN, {
251
- transition: "transition.instant",
252
- });
253
- }
254
- });
254
+ }, 1000);
255
255
  /** Update current camera pose and rotation */
256
256
  sdk.Camera.pose.subscribe((event) => {
257
257
  /** We update only if the user is not changing the rotation with the <input> range, to not override the <input> value */
@@ -316,15 +316,15 @@ export class CalibrationComponent {
316
316
  if (deltaXPlan === 0) {
317
317
  // console.log("we moved along Y axis on Plan");
318
318
  const deltaYPlan = this.secondMarkPlan.y - this.firstMarkPlan.y;
319
- this.calibrage.nameYAxis = "z";
320
- this.calibrage.nameXAxis = "x";
319
+ this.calibrage.nameYAxis = 'z';
320
+ this.calibrage.nameXAxis = 'x';
321
321
  this.calibrage.offsetY = this.secondMarkPlan.y;
322
322
  this.calibrage.scaleY = deltaYPlan / deltaZVisit;
323
323
  }
324
324
  else {
325
325
  // console.log(" we moved along X axis on Plan");
326
- this.calibrage.nameYAxis = "x";
327
- this.calibrage.nameXAxis = "z";
326
+ this.calibrage.nameYAxis = 'x';
327
+ this.calibrage.nameXAxis = 'z';
328
328
  this.calibrage.offsetX = this.secondMarkPlan.x;
329
329
  this.calibrage.scaleX = deltaXPlan / deltaZVisit;
330
330
  }
@@ -366,21 +366,13 @@ export class CalibrationComponent {
366
366
  if (navigations.length > 0) {
367
367
  for (const navigation of navigations) {
368
368
  const testPosition = JSON.parse(navigation.position);
369
- const positionX = this.calibrage.nameXAxis === "x"
370
- ? testPosition.x
371
- : testPosition.z;
372
- const positionY = this.calibrage.nameYAxis === "x"
373
- ? testPosition.x
374
- : testPosition.z;
375
- const testX = positionX * this.calibrage.scaleX +
376
- this.calibrage.offsetX;
377
- const testY = positionY * this.calibrage.scaleY +
378
- this.calibrage.offsetY;
369
+ const positionX = this.calibrage.nameXAxis === 'x' ? testPosition.x : testPosition.z;
370
+ const positionY = this.calibrage.nameYAxis === 'x' ? testPosition.x : testPosition.z;
371
+ const testX = positionX * this.calibrage.scaleX + this.calibrage.offsetX;
372
+ const testY = positionY * this.calibrage.scaleY + this.calibrage.offsetY;
379
373
  // console.log("test position GREEN", testX, testY);
380
- const transformedX = (testX - this.calibrage.offsetXPlan) /
381
- this.calibrage.scalePlan; // we are undoing the pan and zoom
382
- const transformedY = (testY - this.calibrage.offsetYPlan) /
383
- this.calibrage.scalePlan;
374
+ const transformedX = (testX - this.calibrage.offsetXPlan) / this.calibrage.scalePlan; // we are undoing the pan and zoom
375
+ const transformedY = (testY - this.calibrage.offsetYPlan) / this.calibrage.scalePlan;
384
376
  this.positions.push({
385
377
  navID: navigation.id,
386
378
  planID: this.chosenPlan.id,
@@ -389,7 +381,7 @@ export class CalibrationComponent {
389
381
  });
390
382
  const iconSize = 30 * this.calibrage.scalePlan;
391
383
  const shift = iconSize / 2;
392
- this.drawImage("https://api.iconify.design/mdi:adjust.svg?color=green&height=30&width=30", transformedX - shift, transformedY - shift, true);
384
+ this.drawImage('https://api.iconify.design/mdi:adjust.svg?color=green&height=30&width=30', transformedX - shift, transformedY - shift, true);
393
385
  }
394
386
  }
395
387
  }
@@ -436,12 +428,8 @@ export class CalibrationComponent {
436
428
  }));
437
429
  }
438
430
  this.matterportImportService.removeFrame();
439
- this.router.navigate([
440
- "/dashboard/localisation",
441
- this.spaceID,
442
- "plans",
443
- ]);
444
- alert(this.translate.instant("calibration.success"));
431
+ this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);
432
+ alert(this.translate.instant('calibration.success'));
445
433
  }
446
434
  /** Reset the canvas */
447
435
  onReset() {
@@ -453,12 +441,8 @@ export class CalibrationComponent {
453
441
  /** Cancel, leave */
454
442
  onCancel() {
455
443
  this.matterportImportService.removeFrame();
456
- this.router.navigate([
457
- "/dashboard/localisation",
458
- this.spaceID,
459
- "plans",
460
- ]);
461
- alert(this.translate.instant("calibration.canceled"));
444
+ this.router.navigate(['/dashboard/localisation', this.spaceID, 'plans']);
445
+ alert(this.translate.instant('calibration.canceled'));
462
446
  }
463
447
  async onFloorClick(floor) {
464
448
  this.currentFloor = floor;
@@ -466,9 +450,9 @@ export class CalibrationComponent {
466
450
  }
467
451
  onActivateZoomChange() {
468
452
  this.zoomCanBeChanged = !this.zoomCanBeChanged;
469
- const iframe = document.querySelector("#viewer-frame");
453
+ const iframe = document.querySelector('#viewer-frame');
470
454
  if (iframe) {
471
- iframe.style.zIndex = this.zoomCanBeChanged ? "1" : "0";
455
+ iframe.style.zIndex = this.zoomCanBeChanged ? '1' : '0';
472
456
  }
473
457
  }
474
458
  }
@@ -479,6 +463,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
479
463
  args: [{ selector: 'lib-calibration', template: "<div class=\"row mt-3\">\r\n <div class=\"col\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems'></lib-tab-navigation>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div id=\"rowCanvas\">\r\n <div #canvasDiv id=\"canvasDiv\">\r\n\r\n <div id=\"viewer-frame\" [style.pointer-events]=\"zoomCanBeChanged?'auto':'none'\">\r\n <!-- <div class=\"blur\"></div> -->\r\n </div>\r\n <canvas id=\"canvas\" [ngStyle]=\"{'opacity': (preview||loading) ? '1' : 'calc(' + opacity + '/ 100)'}\"></canvas>\r\n </div>\r\n\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"!(preview || loading)\">\r\n <h1>{{'Calibration tool' | translate}}</h1>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 legend\">\r\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (-(opacity-100)+10) + '/ 100)'}\">\r\n {{'Less' | translate}}</div>\r\n <div class=\"legend-title\">{{'Plan Opacity' | translate }}</div>\r\n <div class=\"legend-bar-indicator\" [ngStyle]=\"{'opacity': 'calc(' + (opacity+10) + '/ 100)'}\">{{'More' |\r\n translate}}</div>\r\n </div>\r\n <div class=\"row ms-0 me-0 \">\r\n <input [disabled]=\"false\" [ngModelOptions]=\"{standalone: true}\" [(ngModel)]=\"opacity\" type=\"range\"\r\n class=\"form-range\" min=\"0\" max=\"100\" value=\"50\" id=\"opacity\">\r\n </div>\r\n </div>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 \">\r\n <div class=\"label-legend\">{{'Change Visit Floor' | translate}}</div>\r\n <div ngbDropdown class=\"d-inline-block ms-3\">\r\n <button class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\" ngbDropdownToggle>\r\n {{currentFloor ? currentFloor.id : ('Floor' | translate) }}</button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\r\n <button ngbDropdownItem *ngFor=\"let floor of floors\" (click)=\"onFloorClick(floor)\">\r\n {{ floor.name.length > 0 ? floor.name : ('Floor ' + floor.id) }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"tool\">\r\n <div class=\"row ms-0 me-0 \">\r\n <div class=\"tool-checkbox-container\">\r\n <div class=\"tool-checkbox-subcontainer\">\r\n <div class=\"label-legend me-3\">{{'Pan/Zoom Visit' | translate}} {{zoomCanBeChanged ? \"ON\" :\r\n \"OFF\"}}\r\n </div>\r\n <input type=\"checkbox\" (change)=\"onActivateZoomChange()\" style=\"margin-top: 5px;\">\r\n </div>\r\n <div class=\"card border-warning mb-3 mt-3\" *ngIf=\"zoomCanBeChanged\">\r\n <div class=\"card-body text-warning\">\r\n <h5 class=\"card-title\">{{\"calibration.wait-message\" | translate}}</h5>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onPreview()\"\r\n [disabled]=\"zoomCanBeChanged\">{{'Preview' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n </div>\r\n\r\n </div>\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"preview\">\r\n <h1>{{'Validation' | translate}}</h1>\r\n <div class=\"action\">\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onSave()\">{{'Validate' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onReset()\">{{'Reset' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\" (click)=\"onCancel()\">{{'Cancel' |\r\n translate}}</button>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <div class=\"calibration-tools container-fluid\" *ngIf=\"loading\">\r\n <h3>{{\"Waiting for Matterport\" | translate}}...</h3>\r\n <div class=\"d-flex justify-content-center\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>", styles: [".button-visit{display:none;height:30px;width:30px;position:absolute;background:url(https://api.iconify.design/mdi:map-marker-check.svg?color=red&height=30) no-repeat scroll 0 0 transparent;border:none}#button-visit-left{left:350px;top:550px}#button-visit-right{left:500px;top:600px}#rowCanvas{display:flex}#canvasDiv{height:100%;width:100%;position:relative}#canvas{width:100%;height:100%;opacity:.5}#viewer-frame{top:0;position:absolute;width:100%;height:100%}.calibration-tools{margin-left:20px;width:400px;background-color:#fff;z-index:11;border:1px solid var(--smarterplan-primary);padding:7px}.form-range{width:100%}.tool{margin-top:20px}.tool .legend{justify-content:space-between;position:relative;margin-bottom:5px}.tool .legend-title{font-size:1.2rem;color:var(--smarterplan-primary);margin:auto;width:100%;font-weight:700;display:flex;justify-content:center}.tool .legend-bar-indicator{width:15%!important}.tool .label-legend{color:var(--smarterplan-primary);font-size:1.1rem;max-width:55%}.tool .tool-checkbox-container{display:flex;flex-direction:column}.tool .tool-checkbox-container .tool-checkbox-subcontainer{display:flex}.blur{width:150px;height:52px;position:absolute;background-color:#1e2023;bottom:0}.symmetry{padding:5px;border:solid 2px;border-radius:10px;color:var(--smarterplan-primary);margin:25px 10px;cursor:pointer}.symmetry:hover{color:var(--smarterplan-primary)}.symmetry-row{justify-content:center}.action{margin-top:30px;display:flex;justify-content:space-evenly}h1{color:var(--smarterplan-primary);text-align:center;margin-bottom:20px}h3{color:var(--smarterplan-primary);text-align:center;margin-bottom:10px}.btn-outline-primary.disabled{background-color:var(--smarterplan-orange)!important}\n"] }]
480
464
  }], ctorParameters: function () { return [{ type: i1.MatterportImportService }, { type: i1.PlanService }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i1.ZoneService }, { type: i1.SpaceService }, { type: i1.NavigationService }, { type: i3.TranslateService }]; }, propDecorators: { canvasDiv: [{
481
465
  type: ViewChild,
482
- args: ["canvasDiv"]
466
+ args: ['canvasDiv']
483
467
  }] } });
484
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsaWJyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvcGxhbnMvY2FsaWJyYXRpb24vY2FsaWJyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvcGxhbnMvY2FsaWJyYXRpb24vY2FsaWJyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekMsT0FBTyxFQUFzRyxlQUFlLEVBQTJCLE1BQU0sbUNBQW1DLENBQUM7QUFDak0sT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7QUFPOUIsTUFBTSxPQUFPLG9CQUFvQjtJQXFGN0IsWUFDWSx1QkFBZ0QsRUFDaEQsV0FBd0IsRUFDeEIsS0FBcUIsRUFDckIsTUFBYyxFQUNkLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUNwQyxTQUEyQjtRQVAzQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBQ2hELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBM0Z2QyxxQ0FBcUM7UUFDckMsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQVczQixxQ0FBcUM7UUFDckMsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUVmLG9DQUFvQztRQUNwQyxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBRXJCLDRGQUE0RjtRQUM1RixhQUFRLEdBQVcsR0FBRyxDQUFDO1FBRXZCLHlIQUF5SDtRQUN6SCxpQkFBWSxHQUFXLEdBQUcsQ0FBQztRQUszQixvSEFBb0g7UUFDcEgsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFFakMsaURBQWlEO1FBQ2pELHVCQUFrQixHQUFhLEVBQUUsQ0FBQztRQUVsQyw2Q0FBNkM7UUFDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVqQiwrQ0FBK0M7UUFDL0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQVVqQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4QiwrREFBK0Q7UUFDL0QsbUJBQWMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBRWhDLGdFQUFnRTtRQUNoRSxvQkFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFckMsZ0RBQWdEO1FBQ2hELGtCQUFhLEdBQTZCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFekQsaURBQWlEO1FBQ2pELG1CQUFjLEdBQTZCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFMUQsbURBQW1EO1FBQ25ELGNBQVMsR0FBUSxFQUFFLENBQUM7UUFFcEIsMkNBQTJDO1FBQzNDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsNEJBQTRCO1FBQzVCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFPZixjQUFTLEdBQThELEVBQUUsQ0FBQztRQUUxRSxXQUFNLEdBQVUsRUFBRSxDQUFDO1FBSW5CLHFCQUFnQixHQUFZLEtBQUssQ0FBQztJQVcvQixDQUFDO0lBRUosV0FBVztRQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkUsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFbkQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNoQyxNQUFNLEVBQUUsSUFBSTt3QkFDWixhQUFhLEVBQUUsQ0FBQzt3QkFDaEIsT0FBTyxFQUFFLEdBQUc7d0JBQ1osT0FBTyxFQUFFLEdBQUc7d0JBQ1osV0FBVyxFQUFFLENBQUM7d0JBQ2QsU0FBUyxFQUFFLElBQUk7cUJBQ2xCLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNYO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDakIseUJBQXlCO2dCQUN6QixJQUFJLENBQUMsT0FBTztnQkFDWixPQUFPO2FBQ1YsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQ7O3VHQUVtRztJQUNuRyxjQUFjO1FBQ1YsSUFBSSxDQUFDLFNBQVMsR0FBRztZQUNiLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFO1lBQzVDO2dCQUNJLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUk7Z0JBQzdCLEdBQUcsRUFBRSxpQkFBaUIsSUFBSSxDQUFDLE9BQU8sRUFBRTthQUN2QztZQUNEO2dCQUNJLEtBQUssRUFBRSxPQUFPO2dCQUNkLEdBQUcsRUFBRSxpQkFBaUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLFFBQVE7YUFDckQ7WUFDRDtnQkFDSSxLQUFLLEVBQUUsYUFBYTtnQkFDcEIsR0FBRyxFQUFFLGlCQUFpQixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsNkJBQTZCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFO2FBQ2hHO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7dUdBRW1HO0lBRW5HLHVCQUF1QjtJQUN2QixLQUFLLENBQUMsZUFBZTtRQUNqQixpQkFBaUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUNqQyxTQUFTLENBQ1MsQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUQsMkdBQTJHO1lBQzNHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5RCxrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFFdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0Qiw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDSCxPQUFPO1lBQ1AsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxVQUFVLENBQUMsSUFBSTtRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLFNBQVMsQ0FBQyxHQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QyxxQ0FBcUM7UUFDckMsdUJBQXVCO1FBQ3ZCLG9DQUFvQztRQUNwQyw0QkFBNEI7UUFDNUIsSUFBSTtRQUNKLHVCQUF1QjtRQUN2QixvQ0FBb0M7UUFDcEMsNEJBQTRCO1FBQzVCLElBQUk7UUFFSixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDaEMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2FBQzlCO1lBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FDYixLQUFLLEVBQ0wsQ0FBQyxFQUNELENBQUMsRUFDRCxLQUFLLENBQUMsS0FBSyxFQUNYLEtBQUssQ0FBQyxNQUFNLEVBQ1osQ0FBQyxFQUNELENBQUMsRUFDRCxVQUFVLEVBQ1YsV0FBVyxDQUNkLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1FBQ3ZELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUV4RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdEMsSUFBSSxVQUFVLEdBQUcsV0FBVyxFQUFFO1lBQzFCLE9BQU8sR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO1NBQ2xDO2FBQU07WUFDSCxPQUFPLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQztTQUNsQztRQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLEtBQUssQ0FBQyxXQUFXO1FBQ2IsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRXRFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBRWxELE1BQU0sR0FBRyxHQUFxQixNQUFNLFdBQVcsQ0FDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQzNCLENBQUMsT0FBTyxDQUFDO1FBQ1YsTUFBTSxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUVuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUV2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUUxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDbEMsSUFBSSxDQUNxQixDQUFDO1FBQzlCLE1BQU0sYUFBYSxHQUFHO1lBQ2xCLGFBQWEsRUFBRSxPQUFPO1lBQ3RCLFFBQVE7U0FDWCxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFdEQsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFcEQsa0NBQWtDO1FBQ2xDLGtDQUFrQztRQUNsQyxjQUFjO0lBQ2xCLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsVUFBVTtRQUNOLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLFVBQVU7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzt1R0FFbUc7SUFFbkcsd0JBQXdCO0lBQ3hCLEtBQUssQ0FBQyxZQUFZO1FBQ2QsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FDMUIsQ0FBQztRQUVGLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRSw0QkFBNEI7UUFDNUIsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2xCLHNCQUFzQjtZQUN0QixNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9DLDZDQUE2QztZQUM3QyxJQUFJO2dCQUNBLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3ZCLENBQUM7YUFDTDtZQUFDLE1BQU07Z0JBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2FBQ3pDO1lBRUQsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVSLDJFQUEyRTtRQUUzRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNuRCxJQUFJLE9BQU8sS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDckMsVUFBVSxFQUFFLG9CQUFvQjtpQkFDbkMsQ0FBQyxDQUFDO2FBQ047UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILDhDQUE4QztRQUM5QyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQyx3SEFBd0g7WUFDeEgsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2FBQzNCO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsbURBQW1EO0lBQ25ELEtBQUssQ0FBQyxnQkFBZ0I7UUFDbEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3hELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVsQyxpRkFBaUY7UUFDakYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU1QywwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLEtBQUssQ0FBQyx5QkFBeUI7UUFDM0IsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUU3QyxtQ0FBbUM7UUFDbkMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2QyxxRUFBcUU7WUFDckUsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUN4RCxLQUFLLEVBQUUsR0FBRzthQUNiLENBQUMsQ0FBQztTQUNOO1FBRUQsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7dUdBRW1HO0lBRW5HLDBCQUEwQjtJQUMxQixLQUFLLENBQUMsU0FBUztRQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLG1CQUFtQjtRQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFTO1FBQ1gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsYUFBYTtZQUNkLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUM7Z0JBQzlELENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDYixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2hCLENBQUMsQ0FBQztRQUNQLElBQUksQ0FBQyxjQUFjO1lBQ2YsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDOUQsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNiLENBQUMsRUFBRSxDQUFDO2dCQUNKLENBQUMsRUFBRSxDQUFDO2FBQ1AsQ0FBQyxDQUFDO1FBQ1AsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLGdEQUFnRDtZQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUM7U0FDcEQ7YUFBTTtZQUNILGlEQUFpRDtZQUNqRCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUM7U0FDcEQ7UUFDRCxNQUFNLGFBQWEsR0FDZixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQzlELENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDaEIsQ0FBQyxDQUFDO1FBQ1AsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLGlEQUFpRDtZQUNqRCxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUM7U0FDcEQ7YUFBTTtZQUNILE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLEdBQUcsV0FBVyxDQUFDO1NBQ3BEO1FBRUQsMkRBQTJEO1FBQzNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEQsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDO1FBQ3RDLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLEtBQUssQ0FBQyxhQUFhO1FBQ2YsdUJBQXVCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwRSxJQUFJLElBQUksRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLE1BQU0sV0FBVyxHQUNiLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUM5QyxJQUFJLENBQUMsV0FBVyxDQUNuQixDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztZQUN0QyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtvQkFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3JELE1BQU0sU0FBUyxHQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxLQUFLLEdBQUc7d0JBQzVCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU0sU0FBUyxHQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxLQUFLLEdBQUc7d0JBQzVCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDaEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU0sS0FBSyxHQUNQLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07d0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUMzQixNQUFNLEtBQUssR0FDUCxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNO3dCQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDM0Isb0RBQW9EO29CQUNwRCxNQUFNLFlBQVksR0FDZCxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxrQ0FBa0M7b0JBQ2hFLE1BQU0sWUFBWSxHQUNkLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO3dCQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7d0JBQ2hCLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRTt3QkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTt3QkFDMUIsQ0FBQyxFQUFFLFlBQVk7d0JBQ2YsQ0FBQyxFQUFFLFlBQVk7cUJBQ2xCLENBQUMsQ0FBQztvQkFDSCxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7b0JBQy9DLE1BQU0sS0FBSyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7b0JBQzNCLElBQUksQ0FBQyxTQUFTLENBQ1YsMEVBQTBFLEVBQzFFLFlBQVksR0FBRyxLQUFLLEVBQ3BCLFlBQVksR0FBRyxLQUFLLEVBQ3BCLElBQUksQ0FDUCxDQUFDO2lCQUNMO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsS0FBSyxDQUFDLE1BQU07UUFDUixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsOEJBQThCO1lBQzlCLDZDQUE2QztZQUM3Qyw2Q0FBNkM7WUFDN0MsdUNBQXVDO1lBQ3ZDLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFN0MsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDdEIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUM5QyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUNsQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsUUFBUSxDQUFDO2dCQUMzQixPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQ3BDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FDOUIsQ0FBQztnQkFDRixJQUFJLHFCQUFxQixDQUFDO2dCQUMxQixJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUU7b0JBQ3BCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDcEIsQ0FBQztvQkFDRixNQUFNLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQzlDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUNqRCxDQUFDO29CQUNGLElBQUksc0JBQXNCLEVBQUU7d0JBQ3hCLGNBQWMsQ0FBQyxNQUFNLENBQ2pCLGNBQWMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFDOUMsQ0FBQyxFQUNELFFBQVEsQ0FDWCxDQUFDO3FCQUNMO3lCQUFNO3dCQUNILGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ2pDO29CQUNELHFCQUFxQixHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztpQkFDL0M7cUJBQU07b0JBQ0gscUJBQXFCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDdEM7Z0JBQ0Qsc0NBQXNDO2dCQUN0QyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDMUMsRUFBRSxFQUFFLEtBQUs7b0JBQ1QsY0FBYyxFQUFFLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQ3hCO2lCQUNKLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUNMLENBQUM7U0FDTDtRQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUNqQix5QkFBeUI7WUFDekIsSUFBSSxDQUFDLE9BQU87WUFDWixPQUFPO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLE9BQU87UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixRQUFRO1FBQ0osSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ2pCLHlCQUF5QjtZQUN6QixJQUFJLENBQUMsT0FBTztZQUNaLE9BQU87U0FDVixDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBZ0IsQ0FBQztRQUN0RSxJQUFJLE1BQU0sRUFBRTtZQUNSLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDM0Q7SUFDTCxDQUFDOztpSEEvbEJRLG9CQUFvQjtxR0FBcEIsb0JBQW9CLCtKQ2JqQyxpekpBaUdNOzJGRHBGTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsaUJBQWlCOzhTQWFELFNBQVM7c0JBQWhDLFNBQVM7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgZ2V0RG9jdW1lbnQgfSBmcm9tIFwicGRmanMtZGlzdFwiO1xyXG5pbXBvcnQgeyBQREZEb2N1bWVudFByb3h5IH0gZnJvbSBcIm5nMi1wZGYtdmlld2VyXCI7XHJcbmltcG9ydCB7IFpvbmUsIE1lbnVJdGVtLCBQbGFuLCBTcGFjZSwgTmF2aWdhdGlvbiwgUGxhblNlcnZpY2UsIFpvbmVTZXJ2aWNlLCBTcGFjZVNlcnZpY2UsIE5hdmlnYXRpb25TZXJ2aWNlLCBnZXRNZXRhRm9ySW1hZ2UsIE1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHBhbnpvb20gZnJvbSAncGFuem9vbSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jYWxpYnJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGlicmF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxpYnJhdGlvbi5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYWxpYnJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgLyoqIEl0ZW0gdG8gZGlzcGxheSBmb3IgdGhlIG5hdmJhciAqL1xyXG4gICAgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XHJcblxyXG4gICAgLyoqIENhbnZhcyAoUGxhbikgKi9cclxuICAgIGNhbnZhcztcclxuXHJcbiAgICAvKiogQ2FudmFzRGl2IChEaXYgdGhhdCBjb250YWluIHRoZSBjYW52YXMgKyBtYXR0ZXJwb3J0IGlmcmFtZSkgKi9cclxuICAgIEBWaWV3Q2hpbGQoXCJjYW52YXNEaXZcIikgY2FudmFzRGl2OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKiBTaXplIG9mIHRoZSBjYW52YXMgJiBtYXR0ZXJwb3J0IGlmcmFtZSAqL1xyXG4gICAgY2FudmFzU2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9O1xyXG5cclxuICAgIC8qKiBab29tIHJhdGlvIG9mIHRoZSBjYW52YXMvcGxhbiAgKi9cclxuICAgIGNhbnZhc1pvb20gPSAwO1xyXG5cclxuICAgIC8qKiBPcGFjaXR5IGZvciBtYXR0ZXJwb3J0IGlmcmFtZSAqL1xyXG4gICAgb3BhY2l0eTogbnVtYmVyID0gNTA7XHJcblxyXG4gICAgLyoqIEN1cnJlbnQgcm90YXRpb24gZm9yIG1hdHRlcnBvcnQsIFswLTM2MF0sICBtYXR0ZXJwb3J0IHJvdGF0aW9uIGlzIGJpbmQgdG8gaW5wdXQgcmFuZ2UgKi9cclxuICAgIHJvdGF0aW9uOiBudW1iZXIgPSAxODA7XHJcblxyXG4gICAgLyoqIFByZXZpb3VzIHJvdGF0aW9uLCB1c2UgdG8gY2FsY3VsYXRlIHRoZSBkZWx0YVJvdGF0aW9uIHRvIHJvdGF0ZSwgd2hlbiB1c2VyIGNoYW5nZSByb3RhdGlvbiB2YWx1ZSB1c2luZyByYW5nZSBpbnB1dCAqL1xyXG4gICAgcHJldlJvdGF0aW9uOiBudW1iZXIgPSAxODA7XHJcblxyXG4gICAgLyoqIEN1cnJlbnQgQ2FtZXJhIFBvc2UgKi9cclxuICAgIGNhbWVyYVBvc2U6IGFueTtcclxuXHJcbiAgICAvKiogVHJ1ZSB3aGVuIHRoZSB1c2VyIGlzIGN1cnJlbnRseSByb3RhdGluZyB3aXRoIHRoZSBpbnB1dCByYW5nZSwgdGhlIG1hdHRlcnBvcnQgcm90YXRpb24gZXZlbnRzIHdpbGwgYmUgaWdub3JlZCAqL1xyXG4gICAgaXNSb3RhdGluZ1JhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIFJvdGF0aW5nIHF1ZXVlIGV2ZW50IHRvIHNlbmQgdG8gbWF0dGVycG9ydCAqL1xyXG4gICAgcm90YXRpbmdRdWV1ZUV2ZW50OiBudW1iZXJbXSA9IFtdO1xyXG5cclxuICAgIC8qKiBUcnVlIHdoZW4gVmVydGljYWwgc3ltbWV0cnkgaXMgZW5hYmxlZCAqL1xyXG4gICAgcmVmbGVjdFYgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogVHJ1ZSB3aGVuIEhvcml6b250YWwgc3ltbWV0cnkgaXMgZW5hYmxlZCAqL1xyXG4gICAgcmVmbGVjdEggPSBmYWxzZTtcclxuXHJcbiAgICBjaG9zZW5QbGFuOiBQbGFuO1xyXG5cclxuICAgIHNwYWNlSUQ6IHN0cmluZztcclxuXHJcbiAgICBjdXJyZW50U3BhY2U6IFNwYWNlO1xyXG5cclxuICAgIGN1cnJlbnRab25lOiBab25lO1xyXG5cclxuICAgIGNob3NlblBsYW5Jc1BkZiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBGaXJzdCBQb2ludCBpbiB2aXNpdCwgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhbGlicmF0aW9uICAqL1xyXG4gICAgZmlyc3RNYXJrVmlzaXQgPSB7IHg6IDAsIHk6IDAgfTtcclxuXHJcbiAgICAvKiogU2Vjb25kIFBvaW50IGluIHZpc2l0LCB1c2VkIHRvIGRldGVybWluZSB0aGUgY2FsaWJyYXRpb24gICovXHJcbiAgICBzZWNvbmRNYXJrVmlzaXQgPSB7IHg6IDAuNSwgeTogMC41IH07XHJcblxyXG4gICAgLyoqIEVxdWl2YWxlbnQgb2YgJ2ZpcnN0TWFya1Zpc2l0JyBpbiBjYW52YXMgICovXHJcbiAgICBmaXJzdE1hcmtQbGFuOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcclxuXHJcbiAgICAvKiogRXF1aXZhbGVudCBvZiAnc2Vjb25kTWFya1Zpc2l0JyBpbiBjYW52YXMgICovXHJcbiAgICBzZWNvbmRNYXJrUGxhbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0geyB4OiAwLCB5OiAwIH07XHJcblxyXG4gICAgLyoqIENhbGlicmF0aW9uIHJlc3VsdCwgKG9mZnNldFgsIG9mZnNldFksIHgsIHkpICovXHJcbiAgICBjYWxpYnJhZ2U6IGFueSA9IHt9O1xyXG5cclxuICAgIC8qKiBJcyBpbiBwcmV2aWV3IG1vZGUgKHNlZSBzY2FuIHJlc3VsdCkgKi9cclxuICAgIHByZXZpZXcgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogTWF0dGVycG9ydCBpcyBsb2FkaW5nICovXHJcbiAgICBsb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAvKiBmb3IgcGFuIGFuZCB6b29tIG9mIGNhbnZhcyAqL1xyXG4gICAgcGFuem9vbTogYW55O1xyXG5cclxuICAgIGN1cnJlbnROYXZpZ2F0aW9uczogTmF2aWdhdGlvbltdO1xyXG5cclxuICAgIHBvc2l0aW9uczogeyBuYXZJRDogc3RyaW5nOyBwbGFuSUQ6IHN0cmluZzsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107XHJcblxyXG4gICAgZmxvb3JzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGN1cnJlbnRGbG9vcjtcclxuXHJcbiAgICB6b29tQ2FuQmVDaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBtYXR0ZXJwb3J0SW1wb3J0U2VydmljZTogTWF0dGVycG9ydEltcG9ydFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBwbGFuU2VydmljZTogUGxhblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICBwcml2YXRlIHpvbmVTZXJ2aWNlOiBab25lU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5sb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2UucmVtb3ZlRnJhbWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy5zcGFjZUlEID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5zcGFjZUlEO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZUlEKTtcclxuXHJcbiAgICAgICAgLyoqIE1lbnUgbmF2IGJhciAqL1xyXG4gICAgICAgIHRoaXMuc2V0dXBNZW51SXRlbXMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaG9zZW5QbGFuID0gdGhpcy5wbGFuU2VydmljZS5nZXRDaG9zZW5QbGFuKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNob3NlblBsYW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jaG9zZW5QbGFuSXNQZGYgPSB0aGlzLmNob3NlblBsYW4uYW5uZXhlLmluY2x1ZGVzKFwicGRmXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmxhdW5jaFZpZXdlcigpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlQ2FudmFzKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYW56b29tID0gcGFuem9vbSh0aGlzLmNhbnZhcywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3VuZHM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1BhZGRpbmc6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFpvb206IDIuNSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluWm9vbTogMC4xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsWm9vbTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgem9vbVNwZWVkOiAwLjAyLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1xyXG4gICAgICAgICAgICAgICAgXCIvZGFzaGJvYXJkL2xvY2FsaXNhdGlvblwiLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICAgICAgXCJwbGFuc1wiLFxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU5VIE5BViBCQVJcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuY3VycmVudFNwYWNlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5zcGFjZUlEfWAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIlBsYW5zXCIsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5jdXJyZW50U3BhY2UuaWR9L3BsYW5zYCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiQ2FsaWJyYXRpb25cIixcclxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLmN1cnJlbnRTcGFjZS5pZH0vcGxhbi1jYWxpYnJhdGlvbj9zcGFjZUlEPSR7dGhpcy5jdXJyZW50U3BhY2UuaWR9YCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5WQVNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKiBEaXNwbGF5IHRoZSBwbGFuICovXHJcbiAgICBhc3luYyBjb25maWd1cmVDYW52YXMoKSB7XHJcbiAgICAgICAgLyoqIEdldCBjYW52YXMgKi9cclxuICAgICAgICBpZiAoIXRoaXMuY2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgICBcIiNjYW52YXNcIixcclxuICAgICAgICAgICAgKSBhcyBIVE1MQ2FudmFzRWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY2hvc2VuUGxhbklzUGRmKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgZ2V0TWV0YUZvckltYWdlKHRoaXMuY2hvc2VuUGxhbi5maWxlcGF0aCk7XHJcbiAgICAgICAgICAgIC8qKiBDb21wdXRlIHRoZSBuZXcgc2l6ZSBmb3IgdGhlIGNhbnZhcy9tYXR0ZXJwb3J0LCBiYXNlIG9uIHRoZSBkaW1lbnNpb24gb2YgdGhlIHBsYW4sIGtlZXBpbmcgdGhlIHJhdGlvICovXHJcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmdldFNpemVGb3JDYW52YXMoaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAvKiogQ29tcHV0ZSB0aGUgcGxhbiB6b29tIHJhdGlvICh1c2UgZm9yIHRoZSBjYWxpYnJhdGlvbiBsYXRlcikgKi9cclxuICAgICAgICAgICAgdGhpcy5jYW52YXNab29tID0gc2l6ZS53IC8gaW1hZ2Uud2lkdGg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVZpZXcoc2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAvKiogRHJhdyBQbGFuIG9uIHRoZSBjYW52YXMgKi9cclxuICAgICAgICAgICAgdGhpcy5kcmF3SW1hZ2UodGhpcy5jaG9zZW5QbGFuLmZpbGVwYXRoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBUT0RPXHJcbiAgICAgICAgICAgIHRoaXMucGRmVG9DYW52YXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVwZGF0ZSBzaXplIG9mIHRoZSBjYW52YXMvbWF0dGVycG9ydCAqL1xyXG4gICAgcmVzaXplVmlldyhzaXplKSB7XHJcbiAgICAgICAgdGhpcy5jYW52YXNEaXYubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3NpemUud31weGA7XHJcbiAgICAgICAgdGhpcy5jYW52YXNEaXYubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtzaXplLmh9cHhgO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gYCR7c2l6ZS53fXB4YDtcclxuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtzaXplLmh9cHhgO1xyXG4gICAgICAgIHRoaXMuY2FudmFzLndpZHRoID0gc2l6ZS53O1xyXG4gICAgICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IHNpemUuaDtcclxuICAgICAgICB0aGlzLmNhbnZhc1NpemUgPSBzaXplO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBEcmF3IHNvbWV0aGluZyBvbiB0aGUgY2FudmFzICovXHJcbiAgICBkcmF3SW1hZ2UodXJsOiBzdHJpbmcsIHggPSAwLCB5ID0gMCwgaWNvbmUgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuY2FudmFzU2l6ZTtcclxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xyXG5cclxuICAgICAgICAvKiogRmxpcCB0aGUgY29udGV4dCwgZm9yIHN5bW1ldHJ5ICovXHJcbiAgICAgICAgLy8gaWYgKHRoaXMucmVmbGVjdFYpIHtcclxuICAgICAgICAvLyAgICAgY29udGV4dC50cmFuc2xhdGUoc2l6ZS53LCAwKTtcclxuICAgICAgICAvLyAgICAgY29udGV4dC5zY2FsZSgtMSwgMSk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGlmICh0aGlzLnJlZmxlY3RIKSB7XHJcbiAgICAgICAgLy8gICAgIGNvbnRleHQudHJhbnNsYXRlKDAsIHNpemUuaCk7XHJcbiAgICAgICAgLy8gICAgIGNvbnRleHQuc2NhbGUoMSwgLTEpO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgbGV0IGltYWdlV2lkdGggPSBzaXplLnc7XHJcbiAgICAgICAgbGV0IGltYWdlSGVpZ2h0ID0gc2l6ZS5oO1xyXG4gICAgICAgIGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKGljb25lKSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZVdpZHRoID0gaW1hZ2Uud2lkdGg7XHJcbiAgICAgICAgICAgICAgICBpbWFnZUhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcclxuICAgICAgICAgICAgICAgIGltYWdlLFxyXG4gICAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICAgIDAsXHJcbiAgICAgICAgICAgICAgICBpbWFnZS53aWR0aCxcclxuICAgICAgICAgICAgICAgIGltYWdlLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIHgsXHJcbiAgICAgICAgICAgICAgICB5LFxyXG4gICAgICAgICAgICAgICAgaW1hZ2VXaWR0aCxcclxuICAgICAgICAgICAgICAgIGltYWdlSGVpZ2h0LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGltYWdlLnNyYyA9IHVybDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2V0IHRoZSBzaXplIGZvciB0aGUgY2FudmFzLCBiYXNlZCBvbiB0aGUgcGxhbiBzaXplLCBrZWVwaW5nIHRoZSByYXRpbyAqL1xyXG4gICAgZ2V0U2l6ZUZvckNhbnZhcyh3LCBoKSB7XHJcbiAgICAgICAgbGV0IGNhbnZhc1cgPSB0aGlzLmNhbnZhc0Rpdi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGxldCBjYW52YXNIID0gdGhpcy5jYW52YXNEaXYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGltYWdlUmF0aW8gPSB3IC8gaDtcclxuICAgICAgICBjb25zdCBjYW52YXNSYXRpbyA9IGNhbnZhc1cgLyBjYW52YXNIO1xyXG5cclxuICAgICAgICBpZiAoaW1hZ2VSYXRpbyA+IGNhbnZhc1JhdGlvKSB7XHJcbiAgICAgICAgICAgIGNhbnZhc0ggPSBjYW52YXNXIC8gaW1hZ2VSYXRpbztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjYW52YXNXID0gY2FudmFzSCAqIGltYWdlUmF0aW87XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IHc6IGNhbnZhc1csIGg6IGNhbnZhc0ggfTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogW1RPRE9dIENvbnZlcnQgYSBQREYgdG8gYSBDYW52YXMgKi9cclxuICAgIGFzeW5jIHBkZlRvQ2FudmFzKCkge1xyXG4gICAgICAgIGNvbnN0IHBkZmpzID0gYXdhaXQgaW1wb3J0KFwicGRmanMtZGlzdC9idWlsZC9wZGZcIik7XHJcbiAgICAgICAgY29uc3QgcGRmanNXb3JrZXIgPSBhd2FpdCBpbXBvcnQoXCJwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIuZW50cnlcIik7XHJcblxyXG4gICAgICAgIHBkZmpzLkdsb2JhbFdvcmtlck9wdGlvbnMud29ya2VyU3JjID0gcGRmanNXb3JrZXI7XHJcblxyXG4gICAgICAgIGNvbnN0IHBkZjogUERGRG9jdW1lbnRQcm94eSA9IGF3YWl0IGdldERvY3VtZW50KFxyXG4gICAgICAgICAgICB0aGlzLmNob3NlblBsYW4uZmlsZXBhdGgsXHJcbiAgICAgICAgKS5wcm9taXNlO1xyXG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBwZGYuZ2V0UGFnZSgxKTtcclxuXHJcbiAgICAgICAgY29uc3Qgdmlld1BvcnRQYXJhbWV0ZXJzID0geyBzY2FsZTogMSB9O1xyXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gcGFnZS5nZXRWaWV3cG9ydCh2aWV3UG9ydFBhcmFtZXRlcnMpO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB2aWV3cG9ydC53aWR0aDtcclxuXHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuZ2V0U2l6ZUZvckNhbnZhcyh2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0KTtcclxuICAgICAgICBjb25zb2xlLmxvZyhzaXplKTtcclxuICAgICAgICB0aGlzLmNhbnZhc1NpemUgPSBzaXplO1xyXG5cclxuICAgICAgICB0aGlzLmNhbnZhc1pvb20gPSBzaXplLncgLyB2aWV3cG9ydC53aWR0aDtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoXHJcbiAgICAgICAgICAgIFwiMmRcIixcclxuICAgICAgICApIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICAgICAgICBjb25zdCByZW5kZXJDb250ZXh0ID0ge1xyXG4gICAgICAgICAgICBjYW52YXNDb250ZXh0OiBjb250ZXh0LFxyXG4gICAgICAgICAgICB2aWV3cG9ydCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KS5wcm9taXNlO1xyXG5cclxuICAgICAgICByZW5kZXJUYXNrLnRoZW4oKCkgPT4gY29uc29sZS5sb2coXCJQYWdlIHJlbmRlcmVkXCIpKTtcclxuXHJcbiAgICAgICAgLy8gY29uc3QgcmVzID0gY2FudmFzLnRvRGF0YVVSTCgpO1xyXG4gICAgICAgIC8vIGlmIChwZGYgIT0gbnVsbCkgcGRmLmRlc3Ryb3koKTtcclxuICAgICAgICAvLyByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBVc2VyIGNsaWNrIHRvIHVzZXIgU3ltbWV0cnkgVmVydGljYWwgKi9cclxuICAgIG9uUmVmbGVjdFYoKSB7XHJcbiAgICAgICAgdGhpcy5yZWZsZWN0ViA9ICF0aGlzLnJlZmxlY3RWO1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJlQ2FudmFzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFVzZXIgY2xpY2sgdG8gdXNlciBTeW1tZXRyeSBIb3Jpem9udGFsICovXHJcbiAgICBvblJlZmxlY3RIKCkge1xyXG4gICAgICAgIHRoaXMucmVmbGVjdEggPSAhdGhpcy5yZWZsZWN0SDtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyZUNhbnZhcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRURVJQT1JUXHJcbiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgICAvKiogTGF1bmNoIG1hdHRlcnBvcnQgKi9cclxuICAgIGFzeW5jIGxhdW5jaFZpZXdlcigpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLmluaXRTZGtGb3JNb2RlbChcclxuICAgICAgICAgICAgdGhpcy5jaG9zZW5QbGFuLm1vZGVsM2QsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBzZGsgfSA9IHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2U7XHJcbiAgICAgICAgdGhpcy5mbG9vcnMgPSBPYmplY3QudmFsdWVzKHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2UuZmxvb3JzKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmZsb29ycyk7XHJcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8qKiBNb3ZlIEZsb29yIG1vZGUgKi9cclxuICAgICAgICAgICAgYXdhaXQgc2RrLk1vZGUubW92ZVRvKHNkay5Nb2RlLk1vZGUuRkxPT1JQTEFOKTtcclxuICAgICAgICAgICAgLyoqIERpc3BsYXkgdGhlIGNvcnJlY3QgZmxvb3IgZm9yIHRoZSBwbGFuICovXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLm1vdmVUb0Zsb29yKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hvc2VuUGxhbi5uYW1lLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImNvdWxkbm90IG1vdmUgdG8gZmxvb3JcIik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKiBXZSBjYW4gZGlzcGxheSB0aGUgbWF0dGVycG9ydCB2aWV3IG5vdyAqL1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LCAzMDApO1xyXG5cclxuICAgICAgICAvKiogV2hlbiB0aGUgdXNlciB0cnkgdG8gY2hhbmdlIHRoZSB2aWV3IG1vZGUgd2Ugc2V0IGl0IGJhY2sgdG8gZmxvb3JwYW4gKi9cclxuXHJcbiAgICAgICAgc2RrLm9uKHNkay5Nb2RlLkV2ZW50LkNIQU5HRV9FTkQsIChvbGRNb2RlLCBuZXdNb2RlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChuZXdNb2RlICE9PSBzZGsuTW9kZS5Nb2RlLkZMT09SUExBTikge1xyXG4gICAgICAgICAgICAgICAgc2RrLk1vZGUubW92ZVRvKHNkay5Nb2RlLk1vZGUuRkxPT1JQTEFOLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogXCJ0cmFuc2l0aW9uLmluc3RhbnRcIixcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8qKiBVcGRhdGUgY3VycmVudCBjYW1lcmEgcG9zZSBhbmQgcm90YXRpb24gKi9cclxuICAgICAgICBzZGsuQ2FtZXJhLnBvc2Uuc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAvKiogV2UgdXBkYXRlIG9ubHkgaWYgdGhlIHVzZXIgaXMgbm90IGNoYW5naW5nIHRoZSByb3RhdGlvbiB3aXRoIHRoZSA8aW5wdXQ+IHJhbmdlLCB0byBub3Qgb3ZlcnJpZGUgdGhlIDxpbnB1dD4gdmFsdWUgKi9cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUm90YXRpbmdSYW5nZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGV2ZW50LnJvdGF0aW9uLnkgKyAxODA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZSb3RhdGlvbiA9IHRoaXMucm90YXRpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbWVyYVBvc2UgPSBldmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBXaGVuIHRoZSA8aW5wdXQ+IHJhbmdlLCBmb3Igcm90YXRpb24sIGNoYW5nZSAqL1xyXG4gICAgYXN5bmMgb25Sb3RhdGlvbkNoYW5nZSgpIHtcclxuICAgICAgICBjb25zdCByb3RhdGlvbkRlbHRhID0gdGhpcy5yb3RhdGlvbiAtIHRoaXMucHJldlJvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMucHJldlJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcclxuXHJcbiAgICAgICAgLyoqIFNlbmQgdGhlIHJvdGF0aW9uRGVsdGEgdG8gdGggcXVldWUgZXZlbnQgaW4gb3JkZXIgdG8gYmUgc2VuZCB0byBtYXR0ZXJwb3J0ICovXHJcbiAgICAgICAgdGhpcy5yb3RhdGluZ1F1ZXVlRXZlbnQucHVzaChyb3RhdGlvbkRlbHRhKTtcclxuXHJcbiAgICAgICAgLyoqIFN0YXJ0IHRvIHByb2Nlc3MgdGhlIHF1ZXVlLCBpZiBpdCdzIHRoZSBmaXJzdCBldmVudCAqL1xyXG4gICAgICAgIGlmICghdGhpcy5pc1JvdGF0aW5nUmFuZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1JvdGF0aW5nUmFuZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NSb3RhdGluZ1F1ZXVlRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFByb2Nlc3MgdGhlIHJvdGF0aW5nIGV2ZW50IHF1ZXVlLCBzZW5kIGV2ZW50IG9uZSBieSBvbmUgdG8gbWF0dGVycG9ydCAgKi9cclxuICAgIGFzeW5jIHByb2Nlc3NSb3RhdGluZ1F1ZXVlRXZlbnQoKSB7XHJcbiAgICAgICAgY29uc3QgeyBzZGsgfSA9IHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2U7XHJcblxyXG4gICAgICAgIC8qKiBXaGlsZSB0aGUgcXVldWUgaXMgbm90IGVtcHR5ICovXHJcbiAgICAgICAgd2hpbGUgKHRoaXMucm90YXRpbmdRdWV1ZUV2ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLyoqIFJvdGF0ZSBtYXR0ZXJwb3J0IGJ5IGRlbHRhUm90YXRpb24gYW5kIHJlbW92ZSBldmVudCBmcm9tIHF1ZXVlICovXHJcbiAgICAgICAgICAgIGF3YWl0IHNkay5DYW1lcmEucm90YXRlKHRoaXMucm90YXRpbmdRdWV1ZUV2ZW50LnNoaWZ0KCksIDAsIHtcclxuICAgICAgICAgICAgICAgIHNwZWVkOiAzNjAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIFdoZW4gdGhlIHF1ZXVlIGlzIGVtcHR5LCB0aGVuIHRoZSB1c2VyIGlzIG5vdCByb3RhdGluZyB3aXRoIHRoZSA8aW5wdXQ+IHJhbmdlIGFueW1vcmUgKi9cclxuICAgICAgICB0aGlzLmlzUm90YXRpbmdSYW5nZSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSIEFDVElPTlNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuICAgIC8qKiBQcmV2aWV3IGNhbGlicmF0aW9uICovXHJcbiAgICBhc3luYyBvblByZXZpZXcoKSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gdHJ1ZTtcclxuICAgICAgICAvKiogUGxhY2Ugc3dlZXBzICovXHJcbiAgICAgICAgdGhpcy5vblBsYWNlU3dlZXBzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2FsaWJyYXRlKCkge1xyXG4gICAgICAgIGNvbnN0IFtuYXZpZ2F0aW9uXSA9IHRoaXMuY3VycmVudE5hdmlnYXRpb25zO1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gSlNPTi5wYXJzZShuYXZpZ2F0aW9uLnBvc2l0aW9uKTtcclxuICAgICAgICB0aGlzLmZpcnN0TWFya1BsYW4gPVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLnNkay5SZW5kZXJlci5nZXRTY3JlZW5Qb3NpdGlvbih7XHJcbiAgICAgICAgICAgICAgICB4OiBwb3NpdGlvbi54LFxyXG4gICAgICAgICAgICAgICAgeTogcG9zaXRpb24ueSxcclxuICAgICAgICAgICAgICAgIHo6IHBvc2l0aW9uLnosXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2Vjb25kTWFya1BsYW4gPVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLnNkay5SZW5kZXJlci5nZXRTY3JlZW5Qb3NpdGlvbih7XHJcbiAgICAgICAgICAgICAgICB4OiBwb3NpdGlvbi54LFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHo6IDAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGRlbHRhWlZpc2l0ID0gMCAtIHBvc2l0aW9uLno7XHJcbiAgICAgICAgbGV0IGRlbHRhWFBsYW4gPSB0aGlzLnNlY29uZE1hcmtQbGFuLnggLSB0aGlzLmZpcnN0TWFya1BsYW4ueDtcclxuICAgICAgICBpZiAoZGVsdGFYUGxhbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIndlIG1vdmVkIGFsb25nIFkgYXhpcyBvbiBQbGFuXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVlQbGFuID0gdGhpcy5zZWNvbmRNYXJrUGxhbi55IC0gdGhpcy5maXJzdE1hcmtQbGFuLnk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLm5hbWVZQXhpcyA9IFwielwiO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5uYW1lWEF4aXMgPSBcInhcIjtcclxuICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WSA9IHRoaXMuc2Vjb25kTWFya1BsYW4ueTtcclxuICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2Uuc2NhbGVZID0gZGVsdGFZUGxhbiAvIGRlbHRhWlZpc2l0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiIHdlIG1vdmVkIGFsb25nIFggYXhpcyBvbiBQbGFuXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5uYW1lWUF4aXMgPSBcInhcIjtcclxuICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2UubmFtZVhBeGlzID0gXCJ6XCI7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLm9mZnNldFggPSB0aGlzLnNlY29uZE1hcmtQbGFuLng7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLnNjYWxlWCA9IGRlbHRhWFBsYW4gLyBkZWx0YVpWaXNpdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGhpcmRNYXJrUGxhbiA9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2Uuc2RrLlJlbmRlcmVyLmdldFNjcmVlblBvc2l0aW9uKHtcclxuICAgICAgICAgICAgICAgIHg6IDAsXHJcbiAgICAgICAgICAgICAgICB5OiAwLFxyXG4gICAgICAgICAgICAgICAgejogcG9zaXRpb24ueixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZGVsdGFYVmlzaXQgPSAwIC0gcG9zaXRpb24ueDtcclxuICAgICAgICBpZiAoZGVsdGFYUGxhbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIiB3ZSBtb3ZlZCBhbG9uZyBYIGF4aXMgb24gUGxhblwiKTtcclxuICAgICAgICAgICAgZGVsdGFYUGxhbiA9IHRoaXJkTWFya1BsYW4ueCAtIHRoaXMuZmlyc3RNYXJrUGxhbi54O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRYID0gdGhpcmRNYXJrUGxhbi54O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5zY2FsZVggPSBkZWx0YVhQbGFuIC8gZGVsdGFYVmlzaXQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFZUGxhbiA9IHRoaXJkTWFya1BsYW4ueSAtIHRoaXMuZmlyc3RNYXJrUGxhbi55O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRZID0gdGhpcmRNYXJrUGxhbi55O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5zY2FsZVkgPSBkZWx0YVlQbGFuIC8gZGVsdGFYVmlzaXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogVGFrZSBjb25zaWRpcmF0aW9uIG9mIHBhbiBhbmQgem9vbSBvZiBwbGFuIG9uIGNhbnZhcyAqL1xyXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybUluZm8gPSB0aGlzLnBhbnpvb20uZ2V0VHJhbnNmb3JtKCk7XHJcbiAgICAgICAgY29uc3QgeyBzY2FsZSwgeCwgeSB9ID0gdHJhbnNmb3JtSW5mbztcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyh0cmFuc2Zvcm1JbmZvKTtcclxuICAgICAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRYUGxhbiA9IHg7XHJcbiAgICAgICAgdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WVBsYW4gPSB5O1xyXG4gICAgICAgIHRoaXMuY2FsaWJyYWdlLnNjYWxlUGxhbiA9IHNjYWxlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsaWJyYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogUGxhY2Ugc3dlZXBzICovXHJcbiAgICBhc3luYyBvblBsYWNlU3dlZXBzKCkge1xyXG4gICAgICAgIC8qKiBEaXNwbGF5IGFsbCBzY2FuICovXHJcbiAgICAgICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuZ2V0Wm9uZSh0aGlzLmNob3NlblBsYW4uem9uZUlEKTtcclxuXHJcbiAgICAgICAgaWYgKHpvbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9uZSA9IHpvbmU7XHJcbiAgICAgICAgICAgIGNvbnN0IG5hdmlnYXRpb25zID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TmF2aWdhdGlvbnNGb3Jab25lKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFpvbmUsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROYXZpZ2F0aW9ucyA9IG5hdmlnYXRpb25zO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNhbGlicmF0ZSgpO1xyXG4gICAgICAgICAgICBpZiAobmF2aWdhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYXZpZ2F0aW9uIG9mIG5hdmlnYXRpb25zKSB7ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UG9zaXRpb24gPSBKU09OLnBhcnNlKG5hdmlnYXRpb24ucG9zaXRpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uWCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLm5hbWVYQXhpcyA9PT0gXCJ4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGVzdFBvc2l0aW9uLnhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGVzdFBvc2l0aW9uLno7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25ZID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2UubmFtZVlBeGlzID09PSBcInhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0ZXN0UG9zaXRpb24ueFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0ZXN0UG9zaXRpb24uejtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0WCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uWCAqIHRoaXMuY2FsaWJyYWdlLnNjYWxlWCArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLm9mZnNldFg7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVzdFkgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblkgKiB0aGlzLmNhbGlicmFnZS5zY2FsZVkgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRZO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidGVzdCBwb3NpdGlvbiBHUkVFTlwiLCB0ZXN0WCwgdGVzdFkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkWCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0WCAtIHRoaXMuY2FsaWJyYWdlLm9mZnNldFhQbGFuKSAvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLnNjYWxlUGxhbjsgLy8gd2UgYXJlIHVuZG9pbmcgdGhlIHBhbiBhbmQgem9vbVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkWSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0WSAtIHRoaXMuY2FsaWJyYWdlLm9mZnNldFlQbGFuKSAvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLnNjYWxlUGxhbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2SUQ6IG5hdmlnYXRpb24uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5JRDogdGhpcy5jaG9zZW5QbGFuLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiB0cmFuc2Zvcm1lZFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRyYW5zZm9ybWVkWSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpY29uU2l6ZSA9IDMwICogdGhpcy5jYWxpYnJhZ2Uuc2NhbGVQbGFuO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gaWNvblNpemUgLyAyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd0ltYWdlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImh0dHBzOi8vYXBpLmljb25pZnkuZGVzaWduL21kaTphZGp1c3Quc3ZnP2NvbG9yPWdyZWVuJmhlaWdodD0zMCZ3aWR0aD0zMFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFggLSBzaGlmdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRZIC0gc2hpZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogU2F2ZSBjYWxpYnJhdGlvbiAqL1xyXG4gICAgYXN5bmMgb25TYXZlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRab25lKSB7XHJcbiAgICAgICAgICAgIC8qKiBOb3JtYWxpemUgd2l0aCB0aGUgem9vbSAqL1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNhbGlicmFnZS5vZmZzZXRYIC89IHRoaXMuY2FudmFzWm9vbTtcclxuICAgICAgICAgICAgLy8gdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WSAvPSB0aGlzLmNhbnZhc1pvb207XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY2FsaWJyYWdlLnggLz0gdGhpcy5jYW52YXNab29tO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNhbGlicmFnZS55IC89IHRoaXMuY2FudmFzWm9vbTtcclxuICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2UubmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2UuaW1nV2lkdGggPSB0aGlzLmNhbnZhc1NpemUudztcclxuICAgICAgICAgICAgdGhpcy5jYWxpYnJhZ2UuaW1nSGVpZ2h0ID0gdGhpcy5jYW52YXNTaXplLmg7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBsYW5TZXJ2aWNlLnVwZGF0ZVBsYW4oe1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuY2hvc2VuUGxhbi5pZCxcclxuICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNhbGlicmFnZSksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25zLm1hcChhc3luYyAocG9zaXRpb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG5hdklEIH0gPSBwb3NpdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcG9zaXRpb24ubmF2SUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF2ID0gdGhpcy5jdXJyZW50TmF2aWdhdGlvbnMuZmluZChcclxuICAgICAgICAgICAgICAgICAgICAgICAgKF9uYXYpID0+IF9uYXYuaWQgPT09IG5hdklELFxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uc0RhdGFUb1VwZGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmF2LnBvc2l0aW9uT25QbGFuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uT25QbGFuID0gbmF2LnBvc2l0aW9uT25QbGFuLm1hcCgoZW50cnkpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKGVudHJ5KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb25Gb3JDdXJyZW50UGxhbiA9IHBvc2l0aW9uT25QbGFuLmZpbmQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW50cnkpID0+IGVudHJ5LnBsYW5JRCA9PT0gdGhpcy5jaG9zZW5QbGFuLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25Gb3JDdXJyZW50UGxhbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25PblBsYW4uc3BsaWNlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT25QbGFuLmluZGV4T2YocG9zaXRpb25Gb3JDdXJyZW50UGxhbiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9uUGxhbi5wdXNoKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnNEYXRhVG9VcGRhdGUgPSBbLi4ucG9zaXRpb25PblBsYW5dO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uc0RhdGFUb1VwZGF0ZSA9IFtwb3NpdGlvbl07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHBvc2l0aW9uc0RhdGFUb1VwZGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS51cGRhdGVOYXZpZ2F0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG5hdklELFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9uUGxhbjogcG9zaXRpb25zRGF0YVRvVXBkYXRlLm1hcCgoZW50cnkpID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShlbnRyeSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0SW1wb3J0U2VydmljZS5yZW1vdmVGcmFtZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXHJcbiAgICAgICAgICAgIFwiL2Rhc2hib2FyZC9sb2NhbGlzYXRpb25cIixcclxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICBcInBsYW5zXCIsXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNhbGlicmF0aW9uLnN1Y2Nlc3NcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXNldCB0aGUgY2FudmFzICovXHJcbiAgICBvblJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMucmVmbGVjdEggPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnJlZmxlY3RWID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuY29uZmlndXJlQ2FudmFzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENhbmNlbCwgbGVhdmUgKi9cclxuICAgIG9uQ2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2UucmVtb3ZlRnJhbWUoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXHJcbiAgICAgICAgICAgIFwiL2Rhc2hib2FyZC9sb2NhbGlzYXRpb25cIixcclxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxyXG4gICAgICAgICAgICBcInBsYW5zXCIsXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgYWxlcnQodGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNhbGlicmF0aW9uLmNhbmNlbGVkXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkZsb29yQ2xpY2soZmxvb3IpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGbG9vciA9IGZsb29yO1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2UubW92ZVRvRmxvb3IoZmxvb3IuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQWN0aXZhdGVab29tQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuem9vbUNhbkJlQ2hhbmdlZCA9ICF0aGlzLnpvb21DYW5CZUNoYW5nZWQ7XHJcbiAgICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN2aWV3ZXItZnJhbWVcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGlmcmFtZSkge1xyXG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUuekluZGV4ID0gdGhpcy56b29tQ2FuQmVDaGFuZ2VkID8gXCIxXCIgOiBcIjBcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cclxuICAgICAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJz48L2xpYi10YWItbmF2aWdhdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgaWQ9XCJyb3dDYW52YXNcIj5cclxuICAgIDxkaXYgI2NhbnZhc0RpdiBpZD1cImNhbnZhc0RpdlwiPlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidmlld2VyLWZyYW1lXCIgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cInpvb21DYW5CZUNoYW5nZWQ/J2F1dG8nOidub25lJ1wiPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJibHVyXCI+PC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxjYW52YXMgaWQ9XCJjYW52YXNcIiBbbmdTdHlsZV09XCJ7J29wYWNpdHknOiAocHJldmlld3x8bG9hZGluZykgPyAnMScgOiAnY2FsYygnICsgb3BhY2l0eSArICcvIDEwMCknfVwiPjwvY2FudmFzPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGlicmF0aW9uLXRvb2xzIGNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwiIShwcmV2aWV3IHx8IGxvYWRpbmcpXCI+XHJcbiAgICAgICAgPGgxPnt7J0NhbGlicmF0aW9uIHRvb2wnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXMtMCBtZS0wIGxlZ2VuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1iYXItaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwieydvcGFjaXR5JzogJ2NhbGMoJyArICgtKG9wYWNpdHktMTAwKSsxMCkgKyAnLyAxMDApJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydMZXNzJyB8IHRyYW5zbGF0ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRpdGxlXCI+e3snUGxhbiBPcGFjaXR5JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1iYXItaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwieydvcGFjaXR5JzogJ2NhbGMoJyArIChvcGFjaXR5KzEwKSArICcvIDEwMCknfVwiPnt7J01vcmUnIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtcy0wIG1lLTAgXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2Rpc2FibGVkXT1cImZhbHNlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIFsobmdNb2RlbCldPVwib3BhY2l0eVwiIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHZhbHVlPVwiNTBcIiBpZD1cIm9wYWNpdHlcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtcy0wIG1lLTAgXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtbGVnZW5kXCI+e3snQ2hhbmdlIFZpc2l0IEZsb29yJyB8IHRyYW5zbGF0ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxhYmVsLWZpbGUgcm91bmRlZC1waWxsXCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2N1cnJlbnRGbG9vciA/IGN1cnJlbnRGbG9vci5pZCA6ICgnRmxvb3InIHwgdHJhbnNsYXRlKSB9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtICpuZ0Zvcj1cImxldCBmbG9vciBvZiBmbG9vcnNcIiAoY2xpY2spPVwib25GbG9vckNsaWNrKGZsb29yKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmxvb3IubmFtZS5sZW5ndGggPiAwID8gZmxvb3IubmFtZSA6ICgnRmxvb3IgJyArIGZsb29yLmlkKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtcy0wIG1lLTAgXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbC1jaGVja2JveC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbC1jaGVja2JveC1zdWJjb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWxlZ2VuZCBtZS0zXCI+e3snUGFuL1pvb20gVmlzaXQnIHwgdHJhbnNsYXRlfX0ge3t6b29tQ2FuQmVDaGFuZ2VkID8gXCJPTlwiIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiT0ZGXCJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwib25BY3RpdmF0ZVpvb21DaGFuZ2UoKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci13YXJuaW5nIG1iLTMgbXQtM1wiICpuZ0lmPVwiem9vbUNhbkJlQ2hhbmdlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHRleHQtd2FybmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7XCJjYWxpYnJhdGlvbi53YWl0LW1lc3NhZ2VcIiB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25QcmV2aWV3KClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInpvb21DYW5CZUNoYW5nZWRcIj57eydQcmV2aWV3JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj57eydDYW5jZWwnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGlicmF0aW9uLXRvb2xzIGNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwicHJldmlld1wiPlxyXG4gICAgICAgIDxoMT57eydWYWxpZGF0aW9uJyB8IHRyYW5zbGF0ZX19PC9oMT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uU2F2ZSgpXCI+e3snVmFsaWRhdGUnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uUmVzZXQoKVwiPnt7J1Jlc2V0JyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+e3snQ2FuY2VsJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsaWJyYXRpb24tdG9vbHMgY29udGFpbmVyLWZsdWlkXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGgzPnt7XCJXYWl0aW5nIGZvciBNYXR0ZXJwb3J0XCIgfCB0cmFuc2xhdGV9fS4uLjwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsaWJyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvcGxhbnMvY2FsaWJyYXRpb24vY2FsaWJyYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvcGxhbnMvY2FsaWJyYXRpb24vY2FsaWJyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBc0IsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFekMsT0FBTyxFQVVMLGVBQWUsR0FFaEIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7Ozs7Ozs7OztBQU85QixNQUFNLE9BQU8sb0JBQW9CO0lBb0YvQixZQUNVLHVCQUFnRCxFQUNoRCxXQUF3QixFQUN4QixLQUFxQixFQUNyQixNQUFjLEVBQ2QsV0FBd0IsRUFDeEIsWUFBMEIsRUFDMUIsaUJBQW9DLEVBQ3BDLFNBQTJCO1FBUDNCLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUEzRnJDLHFDQUFxQztRQUNyQyxjQUFTLEdBQWUsRUFBRSxDQUFDO1FBVzNCLHFDQUFxQztRQUNyQyxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRWYsb0NBQW9DO1FBQ3BDLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFFckIsNEZBQTRGO1FBQzVGLGFBQVEsR0FBVyxHQUFHLENBQUM7UUFFdkIseUhBQXlIO1FBQ3pILGlCQUFZLEdBQVcsR0FBRyxDQUFDO1FBSzNCLG9IQUFvSDtRQUNwSCxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUVqQyxpREFBaUQ7UUFDakQsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBRWxDLDZDQUE2QztRQUM3QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLCtDQUErQztRQUMvQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBVWpCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRXhCLCtEQUErRDtRQUMvRCxtQkFBYyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFaEMsZ0VBQWdFO1FBQ2hFLG9CQUFlLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUVyQyxnREFBZ0Q7UUFDaEQsa0JBQWEsR0FBNkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUV6RCxpREFBaUQ7UUFDakQsbUJBQWMsR0FBNkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUUxRCxtREFBbUQ7UUFDbkQsY0FBUyxHQUFRLEVBQUUsQ0FBQztRQUVwQiwyQ0FBMkM7UUFDM0MsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQiw0QkFBNEI7UUFDNUIsWUFBTyxHQUFHLElBQUksQ0FBQztRQU9mLGNBQVMsR0FBOEQsRUFBRSxDQUFDO1FBRTFFLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFJbkIscUJBQWdCLEdBQVksS0FBSyxDQUFDO0lBVy9CLENBQUM7SUFFSixXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbkUsbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFbkQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNsQyxNQUFNLEVBQUUsSUFBSTt3QkFDWixhQUFhLEVBQUUsQ0FBQzt3QkFDaEIsT0FBTyxFQUFFLEdBQUc7d0JBQ1osT0FBTyxFQUFFLEdBQUc7d0JBQ1osV0FBVyxFQUFFLENBQUM7d0JBQ2QsU0FBUyxFQUFFLElBQUk7cUJBQ2hCLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUNUO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUMxRTtJQUNILENBQUM7SUFFRDs7dUdBRW1HO0lBQ25HLGNBQWM7UUFDWixJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUU7WUFDNUM7Z0JBQ0UsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSTtnQkFDN0IsR0FBRyxFQUFFLGlCQUFpQixJQUFJLENBQUMsT0FBTyxFQUFFO2FBQ3JDO1lBQ0Q7Z0JBQ0UsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsR0FBRyxFQUFFLGlCQUFpQixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsUUFBUTthQUNuRDtZQUNEO2dCQUNFLEtBQUssRUFBRSxhQUFhO2dCQUNwQixHQUFHLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSw2QkFBNkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7YUFDOUY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzt1R0FFbUc7SUFFbkcsdUJBQXVCO0lBQ3ZCLEtBQUssQ0FBQyxlQUFlO1FBQ25CLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBc0IsQ0FBQztZQUN0RSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUN0QjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUQsMkdBQTJHO1lBQzNHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU5RCxrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFFdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV0Qiw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFDO2FBQU07WUFDTCxPQUFPO1lBQ1AsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxVQUFVLENBQUMsSUFBSTtRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN6QixDQUFDO0lBRUQsbUNBQW1DO0lBQ25DLFNBQVMsQ0FBQyxHQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QyxxQ0FBcUM7UUFDckMsdUJBQXVCO1FBQ3ZCLG9DQUFvQztRQUNwQyw0QkFBNEI7UUFDNUIsSUFBSTtRQUNKLHVCQUF1QjtRQUN2QixvQ0FBb0M7UUFDcEMsNEJBQTRCO1FBQzVCLElBQUk7UUFFSixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDbEMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ3pCLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2FBQzVCO1lBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FDZixLQUFLLEVBQ0wsQ0FBQyxFQUNELENBQUMsRUFDRCxLQUFLLENBQUMsS0FBSyxFQUNYLEtBQUssQ0FBQyxNQUFNLEVBQ1osQ0FBQyxFQUNELENBQUMsRUFDRCxVQUFVLEVBQ1YsV0FBVyxDQUNaLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCw2RUFBNkU7SUFDN0UsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO1FBQ3ZELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUV4RCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFFdEMsSUFBSSxVQUFVLEdBQUcsV0FBVyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO1NBQ2hDO2FBQU07WUFDTCxPQUFPLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQztTQUNoQztRQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsdUNBQXVDO0lBQ3ZDLEtBQUssQ0FBQyxXQUFXO1FBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLE1BQU0sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRXRFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBRWxELE1BQU0sR0FBRyxHQUFxQixNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzthQUN0RSxPQUFPLENBQUM7UUFDWCxNQUFNLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbEMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRW5DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBRXZCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRTFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBNkIsQ0FBQztRQUN6RSxNQUFNLGFBQWEsR0FBRztZQUNwQixhQUFhLEVBQUUsT0FBTztZQUN0QixRQUFRO1NBQ1QsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRXRELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBRXBELGtDQUFrQztRQUNsQyxrQ0FBa0M7UUFDbEMsY0FBYztJQUNoQixDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELDZDQUE2QztJQUM3QyxVQUFVO1FBQ1IsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7dUdBRW1HO0lBRW5HLHdCQUF3QjtJQUN4QixLQUFLLENBQUMsWUFBWTtRQUNoQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU1RSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakUsNEJBQTRCO1FBQzVCLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNwQixzQkFBc0I7WUFDdEIsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUNyRSxrQkFBa0I7Z0JBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBRXBELDZDQUE2QztnQkFDN0MsSUFBSTtvQkFDRixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFckUsMkVBQTJFO29CQUMzRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRTt3QkFDckQsSUFBSSxPQUFPLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFOzRCQUN2QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0NBQ3ZDLFVBQVUsRUFBRSxvQkFBb0I7NkJBQ2pDLENBQUMsQ0FBQzt5QkFDSjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFBQyxNQUFNO29CQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztpQkFDdkM7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILDZDQUE2QztZQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFVCw4Q0FBOEM7UUFDOUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEMsd0hBQXdIO1lBQ3hILElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFFbEMsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFNUMsMERBQTBEO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELDZFQUE2RTtJQUM3RSxLQUFLLENBQUMseUJBQXlCO1FBQzdCLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFFN0MsbUNBQW1DO1FBQ25DLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekMscUVBQXFFO1lBQ3JFLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDMUQsS0FBSyxFQUFFLEdBQUc7YUFDWCxDQUFDLENBQUM7U0FDSjtRQUVELDRGQUE0RjtRQUM1RixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQ7O3VHQUVtRztJQUVuRywwQkFBMEI7SUFDMUIsS0FBSyxDQUFDLFNBQVM7UUFDYixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLGFBQWE7WUFDaEIsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNiLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDYixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDZCxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsY0FBYztZQUNqQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2dCQUNoRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2IsQ0FBQyxFQUFFLENBQUM7Z0JBQ0osQ0FBQyxFQUFFLENBQUM7YUFDTCxDQUFDLENBQUM7UUFDTCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUU7WUFDcEIsZ0RBQWdEO1lBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFdBQVcsQ0FBQztTQUNsRDthQUFNO1lBQ0wsaURBQWlEO1lBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFdBQVcsQ0FBQztTQUNsRDtRQUNELE1BQU0sYUFBYSxHQUNqQixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1lBQ2hFLENBQUMsRUFBRSxDQUFDO1lBQ0osQ0FBQyxFQUFFLENBQUM7WUFDSixDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDZCxDQUFDLENBQUM7UUFDTCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNuQyxJQUFJLFVBQVUsS0FBSyxDQUFDLEVBQUU7WUFDcEIsaURBQWlEO1lBQ2pELFVBQVUsR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFdBQVcsQ0FBQztTQUNsRDthQUFNO1lBQ0wsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUM7U0FDbEQ7UUFFRCwyREFBMkQ7UUFDM0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUM7UUFDdEMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsS0FBSyxDQUFDLGFBQWE7UUFDakIsdUJBQXVCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVwRSxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUNwRSxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1lBQ0YsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztZQUN0QyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMxQixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtvQkFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3JELE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztvQkFDckUsTUFBTSxTQUFTLEdBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLEtBQUssR0FDVCxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7b0JBQzdELE1BQU0sS0FBSyxHQUNULFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztvQkFDN0Qsb0RBQW9EO29CQUNwRCxNQUFNLFlBQVksR0FDaEIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtDQUFrQztvQkFDckcsTUFBTSxZQUFZLEdBQ2hCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7b0JBQ2xFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO3dCQUNsQixLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7d0JBQ3BCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQzFCLENBQUMsRUFBRSxZQUFZO3dCQUNmLENBQUMsRUFBRSxZQUFZO3FCQUNoQixDQUFDLENBQUM7b0JBQ0gsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO29CQUMvQyxNQUFNLEtBQUssR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO29CQUMzQixJQUFJLENBQUMsU0FBUyxDQUNaLDBFQUEwRSxFQUMxRSxZQUFZLEdBQUcsS0FBSyxFQUNwQixZQUFZLEdBQUcsS0FBSyxFQUNwQixJQUFJLENBQ0wsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLEtBQUssQ0FBQyxNQUFNO1FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLDhCQUE4QjtZQUM5Qiw2Q0FBNkM7WUFDN0MsNkNBQTZDO1lBQzdDLHVDQUF1QztZQUN2Qyx1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBRTdDLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7Z0JBQ2hDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3RCLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7YUFDNUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFFBQVEsQ0FBQztnQkFDM0IsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLHFCQUFxQixDQUFDO2dCQUMxQixJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUU7b0JBQ3RCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDdEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDbEIsQ0FBQztvQkFDRixNQUFNLHNCQUFzQixHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQ2hELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUMvQyxDQUFDO29CQUNGLElBQUksc0JBQXNCLEVBQUU7d0JBQzFCLGNBQWMsQ0FBQyxNQUFNLENBQ25CLGNBQWMsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFDOUMsQ0FBQyxFQUNELFFBQVEsQ0FDVCxDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQy9CO29CQUNELHFCQUFxQixHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztpQkFDN0M7cUJBQU07b0JBQ0wscUJBQXFCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDcEM7Z0JBQ0Qsc0NBQXNDO2dCQUN0QyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDNUMsRUFBRSxFQUFFLEtBQUs7b0JBQ1QsY0FBYyxFQUFFLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2xELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQ3RCO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7U0FDSDtRQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6RSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsT0FBTztRQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLFFBQVE7UUFDTixJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekUsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQWdCLENBQUM7UUFDdEUsSUFBSSxNQUFNLEVBQUU7WUFDVixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQzs7aUhBamtCVSxvQkFBb0I7cUdBQXBCLG9CQUFvQiwrSkN6QmpDLGl6SkFpR007MkZEeEVPLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxpQkFBaUI7OFNBWUgsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBnZXREb2N1bWVudCB9IGZyb20gJ3BkZmpzLWRpc3QnO1xyXG5pbXBvcnQgeyBQREZEb2N1bWVudFByb3h5IH0gZnJvbSAnbmcyLXBkZi12aWV3ZXInO1xyXG5pbXBvcnQge1xyXG4gIFpvbmUsXHJcbiAgTWVudUl0ZW0sXHJcbiAgUGxhbixcclxuICBTcGFjZSxcclxuICBOYXZpZ2F0aW9uLFxyXG4gIFBsYW5TZXJ2aWNlLFxyXG4gIFpvbmVTZXJ2aWNlLFxyXG4gIFNwYWNlU2VydmljZSxcclxuICBOYXZpZ2F0aW9uU2VydmljZSxcclxuICBnZXRNZXRhRm9ySW1hZ2UsXHJcbiAgTWF0dGVycG9ydEltcG9ydFNlcnZpY2UsXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHBhbnpvb20gZnJvbSAncGFuem9vbSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1jYWxpYnJhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGlicmF0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jYWxpYnJhdGlvbi5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2FsaWJyYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIC8qKiBJdGVtIHRvIGRpc3BsYXkgZm9yIHRoZSBuYXZiYXIgKi9cclxuICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgLyoqIENhbnZhcyAoUGxhbikgKi9cclxuICBjYW52YXM7XHJcblxyXG4gIC8qKiBDYW52YXNEaXYgKERpdiB0aGF0IGNvbnRhaW4gdGhlIGNhbnZhcyArIG1hdHRlcnBvcnQgaWZyYW1lKSAqL1xyXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhc0RpdicpIGNhbnZhc0RpdjogRWxlbWVudFJlZjtcclxuXHJcbiAgLyoqIFNpemUgb2YgdGhlIGNhbnZhcyAmIG1hdHRlcnBvcnQgaWZyYW1lICovXHJcbiAgY2FudmFzU2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9O1xyXG5cclxuICAvKiogWm9vbSByYXRpbyBvZiB0aGUgY2FudmFzL3BsYW4gICovXHJcbiAgY2FudmFzWm9vbSA9IDA7XHJcblxyXG4gIC8qKiBPcGFjaXR5IGZvciBtYXR0ZXJwb3J0IGlmcmFtZSAqL1xyXG4gIG9wYWNpdHk6IG51bWJlciA9IDUwO1xyXG5cclxuICAvKiogQ3VycmVudCByb3RhdGlvbiBmb3IgbWF0dGVycG9ydCwgWzAtMzYwXSwgIG1hdHRlcnBvcnQgcm90YXRpb24gaXMgYmluZCB0byBpbnB1dCByYW5nZSAqL1xyXG4gIHJvdGF0aW9uOiBudW1iZXIgPSAxODA7XHJcblxyXG4gIC8qKiBQcmV2aW91cyByb3RhdGlvbiwgdXNlIHRvIGNhbGN1bGF0ZSB0aGUgZGVsdGFSb3RhdGlvbiB0byByb3RhdGUsIHdoZW4gdXNlciBjaGFuZ2Ugcm90YXRpb24gdmFsdWUgdXNpbmcgcmFuZ2UgaW5wdXQgKi9cclxuICBwcmV2Um90YXRpb246IG51bWJlciA9IDE4MDtcclxuXHJcbiAgLyoqIEN1cnJlbnQgQ2FtZXJhIFBvc2UgKi9cclxuICBjYW1lcmFQb3NlOiBhbnk7XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gdGhlIHVzZXIgaXMgY3VycmVudGx5IHJvdGF0aW5nIHdpdGggdGhlIGlucHV0IHJhbmdlLCB0aGUgbWF0dGVycG9ydCByb3RhdGlvbiBldmVudHMgd2lsbCBiZSBpZ25vcmVkICovXHJcbiAgaXNSb3RhdGluZ1JhbmdlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBSb3RhdGluZyBxdWV1ZSBldmVudCB0byBzZW5kIHRvIG1hdHRlcnBvcnQgKi9cclxuICByb3RhdGluZ1F1ZXVlRXZlbnQ6IG51bWJlcltdID0gW107XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gVmVydGljYWwgc3ltbWV0cnkgaXMgZW5hYmxlZCAqL1xyXG4gIHJlZmxlY3RWID0gZmFsc2U7XHJcblxyXG4gIC8qKiBUcnVlIHdoZW4gSG9yaXpvbnRhbCBzeW1tZXRyeSBpcyBlbmFibGVkICovXHJcbiAgcmVmbGVjdEggPSBmYWxzZTtcclxuXHJcbiAgY2hvc2VuUGxhbjogUGxhbjtcclxuXHJcbiAgc3BhY2VJRDogc3RyaW5nO1xyXG5cclxuICBjdXJyZW50U3BhY2U6IFNwYWNlO1xyXG5cclxuICBjdXJyZW50Wm9uZTogWm9uZTtcclxuXHJcbiAgY2hvc2VuUGxhbklzUGRmID0gZmFsc2U7XHJcblxyXG4gIC8qKiBGaXJzdCBQb2ludCBpbiB2aXNpdCwgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNhbGlicmF0aW9uICAqL1xyXG4gIGZpcnN0TWFya1Zpc2l0ID0geyB4OiAwLCB5OiAwIH07XHJcblxyXG4gIC8qKiBTZWNvbmQgUG9pbnQgaW4gdmlzaXQsIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjYWxpYnJhdGlvbiAgKi9cclxuICBzZWNvbmRNYXJrVmlzaXQgPSB7IHg6IDAuNSwgeTogMC41IH07XHJcblxyXG4gIC8qKiBFcXVpdmFsZW50IG9mICdmaXJzdE1hcmtWaXNpdCcgaW4gY2FudmFzICAqL1xyXG4gIGZpcnN0TWFya1BsYW46IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICAvKiogRXF1aXZhbGVudCBvZiAnc2Vjb25kTWFya1Zpc2l0JyBpbiBjYW52YXMgICovXHJcbiAgc2Vjb25kTWFya1BsYW46IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMCB9O1xyXG5cclxuICAvKiogQ2FsaWJyYXRpb24gcmVzdWx0LCAob2Zmc2V0WCwgb2Zmc2V0WSwgeCwgeSkgKi9cclxuICBjYWxpYnJhZ2U6IGFueSA9IHt9O1xyXG5cclxuICAvKiogSXMgaW4gcHJldmlldyBtb2RlIChzZWUgc2NhbiByZXN1bHQpICovXHJcbiAgcHJldmlldyA9IGZhbHNlO1xyXG5cclxuICAvKiogTWF0dGVycG9ydCBpcyBsb2FkaW5nICovXHJcbiAgbG9hZGluZyA9IHRydWU7XHJcblxyXG4gIC8qIGZvciBwYW4gYW5kIHpvb20gb2YgY2FudmFzICovXHJcbiAgcGFuem9vbTogYW55O1xyXG5cclxuICBjdXJyZW50TmF2aWdhdGlvbnM6IE5hdmlnYXRpb25bXTtcclxuXHJcbiAgcG9zaXRpb25zOiB7IG5hdklEOiBzdHJpbmc7IHBsYW5JRDogc3RyaW5nOyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10gPSBbXTtcclxuXHJcbiAgZmxvb3JzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjdXJyZW50Rmxvb3I7XHJcblxyXG4gIHpvb21DYW5CZUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlOiBNYXR0ZXJwb3J0SW1wb3J0U2VydmljZSxcclxuICAgIHByaXZhdGUgcGxhblNlcnZpY2U6IFBsYW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubG9hZGluZykge1xyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLnJlbW92ZUZyYW1lKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc3BhY2VJRCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuc3BhY2VJRDtcclxuICAgIHRoaXMuY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZUlEKTtcclxuXHJcbiAgICAvKiogTWVudSBuYXYgYmFyICovXHJcbiAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgdGhpcy5jaG9zZW5QbGFuID0gdGhpcy5wbGFuU2VydmljZS5nZXRDaG9zZW5QbGFuKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hvc2VuUGxhbikge1xyXG4gICAgICB0aGlzLmNob3NlblBsYW5Jc1BkZiA9IHRoaXMuY2hvc2VuUGxhbi5hbm5leGUuaW5jbHVkZXMoJ3BkZicpO1xyXG4gICAgICB0aGlzLmxhdW5jaFZpZXdlcigpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyZUNhbnZhcygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5wYW56b29tID0gcGFuem9vbSh0aGlzLmNhbnZhcywge1xyXG4gICAgICAgICAgICBib3VuZHM6IHRydWUsXHJcbiAgICAgICAgICAgIGJvdW5kc1BhZGRpbmc6IDAsXHJcbiAgICAgICAgICAgIG1heFpvb206IDIuNSxcclxuICAgICAgICAgICAgbWluWm9vbTogMC4xLFxyXG4gICAgICAgICAgICBpbml0aWFsWm9vbTogMSxcclxuICAgICAgICAgICAgem9vbVNwZWVkOiAwLjAyLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sIDUwMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9kYXNoYm9hcmQvbG9jYWxpc2F0aW9uJywgdGhpcy5zcGFjZUlELCAncGxhbnMnXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU5VIE5BViBCQVJcclxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuICBzZXR1cE1lbnVJdGVtcygpIHtcclxuICAgIHRoaXMubWVudUl0ZW1zID0gW1xyXG4gICAgICB7IGxhYmVsOiAnTG9jYXRpb25zJywgdXJsOiAnL2xvY2FsaXNhdGlvbicgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiB0aGlzLmN1cnJlbnRTcGFjZS5uYW1lLFxyXG4gICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLnNwYWNlSUR9YCxcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIGxhYmVsOiAnUGxhbnMnLFxyXG4gICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLmN1cnJlbnRTcGFjZS5pZH0vcGxhbnNgLFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbGFiZWw6ICdDYWxpYnJhdGlvbicsXHJcbiAgICAgICAgdXJsOiBgL2xvY2FsaXNhdGlvbi8ke3RoaXMuY3VycmVudFNwYWNlLmlkfS9wbGFuLWNhbGlicmF0aW9uP3NwYWNlSUQ9JHt0aGlzLmN1cnJlbnRTcGFjZS5pZH1gLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOVkFTXHJcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gIC8qKiBEaXNwbGF5IHRoZSBwbGFuICovXHJcbiAgYXN5bmMgY29uZmlndXJlQ2FudmFzKCkge1xyXG4gICAgLyoqIEdldCBjYW52YXMgKi9cclxuICAgIGlmICghdGhpcy5jYW52YXMpIHtcclxuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NhbnZhcycpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xyXG4gICAgICB0aGlzLmNhbnZhcyA9IGNhbnZhcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY2hvc2VuUGxhbklzUGRmKSB7XHJcbiAgICAgIGNvbnN0IGltYWdlID0gYXdhaXQgZ2V0TWV0YUZvckltYWdlKHRoaXMuY2hvc2VuUGxhbi5maWxlcGF0aCk7XHJcbiAgICAgIC8qKiBDb21wdXRlIHRoZSBuZXcgc2l6ZSBmb3IgdGhlIGNhbnZhcy9tYXR0ZXJwb3J0LCBiYXNlIG9uIHRoZSBkaW1lbnNpb24gb2YgdGhlIHBsYW4sIGtlZXBpbmcgdGhlIHJhdGlvICovXHJcbiAgICAgIGNvbnN0IHNpemUgPSB0aGlzLmdldFNpemVGb3JDYW52YXMoaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCk7XHJcblxyXG4gICAgICAvKiogQ29tcHV0ZSB0aGUgcGxhbiB6b29tIHJhdGlvICh1c2UgZm9yIHRoZSBjYWxpYnJhdGlvbiBsYXRlcikgKi9cclxuICAgICAgdGhpcy5jYW52YXNab29tID0gc2l6ZS53IC8gaW1hZ2Uud2lkdGg7XHJcblxyXG4gICAgICB0aGlzLnJlc2l6ZVZpZXcoc2l6ZSk7XHJcblxyXG4gICAgICAvKiogRHJhdyBQbGFuIG9uIHRoZSBjYW52YXMgKi9cclxuICAgICAgdGhpcy5kcmF3SW1hZ2UodGhpcy5jaG9zZW5QbGFuLmZpbGVwYXRoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFRPRE9cclxuICAgICAgdGhpcy5wZGZUb0NhbnZhcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZSBzaXplIG9mIHRoZSBjYW52YXMvbWF0dGVycG9ydCAqL1xyXG4gIHJlc2l6ZVZpZXcoc2l6ZSkge1xyXG4gICAgdGhpcy5jYW52YXNEaXYubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3NpemUud31weGA7XHJcbiAgICB0aGlzLmNhbnZhc0Rpdi5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3NpemUuaH1weGA7XHJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS53aWR0aCA9IGAke3NpemUud31weGA7XHJcbiAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHtzaXplLmh9cHhgO1xyXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSBzaXplLnc7XHJcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBzaXplLmg7XHJcbiAgICB0aGlzLmNhbnZhc1NpemUgPSBzaXplO1xyXG4gIH1cclxuXHJcbiAgLyoqIERyYXcgc29tZXRoaW5nIG9uIHRoZSBjYW52YXMgKi9cclxuICBkcmF3SW1hZ2UodXJsOiBzdHJpbmcsIHggPSAwLCB5ID0gMCwgaWNvbmUgPSBmYWxzZSkge1xyXG4gICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGNvbnN0IHNpemUgPSB0aGlzLmNhbnZhc1NpemU7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICAvKiogRmxpcCB0aGUgY29udGV4dCwgZm9yIHN5bW1ldHJ5ICovXHJcbiAgICAvLyBpZiAodGhpcy5yZWZsZWN0Vikge1xyXG4gICAgLy8gICAgIGNvbnRleHQudHJhbnNsYXRlKHNpemUudywgMCk7XHJcbiAgICAvLyAgICAgY29udGV4dC5zY2FsZSgtMSwgMSk7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBpZiAodGhpcy5yZWZsZWN0SCkge1xyXG4gICAgLy8gICAgIGNvbnRleHQudHJhbnNsYXRlKDAsIHNpemUuaCk7XHJcbiAgICAvLyAgICAgY29udGV4dC5zY2FsZSgxLCAtMSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgbGV0IGltYWdlV2lkdGggPSBzaXplLnc7XHJcbiAgICBsZXQgaW1hZ2VIZWlnaHQgPSBzaXplLmg7XHJcbiAgICBpbWFnZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xyXG4gICAgICBpZiAoaWNvbmUpIHtcclxuICAgICAgICBpbWFnZVdpZHRoID0gaW1hZ2Uud2lkdGg7XHJcbiAgICAgICAgaW1hZ2VIZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XHJcbiAgICAgIH1cclxuICAgICAgY29udGV4dC5kcmF3SW1hZ2UoXHJcbiAgICAgICAgaW1hZ2UsXHJcbiAgICAgICAgMCxcclxuICAgICAgICAwLFxyXG4gICAgICAgIGltYWdlLndpZHRoLFxyXG4gICAgICAgIGltYWdlLmhlaWdodCxcclxuICAgICAgICB4LFxyXG4gICAgICAgIHksXHJcbiAgICAgICAgaW1hZ2VXaWR0aCxcclxuICAgICAgICBpbWFnZUhlaWdodFxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgICBpbWFnZS5zcmMgPSB1cmw7XHJcbiAgfVxyXG5cclxuICAvKiogR2V0IHRoZSBzaXplIGZvciB0aGUgY2FudmFzLCBiYXNlZCBvbiB0aGUgcGxhbiBzaXplLCBrZWVwaW5nIHRoZSByYXRpbyAqL1xyXG4gIGdldFNpemVGb3JDYW52YXModywgaCkge1xyXG4gICAgbGV0IGNhbnZhc1cgPSB0aGlzLmNhbnZhc0Rpdi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgbGV0IGNhbnZhc0ggPSB0aGlzLmNhbnZhc0Rpdi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuXHJcbiAgICBjb25zdCBpbWFnZVJhdGlvID0gdyAvIGg7XHJcbiAgICBjb25zdCBjYW52YXNSYXRpbyA9IGNhbnZhc1cgLyBjYW52YXNIO1xyXG5cclxuICAgIGlmIChpbWFnZVJhdGlvID4gY2FudmFzUmF0aW8pIHtcclxuICAgICAgY2FudmFzSCA9IGNhbnZhc1cgLyBpbWFnZVJhdGlvO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FudmFzVyA9IGNhbnZhc0ggKiBpbWFnZVJhdGlvO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgdzogY2FudmFzVywgaDogY2FudmFzSCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFtUT0RPXSBDb252ZXJ0IGEgUERGIHRvIGEgQ2FudmFzICovXHJcbiAgYXN5bmMgcGRmVG9DYW52YXMoKSB7XHJcbiAgICBjb25zdCBwZGZqcyA9IGF3YWl0IGltcG9ydCgncGRmanMtZGlzdC9idWlsZC9wZGYnKTtcclxuICAgIGNvbnN0IHBkZmpzV29ya2VyID0gYXdhaXQgaW1wb3J0KCdwZGZqcy1kaXN0L2J1aWxkL3BkZi53b3JrZXIuZW50cnknKTtcclxuXHJcbiAgICBwZGZqcy5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IHBkZmpzV29ya2VyO1xyXG5cclxuICAgIGNvbnN0IHBkZjogUERGRG9jdW1lbnRQcm94eSA9IGF3YWl0IGdldERvY3VtZW50KHRoaXMuY2hvc2VuUGxhbi5maWxlcGF0aClcclxuICAgICAgLnByb21pc2U7XHJcbiAgICBjb25zdCBwYWdlID0gYXdhaXQgcGRmLmdldFBhZ2UoMSk7XHJcblxyXG4gICAgY29uc3Qgdmlld1BvcnRQYXJhbWV0ZXJzID0geyBzY2FsZTogMSB9O1xyXG4gICAgY29uc3Qgdmlld3BvcnQgPSBwYWdlLmdldFZpZXdwb3J0KHZpZXdQb3J0UGFyYW1ldGVycyk7XHJcblxyXG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0O1xyXG4gICAgdGhpcy5jYW52YXMud2lkdGggPSB2aWV3cG9ydC53aWR0aDtcclxuXHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5nZXRTaXplRm9yQ2FudmFzKHZpZXdwb3J0LndpZHRoLCB2aWV3cG9ydC5oZWlnaHQpO1xyXG4gICAgY29uc29sZS5sb2coc2l6ZSk7XHJcbiAgICB0aGlzLmNhbnZhc1NpemUgPSBzaXplO1xyXG5cclxuICAgIHRoaXMuY2FudmFzWm9vbSA9IHNpemUudyAvIHZpZXdwb3J0LndpZHRoO1xyXG5cclxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KCcyZCcpIGFzIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcclxuICAgIGNvbnN0IHJlbmRlckNvbnRleHQgPSB7XHJcbiAgICAgIGNhbnZhc0NvbnRleHQ6IGNvbnRleHQsXHJcbiAgICAgIHZpZXdwb3J0LFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHJlbmRlclRhc2sgPSBwYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KS5wcm9taXNlO1xyXG5cclxuICAgIHJlbmRlclRhc2sudGhlbigoKSA9PiBjb25zb2xlLmxvZygnUGFnZSByZW5kZXJlZCcpKTtcclxuXHJcbiAgICAvLyBjb25zdCByZXMgPSBjYW52YXMudG9EYXRhVVJMKCk7XHJcbiAgICAvLyBpZiAocGRmICE9IG51bGwpIHBkZi5kZXN0cm95KCk7XHJcbiAgICAvLyByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVzZXIgY2xpY2sgdG8gdXNlciBTeW1tZXRyeSBWZXJ0aWNhbCAqL1xyXG4gIG9uUmVmbGVjdFYoKSB7XHJcbiAgICB0aGlzLnJlZmxlY3RWID0gIXRoaXMucmVmbGVjdFY7XHJcbiAgICB0aGlzLmNvbmZpZ3VyZUNhbnZhcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVzZXIgY2xpY2sgdG8gdXNlciBTeW1tZXRyeSBIb3Jpem9udGFsICovXHJcbiAgb25SZWZsZWN0SCgpIHtcclxuICAgIHRoaXMucmVmbGVjdEggPSAhdGhpcy5yZWZsZWN0SDtcclxuICAgIHRoaXMuY29uZmlndXJlQ2FudmFzKCk7XHJcbiAgfVxyXG5cclxuICAvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFRFUlBPUlRcclxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbiAgLyoqIExhdW5jaCBtYXR0ZXJwb3J0ICovXHJcbiAgYXN5bmMgbGF1bmNoVmlld2VyKCkge1xyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0SW1wb3J0U2VydmljZS5pbml0U2RrRm9yTW9kZWwodGhpcy5jaG9zZW5QbGFuLm1vZGVsM2QpO1xyXG5cclxuICAgIGNvbnN0IHsgc2RrIH0gPSB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlO1xyXG4gICAgdGhpcy5mbG9vcnMgPSBPYmplY3QudmFsdWVzKHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2UuZmxvb3JzKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZmxvb3JzKTtcclxuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAvKiogTW92ZSBGbG9vciBtb2RlICovXHJcbiAgICAgIGF3YWl0IHNkay5Nb2RlLm1vdmVUbyhzZGsuTW9kZS5Nb2RlLkZMT09SUExBTikudGhlbihhc3luYyAobmV4dE1vZGUpID0+IHtcclxuICAgICAgICAvLyBNb3ZlIHN1Y2Nlc3NmdWxcclxuICAgICAgICBjb25zb2xlLmxvZyhgQXJyaXZlZCBhdCBuZXcgdmlldyBtb2RlICR7bmV4dE1vZGV9YCk7XHJcblxyXG4gICAgICAgIC8qKiBEaXNwbGF5IHRoZSBjb3JyZWN0IGZsb29yIGZvciB0aGUgcGxhbiAqL1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLm1vdmVUb0Zsb29yKHRoaXMuY2hvc2VuUGxhbi5uYW1lKTtcclxuXHJcbiAgICAgICAgICAvKiogV2hlbiB0aGUgdXNlciB0cnkgdG8gY2hhbmdlIHRoZSB2aWV3IG1vZGUgd2Ugc2V0IGl0IGJhY2sgdG8gZmxvb3JwYW4gKi9cclxuICAgICAgICAgIHNkay5vbihzZGsuTW9kZS5FdmVudC5DSEFOR0VfRU5ELCAob2xkTW9kZSwgbmV3TW9kZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAobmV3TW9kZSAhPT0gc2RrLk1vZGUuTW9kZS5GTE9PUlBMQU4pIHtcclxuICAgICAgICAgICAgICBzZGsuTW9kZS5tb3ZlVG8oc2RrLk1vZGUuTW9kZS5GTE9PUlBMQU4sIHtcclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICd0cmFuc2l0aW9uLmluc3RhbnQnLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3VsZG5vdCBtb3ZlIHRvIGZsb29yJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8qKiBXZSBjYW4gZGlzcGxheSB0aGUgbWF0dGVycG9ydCB2aWV3IG5vdyAqL1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0sIDEwMDApO1xyXG5cclxuICAgIC8qKiBVcGRhdGUgY3VycmVudCBjYW1lcmEgcG9zZSBhbmQgcm90YXRpb24gKi9cclxuICAgIHNkay5DYW1lcmEucG9zZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIC8qKiBXZSB1cGRhdGUgb25seSBpZiB0aGUgdXNlciBpcyBub3QgY2hhbmdpbmcgdGhlIHJvdGF0aW9uIHdpdGggdGhlIDxpbnB1dD4gcmFuZ2UsIHRvIG5vdCBvdmVycmlkZSB0aGUgPGlucHV0PiB2YWx1ZSAqL1xyXG4gICAgICBpZiAoIXRoaXMuaXNSb3RhdGluZ1JhbmdlKSB7XHJcbiAgICAgICAgdGhpcy5yb3RhdGlvbiA9IGV2ZW50LnJvdGF0aW9uLnkgKyAxODA7XHJcbiAgICAgICAgdGhpcy5wcmV2Um90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xyXG4gICAgICAgIHRoaXMuY2FtZXJhUG9zZSA9IGV2ZW50O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGVuIHRoZSA8aW5wdXQ+IHJhbmdlLCBmb3Igcm90YXRpb24sIGNoYW5nZSAqL1xyXG4gIGFzeW5jIG9uUm90YXRpb25DaGFuZ2UoKSB7XHJcbiAgICBjb25zdCByb3RhdGlvbkRlbHRhID0gdGhpcy5yb3RhdGlvbiAtIHRoaXMucHJldlJvdGF0aW9uO1xyXG4gICAgdGhpcy5wcmV2Um90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xyXG5cclxuICAgIC8qKiBTZW5kIHRoZSByb3RhdGlvbkRlbHRhIHRvIHRoIHF1ZXVlIGV2ZW50IGluIG9yZGVyIHRvIGJlIHNlbmQgdG8gbWF0dGVycG9ydCAqL1xyXG4gICAgdGhpcy5yb3RhdGluZ1F1ZXVlRXZlbnQucHVzaChyb3RhdGlvbkRlbHRhKTtcclxuXHJcbiAgICAvKiogU3RhcnQgdG8gcHJvY2VzcyB0aGUgcXVldWUsIGlmIGl0J3MgdGhlIGZpcnN0IGV2ZW50ICovXHJcbiAgICBpZiAoIXRoaXMuaXNSb3RhdGluZ1JhbmdlKSB7XHJcbiAgICAgIHRoaXMuaXNSb3RhdGluZ1JhbmdlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5wcm9jZXNzUm90YXRpbmdRdWV1ZUV2ZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogUHJvY2VzcyB0aGUgcm90YXRpbmcgZXZlbnQgcXVldWUsIHNlbmQgZXZlbnQgb25lIGJ5IG9uZSB0byBtYXR0ZXJwb3J0ICAqL1xyXG4gIGFzeW5jIHByb2Nlc3NSb3RhdGluZ1F1ZXVlRXZlbnQoKSB7XHJcbiAgICBjb25zdCB7IHNkayB9ID0gdGhpcy5tYXR0ZXJwb3J0SW1wb3J0U2VydmljZTtcclxuXHJcbiAgICAvKiogV2hpbGUgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSAqL1xyXG4gICAgd2hpbGUgKHRoaXMucm90YXRpbmdRdWV1ZUV2ZW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLyoqIFJvdGF0ZSBtYXR0ZXJwb3J0IGJ5IGRlbHRhUm90YXRpb24gYW5kIHJlbW92ZSBldmVudCBmcm9tIHF1ZXVlICovXHJcbiAgICAgIGF3YWl0IHNkay5DYW1lcmEucm90YXRlKHRoaXMucm90YXRpbmdRdWV1ZUV2ZW50LnNoaWZ0KCksIDAsIHtcclxuICAgICAgICBzcGVlZDogMzYwLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogV2hlbiB0aGUgcXVldWUgaXMgZW1wdHksIHRoZW4gdGhlIHVzZXIgaXMgbm90IHJvdGF0aW5nIHdpdGggdGhlIDxpbnB1dD4gcmFuZ2UgYW55bW9yZSAqL1xyXG4gICAgdGhpcy5pc1JvdGF0aW5nUmFuZ2UgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUiBBQ1RJT05TXHJcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcblxyXG4gIC8qKiBQcmV2aWV3IGNhbGlicmF0aW9uICovXHJcbiAgYXN5bmMgb25QcmV2aWV3KCkge1xyXG4gICAgdGhpcy5wcmV2aWV3ID0gdHJ1ZTtcclxuICAgIC8qKiBQbGFjZSBzd2VlcHMgKi9cclxuICAgIHRoaXMub25QbGFjZVN3ZWVwcygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FsaWJyYXRlKCkge1xyXG4gICAgY29uc3QgW25hdmlnYXRpb25dID0gdGhpcy5jdXJyZW50TmF2aWdhdGlvbnM7XHJcbiAgICBjb25zdCBwb3NpdGlvbiA9IEpTT04ucGFyc2UobmF2aWdhdGlvbi5wb3NpdGlvbik7XHJcbiAgICB0aGlzLmZpcnN0TWFya1BsYW4gPVxyXG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRJbXBvcnRTZXJ2aWNlLnNkay5SZW5kZXJlci5nZXRTY3JlZW5Qb3NpdGlvbih7XHJcbiAgICAgICAgeDogcG9zaXRpb24ueCxcclxuICAgICAgICB5OiBwb3NpdGlvbi55LFxyXG4gICAgICAgIHo6IHBvc2l0aW9uLnosXHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zZWNvbmRNYXJrUGxhbiA9XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2Uuc2RrLlJlbmRlcmVyLmdldFNjcmVlblBvc2l0aW9uKHtcclxuICAgICAgICB4OiBwb3NpdGlvbi54LFxyXG4gICAgICAgIHk6IDAsXHJcbiAgICAgICAgejogMCxcclxuICAgICAgfSk7XHJcbiAgICBjb25zdCBkZWx0YVpWaXNpdCA9IDAgLSBwb3NpdGlvbi56O1xyXG4gICAgbGV0IGRlbHRhWFBsYW4gPSB0aGlzLnNlY29uZE1hcmtQbGFuLnggLSB0aGlzLmZpcnN0TWFya1BsYW4ueDtcclxuICAgIGlmIChkZWx0YVhQbGFuID09PSAwKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwid2UgbW92ZWQgYWxvbmcgWSBheGlzIG9uIFBsYW5cIik7XHJcbiAgICAgIGNvbnN0IGRlbHRhWVBsYW4gPSB0aGlzLnNlY29uZE1hcmtQbGFuLnkgLSB0aGlzLmZpcnN0TWFya1BsYW4ueTtcclxuICAgICAgdGhpcy5jYWxpYnJhZ2UubmFtZVlBeGlzID0gJ3onO1xyXG4gICAgICB0aGlzLmNhbGlicmFnZS5uYW1lWEF4aXMgPSAneCc7XHJcbiAgICAgIHRoaXMuY2FsaWJyYWdlLm9mZnNldFkgPSB0aGlzLnNlY29uZE1hcmtQbGFuLnk7XHJcbiAgICAgIHRoaXMuY2FsaWJyYWdlLnNjYWxlWSA9IGRlbHRhWVBsYW4gLyBkZWx0YVpWaXNpdDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiIHdlIG1vdmVkIGFsb25nIFggYXhpcyBvbiBQbGFuXCIpO1xyXG4gICAgICB0aGlzLmNhbGlicmFnZS5uYW1lWUF4aXMgPSAneCc7XHJcbiAgICAgIHRoaXMuY2FsaWJyYWdlLm5hbWVYQXhpcyA9ICd6JztcclxuICAgICAgdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WCA9IHRoaXMuc2Vjb25kTWFya1BsYW4ueDtcclxuICAgICAgdGhpcy5jYWxpYnJhZ2Uuc2NhbGVYID0gZGVsdGFYUGxhbiAvIGRlbHRhWlZpc2l0O1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhpcmRNYXJrUGxhbiA9XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2Uuc2RrLlJlbmRlcmVyLmdldFNjcmVlblBvc2l0aW9uKHtcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAsXHJcbiAgICAgICAgejogcG9zaXRpb24ueixcclxuICAgICAgfSk7XHJcbiAgICBjb25zdCBkZWx0YVhWaXNpdCA9IDAgLSBwb3NpdGlvbi54O1xyXG4gICAgaWYgKGRlbHRhWFBsYW4gPT09IDApIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coXCIgd2UgbW92ZWQgYWxvbmcgWCBheGlzIG9uIFBsYW5cIik7XHJcbiAgICAgIGRlbHRhWFBsYW4gPSB0aGlyZE1hcmtQbGFuLnggLSB0aGlzLmZpcnN0TWFya1BsYW4ueDtcclxuICAgICAgdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WCA9IHRoaXJkTWFya1BsYW4ueDtcclxuICAgICAgdGhpcy5jYWxpYnJhZ2Uuc2NhbGVYID0gZGVsdGFYUGxhbiAvIGRlbHRhWFZpc2l0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZGVsdGFZUGxhbiA9IHRoaXJkTWFya1BsYW4ueSAtIHRoaXMuZmlyc3RNYXJrUGxhbi55O1xyXG4gICAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRZID0gdGhpcmRNYXJrUGxhbi55O1xyXG4gICAgICB0aGlzLmNhbGlicmFnZS5zY2FsZVkgPSBkZWx0YVlQbGFuIC8gZGVsdGFYVmlzaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFRha2UgY29uc2lkaXJhdGlvbiBvZiBwYW4gYW5kIHpvb20gb2YgcGxhbiBvbiBjYW52YXMgKi9cclxuICAgIGNvbnN0IHRyYW5zZm9ybUluZm8gPSB0aGlzLnBhbnpvb20uZ2V0VHJhbnNmb3JtKCk7XHJcbiAgICBjb25zdCB7IHNjYWxlLCB4LCB5IH0gPSB0cmFuc2Zvcm1JbmZvO1xyXG4gICAgLy8gY29uc29sZS5sb2codHJhbnNmb3JtSW5mbyk7XHJcbiAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRYUGxhbiA9IHg7XHJcbiAgICB0aGlzLmNhbGlicmFnZS5vZmZzZXRZUGxhbiA9IHk7XHJcbiAgICB0aGlzLmNhbGlicmFnZS5zY2FsZVBsYW4gPSBzY2FsZTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuY2FsaWJyYWdlKTtcclxuICB9XHJcblxyXG4gIC8qKiBQbGFjZSBzd2VlcHMgKi9cclxuICBhc3luYyBvblBsYWNlU3dlZXBzKCkge1xyXG4gICAgLyoqIERpc3BsYXkgYWxsIHNjYW4gKi9cclxuICAgIGNvbnN0IHpvbmUgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmUodGhpcy5jaG9zZW5QbGFuLnpvbmVJRCk7XHJcblxyXG4gICAgaWYgKHpvbmUpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Wm9uZSA9IHpvbmU7XHJcbiAgICAgIGNvbnN0IG5hdmlnYXRpb25zID0gYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXROYXZpZ2F0aW9uc0ZvclpvbmUoXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Wm9uZVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmN1cnJlbnROYXZpZ2F0aW9ucyA9IG5hdmlnYXRpb25zO1xyXG4gICAgICBhd2FpdCB0aGlzLmNhbGlicmF0ZSgpO1xyXG4gICAgICBpZiAobmF2aWdhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgbmF2aWdhdGlvbiBvZiBuYXZpZ2F0aW9ucykge1xyXG4gICAgICAgICAgY29uc3QgdGVzdFBvc2l0aW9uID0gSlNPTi5wYXJzZShuYXZpZ2F0aW9uLnBvc2l0aW9uKTtcclxuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uWCA9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLm5hbWVYQXhpcyA9PT0gJ3gnID8gdGVzdFBvc2l0aW9uLnggOiB0ZXN0UG9zaXRpb24uejtcclxuICAgICAgICAgIGNvbnN0IHBvc2l0aW9uWSA9XHJcbiAgICAgICAgICAgIHRoaXMuY2FsaWJyYWdlLm5hbWVZQXhpcyA9PT0gJ3gnID8gdGVzdFBvc2l0aW9uLnggOiB0ZXN0UG9zaXRpb24uejtcclxuICAgICAgICAgIGNvbnN0IHRlc3RYID1cclxuICAgICAgICAgICAgcG9zaXRpb25YICogdGhpcy5jYWxpYnJhZ2Uuc2NhbGVYICsgdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WDtcclxuICAgICAgICAgIGNvbnN0IHRlc3RZID1cclxuICAgICAgICAgICAgcG9zaXRpb25ZICogdGhpcy5jYWxpYnJhZ2Uuc2NhbGVZICsgdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidGVzdCBwb3NpdGlvbiBHUkVFTlwiLCB0ZXN0WCwgdGVzdFkpO1xyXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRYID1cclxuICAgICAgICAgICAgKHRlc3RYIC0gdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WFBsYW4pIC8gdGhpcy5jYWxpYnJhZ2Uuc2NhbGVQbGFuOyAvLyB3ZSBhcmUgdW5kb2luZyB0aGUgcGFuIGFuZCB6b29tXHJcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFkgPVxyXG4gICAgICAgICAgICAodGVzdFkgLSB0aGlzLmNhbGlicmFnZS5vZmZzZXRZUGxhbikgLyB0aGlzLmNhbGlicmFnZS5zY2FsZVBsYW47XHJcbiAgICAgICAgICB0aGlzLnBvc2l0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgbmF2SUQ6IG5hdmlnYXRpb24uaWQsXHJcbiAgICAgICAgICAgIHBsYW5JRDogdGhpcy5jaG9zZW5QbGFuLmlkLFxyXG4gICAgICAgICAgICB4OiB0cmFuc2Zvcm1lZFgsXHJcbiAgICAgICAgICAgIHk6IHRyYW5zZm9ybWVkWSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgY29uc3QgaWNvblNpemUgPSAzMCAqIHRoaXMuY2FsaWJyYWdlLnNjYWxlUGxhbjtcclxuICAgICAgICAgIGNvbnN0IHNoaWZ0ID0gaWNvblNpemUgLyAyO1xyXG4gICAgICAgICAgdGhpcy5kcmF3SW1hZ2UoXHJcbiAgICAgICAgICAgICdodHRwczovL2FwaS5pY29uaWZ5LmRlc2lnbi9tZGk6YWRqdXN0LnN2Zz9jb2xvcj1ncmVlbiZoZWlnaHQ9MzAmd2lkdGg9MzAnLFxyXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZFggLSBzaGlmdCxcclxuICAgICAgICAgICAgdHJhbnNmb3JtZWRZIC0gc2hpZnQsXHJcbiAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU2F2ZSBjYWxpYnJhdGlvbiAqL1xyXG4gIGFzeW5jIG9uU2F2ZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRab25lKSB7XHJcbiAgICAgIC8qKiBOb3JtYWxpemUgd2l0aCB0aGUgem9vbSAqL1xyXG4gICAgICAvLyB0aGlzLmNhbGlicmFnZS5vZmZzZXRYIC89IHRoaXMuY2FudmFzWm9vbTtcclxuICAgICAgLy8gdGhpcy5jYWxpYnJhZ2Uub2Zmc2V0WSAvPSB0aGlzLmNhbnZhc1pvb207XHJcbiAgICAgIC8vIHRoaXMuY2FsaWJyYWdlLnggLz0gdGhpcy5jYW52YXNab29tO1xyXG4gICAgICAvLyB0aGlzLmNhbGlicmFnZS55IC89IHRoaXMuY2FudmFzWm9vbTtcclxuICAgICAgdGhpcy5jYWxpYnJhZ2UubmV3ID0gdHJ1ZTtcclxuICAgICAgdGhpcy5jYWxpYnJhZ2UuaW1nV2lkdGggPSB0aGlzLmNhbnZhc1NpemUudztcclxuICAgICAgdGhpcy5jYWxpYnJhZ2UuaW1nSGVpZ2h0ID0gdGhpcy5jYW52YXNTaXplLmg7XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLnBsYW5TZXJ2aWNlLnVwZGF0ZVBsYW4oe1xyXG4gICAgICAgIGlkOiB0aGlzLmNob3NlblBsYW4uaWQsXHJcbiAgICAgICAgY2FsaWJyYXRpb246IEpTT04uc3RyaW5naWZ5KHRoaXMuY2FsaWJyYWdlKSxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgIHRoaXMucG9zaXRpb25zLm1hcChhc3luYyAocG9zaXRpb24pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHsgbmF2SUQgfSA9IHBvc2l0aW9uO1xyXG4gICAgICAgICAgZGVsZXRlIHBvc2l0aW9uLm5hdklEO1xyXG4gICAgICAgICAgY29uc3QgbmF2ID0gdGhpcy5jdXJyZW50TmF2aWdhdGlvbnMuZmluZCgoX25hdikgPT4gX25hdi5pZCA9PT0gbmF2SUQpO1xyXG4gICAgICAgICAgbGV0IHBvc2l0aW9uc0RhdGFUb1VwZGF0ZTtcclxuICAgICAgICAgIGlmIChuYXYucG9zaXRpb25PblBsYW4pIHtcclxuICAgICAgICAgICAgY29uc3QgcG9zaXRpb25PblBsYW4gPSBuYXYucG9zaXRpb25PblBsYW4ubWFwKChlbnRyeSkgPT5cclxuICAgICAgICAgICAgICBKU09OLnBhcnNlKGVudHJ5KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbkZvckN1cnJlbnRQbGFuID0gcG9zaXRpb25PblBsYW4uZmluZChcclxuICAgICAgICAgICAgICAoZW50cnkpID0+IGVudHJ5LnBsYW5JRCA9PT0gdGhpcy5jaG9zZW5QbGFuLmlkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmIChwb3NpdGlvbkZvckN1cnJlbnRQbGFuKSB7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb25PblBsYW4uc3BsaWNlKFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb25PblBsYW4uaW5kZXhPZihwb3NpdGlvbkZvckN1cnJlbnRQbGFuKSxcclxuICAgICAgICAgICAgICAgIDEsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvblxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcG9zaXRpb25PblBsYW4ucHVzaChwb3NpdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcG9zaXRpb25zRGF0YVRvVXBkYXRlID0gWy4uLnBvc2l0aW9uT25QbGFuXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uc0RhdGFUb1VwZGF0ZSA9IFtwb3NpdGlvbl07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwb3NpdGlvbnNEYXRhVG9VcGRhdGUpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS51cGRhdGVOYXZpZ2F0aW9uKHtcclxuICAgICAgICAgICAgaWQ6IG5hdklELFxyXG4gICAgICAgICAgICBwb3NpdGlvbk9uUGxhbjogcG9zaXRpb25zRGF0YVRvVXBkYXRlLm1hcCgoZW50cnkpID0+XHJcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZW50cnkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5tYXR0ZXJwb3J0SW1wb3J0U2VydmljZS5yZW1vdmVGcmFtZSgpO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2Rhc2hib2FyZC9sb2NhbGlzYXRpb24nLCB0aGlzLnNwYWNlSUQsICdwbGFucyddKTtcclxuICAgIGFsZXJ0KHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NhbGlicmF0aW9uLnN1Y2Nlc3MnKSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVzZXQgdGhlIGNhbnZhcyAqL1xyXG4gIG9uUmVzZXQoKSB7XHJcbiAgICB0aGlzLnJlZmxlY3RIID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlZmxlY3RWID0gZmFsc2U7XHJcbiAgICB0aGlzLnByZXZpZXcgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmNvbmZpZ3VyZUNhbnZhcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIENhbmNlbCwgbGVhdmUgKi9cclxuICBvbkNhbmNlbCgpIHtcclxuICAgIHRoaXMubWF0dGVycG9ydEltcG9ydFNlcnZpY2UucmVtb3ZlRnJhbWUoKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2Rhc2hib2FyZC9sb2NhbGlzYXRpb24nLCB0aGlzLnNwYWNlSUQsICdwbGFucyddKTtcclxuICAgIGFsZXJ0KHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NhbGlicmF0aW9uLmNhbmNlbGVkJykpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25GbG9vckNsaWNrKGZsb29yKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRGbG9vciA9IGZsb29yO1xyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0SW1wb3J0U2VydmljZS5tb3ZlVG9GbG9vcihmbG9vci5pZCk7XHJcbiAgfVxyXG5cclxuICBvbkFjdGl2YXRlWm9vbUNoYW5nZSgpIHtcclxuICAgIHRoaXMuem9vbUNhbkJlQ2hhbmdlZCA9ICF0aGlzLnpvb21DYW5CZUNoYW5nZWQ7XHJcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLWZyYW1lJykgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoaWZyYW1lKSB7XHJcbiAgICAgIGlmcmFtZS5zdHlsZS56SW5kZXggPSB0aGlzLnpvb21DYW5CZUNoYW5nZWQgPyAnMScgOiAnMCc7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTNcIj5cclxuICAgICAgICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJz48L2xpYi10YWItbmF2aWdhdGlvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgaWQ9XCJyb3dDYW52YXNcIj5cclxuICAgIDxkaXYgI2NhbnZhc0RpdiBpZD1cImNhbnZhc0RpdlwiPlxyXG5cclxuICAgICAgICA8ZGl2IGlkPVwidmlld2VyLWZyYW1lXCIgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cInpvb21DYW5CZUNoYW5nZWQ/J2F1dG8nOidub25lJ1wiPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJibHVyXCI+PC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxjYW52YXMgaWQ9XCJjYW52YXNcIiBbbmdTdHlsZV09XCJ7J29wYWNpdHknOiAocHJldmlld3x8bG9hZGluZykgPyAnMScgOiAnY2FsYygnICsgb3BhY2l0eSArICcvIDEwMCknfVwiPjwvY2FudmFzPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGlicmF0aW9uLXRvb2xzIGNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwiIShwcmV2aWV3IHx8IGxvYWRpbmcpXCI+XHJcbiAgICAgICAgPGgxPnt7J0NhbGlicmF0aW9uIHRvb2wnIHwgdHJhbnNsYXRlfX08L2gxPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXMtMCBtZS0wIGxlZ2VuZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1iYXItaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwieydvcGFjaXR5JzogJ2NhbGMoJyArICgtKG9wYWNpdHktMTAwKSsxMCkgKyAnLyAxMDApJ31cIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydMZXNzJyB8IHRyYW5zbGF0ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRpdGxlXCI+e3snUGxhbiBPcGFjaXR5JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC1iYXItaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwieydvcGFjaXR5JzogJ2NhbGMoJyArIChvcGFjaXR5KzEwKSArICcvIDEwMCknfVwiPnt7J01vcmUnIHxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtcy0wIG1lLTAgXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgW2Rpc2FibGVkXT1cImZhbHNlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiIFsobmdNb2RlbCldPVwib3BhY2l0eVwiIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLXJhbmdlXCIgbWluPVwiMFwiIG1heD1cIjEwMFwiIHZhbHVlPVwiNTBcIiBpZD1cIm9wYWNpdHlcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtcy0wIG1lLTAgXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtbGVnZW5kXCI+e3snQ2hhbmdlIFZpc2l0IEZsb29yJyB8IHRyYW5zbGF0ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxhYmVsLWZpbGUgcm91bmRlZC1waWxsXCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2N1cnJlbnRGbG9vciA/IGN1cnJlbnRGbG9vci5pZCA6ICgnRmxvb3InIHwgdHJhbnNsYXRlKSB9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtICpuZ0Zvcj1cImxldCBmbG9vciBvZiBmbG9vcnNcIiAoY2xpY2spPVwib25GbG9vckNsaWNrKGZsb29yKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmxvb3IubmFtZS5sZW5ndGggPiAwID8gZmxvb3IubmFtZSA6ICgnRmxvb3IgJyArIGZsb29yLmlkKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2xcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtcy0wIG1lLTAgXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbC1jaGVja2JveC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbC1jaGVja2JveC1zdWJjb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWxlZ2VuZCBtZS0zXCI+e3snUGFuL1pvb20gVmlzaXQnIHwgdHJhbnNsYXRlfX0ge3t6b29tQ2FuQmVDaGFuZ2VkID8gXCJPTlwiIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiT0ZGXCJ9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjaGFuZ2UpPVwib25BY3RpdmF0ZVpvb21DaGFuZ2UoKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci13YXJuaW5nIG1iLTMgbXQtM1wiICpuZ0lmPVwiem9vbUNhbkJlQ2hhbmdlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHRleHQtd2FybmluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC10aXRsZVwiPnt7XCJjYWxpYnJhdGlvbi53YWl0LW1lc3NhZ2VcIiB8IHRyYW5zbGF0ZX19PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25QcmV2aWV3KClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInpvb21DYW5CZUNoYW5nZWRcIj57eydQcmV2aWV3JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj57eydDYW5jZWwnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGlicmF0aW9uLXRvb2xzIGNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwicHJldmlld1wiPlxyXG4gICAgICAgIDxoMT57eydWYWxpZGF0aW9uJyB8IHRyYW5zbGF0ZX19PC9oMT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uU2F2ZSgpXCI+e3snVmFsaWRhdGUnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCIgKGNsaWNrKT1cIm9uUmVzZXQoKVwiPnt7J1Jlc2V0JyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+e3snQ2FuY2VsJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsaWJyYXRpb24tdG9vbHMgY29udGFpbmVyLWZsdWlkXCIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgPGgzPnt7XCJXYWl0aW5nIGZvciBNYXR0ZXJwb3J0XCIgfCB0cmFuc2xhdGV9fS4uLjwvaDM+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWJvcmRlclwiIHJvbGU9XCJzdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==