@rocketshow/designer 1.33.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/assets/i18n/de.json +2 -1
  2. package/assets/i18n/en.json +2 -1
  3. package/esm2022/lib/designer.component.mjs +197 -130
  4. package/esm2022/lib/designer.module.mjs +5 -2
  5. package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
  6. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +14 -6
  7. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +5 -5
  8. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +6 -4
  9. package/esm2022/lib/fixture/fixture.component.mjs +25 -15
  10. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +4 -4
  11. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +75 -21
  12. package/esm2022/lib/models/cached-fixture.mjs +1 -1
  13. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
  14. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
  15. package/esm2022/lib/models/fixture-matrix.mjs +25 -0
  16. package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
  17. package/esm2022/lib/models/fixture-mode.mjs +5 -2
  18. package/esm2022/lib/models/fixture-physical.mjs +14 -0
  19. package/esm2022/lib/models/fixture-profile.mjs +16 -1
  20. package/esm2022/lib/models/fixture.mjs +2 -2
  21. package/esm2022/lib/models/preset-fixture.mjs +10 -0
  22. package/esm2022/lib/models/preset.mjs +10 -1
  23. package/esm2022/lib/models/project.mjs +11 -1
  24. package/esm2022/lib/preview/models/color-changer-3d.mjs +5 -108
  25. package/esm2022/lib/preview/models/fixture-3d.mjs +125 -1
  26. package/esm2022/lib/preview/models/moving-head-3d.mjs +3 -122
  27. package/esm2022/lib/preview/preview.component.mjs +21 -14
  28. package/esm2022/lib/services/config.service.mjs +2 -1
  29. package/esm2022/lib/services/fixture.service.mjs +251 -43
  30. package/esm2022/lib/services/preset.service.mjs +91 -42
  31. package/esm2022/lib/services/preview.service.mjs +65 -64
  32. package/esm2022/lib/services/project-load.service.mjs +64 -4
  33. package/esm2022/lib/services/project.service.mjs +11 -15
  34. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +14 -44
  35. package/fesm2022/rocketshow-designer.mjs +1336 -791
  36. package/fesm2022/rocketshow-designer.mjs.map +1 -1
  37. package/lib/designer.component.d.ts +5 -5
  38. package/lib/designer.module.d.ts +15 -14
  39. package/lib/dropzone/dropzone.component.d.ts +24 -0
  40. package/lib/fixture/fixture.component.d.ts +4 -3
  41. package/lib/models/cached-fixture.d.ts +1 -0
  42. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
  43. package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
  44. package/lib/models/fixture-matrix.d.ts +6 -0
  45. package/lib/models/fixture-mode-channel.d.ts +8 -0
  46. package/lib/models/fixture-mode.d.ts +3 -1
  47. package/lib/models/fixture-physical.d.ts +4 -0
  48. package/lib/models/fixture-profile.d.ts +5 -0
  49. package/lib/models/preset-fixture.d.ts +5 -0
  50. package/lib/models/preset.d.ts +2 -0
  51. package/lib/models/project.d.ts +3 -0
  52. package/lib/preview/models/color-changer-3d.d.ts +1 -11
  53. package/lib/preview/models/fixture-3d.d.ts +11 -0
  54. package/lib/preview/models/moving-head-3d.d.ts +1 -11
  55. package/lib/services/config.service.d.ts +1 -0
  56. package/lib/services/fixture.service.d.ts +7 -2
  57. package/lib/services/preset.service.d.ts +4 -2
  58. package/lib/services/preview.service.d.ts +2 -4
  59. package/lib/services/project-load.service.d.ts +5 -1
  60. package/lib/services/project.service.d.ts +2 -3
  61. package/lib/services/timeline.service.d.ts +1 -1
  62. package/lib/timeline/composition-settings/composition-settings.component.d.ts +2 -1
  63. package/package.json +1 -1
  64. package/rocketshow-designer-1.35.0.tgz +0 -0
  65. package/esm2022/lib/models/universe.mjs +0 -11
  66. package/esm2022/lib/services/universe.service.mjs +0 -23
  67. package/lib/models/universe.d.ts +0 -8
  68. package/lib/services/universe.service.d.ts +0 -9
  69. package/rocketshow-designer-1.33.0.tgz +0 -0
@@ -12,6 +12,7 @@ import { PreviewService } from '../services/preview.service';
12
12
  import { ProjectService } from '../services/project.service';
13
13
  import { UuidService } from '../services/uuid.service';
14
14
  import { FixturePoolCreateFromFileComponent } from './fixture-pool-create-from-file/fixture-pool-create-from-file.component';
15
+ import { PresetFixture } from '../models/preset-fixture';
15
16
  import * as i0 from "@angular/core";
16
17
  import * as i1 from "ngx-bootstrap/modal";
17
18
  import * as i2 from "../services/fixture.service";
@@ -126,9 +127,10 @@ function FixturePoolComponent_div_66_option_13_Template(rf, ctx) { if (rf & 1) {
126
127
  i0.ɵɵelementEnd();
127
128
  } if (rf & 2) {
128
129
  const mode_r10 = ctx.$implicit;
130
+ const ctx_r2 = i0.ɵɵnextContext(2);
129
131
  i0.ɵɵproperty("ngValue", mode_r10.shortName || mode_r10.name);
130
132
  i0.ɵɵadvance();
131
- i0.ɵɵtextInterpolate3(" ", mode_r10.name, " - ", mode_r10.channels.length, " ", i0.ɵɵpipeBind1(2, 4, "designer.fixture-pool.channels"), " ");
133
+ i0.ɵɵtextInterpolate3(" ", mode_r10.name, " - ", ctx_r2.fixtureService.getModeChannelCount(ctx_r2.selectedFixtureProfile, mode_r10), " ", i0.ɵɵpipeBind1(2, 4, "designer.fixture-pool.channels"), " ");
132
134
  } }
133
135
  function FixturePoolComponent_div_66_option_20_Template(rf, ctx) { if (rf & 1) {
134
136
  i0.ɵɵelementStart(0, "option", 72);
@@ -262,7 +264,9 @@ export class FixturePoolComponent {
262
264
  this.fixtureService.loadProfileByUuid(searchProfile.uuid).subscribe(() => {
263
265
  const profile = this.fixtureService.getProfileByUuid(searchProfile.uuid);
264
266
  const newFixture = this.fixtureService.addFixture(profile, this.fixturePool);
265
- this.selectFixture(newFixture);
267
+ if (newFixture) {
268
+ this.selectFixture(newFixture);
269
+ }
266
270
  });
267
271
  }
268
272
  addCopy(originalFixture) {
@@ -305,8 +309,10 @@ export class FixturePoolComponent {
305
309
  }
306
310
  channelOccupied(index) {
307
311
  for (const fixture of this.fixturePool) {
308
- const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
309
- if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + mode.channels.length) {
312
+ const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
313
+ const mode = this.fixtureService.getModeByFixture(profile, fixture);
314
+ const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
315
+ if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + channelCount) {
310
316
  return true;
311
317
  }
312
318
  }
@@ -322,8 +328,10 @@ export class FixturePoolComponent {
322
328
  }
323
329
  channelOccupiedEnd(index) {
324
330
  for (const fixture of this.fixturePool) {
325
- const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
326
- if (index === fixture.dmxFirstChannel + mode.channels.length - 1) {
331
+ const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
332
+ const mode = this.fixtureService.getModeByFixture(profile, fixture);
333
+ const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
334
+ if (index === fixture.dmxFirstChannel + channelCount - 1) {
327
335
  return true;
328
336
  }
329
337
  }
@@ -332,8 +340,10 @@ export class FixturePoolComponent {
332
340
  channelOverlapped(index) {
333
341
  let occupiedFixture;
334
342
  for (const fixture of this.fixturePool) {
335
- const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
336
- if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + mode.channels.length) {
343
+ const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
344
+ const mode = this.fixtureService.getModeByFixture(profile, fixture);
345
+ const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
346
+ if (index >= fixture.dmxFirstChannel && index < fixture.dmxFirstChannel + channelCount) {
337
347
  if (occupiedFixture) {
338
348
  if (occupiedFixture.dmxFirstChannel !== fixture.dmxFirstChannel || occupiedFixture.modeShortName !== fixture.modeShortName) {
339
349
  // fixtures are allowed to overlap, if they start at the same channel and
@@ -355,8 +365,10 @@ export class FixturePoolComponent {
355
365
  // find a dragging fixture and select it, but don't change the selection, if the
356
366
  // currently selected fixture might also be selected (on overlapped fixtures)
357
367
  for (const fixture of this.fixturePool) {
358
- const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(fixture.profileUuid), fixture);
359
- if (selectedIndex >= fixture.dmxFirstChannel && selectedIndex <= fixture.dmxFirstChannel + mode.channels.length - 1) {
368
+ const profile = this.fixtureService.getProfileByUuid(fixture.profileUuid);
369
+ const mode = this.fixtureService.getModeByFixture(profile, fixture);
370
+ const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
371
+ if (selectedIndex >= fixture.dmxFirstChannel && selectedIndex <= fixture.dmxFirstChannel + channelCount - 1) {
360
372
  if (this.selectedFixture === fixture) {
361
373
  newSelectedFixture = fixture;
362
374
  break;
@@ -379,8 +391,10 @@ export class FixturePoolComponent {
379
391
  return false;
380
392
  }
381
393
  if (index >= this.selectedFixture.dmxFirstChannel) {
382
- const mode = this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(this.selectedFixture.profileUuid), this.selectedFixture);
383
- if (index < this.selectedFixture.dmxFirstChannel + mode.channels.length) {
394
+ const profile = this.fixtureService.getProfileByUuid(this.selectedFixture.profileUuid);
395
+ const mode = this.fixtureService.getModeByFixture(profile, this.selectedFixture);
396
+ const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
397
+ if (index < this.selectedFixture.dmxFirstChannel + channelCount) {
384
398
  return true;
385
399
  }
386
400
  }
@@ -393,15 +407,15 @@ export class FixturePoolComponent {
393
407
  this.channelDragOffset = undefined;
394
408
  }
395
409
  channelMouseOver(event) {
410
+ if (!this.channelDragFixture) {
411
+ return;
412
+ }
396
413
  // perform dragging
397
414
  const selectedIndex = event.target.dataset.index;
398
- if (this.channelDragFixture &&
399
- selectedIndex - this.channelDragOffset >= 0 &&
400
- selectedIndex -
401
- this.channelDragOffset +
402
- this.fixtureService.getModeByFixture(this.fixtureService.getProfileByUuid(this.channelDragFixture.profileUuid), this.channelDragFixture).channels.length -
403
- 1 <=
404
- 511) {
415
+ const profile = this.fixtureService.getProfileByUuid(this.channelDragFixture.profileUuid);
416
+ const mode = this.fixtureService.getModeByFixture(profile, this.selectedFixture);
417
+ const channelCount = this.fixtureService.getModeChannelCount(profile, mode);
418
+ if (selectedIndex - this.channelDragOffset >= 0 && selectedIndex - this.channelDragOffset + channelCount - 1 <= 511) {
405
419
  this.channelDragFixture.dmxFirstChannel = selectedIndex - this.channelDragOffset;
406
420
  }
407
421
  }
@@ -418,6 +432,46 @@ export class FixturePoolComponent {
418
432
  }
419
433
  }
420
434
  this.projectService.project.fixtures = this.fixturePool;
435
+ // remove deleted fixtures from preset fixtures
436
+ for (let i = this.projectService.project.presetFixtures.length - 1; i >= 0; i--) {
437
+ let found = false;
438
+ const presetFixture = this.projectService.project.presetFixtures[i];
439
+ for (let fixture of this.projectService.project.fixtures) {
440
+ if (presetFixture.fixtureUuid === fixture.uuid) {
441
+ found = true;
442
+ break;
443
+ }
444
+ }
445
+ if (!found) {
446
+ this.projectService.project.presetFixtures.splice(i, 1);
447
+ }
448
+ }
449
+ // add the new fixtures to the preset fixtures
450
+ for (let fixture of this.projectService.project.fixtures) {
451
+ let found = false;
452
+ for (let presetFixture of this.projectService.project.presetFixtures) {
453
+ if (presetFixture.fixtureUuid === fixture.uuid) {
454
+ found = true;
455
+ break;
456
+ }
457
+ }
458
+ if (!found) {
459
+ const pixelKeys = this.fixtureService.fixtureGetUniquePixelKeys(fixture);
460
+ if (pixelKeys.length > 0) {
461
+ for (let pixelKey of pixelKeys) {
462
+ const presetFixture = new PresetFixture();
463
+ presetFixture.fixtureUuid = fixture.uuid;
464
+ presetFixture.pixelKey = pixelKey;
465
+ this.projectService.project.presetFixtures.push(presetFixture);
466
+ }
467
+ }
468
+ else {
469
+ const presetFixture = new PresetFixture();
470
+ presetFixture.fixtureUuid = fixture.uuid;
471
+ this.projectService.project.presetFixtures.push(presetFixture);
472
+ }
473
+ }
474
+ }
421
475
  this.fixtureService.updateCachedFixtures();
422
476
  this.presetService.removeDeletedFixtures();
423
477
  this.previewService.updateFixtureSetup();
@@ -577,7 +631,7 @@ export class FixturePoolComponent {
577
631
  }
578
632
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FixturePoolComponent, [{
579
633
  type: Component,
580
- args: [{ selector: 'lib-app-fixture-pool', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ 'designer.fixture-pool.title' | translate }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel(); (false)\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-6\">\n <!-- Search for profiles -->\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchSet\"\n placeholder=\"{{ 'designer.fixture-pool.search-profiles' | translate }}\"\n (input)=\"searchExpression = $event.target.value; filterProfiles()\"\n />\n\n <!-- Profiles -->\n <div class=\"card border-secondary w-100\" style=\"height: 200px\">\n <div class=\"card-body p-0 w-100\">\n <div class=\"list-group list-group-flush w-100\">\n <a *ngIf=\"loadingProfiles\" class=\"list-group-item flex-column align-items-start d-flex\">\n <p class=\"mb-0 mx-auto\">\n <i class=\"fa fa-spinner fa-pulse fa-fw\"></i>\n </p>\n </a>\n\n <div class=\"list-group-item\" *ngFor=\"let profile of filteredProfiles | sort: 'uuid'\">\n <div class=\"row\">\n <div class=\"col-10 col-auto my-auto pl-2\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(profile) }} mr-1\"></span> {{ profile.manufacturerName }} -\n {{ profile.name }}\n </p>\n </div>\n <div class=\"col-2 my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"addFixture(profile); (false)\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div>\n <p class=\"d-inline-block mb-0 mt-2\">\n Powered by the <a href=\"https://open-fixture-library.org/\" target=\"_blank\">Open Fixture Library</a>\n </p>\n <a\n class=\"mt-2 btn btn-secondary btn-sm float-right\"\n href=\"https://open-fixture-library.org/fixture-editor\"\n target=\"_blank\"\n role=\"button\"\n >\n <i class=\"fa fa-file-o\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.add-profile' | translate }}\n </a>\n <button\n *ngIf=\"configService.localProfiles\"\n type=\"button\"\n class=\"mr-2 mt-2 btn btn-secondary btn-sm float-right\"\n (click)=\"updateProfiles(); (false)\"\n [disabled]=\"updatingProfiles\"\n role=\"button\"\n >\n <i *ngIf=\"updatingProfiles\" class=\"fa fa-spinner fa-pulse fa-fw\" aria-hidden=\"true\"></i>\n <i *ngIf=\"!updatingProfiles\" class=\"fa fa-download fa-fw\" aria-hidden=\"true\"></i>\n {{ 'designer.fixture-pool.update-profiles' | translate }}\n </button>\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row\">\n <!-- Add fixture from local profile -->\n <div class=\"col-6\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"createFixtureFromProfileFile()\" role=\"button\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.create-fixture-from-profile-file' | translate }}\n </button>\n </div>\n\n <!-- Universe -->\n <div class=\"col-6\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.fixture-pool.universe' | translate }}</label>\n <div class=\"col-lg-8\">\n <select class=\"custom-select\">\n <option>Universe 1</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixtures -->\n <div class=\"card border-secondary\" style=\"height: 235px\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\" [sortablejs]=\"fixturePool\">\n <div\n class=\"list-group-item\"\n *ngFor=\"let fixture of fixturePool\"\n [class.active]=\"fixture == selectedFixture\"\n (click)=\"selectFixture(fixture)\"\n style=\"cursor: pointer\"\n >\n <div class=\"row\">\n <div class=\"col-auto list-sort-handle my-auto\" style=\"cursor: move; cursor: -webkit-grabbing\">\n <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"col-auto flex-grow pl-0 my-auto\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(fixtureService.getProfileByUuid(fixture.profileUuid)) }} mr-1\">\n </span\n >{{ fixture.name }}\n </p>\n </div>\n <div class=\"col-auto my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"removeFixture(fixture); (false)\">\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col\">\n <!-- Tab navigation -->\n <ul class=\"nav nav-tabs mb-4\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"sets-tab\" data-toggle=\"tab\" href=\"#dmx\" role=\"tab\">\n <i class=\"icon-ola\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.dmx' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"compositions-tab\" data-toggle=\"tab\" href=\"#settings\" role=\"tab\">\n <i class=\"fa fa-cog\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.settings' | translate }}\n </a>\n </li>\n </ul>\n\n <!-- Tab content -->\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- DMX universe overview-->\n <div class=\"tab-pane show active\" id=\"dmx\" role=\"tabpanel\">\n <!-- Show all channel numbers -->\n <!-- <div class=\"form-group row\">\n <div class=\"col-auto flex-grow\"></div>\n <div class=\"col-lg-3 d-flex\">\n <div class=\"form-check my-auto ml-auto\">\n <input type=\"checkbox\" class=\"form-check-input\" id=\"showChannelNumbers\" [ngModel]=\"showChannelNumbers\"\n (ngModelChange)=\"showChannelNumbers = $event\">\n <label class=\"form-check-label\" for=\"showChannelNumbers\">Show channels</label>\n </div>\n </div>\n </div> -->\n\n <!-- List of DMX channels -->\n <div>\n <div\n *ngFor=\"let channel of dmxChannels; let i = index\"\n class=\"dmx-channel\"\n [class.dmx-channel-occupied]=\"channelOccupied(i)\"\n [class.dmx-channel-occupied-start]=\"channelOccupiedStart(i)\"\n [class.dmx-channel-occupied-end]=\"channelOccupiedEnd(i)\"\n [class.dmx-channel-selected]=\"channelSelected(i)\"\n [class.dmx-channel-overlapped]=\"channelOverlapped(i)\"\n (mousedown)=\"channelMouseDown($event)\"\n (mouseover)=\"channelMouseOver($event)\"\n [attr.data-index]=\"i\"\n popover=\"{{ i + 1 }}\"\n placement=\"top\"\n triggers=\"mouseenter:mouseleave\"\n >\n <div class=\"d-flex w-100 dmx-channel-text\" [attr.data-index]=\"i\" [class.dmx-channel-text-visible]=\"showChannelNumbers\">\n <div class=\"m-auto\" style=\"font-size: 11px\" [attr.data-index]=\"i\"><small [attr.data-index]=\"i\">&nbsp;</small></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixture settings -->\n <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\">\n <div *ngIf=\"selectedFixture && selectedFixtureProfile\">\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\" for=\"fixtureName\">{{ 'designer.fixture-pool.fixture-name' | translate }}</label>\n <div class=\"col-lg-9\">\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"selectedFixture.name\" maxlength=\"200\" id=\"fixtureName\" />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.mode' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.modeShortName\"\n (ngModelChange)=\"selectedFixture.modeShortName = $event\"\n >\n <option *ngFor=\"let mode of selectedFixtureProfile.modes\" [ngValue]=\"mode.shortName || mode.name\">\n {{ mode.name }}\n - {{ mode.channels.length }}\n {{ 'designer.fixture-pool.channels' | translate }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.first-channel' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.dmxFirstChannel\"\n (ngModelChange)=\"selectedFixture.dmxFirstChannel = $event\"\n >\n <option *ngFor=\"let channel of dmxChannels; let i = index\" [ngValue]=\"i\">\n {{ i + 1 }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\"></label>\n <div class=\"col-lg-9\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addCopy(selectedFixture)\">\n {{ 'designer.fixture.add-copy' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n", styles: [".list-group-item{padding:.3rem 1.25rem}.dmx-channel{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected{background-color:#fd7e14}.dmx-channel-overlapped{background-color:red;border:1px solid red;cursor:move}.card{overflow:auto}\n"] }]
634
+ args: [{ selector: 'lib-app-fixture-pool', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{ 'designer.fixture-pool.title' | translate }}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel(); (false)\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n</div>\n<div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-6\">\n <!-- Search for profiles -->\n <input\n type=\"text\"\n class=\"form-control input-block mb-3\"\n id=\"searchSet\"\n placeholder=\"{{ 'designer.fixture-pool.search-profiles' | translate }}\"\n (input)=\"searchExpression = $event.target.value; filterProfiles()\"\n />\n\n <!-- Profiles -->\n <div class=\"card border-secondary w-100\" style=\"height: 200px\">\n <div class=\"card-body p-0 w-100\">\n <div class=\"list-group list-group-flush w-100\">\n <a *ngIf=\"loadingProfiles\" class=\"list-group-item flex-column align-items-start d-flex\">\n <p class=\"mb-0 mx-auto\">\n <i class=\"fa fa-spinner fa-pulse fa-fw\"></i>\n </p>\n </a>\n\n <div class=\"list-group-item\" *ngFor=\"let profile of filteredProfiles | sort : 'uuid'\">\n <div class=\"row\">\n <div class=\"col-10 col-auto my-auto pl-2\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(profile) }} mr-1\"></span> {{ profile.manufacturerName }} -\n {{ profile.name }}\n </p>\n </div>\n <div class=\"col-2 my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"addFixture(profile); (false)\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div>\n <p class=\"d-inline-block mb-0 mt-2\">\n Powered by the <a href=\"https://open-fixture-library.org/\" target=\"_blank\">Open Fixture Library</a>\n </p>\n <a\n class=\"mt-2 btn btn-secondary btn-sm float-right\"\n href=\"https://open-fixture-library.org/fixture-editor\"\n target=\"_blank\"\n role=\"button\"\n >\n <i class=\"fa fa-file-o\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.add-profile' | translate }}\n </a>\n <button\n *ngIf=\"configService.localProfiles\"\n type=\"button\"\n class=\"mr-2 mt-2 btn btn-secondary btn-sm float-right\"\n (click)=\"updateProfiles(); (false)\"\n [disabled]=\"updatingProfiles\"\n role=\"button\"\n >\n <i *ngIf=\"updatingProfiles\" class=\"fa fa-spinner fa-pulse fa-fw\" aria-hidden=\"true\"></i>\n <i *ngIf=\"!updatingProfiles\" class=\"fa fa-download fa-fw\" aria-hidden=\"true\"></i>\n {{ 'designer.fixture-pool.update-profiles' | translate }}\n </button>\n </div>\n </div>\n <div class=\"col-6\">\n <div class=\"row\">\n <!-- Add fixture from local profile -->\n <div class=\"col-6\">\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"createFixtureFromProfileFile()\" role=\"button\">\n <i class=\"fa fa-plus\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.create-fixture-from-profile-file' | translate }}\n </button>\n </div>\n\n <!-- Universe -->\n <div class=\"col-6\">\n <div class=\"form-group row\">\n <label class=\"col-lg-4 col-form-label\">{{ 'designer.fixture-pool.universe' | translate }}</label>\n <div class=\"col-lg-8\">\n <select class=\"custom-select\">\n <option>Universe 1</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixtures -->\n <div class=\"card border-secondary\" style=\"height: 235px\">\n <div class=\"card-body p-0\">\n <div class=\"list-group list-group-flush\" [sortablejs]=\"fixturePool\">\n <div\n class=\"list-group-item\"\n *ngFor=\"let fixture of fixturePool\"\n [class.active]=\"fixture == selectedFixture\"\n (click)=\"selectFixture(fixture)\"\n style=\"cursor: pointer\"\n >\n <div class=\"row\">\n <div class=\"col-auto list-sort-handle my-auto\" style=\"cursor: move; cursor: -webkit-grabbing\">\n <i class=\"fa fa-bars\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"col-auto flex-grow pl-0 my-auto\">\n <p class=\"mb-0\">\n <span class=\"icon-{{ fixtureService.getFixtureIconClass(fixtureService.getProfileByUuid(fixture.profileUuid)) }} mr-1\">\n </span\n >{{ fixture.name }}\n </p>\n </div>\n <div class=\"col-auto my-auto\">\n <a class=\"btn btn-primary btn-sm float-right\" href=\"#\" role=\"button\" (click)=\"removeFixture(fixture); (false)\">\n <i class=\"fa fa-minus\" aria-hidden=\"true\"></i>\n </a>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row mt-3\">\n <div class=\"col\">\n <!-- Tab navigation -->\n <ul class=\"nav nav-tabs mb-4\" id=\"myTab\" role=\"tablist\">\n <li class=\"nav-item\">\n <a class=\"nav-link active\" id=\"sets-tab\" data-toggle=\"tab\" href=\"#dmx\" role=\"tab\">\n <i class=\"icon-ola\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.dmx' | translate }}\n </a>\n </li>\n <li class=\"nav-item\">\n <a class=\"nav-link\" id=\"compositions-tab\" data-toggle=\"tab\" href=\"#settings\" role=\"tab\">\n <i class=\"fa fa-cog\" aria-hidden=\"true\"></i> {{ 'designer.fixture-pool.settings' | translate }}\n </a>\n </li>\n </ul>\n\n <!-- Tab content -->\n <div class=\"tab-content\" id=\"myTabContent\">\n <!-- DMX universe overview-->\n <div class=\"tab-pane show active\" id=\"dmx\" role=\"tabpanel\">\n <!-- Show all channel numbers -->\n <!-- <div class=\"form-group row\">\n <div class=\"col-auto flex-grow\"></div>\n <div class=\"col-lg-3 d-flex\">\n <div class=\"form-check my-auto ml-auto\">\n <input type=\"checkbox\" class=\"form-check-input\" id=\"showChannelNumbers\" [ngModel]=\"showChannelNumbers\"\n (ngModelChange)=\"showChannelNumbers = $event\">\n <label class=\"form-check-label\" for=\"showChannelNumbers\">Show channels</label>\n </div>\n </div>\n </div> -->\n\n <!-- List of DMX channels -->\n <div>\n <div\n *ngFor=\"let channel of dmxChannels; let i = index\"\n class=\"dmx-channel\"\n [class.dmx-channel-occupied]=\"channelOccupied(i)\"\n [class.dmx-channel-occupied-start]=\"channelOccupiedStart(i)\"\n [class.dmx-channel-occupied-end]=\"channelOccupiedEnd(i)\"\n [class.dmx-channel-selected]=\"channelSelected(i)\"\n [class.dmx-channel-overlapped]=\"channelOverlapped(i)\"\n (mousedown)=\"channelMouseDown($event)\"\n (mouseover)=\"channelMouseOver($event)\"\n [attr.data-index]=\"i\"\n popover=\"{{ i + 1 }}\"\n placement=\"top\"\n triggers=\"mouseenter:mouseleave\"\n >\n <div class=\"d-flex w-100 dmx-channel-text\" [attr.data-index]=\"i\" [class.dmx-channel-text-visible]=\"showChannelNumbers\">\n <div class=\"m-auto\" style=\"font-size: 11px\" [attr.data-index]=\"i\"><small [attr.data-index]=\"i\">&nbsp;</small></div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Fixture settings -->\n <div class=\"tab-pane\" id=\"settings\" role=\"tabpanel\">\n <div *ngIf=\"selectedFixture && selectedFixtureProfile\">\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\" for=\"fixtureName\">{{ 'designer.fixture-pool.fixture-name' | translate }}</label>\n <div class=\"col-lg-9\">\n <input type=\"text\" class=\"form-control\" [(ngModel)]=\"selectedFixture.name\" maxlength=\"200\" id=\"fixtureName\" />\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.mode' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.modeShortName\"\n (ngModelChange)=\"selectedFixture.modeShortName = $event\"\n >\n <option *ngFor=\"let mode of selectedFixtureProfile.modes\" [ngValue]=\"mode.shortName || mode.name\">\n {{ mode.name }}\n - {{ fixtureService.getModeChannelCount(selectedFixtureProfile, mode) }}\n {{ 'designer.fixture-pool.channels' | translate }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\">{{ 'designer.fixture-pool.first-channel' | translate }}</label>\n <div class=\"col-lg-9\">\n <select\n class=\"custom-select\"\n [ngModel]=\"selectedFixture.dmxFirstChannel\"\n (ngModelChange)=\"selectedFixture.dmxFirstChannel = $event\"\n >\n <option *ngFor=\"let channel of dmxChannels; let i = index\" [ngValue]=\"i\">\n {{ i + 1 }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-lg-3 col-form-label\"></label>\n <div class=\"col-lg-9\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"addCopy(selectedFixture)\">\n {{ 'designer.fixture.add-copy' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"modal-footer\">\n <a class=\"mr-3 my-auto\" href=\"#\" role=\"button\" (click)=\"cancel(); (false)\">\n {{ 'designer.misc.cancel' | translate }}\n </a>\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"ok()\">{{ 'designer.misc.ok' | translate }}</button>\n</div>\n", styles: [".list-group-item{padding:.3rem 1.25rem}.dmx-channel{display:flex;float:left;width:28px;border:1px solid white;margin-left:-1px;margin-bottom:-1px;padding-bottom:2px}.dmx-channel-occupied{background-color:#63462e;border-left:none;border-right:none;cursor:move}.dmx-channel-occupied-start{border-left:1px solid white;border-top-left-radius:8px;border-bottom-left-radius:8px}.dmx-channel-occupied-end{border-right:1px solid white;border-top-right-radius:8px;border-bottom-right-radius:8px}.dmx-channel-selected{background-color:#fd7e14}.dmx-channel-overlapped{background-color:red;border:1px solid red;cursor:move}.card{overflow:auto}\n"] }]
581
635
  }], () => [{ type: i1.BsModalRef }, { type: i2.FixtureService }, { type: i3.UuidService }, { type: i4.ProjectService }, { type: i5.PreviewService }, { type: i6.TranslateService }, { type: i7.ToastrService }, { type: i8.PresetService }, { type: i9.ConfigService }, { type: i1.BsModalService }], { mouseUp: [{
582
636
  type: HostListener,
583
637
  args: ['window:mouseup', ['$event']]
@@ -586,4 +640,4 @@ export class FixturePoolComponent {
586
640
  args: ['document:keydown.enter', ['$event']]
587
641
  }] }); })();
588
642
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FixturePoolComponent, { className: "FixturePoolComponent" }); })();
589
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1wb29sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZml4dHVyZS1wb29sL2ZpeHR1cmUtcG9vbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL2ZpeHR1cmUtcG9vbC9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUVBQXlFLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDUy9HLEFBREYsNkJBQXdGLFlBQzlEO0lBQ3RCLHdCQUE0QztJQUVoRCxBQURFLGlCQUFJLEVBQ0Y7Ozs7SUFLRSxBQURGLEFBREYsQUFERiwrQkFBcUYsYUFDbEUsY0FDMkIsWUFDeEI7SUFDZCx1QkFBaUY7SUFBQyxZQUVwRjtJQUNGLEFBREUsaUJBQUksRUFDQTtJQUVKLEFBREYsK0JBQTJCLFlBQ21GO0lBQXZDLG1MQUFTLDZCQUFtQix3QkFBRyxLQUFLLEtBQUU7SUFDekcsd0JBQTZDO0lBSXJELEFBREUsQUFERSxBQURFLGlCQUFJLEVBQ0EsRUFDRixFQUNGOzs7O0lBVlEsZUFBbUU7SUFBbkUsa0dBQW1FO0lBQVMsY0FFcEY7SUFGb0Ysb0ZBRXBGOzs7SUFnQ1Isd0JBQXdGOzs7SUFDeEYsd0JBQWlGOzs7O0lBVG5GLGtDQU9DO0lBSEMsOEpBQVMsdUJBQWdCLHdCQUFHLEtBQUssS0FBRTtJQUtuQyxBQURBLDRFQUFvRiwrREFDUDtJQUM3RSxZQUNGOztJQUFBLGlCQUFTOzs7SUFOUCxrREFBNkI7SUFHekIsY0FBc0I7SUFBdEIsOENBQXNCO0lBQ3RCLGNBQXVCO0lBQXZCLCtDQUF1QjtJQUMzQixjQUNGO0lBREUsOEZBQ0Y7Ozs7SUE2QkksK0JBTUM7SUFGQywyTUFBUyxnQ0FBc0IsS0FBQztJQUk5QixBQURGLDhCQUFpQixjQUMrRTtJQUM1Rix3QkFBNkM7SUFDL0MsaUJBQU07SUFFSixBQURGLCtCQUE2QyxZQUMzQjtJQUNkLHVCQUVDO0lBQUEsWUFDSDtJQUNGLEFBREUsaUJBQUksRUFDQTtJQUVKLEFBREYsK0JBQThCLFlBQ21GO0lBQTFDLG1MQUFTLGdDQUFzQix3QkFBRyxLQUFLLEtBQUU7SUFDNUcseUJBQThDO0lBSXRELEFBREUsQUFERSxBQURFLGlCQUFJLEVBQ0EsRUFDRixFQUNGOzs7O0lBckJKLDhEQUEyQztJQVUvQixlQUFnSDtJQUFoSCxzSkFBZ0g7SUFFckgsY0FDSDtJQURHLCtDQUNIOzs7O0lBZ0ROLCtCQWNDO0lBTEMsQUFEQSw0TEFBYSwrQkFBd0IsS0FBQywrS0FDekIsK0JBQXdCLEtBQUM7SUFPOEIsQUFBbEUsQUFERiwrQkFBdUgsY0FDbkQsWUFBNkI7SUFBQSxzQkFBTTtJQUV6RyxBQURFLEFBRCtHLEFBQVIsaUJBQVEsRUFBTSxFQUMvRyxFQUNGOzs7O0lBWEosQUFEQSxBQURBLEFBREEsQUFEQSxvRUFBaUQsaUVBQ1csNkRBQ0osc0RBQ1AsMERBQ0k7SUFJckQsNkNBQXFCOztJQUk0QyxjQUFxRDtJQUFyRCxxRUFBcUQ7O0lBQ3hFLGNBQXFCOztJQUFRLGNBQXFCOzs7O0lBd0I1RixrQ0FBa0c7SUFDaEcsWUFHRjs7SUFBQSxpQkFBUzs7O0lBSmlELDZEQUF1QztJQUMvRixjQUdGO0lBSEUsNElBR0Y7OztJQWFBLGtDQUF5RTtJQUN2RSxZQUNGO0lBQUEsaUJBQVM7OztJQUZrRCwrQkFBYTtJQUN0RSxjQUNGO0lBREUsMENBQ0Y7Ozs7SUFqQ0osQUFERixBQURGLDJCQUF1RCxjQUN6QixnQkFDK0I7SUFBQSxZQUFzRDs7SUFBQSxpQkFBUTtJQUVySCxBQURGLCtCQUFzQixnQkFDMEY7SUFBdEUsNlRBQWtDO0lBRTlFLEFBREUsQUFERSxpQkFBOEcsRUFDMUcsRUFDRjtJQUdKLEFBREYsK0JBQTRCLGdCQUNhO0lBQUEsWUFBOEM7O0lBQUEsaUJBQVE7SUFFM0YsQUFERixnQ0FBc0Isa0JBS25CO0lBREMsMFBBQXdEO0lBRXhELHFGQUFrRztJQU94RyxBQURFLEFBREUsaUJBQVMsRUFDTCxFQUNGO0lBR0osQUFERixnQ0FBNEIsaUJBQ2E7SUFBQSxhQUF1RDs7SUFBQSxpQkFBUTtJQUVwRyxBQURGLGdDQUFzQixrQkFLbkI7SUFEQyw0UEFBMEQ7SUFFMUQscUZBQXlFO0lBSy9FLEFBREUsQUFERSxpQkFBUyxFQUNMLEVBQ0Y7SUFFTixnQ0FBNEI7SUFDMUIsNkJBQStDO0lBRTdDLEFBREYsZ0NBQXNCLGtCQUM2RDtJQUFuQyxrTEFBUyxzQ0FBd0IsS0FBQztJQUM5RSxhQUNGOztJQUdOLEFBREUsQUFERSxBQURFLGlCQUFTLEVBQ0wsRUFDRixFQUNGOzs7SUE5Q3VELGVBQXNEO0lBQXRELGdGQUFzRDtJQUVyRSxlQUFrQztJQUFsQywyREFBa0M7SUFLckMsZUFBOEM7SUFBOUMsMEVBQThDO0lBSWpGLGVBQXlDO0lBQXpDLDhEQUF5QztJQUdoQixjQUErQjtJQUEvQiw2REFBK0I7SUFVckIsZUFBdUQ7SUFBdkQsbUZBQXVEO0lBSTFGLGVBQTJDO0lBQTNDLGdFQUEyQztJQUdmLGNBQWdCO0lBQWhCLDRDQUFnQjtJQVc1QyxlQUNGO0lBREUsb0ZBQ0Y7O0FEbE5oQixNQUFNLE9BQU8sb0JBQW9CO0lBb0IvQixZQUNTLFVBQXNCLEVBQ3RCLGNBQThCLEVBQzdCLFdBQXdCLEVBQ3pCLGNBQThCLEVBQzdCLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyxhQUE0QixFQUM1QixhQUE0QixFQUM3QixhQUE0QixFQUMzQixZQUE0QjtRQVQ3QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN6QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDN0Isa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0IsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBM0IvQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUl4QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUczQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFJM0IsWUFBTyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBa0I5QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU3RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTVCLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQWdCO1FBQzVCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7UUFDeEMsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztZQUV0QixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixJQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEUsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1RSxDQUFDO29CQUNELGFBQWEsRUFBRSxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksYUFBYSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQUMsYUFBNkI7UUFDdEMsaUVBQWlFO1FBQ2pFLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3ZFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsZUFBd0I7UUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztRQUNwQyxPQUFPLENBQUMsYUFBYSxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUM7UUFDdEQsT0FBTyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDO1FBQzFELE9BQU8sQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQztRQUUxRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBZ0I7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1RSxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFFeEIsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzdDLElBQUksYUFBYSxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RGLFdBQVcsR0FBRyxJQUFJLENBQUM7b0JBQ25CLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFhO1FBQzNCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFdEgsSUFBSSxLQUFLLElBQUksT0FBTyxDQUFDLGVBQWUsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMvRixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYTtRQUNoQyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEtBQUssS0FBSyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFdEgsSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDakUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWE7UUFDN0IsSUFBSSxlQUF3QixDQUFDO1FBRTdCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFdEgsSUFBSSxLQUFLLElBQUksT0FBTyxDQUFDLGVBQWUsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMvRixJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNwQixJQUFJLGVBQWUsQ0FBQyxlQUFlLEtBQUssT0FBTyxDQUFDLGVBQWUsSUFBSSxlQUFlLENBQUMsYUFBYSxLQUFLLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQzt3QkFDM0gseUVBQXlFO3dCQUN6RSxpREFBaUQ7d0JBQ2pELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGVBQWUsR0FBRyxPQUFPLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVU7UUFDekIsaUJBQWlCO1FBQ2pCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNqRCxJQUFJLGtCQUEyQixDQUFDO1FBRWhDLGdGQUFnRjtRQUNoRiw2RUFBNkU7UUFDN0UsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUV0SCxJQUFJLGFBQWEsSUFBSSxPQUFPLENBQUMsZUFBZSxJQUFJLGFBQWEsSUFBSSxPQUFPLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwSCxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQ3JDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztvQkFDN0IsTUFBTTtnQkFDUixDQUFDO2dCQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUN4QixrQkFBa0IsR0FBRyxPQUFPLENBQUM7Z0JBQy9CLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN2QixJQUFJLGtCQUFrQixLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7WUFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUN0RSxJQUFJLENBQUMsZUFBZSxDQUNyQixDQUFDO1lBRUYsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGlFQUFpRTtJQUVqRSxPQUFPLENBQUMsS0FBVTtRQUNoQixrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVO1FBQ3pCLG1CQUFtQjtRQUNuQixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFakQsSUFDRSxJQUFJLENBQUMsa0JBQWtCO1lBQ3ZCLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQztZQUMzQyxhQUFhO2dCQUNYLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUN6RSxJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQ2pCLENBQUM7Z0JBQ0QsR0FBRyxFQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDbkYsQ0FBQztJQUNILENBQUM7SUFFRCxFQUFFO1FBQ0EsK0NBQStDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pELElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sR0FBRyxHQUFHLHdDQUF3QyxDQUFDO2dCQUNyRCxNQUFNLEtBQUssR0FBRyw4Q0FBOEMsQ0FBQztnQkFFN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMzRCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDO2dCQUVILE9BQU87WUFDVCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXhELElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTdCLE9BQU87UUFDUCxJQUFJLENBQUMsY0FBYzthQUNoQixjQUFjLEVBQUU7YUFDaEIsSUFBSSxDQUNILFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLEdBQUcsR0FBRyw2Q0FBNkMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRyxtREFBbUQsQ0FBQztZQUVsRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUVwQixNQUFNLEdBQUcsR0FBRyx3Q0FBd0MsQ0FBQztZQUNyRCxNQUFNLEtBQUssR0FBRyw4Q0FBOEMsQ0FBQztZQUU3RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELDRCQUE0QjtRQUMxQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3SCxVQUFVLENBQUMsT0FBOEMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBdUIsRUFBRSxFQUFFO1lBQ3ZHLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDN0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFHRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNaLENBQUM7cUZBeldVLG9CQUFvQjtvRUFBcEIsb0JBQW9CO1lBQXBCLG1HQUFBLG1CQUFlLCtCQUFLLGtHQUFwQiwrQkFBMkIsaUNBQVA7O1lDcEIvQixBQURGLDhCQUEwQixZQUNVO1lBQUEsWUFBK0M7O1lBQUEsaUJBQUs7WUFDdEYsaUNBQThGO1lBQTVCLDBGQUFTLFlBQVEsU0FBRyxLQUFLLElBQUU7WUFDM0YsK0JBQXlCO1lBQUEsc0JBQU87WUFFcEMsQUFERSxBQURrQyxpQkFBTyxFQUNoQyxFQUNMO1lBS0EsQUFGRixBQURGLEFBREYsOEJBQXdCLGFBQ0wsYUFDSSxnQkFRZjs7WUFEQSxtSkFBaUQsb0JBQWdCLElBQUM7WUFMcEUsaUJBTUU7WUFLRSxBQURGLEFBREYsK0JBQStELGNBQzVCLGVBQ2dCO1lBTzdDLEFBTkEsb0VBQXdGLDJEQU1IOztZQWlCM0YsQUFERSxBQURFLGlCQUFNLEVBQ0YsRUFDRjtZQUVKLEFBREYsNEJBQUssYUFDaUM7WUFDbEMsaUNBQWU7WUFBQSw4QkFBNEQ7WUFBQSxxQ0FBb0I7WUFDakcsQUFEaUcsaUJBQUksRUFDakc7WUFDSiw4QkFLQztZQUNDLHlCQUErQztZQUFDLGFBQ2xEOztZQUFBLGlCQUFJO1lBQ0osOEVBT0M7WUFNTCxBQURFLGlCQUFNLEVBQ0Y7WUFLQSxBQURGLEFBRkYsQUFERiwrQkFBbUIsY0FDQSxjQUVJLGtCQUNzRjtZQUF2RCxrR0FBUyxrQ0FBOEIsSUFBQztZQUN0Rix5QkFBNkM7WUFBQyxhQUNoRDs7WUFDRixBQURFLGlCQUFTLEVBQ0w7WUFLRixBQURGLEFBREYsK0JBQW1CLGVBQ1csaUJBQ2E7WUFBQSxhQUFrRDs7WUFBQSxpQkFBUTtZQUc3RixBQURGLEFBREYsZ0NBQXNCLGtCQUNVLGNBQ3BCO1lBQUEsMkJBQVU7WUFLNUIsQUFERSxBQURFLEFBREUsQUFERSxBQURvQixpQkFBUyxFQUNwQixFQUNMLEVBQ0YsRUFDRixFQUNGO1lBS0YsQUFERixBQURGLGdDQUF5RCxlQUM1QixlQUMyQztZQUNsRSx5RUFNQztZQXVCWCxBQURFLEFBREUsQUFERSxBQURFLGlCQUFNLEVBQ0YsRUFDRixFQUNGLEVBQ0Y7WUFNRSxBQURGLEFBREYsQUFGRixBQURGLGdDQUFzQixlQUNILGNBRXlDLGNBQ2pDLGFBQytEO1lBQ2hGLHlCQUEyQztZQUFDLGFBQzlDOztZQUNGLEFBREUsaUJBQUksRUFDRDtZQUVILEFBREYsK0JBQXFCLGFBQ3FFO1lBQ3RGLHlCQUE0QztZQUFDLGFBQy9DOztZQUVKLEFBREUsQUFERSxpQkFBSSxFQUNELEVBQ0Y7WUFtQkQsQUFkRixBQUZGLGdDQUEyQyxlQUVrQixXQWNwRDtZQUNILHlFQWNDO1lBTUwsQUFERSxpQkFBTSxFQUNGO1lBR04sZ0NBQW9EO1lBQ2xELDBFQUF1RDtZQXFEakUsQUFERSxBQURFLEFBREUsQUFERSxpQkFBTSxFQUNGLEVBQ0YsRUFDRixFQUNGO1lBRUosQUFERixnQ0FBMEIsYUFDbUQ7WUFBNUIsc0ZBQVMsWUFBUSxTQUFHLEtBQUssSUFBRTtZQUN4RSxhQUNGOztZQUFBLGlCQUFJO1lBQ0osbUNBQTZEO1lBQWYsa0dBQVMsUUFBSSxJQUFDO1lBQUMsYUFBb0M7O1lBQ25HLEFBRG1HLGlCQUFTLEVBQ3RHOztZQXBQOEIsZUFBK0M7WUFBL0MsMEVBQStDO1lBYTNFLGVBQXVFO1lBQXZFLHdHQUF1RTtZQVEvRCxlQUFxQjtZQUFyQiwwQ0FBcUI7WUFNd0IsY0FBa0M7WUFBbEMsOEVBQWtDO1lBNEJyQyxlQUNsRDtZQURrRCw0RkFDbEQ7WUFFRyxlQUFpQztZQUFqQyxzREFBaUM7WUFrQmMsZUFDaEQ7WUFEZ0QsaUhBQ2hEO1lBTXlDLGVBQWtEO1lBQWxELDhFQUFrRDtZQWFsRCxlQUEwQjtZQUExQiw0Q0FBMEI7WUFHM0MsY0FBYztZQUFkLHlDQUFjO1lBa0NRLGVBQzlDO1lBRDhDLG9GQUM5QztZQUkrQyxlQUMvQztZQUQrQyx5RkFDL0M7WUF1QndCLGVBQWdCO1lBQWhCLHlDQUFnQjtZQXVCbEMsZUFBK0M7WUFBL0Msd0VBQStDO1lBd0QzRCxlQUNGO1lBREUsK0VBQ0Y7WUFDNkQsZUFBb0M7WUFBcEMsZ0VBQW9DOzs7aUZEL050RixvQkFBb0I7Y0FMaEMsU0FBUzsyQkFDRSxzQkFBc0I7NFNBc1FoQyxPQUFPO2tCQUROLFlBQVk7bUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFzRzFDLG1CQUFtQjtrQkFEbEIsWUFBWTttQkFBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBdFd2QyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsUmVmLCBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZVByb2ZpbGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJlc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJldmlld1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcmV2aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCB9IGZyb20gJy4vZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUvZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWFwcC1maXh0dXJlLXBvb2wnLFxuICB0ZW1wbGF0ZVVybDogJy4vZml4dHVyZS1wb29sLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZml4dHVyZS1wb29sLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRml4dHVyZVBvb2xDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdO1xuICBwdWJsaWMgZmlsdGVyZWRQcm9maWxlczogRml4dHVyZVByb2ZpbGVbXTtcbiAgcHVibGljIGxvYWRpbmdQcm9maWxlcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBmaXh0dXJlUG9vbDogRml4dHVyZVtdO1xuXG4gIHB1YmxpYyBkbXhDaGFubmVsczogbnVtYmVyW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkRml4dHVyZTogRml4dHVyZTtcbiAgcHVibGljIHNlbGVjdGVkRml4dHVyZVByb2ZpbGU6IEZpeHR1cmVQcm9maWxlO1xuICBwdWJsaWMgc2hvd0NoYW5uZWxOdW1iZXJzID0gZmFsc2U7XG4gIHB1YmxpYyBjaGFubmVsRHJhZ0ZpeHR1cmU6IEZpeHR1cmU7XG4gIHB1YmxpYyBjaGFubmVsRHJhZ09mZnNldDogbnVtYmVyO1xuXG4gIHB1YmxpYyBvbkNsb3NlOiBTdWJqZWN0PG51bWJlcj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyBzZWFyY2hFeHByZXNzaW9uOiBzdHJpbmc7XG5cbiAgcHVibGljIHVwZGF0aW5nUHJvZmlsZXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgcHVibGljIGZpeHR1cmVTZXJ2aWNlOiBGaXh0dXJlU2VydmljZSxcbiAgICBwcml2YXRlIHV1aWRTZXJ2aWNlOiBVdWlkU2VydmljZSxcbiAgICBwdWJsaWMgcHJvamVjdFNlcnZpY2U6IFByb2plY3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJldmlld1NlcnZpY2U6IFByZXZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmVzZXRTZXJ2aWNlOiBQcmVzZXRTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZVxuICApIHtcbiAgICB0aGlzLmZpeHR1cmVQb29sID0gWy4uLnRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlc107XG5cbiAgICBpZiAodGhpcy5maXh0dXJlUG9vbC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUodGhpcy5maXh0dXJlUG9vbFswXSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MTI7IGkrKykge1xuICAgICAgdGhpcy5kbXhDaGFubmVscy5wdXNoKDApO1xuICAgIH1cblxuICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRQcm9maWxlcygpIHtcbiAgICB0aGlzLmxvYWRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFNlYXJjaFByb2ZpbGVzKCkuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgdGhpcy5wcm9maWxlcyA9IHByb2ZpbGVzO1xuICAgICAgdGhpcy5maWx0ZXJQcm9maWxlcygpO1xuICAgICAgdGhpcy5sb2FkaW5nUHJvZmlsZXMgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdEZpeHR1cmUoZml4dHVyZTogRml4dHVyZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZml4dHVyZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVQcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gIH1cblxuICBmaWx0ZXJQcm9maWxlcygpIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoRXhwcmVzc2lvbiB8fCAhdGhpcy5wcm9maWxlcykge1xuICAgICAgdGhpcy5maWx0ZXJlZFByb2ZpbGVzID0gdGhpcy5wcm9maWxlcztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMgPSBbXTtcblxuICAgIGNvbnN0IGtleXdvcmRzID0gdGhpcy5zZWFyY2hFeHByZXNzaW9uLnNwbGl0KCcgJyk7XG5cbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgdGhpcy5wcm9maWxlcykge1xuICAgICAgbGV0IGZvdW5kS2V5d29yZHMgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleXdvcmQgb2Yga2V5d29yZHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb2ZpbGUudXVpZC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5d29yZC50b0xvd2VyQ2FzZSgpKSAhPT0gLTEgfHxcbiAgICAgICAgICBwcm9maWxlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGtleXdvcmQudG9Mb3dlckNhc2UoKSkgIT09IC0xIHx8XG4gICAgICAgICAgcHJvZmlsZS5tYW51ZmFjdHVyZXJOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICBmb3VuZEtleXdvcmRzKys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kS2V5d29yZHMgPT09IGtleXdvcmRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMucHVzaChwcm9maWxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRGaXh0dXJlKHNlYXJjaFByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKSB7XG4gICAgLy8gTG9hZCB0aGUgcHJvZmlsZSBkZXRhaWxzLCBpZiBub3QgYWxyZWFkeSBkb25lLiBUaGVyZSBpcyBvbmx5IGFcbiAgICAvLyBtaW5pbWFsIHByb2ZpbGUgcGFzc2VkIGZyb20gdGhlIHNlYXJjaC5cbiAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmxvYWRQcm9maWxlQnlVdWlkKHNlYXJjaFByb2ZpbGUudXVpZCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoc2VhcmNoUHJvZmlsZS51dWlkKTtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb3B5KG9yaWdpbmFsRml4dHVyZTogRml4dHVyZSkge1xuICAgIGNvbnN0IGZpeHR1cmUgPSBuZXcgRml4dHVyZSgpO1xuICAgIGZpeHR1cmUudXVpZCA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VXVpZCgpO1xuICAgIGZpeHR1cmUucHJvZmlsZVV1aWQgPSBvcmlnaW5hbEZpeHR1cmUucHJvZmlsZVV1aWQ7XG4gICAgZml4dHVyZS5uYW1lID0gb3JpZ2luYWxGaXh0dXJlLm5hbWU7XG4gICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gb3JpZ2luYWxGaXh0dXJlLm1vZGVTaG9ydE5hbWU7XG4gICAgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBvcmlnaW5hbEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsO1xuICAgIGZpeHR1cmUuZG14VW5pdmVyc2VVdWlkID0gb3JpZ2luYWxGaXh0dXJlLmRteFVuaXZlcnNlVXVpZDtcblxuICAgIHRoaXMuZml4dHVyZVBvb2wucHVzaChmaXh0dXJlKTtcbiAgICB0aGlzLnNlbGVjdEZpeHR1cmUoZml4dHVyZSk7XG4gIH1cblxuICByZW1vdmVGaXh0dXJlKGZpeHR1cmU6IEZpeHR1cmUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZml4dHVyZVBvb2wubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmZpeHR1cmVQb29sW2ldLnV1aWQgPT09IGZpeHR1cmUudXVpZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmUgPT09IHRoaXMuZml4dHVyZVBvb2xbaV0pIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmUodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpeHR1cmVQb29sLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRml4dHVyZSAmJiB0aGlzLmZpeHR1cmVQb29sICYmIHRoaXMuZml4dHVyZVBvb2wubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlKCh0aGlzLnNlbGVjdGVkRml4dHVyZSA9IHRoaXMuZml4dHVyZVBvb2xbMF0pKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdW51c2VkIHByb2ZpbGVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgcHJvZmlsZVVzZWQgPSBmYWxzZTtcblxuICAgICAgZm9yIChjb25zdCBmaXh0dXJlSW5Qb29sIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgICAgaWYgKGZpeHR1cmVJblBvb2wucHJvZmlsZVV1aWQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlUHJvZmlsZXNbaV0udXVpZCkge1xuICAgICAgICAgIHByb2ZpbGVVc2VkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXByb2ZpbGVVc2VkKSB7XG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlUHJvZmlsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5uZWxPY2N1cGllZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUodGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpLCBmaXh0dXJlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBtb2RlLmNoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGFubmVsT2NjdXBpZWRTdGFydChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gZml4dHVyZS5kbXhGaXJzdENoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE9jY3VwaWVkRW5kKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuXG4gICAgICBpZiAoaW5kZXggPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgbW9kZS5jaGFubmVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxPdmVybGFwcGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBsZXQgb2NjdXBpZWRGaXh0dXJlOiBGaXh0dXJlO1xuXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUodGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpLCBmaXh0dXJlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBtb2RlLmNoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgICBpZiAob2NjdXBpZWRGaXh0dXJlKSB7XG4gICAgICAgICAgaWYgKG9jY3VwaWVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgIT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsIHx8IG9jY3VwaWVkRml4dHVyZS5tb2RlU2hvcnROYW1lICE9PSBmaXh0dXJlLm1vZGVTaG9ydE5hbWUpIHtcbiAgICAgICAgICAgIC8vIGZpeHR1cmVzIGFyZSBhbGxvd2VkIHRvIG92ZXJsYXAsIGlmIHRoZXkgc3RhcnQgYXQgdGhlIHNhbWUgY2hhbm5lbCBhbmRcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgc2FtZSBtb2RlLiBvdGhlcndpc2UgaXQncyBub3QgYWxsb3dlZC5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvY2N1cGllZEZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE1vdXNlRG93bihldmVudDogYW55KSB7XG4gICAgLy8gc3RhcnQgZHJhZ2dpbmdcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG4gICAgbGV0IG5ld1NlbGVjdGVkRml4dHVyZTogRml4dHVyZTtcblxuICAgIC8vIGZpbmQgYSBkcmFnZ2luZyBmaXh0dXJlIGFuZCBzZWxlY3QgaXQsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIHNlbGVjdGlvbiwgaWYgdGhlXG4gICAgLy8gY3VycmVudGx5IHNlbGVjdGVkIGZpeHR1cmUgbWlnaHQgYWxzbyBiZSBzZWxlY3RlZCAob24gb3ZlcmxhcHBlZCBmaXh0dXJlcylcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5maXh0dXJlUG9vbCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBzZWxlY3RlZEluZGV4IDw9IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgbW9kZS5jaGFubmVscy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRml4dHVyZSA9PT0gZml4dHVyZSkge1xuICAgICAgICAgIG5ld1NlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW5ld1NlbGVjdGVkRml4dHVyZSkge1xuICAgICAgICAgIG5ld1NlbGVjdGVkRml4dHVyZSA9IGZpeHR1cmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmV3U2VsZWN0ZWRGaXh0dXJlKSB7XG4gICAgICBpZiAobmV3U2VsZWN0ZWRGaXh0dXJlICE9PSB0aGlzLnNlbGVjdGVkRml4dHVyZSkge1xuICAgICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3U2VsZWN0ZWRGaXh0dXJlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jaGFubmVsRHJhZ0ZpeHR1cmUgPSBuZXdTZWxlY3RlZEZpeHR1cmU7XG4gICAgICB0aGlzLmNoYW5uZWxEcmFnT2Zmc2V0ID0gc2VsZWN0ZWRJbmRleCAtIG5ld1NlbGVjdGVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWw7XG4gICAgfVxuICB9XG5cbiAgY2hhbm5lbFNlbGVjdGVkKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRGaXh0dXJlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID49IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShcbiAgICAgICAgdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuc2VsZWN0ZWRGaXh0dXJlLnByb2ZpbGVVdWlkKSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbmRleCA8IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIG1vZGUuY2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHJlZ2lzdGVyIG1vdXNlIHVwIGdsb2JhbGx5IChlLmcuIGFsc28gb3V0c2lkZSB0aGUgRE1YIG1hcHBpbmcpXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgbW91c2VVcChldmVudDogYW55KSB7XG4gICAgLy8gZmluaXNoIGRyYWdnaW5nXG4gICAgdGhpcy5jaGFubmVsRHJhZ0ZpeHR1cmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jaGFubmVsRHJhZ09mZnNldCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNoYW5uZWxNb3VzZU92ZXIoZXZlbnQ6IGFueSkge1xuICAgIC8vIHBlcmZvcm0gZHJhZ2dpbmdcbiAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuaW5kZXg7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZSAmJlxuICAgICAgc2VsZWN0ZWRJbmRleCAtIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPj0gMCAmJlxuICAgICAgc2VsZWN0ZWRJbmRleCAtXG4gICAgICAgIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgK1xuICAgICAgICB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVCeUZpeHR1cmUoXG4gICAgICAgICAgdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlLnByb2ZpbGVVdWlkKSxcbiAgICAgICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZVxuICAgICAgICApLmNoYW5uZWxzLmxlbmd0aCAtXG4gICAgICAgIDEgPD1cbiAgICAgICAgNTExXG4gICAgKSB7XG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBzZWxlY3RlZEluZGV4IC0gdGhpcy5jaGFubmVsRHJhZ09mZnNldDtcbiAgICB9XG4gIH1cblxuICBvaygpIHtcbiAgICAvLyBkb24ndCBhbGxvdyBPSyBpZiBvdmVybGFwcGluZyBmaXh0dXJlcyBleGlzdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kbXhDaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhbm5lbE92ZXJsYXBwZWQoaSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jaGFubmVsLW9jY3VwaWVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWwtb2NjdXBpZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVQb29sO1xuXG4gICAgdGhpcy5maXh0dXJlU2VydmljZS51cGRhdGVDYWNoZWRGaXh0dXJlcygpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5yZW1vdmVEZWxldGVkRml4dHVyZXMoKTtcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVTZXR1cCgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS51cGRhdGVGaXh0dXJlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLmZpeHR1cmVTZWxlY3Rpb25DaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcblxuICAgIHRoaXMub25DbG9zZS5uZXh0KDEpO1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNsb3NlLm5leHQoMik7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVzKCkge1xuICAgIHRoaXMudXBkYXRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICAvLyBUT0RPXG4gICAgdGhpcy5maXh0dXJlU2VydmljZVxuICAgICAgLnVwZGF0ZVByb2ZpbGVzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGluZ1Byb2ZpbGVzID0gZmFsc2U7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvcic7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvci10aXRsZSc7XG5cbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5wcm9maWxlcy11cGRhdGVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zdWNjZXNzKHJlc3VsdFttc2ddLCByZXN1bHRbdGl0bGVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKSB7XG4gICAgY29uc3QgYnNNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCwgeyBrZXlib2FyZDogdHJ1ZSwgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UgfSk7XG4gICAgKGJzTW9kYWxSZWYuY29udGVudCBhcyBGaXh0dXJlUG9vbENyZWF0ZUZyb21GaWxlQ29tcG9uZW50KS5vbkNsb3NlLnN1YnNjcmliZSgocHJvZmlsZTogRml4dHVyZVByb2ZpbGUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vaygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgIDwhLS0gU2VhcmNoIGZvciBwcm9maWxlcyAtLT5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWJsb2NrIG1iLTNcIlxuICAgICAgICBpZD1cInNlYXJjaFNldFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5zZWFyY2gtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGlucHV0KT1cInNlYXJjaEV4cHJlc3Npb24gPSAkZXZlbnQudGFyZ2V0LnZhbHVlOyBmaWx0ZXJQcm9maWxlcygpXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gUHJvZmlsZXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItc2Vjb25kYXJ5IHctMTAwXCIgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0wIHctMTAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCB3LTEwMFwiPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJsb2FkaW5nUHJvZmlsZXNcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydCBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIG14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIj48L2k+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBwcm9maWxlIG9mIGZpbHRlcmVkUHJvZmlsZXMgfCBzb3J0OiAndXVpZCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTAgY29sLWF1dG8gbXktYXV0byBwbC0yXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLXt7IGZpeHR1cmVTZXJ2aWNlLmdldEZpeHR1cmVJY29uQ2xhc3MocHJvZmlsZSkgfX0gbXItMVwiPjwvc3Bhbj4ge3sgcHJvZmlsZS5tYW51ZmFjdHVyZXJOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAge3sgcHJvZmlsZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJhZGRGaXh0dXJlKHByb2ZpbGUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxwIGNsYXNzPVwiZC1pbmxpbmUtYmxvY2sgbWItMCBtdC0yXCI+XG4gICAgICAgICAgUG93ZXJlZCBieSB0aGUgPGEgaHJlZj1cImh0dHBzOi8vb3Blbi1maXh0dXJlLWxpYnJhcnkub3JnL1wiIHRhcmdldD1cIl9ibGFua1wiPk9wZW4gRml4dHVyZSBMaWJyYXJ5PC9hPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9XCJtdC0yIGJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiXG4gICAgICAgICAgaHJlZj1cImh0dHBzOi8vb3Blbi1maXh0dXJlLWxpYnJhcnkub3JnL2ZpeHR1cmUtZWRpdG9yXCJcbiAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuYWRkLXByb2ZpbGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiY29uZmlnU2VydmljZS5sb2NhbFByb2ZpbGVzXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIm1yLTIgbXQtMiBidG4gYnRuLXNlY29uZGFyeSBidG4tc20gZmxvYXQtcmlnaHRcIlxuICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVQcm9maWxlcygpOyAoZmFsc2UpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidXBkYXRpbmdQcm9maWxlc1wiXG4gICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSAqbmdJZj1cInVwZGF0aW5nUHJvZmlsZXNcIiBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgPGkgKm5nSWY9XCIhdXBkYXRpbmdQcm9maWxlc1wiIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgZmEtZndcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC51cGRhdGUtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDwhLS0gQWRkIGZpeHR1cmUgZnJvbSBsb2NhbCBwcm9maWxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKVwiIHJvbGU9XCJidXR0b25cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jcmVhdGUtZml4dHVyZS1mcm9tLXByb2ZpbGUtZmlsZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBVbml2ZXJzZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudW5pdmVyc2UnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOFwiPlxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxvcHRpb24+VW5pdmVyc2UgMTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEZpeHR1cmVzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgYm9yZGVyLXNlY29uZGFyeVwiIHN0eWxlPVwiaGVpZ2h0OiAyMzVweFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBbc29ydGFibGVqc109XCJmaXh0dXJlUG9vbFwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBmaXh0dXJlIG9mIGZpeHR1cmVQb29sXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJmaXh0dXJlID09IHNlbGVjdGVkRml4dHVyZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGaXh0dXJlKGZpeHR1cmUpXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGxpc3Qtc29ydC1oYW5kbGUgbXktYXV0b1wiIHN0eWxlPVwiY3Vyc29yOiBtb3ZlOyBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFyc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZmxleC1ncm93IHBsLTAgbXktYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi17eyBmaXh0dXJlU2VydmljZS5nZXRGaXh0dXJlSWNvbkNsYXNzKGZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCkpIH19IG1yLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID57eyBmaXh0dXJlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gbXktYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIGZsb2F0LXJpZ2h0XCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUZpeHR1cmUoZml4dHVyZSk7IChmYWxzZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1taW51c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgIDwhLS0gVGFiIG5hdmlnYXRpb24gLS0+XG4gICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgbWItNFwiIGlkPVwibXlUYWJcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmsgYWN0aXZlXCIgaWQ9XCJzZXRzLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiNkbXhcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImljb24tb2xhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmRteCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiIGlkPVwiY29tcG9zaXRpb25zLXRhYlwiIGRhdGEtdG9nZ2xlPVwidGFiXCIgaHJlZj1cIiNzZXR0aW5nc1wiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLnNldHRpbmdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG5cbiAgICAgIDwhLS0gVGFiIGNvbnRlbnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnRcIiBpZD1cIm15VGFiQ29udGVudFwiPlxuICAgICAgICA8IS0tIERNWCB1bml2ZXJzZSBvdmVydmlldy0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgc2hvdyBhY3RpdmVcIiBpZD1cImRteFwiIHJvbGU9XCJ0YWJwYW5lbFwiPlxuICAgICAgICAgIDwhLS0gU2hvdyBhbGwgY2hhbm5lbCBudW1iZXJzIC0tPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZmxleC1ncm93XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTMgZC1mbGV4XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIG15LWF1dG8gbWwtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBpZD1cInNob3dDaGFubmVsTnVtYmVyc1wiIFtuZ01vZGVsXT1cInNob3dDaGFubmVsTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzaG93Q2hhbm5lbE51bWJlcnMgPSAkZXZlbnRcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2hvd0NoYW5uZWxOdW1iZXJzXCI+U2hvdyBjaGFubmVsczwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgPCEtLSBMaXN0IG9mIERNWCBjaGFubmVscyAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hhbm5lbCBvZiBkbXhDaGFubmVsczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZG14LWNoYW5uZWxcIlxuICAgICAgICAgICAgICBbY2xhc3MuZG14LWNoYW5uZWwtb2NjdXBpZWRdPVwiY2hhbm5lbE9jY3VwaWVkKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkLXN0YXJ0XT1cImNoYW5uZWxPY2N1cGllZFN0YXJ0KGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkLWVuZF09XCJjaGFubmVsT2NjdXBpZWRFbmQoaSlcIlxuICAgICAgICAgICAgICBbY2xhc3MuZG14LWNoYW5uZWwtc2VsZWN0ZWRdPVwiY2hhbm5lbFNlbGVjdGVkKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW92ZXJsYXBwZWRdPVwiY2hhbm5lbE92ZXJsYXBwZWQoaSlcIlxuICAgICAgICAgICAgICAobW91c2Vkb3duKT1cImNoYW5uZWxNb3VzZURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwiY2hhbm5lbE1vdXNlT3ZlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pbmRleF09XCJpXCJcbiAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IGkgKyAxIH19XCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJtb3VzZWVudGVyOm1vdXNlbGVhdmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGRteC1jaGFubmVsLXRleHRcIiBbYXR0ci5kYXRhLWluZGV4XT1cImlcIiBbY2xhc3MuZG14LWNoYW5uZWwtdGV4dC12aXNpYmxlXT1cInNob3dDaGFubmVsTnVtYmVyc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLWF1dG9cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTFweFwiIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiPjxzbWFsbCBbYXR0ci5kYXRhLWluZGV4XT1cImlcIj4mbmJzcDs8L3NtYWxsPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEZpeHR1cmUgc2V0dGluZ3MgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZVwiIGlkPVwic2V0dGluZ3NcIiByb2xlPVwidGFicGFuZWxcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaXh0dXJlICYmIHNlbGVjdGVkRml4dHVyZVByb2ZpbGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiIGZvcj1cImZpeHR1cmVOYW1lXCI+e3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5maXh0dXJlLW5hbWUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy05XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRml4dHVyZS5uYW1lXCIgbWF4bGVuZ3RoPVwiMjAwXCIgaWQ9XCJmaXh0dXJlTmFtZVwiIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubW9kZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWVcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VsZWN0ZWRGaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSAkZXZlbnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vZGUgb2Ygc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZS5tb2Rlc1wiIFtuZ1ZhbHVlXT1cIm1vZGUuc2hvcnROYW1lIHx8IG1vZGUubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBtb2RlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgLSB7eyBtb2RlLmNoYW5uZWxzLmxlbmd0aCB9fVxuICAgICAgICAgICAgICAgICAgICB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuZmlyc3QtY2hhbm5lbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjaGFubmVsIG9mIGRteENoYW5uZWxzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZENvcHkoc2VsZWN0ZWRGaXh0dXJlKVwiPlxuICAgICAgICAgICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUuYWRkLWNvcHknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gIDxhIGNsYXNzPVwibXItMyBteS1hdXRvXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAge3sgJ2Rlc2lnbmVyLm1pc2MuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9rKClcIj57eyAnZGVzaWduZXIubWlzYy5vaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZGl2PlxuIl19
643
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1wb29sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvZml4dHVyZS1wb29sL2ZpeHR1cmUtcG9vbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL2ZpeHR1cmUtcG9vbC9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDN0gs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RUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBclp2QyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBCc01vZGFsUmVmLCBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGaXh0dXJlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZVByb2ZpbGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBGaXh0dXJlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2ZpeHR1cmUuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJlc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJldmlld1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcmV2aWV3LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVXVpZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCB9IGZyb20gJy4vZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUvZml4dHVyZS1wb29sLWNyZWF0ZS1mcm9tLWZpbGUuY29tcG9uZW50JztcbmltcG9ydCB7IFByZXNldEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LWZpeHR1cmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItYXBwLWZpeHR1cmUtcG9vbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maXh0dXJlLXBvb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maXh0dXJlLXBvb2wuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaXh0dXJlUG9vbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcHJvZmlsZXM6IEZpeHR1cmVQcm9maWxlW107XG4gIHB1YmxpYyBmaWx0ZXJlZFByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdO1xuICBwdWJsaWMgbG9hZGluZ1Byb2ZpbGVzID0gZmFsc2U7XG5cbiAgcHVibGljIGZpeHR1cmVQb29sOiBGaXh0dXJlW107XG5cbiAgcHVibGljIGRteENoYW5uZWxzOiBudW1iZXJbXSA9IFtdO1xuICBwdWJsaWMgc2VsZWN0ZWRGaXh0dXJlOiBGaXh0dXJlO1xuICBwdWJsaWMgc2VsZWN0ZWRGaXh0dXJlUHJvZmlsZTogRml4dHVyZVByb2ZpbGU7XG4gIHB1YmxpYyBzaG93Q2hhbm5lbE51bWJlcnMgPSBmYWxzZTtcbiAgcHVibGljIGNoYW5uZWxEcmFnRml4dHVyZTogRml4dHVyZTtcbiAgcHVibGljIGNoYW5uZWxEcmFnT2Zmc2V0OiBudW1iZXI7XG5cbiAgcHVibGljIG9uQ2xvc2U6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIHNlYXJjaEV4cHJlc3Npb246IHN0cmluZztcblxuICBwdWJsaWMgdXBkYXRpbmdQcm9maWxlczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYnNNb2RhbFJlZjogQnNNb2RhbFJlZixcbiAgICBwdWJsaWMgZml4dHVyZVNlcnZpY2U6IEZpeHR1cmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlLFxuICAgIHB1YmxpYyBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwcmV2aWV3U2VydmljZTogUHJldmlld1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHByZXNldFNlcnZpY2U6IFByZXNldFNlcnZpY2UsXG4gICAgcHVibGljIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZml4dHVyZVBvb2wgPSBbLi4udGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzXTtcblxuICAgIGlmICh0aGlzLmZpeHR1cmVQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZSh0aGlzLmZpeHR1cmVQb29sWzBdKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7XG4gICAgICB0aGlzLmRteENoYW5uZWxzLnB1c2goMCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkUHJvZmlsZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFByb2ZpbGVzKCkge1xuICAgIHRoaXMubG9hZGluZ1Byb2ZpbGVzID0gdHJ1ZTtcblxuICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0U2VhcmNoUHJvZmlsZXMoKS5zdWJzY3JpYmUoKHByb2ZpbGVzKSA9PiB7XG4gICAgICB0aGlzLnByb2ZpbGVzID0gcHJvZmlsZXM7XG4gICAgICB0aGlzLmZpbHRlclByb2ZpbGVzKCk7XG4gICAgICB0aGlzLmxvYWRpbmdQcm9maWxlcyA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0Rml4dHVyZShmaXh0dXJlOiBGaXh0dXJlKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpeHR1cmVQcm9maWxlID0gdW5kZWZpbmVkO1xuICAgIGlmIChmaXh0dXJlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRml4dHVyZVByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRGaXh0dXJlID0gZml4dHVyZTtcbiAgfVxuXG4gIGZpbHRlclByb2ZpbGVzKCkge1xuICAgIGlmICghdGhpcy5zZWFyY2hFeHByZXNzaW9uIHx8ICF0aGlzLnByb2ZpbGVzKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkUHJvZmlsZXMgPSB0aGlzLnByb2ZpbGVzO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRQcm9maWxlcyA9IFtdO1xuXG4gICAgY29uc3Qga2V5d29yZHMgPSB0aGlzLnNlYXJjaEV4cHJlc3Npb24uc3BsaXQoJyAnKTtcblxuICAgIGZvciAoY29uc3QgcHJvZmlsZSBvZiB0aGlzLnByb2ZpbGVzKSB7XG4gICAgICBsZXQgZm91bmRLZXl3b3JkcyA9IDA7XG5cbiAgICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBrZXl3b3Jkcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJvZmlsZS51dWlkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkpICE9PSAtMSB8fFxuICAgICAgICAgIHByb2ZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoa2V5d29yZC50b0xvd2VyQ2FzZSgpKSAhPT0gLTEgfHxcbiAgICAgICAgICBwcm9maWxlLm1hbnVmYWN0dXJlck5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKGtleXdvcmQudG9Mb3dlckNhc2UoKSkgIT09IC0xXG4gICAgICAgICkge1xuICAgICAgICAgIGZvdW5kS2V5d29yZHMrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmRLZXl3b3JkcyA9PT0ga2V5d29yZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRQcm9maWxlcy5wdXNoKHByb2ZpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZEZpeHR1cmUoc2VhcmNoUHJvZmlsZTogRml4dHVyZVByb2ZpbGUpIHtcbiAgICAvLyBMb2FkIHRoZSBwcm9maWxlIGRldGFpbHMsIGlmIG5vdCBhbHJlYWR5IGRvbmUuIFRoZXJlIGlzIG9ubHkgYVxuICAgIC8vIG1pbmltYWwgcHJvZmlsZSBwYXNzZWQgZnJvbSB0aGUgc2VhcmNoLlxuICAgIHRoaXMuZml4dHVyZVNlcnZpY2UubG9hZFByb2ZpbGVCeVV1aWQoc2VhcmNoUHJvZmlsZS51dWlkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0UHJvZmlsZUJ5VXVpZChzZWFyY2hQcm9maWxlLnV1aWQpO1xuICAgICAgY29uc3QgbmV3Rml4dHVyZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuYWRkRml4dHVyZShwcm9maWxlLCB0aGlzLmZpeHR1cmVQb29sKTtcbiAgICAgIGlmIChuZXdGaXh0dXJlKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZShuZXdGaXh0dXJlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFkZENvcHkob3JpZ2luYWxGaXh0dXJlOiBGaXh0dXJlKSB7XG4gICAgY29uc3QgZml4dHVyZSA9IG5ldyBGaXh0dXJlKCk7XG5cbiAgICBmaXh0dXJlLnV1aWQgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFV1aWQoKTtcbiAgICBmaXh0dXJlLnByb2ZpbGVVdWlkID0gb3JpZ2luYWxGaXh0dXJlLnByb2ZpbGVVdWlkO1xuICAgIGZpeHR1cmUubmFtZSA9IG9yaWdpbmFsRml4dHVyZS5uYW1lO1xuICAgIGZpeHR1cmUubW9kZVNob3J0TmFtZSA9IG9yaWdpbmFsRml4dHVyZS5tb2RlU2hvcnROYW1lO1xuICAgIGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gb3JpZ2luYWxGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbDtcbiAgICBmaXh0dXJlLmRteFVuaXZlcnNlVXVpZCA9IG9yaWdpbmFsRml4dHVyZS5kbXhVbml2ZXJzZVV1aWQ7XG5cbiAgICB0aGlzLmZpeHR1cmVQb29sLnB1c2goZml4dHVyZSk7XG4gICAgdGhpcy5zZWxlY3RGaXh0dXJlKGZpeHR1cmUpO1xuICB9XG5cbiAgcmVtb3ZlRml4dHVyZShmaXh0dXJlOiBGaXh0dXJlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZpeHR1cmVQb29sLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5maXh0dXJlUG9vbFtpXS51dWlkID09PSBmaXh0dXJlLnV1aWQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaXh0dXJlID09PSB0aGlzLmZpeHR1cmVQb29sW2ldKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXh0dXJlUG9vbC5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZEZpeHR1cmUgJiYgdGhpcy5maXh0dXJlUG9vbCAmJiB0aGlzLmZpeHR1cmVQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0Rml4dHVyZSgodGhpcy5zZWxlY3RlZEZpeHR1cmUgPSB0aGlzLmZpeHR1cmVQb29sWzBdKSk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHVudXNlZCBwcm9maWxlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVQcm9maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHByb2ZpbGVVc2VkID0gZmFsc2U7XG5cbiAgICAgIGZvciAoY29uc3QgZml4dHVyZUluUG9vbCBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICAgIGlmIChmaXh0dXJlSW5Qb29sLnByb2ZpbGVVdWlkID09PSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzW2ldLnV1aWQpIHtcbiAgICAgICAgICBwcm9maWxlVXNlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFwcm9maWxlVXNlZCkge1xuICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFubmVsT2NjdXBpZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2hhbm5lbE9jY3VwaWVkU3RhcnQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBpZiAoaW5kZXggPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxPY2N1cGllZEVuZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIGZpeHR1cmUpO1xuICAgICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuXG4gICAgICBpZiAoaW5kZXggPT09IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbENvdW50IC0gMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGFubmVsT3ZlcmxhcHBlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgbGV0IG9jY3VwaWVkRml4dHVyZTogRml4dHVyZTtcblxuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLmZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCBmaXh0dXJlKTtcbiAgICAgIGNvbnN0IGNoYW5uZWxDb3VudCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChwcm9maWxlLCBtb2RlKTtcblxuICAgICAgaWYgKGluZGV4ID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGluZGV4IDwgZml4dHVyZS5kbXhGaXJzdENoYW5uZWwgKyBjaGFubmVsQ291bnQpIHtcbiAgICAgICAgaWYgKG9jY3VwaWVkRml4dHVyZSkge1xuICAgICAgICAgIGlmIChvY2N1cGllZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICE9PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCB8fCBvY2N1cGllZEZpeHR1cmUubW9kZVNob3J0TmFtZSAhPT0gZml4dHVyZS5tb2RlU2hvcnROYW1lKSB7XG4gICAgICAgICAgICAvLyBmaXh0dXJlcyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLCBpZiB0aGV5IHN0YXJ0IGF0IHRoZSBzYW1lIGNoYW5uZWwgYW5kXG4gICAgICAgICAgICAvLyB1c2UgdGhlIHNhbWUgbW9kZS4gb3RoZXJ3aXNlIGl0J3Mgbm90IGFsbG93ZWQuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2NjdXBpZWRGaXh0dXJlID0gZml4dHVyZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNoYW5uZWxNb3VzZURvd24oZXZlbnQ6IGFueSkge1xuICAgIC8vIHN0YXJ0IGRyYWdnaW5nXG4gICAgY29uc3Qgc2VsZWN0ZWRJbmRleCA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LmluZGV4O1xuICAgIGxldCBuZXdTZWxlY3RlZEZpeHR1cmU6IEZpeHR1cmU7XG5cbiAgICAvLyBmaW5kIGEgZHJhZ2dpbmcgZml4dHVyZSBhbmQgc2VsZWN0IGl0LCBidXQgZG9uJ3QgY2hhbmdlIHRoZSBzZWxlY3Rpb24sIGlmIHRoZVxuICAgIC8vIGN1cnJlbnRseSBzZWxlY3RlZCBmaXh0dXJlIG1pZ2h0IGFsc28gYmUgc2VsZWN0ZWQgKG9uIG92ZXJsYXBwZWQgZml4dHVyZXMpXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMuZml4dHVyZVBvb2wpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCk7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIGZpeHR1cmUpO1xuICAgICAgY29uc3QgY2hhbm5lbENvdW50ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQ2hhbm5lbENvdW50KHByb2ZpbGUsIG1vZGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCAmJiBzZWxlY3RlZEluZGV4IDw9IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbENvdW50IC0gMSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZpeHR1cmUgPT09IGZpeHR1cmUpIHtcbiAgICAgICAgICBuZXdTZWxlY3RlZEZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFuZXdTZWxlY3RlZEZpeHR1cmUpIHtcbiAgICAgICAgICBuZXdTZWxlY3RlZEZpeHR1cmUgPSBmaXh0dXJlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5ld1NlbGVjdGVkRml4dHVyZSkge1xuICAgICAgaWYgKG5ld1NlbGVjdGVkRml4dHVyZSAhPT0gdGhpcy5zZWxlY3RlZEZpeHR1cmUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RGaXh0dXJlKG5ld1NlbGVjdGVkRml4dHVyZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlID0gbmV3U2VsZWN0ZWRGaXh0dXJlO1xuICAgICAgdGhpcy5jaGFubmVsRHJhZ09mZnNldCA9IHNlbGVjdGVkSW5kZXggLSBuZXdTZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsO1xuICAgIH1cbiAgfVxuXG4gIGNoYW5uZWxTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRml4dHVyZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpbmRleCA+PSB0aGlzLnNlbGVjdGVkRml4dHVyZS5kbXhGaXJzdENoYW5uZWwpIHtcbiAgICAgIGNvbnN0IHByb2ZpbGUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFByb2ZpbGVCeVV1aWQodGhpcy5zZWxlY3RlZEZpeHR1cmUucHJvZmlsZVV1aWQpO1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUJ5Rml4dHVyZShwcm9maWxlLCB0aGlzLnNlbGVjdGVkRml4dHVyZSk7XG4gICAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVDaGFubmVsQ291bnQocHJvZmlsZSwgbW9kZSk7XG5cbiAgICAgIGlmIChpbmRleCA8IHRoaXMuc2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIGNoYW5uZWxDb3VudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyByZWdpc3RlciBtb3VzZSB1cCBnbG9iYWxseSAoZS5nLiBhbHNvIG91dHNpZGUgdGhlIERNWCBtYXBwaW5nKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6bW91c2V1cCcsIFsnJGV2ZW50J10pXG4gIG1vdXNlVXAoZXZlbnQ6IGFueSkge1xuICAgIC8vIGZpbmlzaCBkcmFnZ2luZ1xuICAgIHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBjaGFubmVsTW91c2VPdmVyKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbERyYWdGaXh0dXJlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gcGVyZm9ybSBkcmFnZ2luZ1xuICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBldmVudC50YXJnZXQuZGF0YXNldC5pbmRleDtcbiAgICBjb25zdCBwcm9maWxlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKHRoaXMuY2hhbm5lbERyYWdGaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRNb2RlQnlGaXh0dXJlKHByb2ZpbGUsIHRoaXMuc2VsZWN0ZWRGaXh0dXJlKTtcbiAgICBjb25zdCBjaGFubmVsQ291bnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldE1vZGVDaGFubmVsQ291bnQocHJvZmlsZSwgbW9kZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRJbmRleCAtIHRoaXMuY2hhbm5lbERyYWdPZmZzZXQgPj0gMCAmJiBzZWxlY3RlZEluZGV4IC0gdGhpcy5jaGFubmVsRHJhZ09mZnNldCArIGNoYW5uZWxDb3VudCAtIDEgPD0gNTExKSB7XG4gICAgICB0aGlzLmNoYW5uZWxEcmFnRml4dHVyZS5kbXhGaXJzdENoYW5uZWwgPSBzZWxlY3RlZEluZGV4IC0gdGhpcy5jaGFubmVsRHJhZ09mZnNldDtcbiAgICB9XG4gIH1cblxuICBvaygpIHtcbiAgICAvLyBkb24ndCBhbGxvdyBPSyBpZiBvdmVybGFwcGluZyBmaXh0dXJlcyBleGlzdFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kbXhDaGFubmVscy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhbm5lbE92ZXJsYXBwZWQoaSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5jaGFubmVsLW9jY3VwaWVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWwtb2NjdXBpZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMgPSB0aGlzLmZpeHR1cmVQb29sO1xuXG4gICAgLy8gcmVtb3ZlIGRlbGV0ZWQgZml4dHVyZXMgZnJvbSBwcmVzZXQgZml4dHVyZXNcbiAgICBmb3IgKGxldCBpID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHByZXNldEZpeHR1cmUgPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0Rml4dHVyZXNbaV07XG4gICAgICBmb3IgKGxldCBmaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgICBpZiAocHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9PT0gZml4dHVyZS51dWlkKSB7XG4gICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBuZXcgZml4dHVyZXMgdG8gdGhlIHByZXNldCBmaXh0dXJlc1xuICAgIGZvciAobGV0IGZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzKSB7XG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IHByZXNldEZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldEZpeHR1cmVzKSB7XG4gICAgICAgIGlmIChwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID09PSBmaXh0dXJlLnV1aWQpIHtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxLZXlzID0gdGhpcy5maXh0dXJlU2VydmljZS5maXh0dXJlR2V0VW5pcXVlUGl4ZWxLZXlzKGZpeHR1cmUpO1xuICAgICAgICBpZiAocGl4ZWxLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBmb3IgKGxldCBwaXhlbEtleSBvZiBwaXhlbEtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXNldEZpeHR1cmUgPSBuZXcgUHJlc2V0Rml4dHVyZSgpO1xuICAgICAgICAgICAgcHJlc2V0Rml4dHVyZS5maXh0dXJlVXVpZCA9IGZpeHR1cmUudXVpZDtcbiAgICAgICAgICAgIHByZXNldEZpeHR1cmUucGl4ZWxLZXkgPSBwaXhlbEtleTtcbiAgICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5wdXNoKHByZXNldEZpeHR1cmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwcmVzZXRGaXh0dXJlID0gbmV3IFByZXNldEZpeHR1cmUoKTtcbiAgICAgICAgICBwcmVzZXRGaXh0dXJlLmZpeHR1cmVVdWlkID0gZml4dHVyZS51dWlkO1xuICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRGaXh0dXJlcy5wdXNoKHByZXNldEZpeHR1cmUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maXh0dXJlU2VydmljZS51cGRhdGVDYWNoZWRGaXh0dXJlcygpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5yZW1vdmVEZWxldGVkRml4dHVyZXMoKTtcbiAgICB0aGlzLnByZXZpZXdTZXJ2aWNlLnVwZGF0ZUZpeHR1cmVTZXR1cCgpO1xuICAgIHRoaXMucHJlc2V0U2VydmljZS51cGRhdGVGaXh0dXJlU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5wcmVzZXRTZXJ2aWNlLmZpeHR1cmVTZWxlY3Rpb25DaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnByZXNldFNlcnZpY2UucHJldmlld0xpdmUoKTtcblxuICAgIHRoaXMub25DbG9zZS5uZXh0KDEpO1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNsb3NlLm5leHQoMik7XG4gICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVzKCkge1xuICAgIHRoaXMudXBkYXRpbmdQcm9maWxlcyA9IHRydWU7XG5cbiAgICAvLyBUT0RPXG4gICAgdGhpcy5maXh0dXJlU2VydmljZVxuICAgICAgLnVwZGF0ZVByb2ZpbGVzKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGluZ1Byb2ZpbGVzID0gZmFsc2U7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvcic7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZS1lcnJvci10aXRsZSc7XG5cbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFttc2csIHRpdGxlXSkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5lcnJvcihyZXN1bHRbbXNnXSwgcmVzdWx0W3RpdGxlXSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZFByb2ZpbGVzKCk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5wcm9maWxlcy11cGRhdGVkJztcbiAgICAgICAgY29uc3QgdGl0bGUgPSAnZGVzaWduZXIuZml4dHVyZS1wb29sLnByb2ZpbGVzLXVwZGF0ZWQtdGl0bGUnO1xuXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zdWNjZXNzKHJlc3VsdFttc2ddLCByZXN1bHRbdGl0bGVdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUZpeHR1cmVGcm9tUHJvZmlsZUZpbGUoKSB7XG4gICAgY29uc3QgYnNNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coRml4dHVyZVBvb2xDcmVhdGVGcm9tRmlsZUNvbXBvbmVudCwgeyBrZXlib2FyZDogdHJ1ZSwgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UgfSk7XG4gICAgKGJzTW9kYWxSZWYuY29udGVudCBhcyBGaXh0dXJlUG9vbENyZWF0ZUZyb21GaWxlQ29tcG9uZW50KS5vbkNsb3NlLnN1YnNjcmliZSgocHJvZmlsZTogRml4dHVyZVByb2ZpbGUpID0+IHtcbiAgICAgIGNvbnN0IG5ld0ZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmFkZEZpeHR1cmUocHJvZmlsZSwgdGhpcy5maXh0dXJlUG9vbCk7XG4gICAgICB0aGlzLnNlbGVjdEZpeHR1cmUobmV3Rml4dHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5Ym9hcmRFdmVudChldmVudDogYW55KSB7XG4gICAgdGhpcy5vaygpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudGl0bGUnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cbiAgICAgIDwhLS0gU2VhcmNoIGZvciBwcm9maWxlcyAtLT5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGlucHV0LWJsb2NrIG1iLTNcIlxuICAgICAgICBpZD1cInNlYXJjaFNldFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5zZWFyY2gtcHJvZmlsZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgKGlucHV0KT1cInNlYXJjaEV4cHJlc3Npb24gPSAkZXZlbnQudGFyZ2V0LnZhbHVlOyBmaWx0ZXJQcm9maWxlcygpXCJcbiAgICAgIC8+XG5cbiAgICAgIDwhLS0gUHJvZmlsZXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBib3JkZXItc2Vjb25kYXJ5IHctMTAwXCIgc3R5bGU9XCJoZWlnaHQ6IDIwMHB4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0wIHctMTAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCB3LTEwMFwiPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJsb2FkaW5nUHJvZmlsZXNcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydCBkLWZsZXhcIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wIG14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtcHVsc2UgZmEtZndcIj48L2k+XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvYT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBwcm9maWxlIG9mIGZpbHRlcmVkUHJvZmlsZXMgfCBzb3J0IDogJ3V1aWQnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEwIGNvbC1hdXRvIG15LWF1dG8gcGwtMlwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtYi0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi17eyBmaXh0dXJlU2VydmljZS5nZXRGaXh0dXJlSWNvbkNsYXNzKHByb2ZpbGUpIH19IG1yLTFcIj48L3NwYW4+IHt7IHByb2ZpbGUubWFudWZhY3R1cmVyTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgIHt7IHByb2ZpbGUubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiBteS1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gZmxvYXQtcmlnaHRcIiBocmVmPVwiI1wiIHJvbGU9XCJidXR0b25cIiAoY2xpY2spPVwiYWRkRml4dHVyZShwcm9maWxlKTsgKGZhbHNlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8cCBjbGFzcz1cImQtaW5saW5lLWJsb2NrIG1iLTAgbXQtMlwiPlxuICAgICAgICAgIFBvd2VyZWQgYnkgdGhlIDxhIGhyZWY9XCJodHRwczovL29wZW4tZml4dHVyZS1saWJyYXJ5Lm9yZy9cIiB0YXJnZXQ9XCJfYmxhbmtcIj5PcGVuIEZpeHR1cmUgTGlicmFyeTwvYT5cbiAgICAgICAgPC9wPlxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzPVwibXQtMiBidG4gYnRuLXNlY29uZGFyeSBidG4tc20gZmxvYXQtcmlnaHRcIlxuICAgICAgICAgIGhyZWY9XCJodHRwczovL29wZW4tZml4dHVyZS1saWJyYXJ5Lm9yZy9maXh0dXJlLWVkaXRvclwiXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmFkZC1wcm9maWxlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2E+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImNvbmZpZ1NlcnZpY2UubG9jYWxQcm9maWxlc1wiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtci0yIG10LTIgYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtIGZsb2F0LXJpZ2h0XCJcbiAgICAgICAgICAoY2xpY2spPVwidXBkYXRlUHJvZmlsZXMoKTsgKGZhbHNlKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInVwZGF0aW5nUHJvZmlsZXNcIlxuICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgKm5nSWY9XCJ1cGRhdGluZ1Byb2ZpbGVzXCIgY2xhc3M9XCJmYSBmYS1zcGlubmVyIGZhLXB1bHNlIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIDxpICpuZ0lmPVwiIXVwZGF0aW5nUHJvZmlsZXNcIiBjbGFzcz1cImZhIGZhLWRvd25sb2FkIGZhLWZ3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgIHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wudXBkYXRlLXByb2ZpbGVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICA8IS0tIEFkZCBmaXh0dXJlIGZyb20gbG9jYWwgcHJvZmlsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjcmVhdGVGaXh0dXJlRnJvbVByb2ZpbGVGaWxlKClcIiByb2xlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+IHt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuY3JlYXRlLWZpeHR1cmUtZnJvbS1wcm9maWxlLWZpbGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVW5pdmVyc2UgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWxnLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLnVuaXZlcnNlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLThcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uPlVuaXZlcnNlIDE8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBGaXh0dXJlcyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlci1zZWNvbmRhcnlcIiBzdHlsZT1cImhlaWdodDogMjM1cHhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgW3NvcnRhYmxlanNdPVwiZml4dHVyZVBvb2xcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZml4dHVyZSBvZiBmaXh0dXJlUG9vbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZml4dHVyZSA9PSBzZWxlY3RlZEZpeHR1cmVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0Rml4dHVyZShmaXh0dXJlKVwiXG4gICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBsaXN0LXNvcnQtaGFuZGxlIG15LWF1dG9cIiBzdHlsZT1cImN1cnNvcjogbW92ZTsgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhcnNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGZsZXgtZ3JvdyBwbC0wIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24te3sgZml4dHVyZVNlcnZpY2UuZ2V0Rml4dHVyZUljb25DbGFzcyhmaXh0dXJlU2VydmljZS5nZXRQcm9maWxlQnlVdWlkKGZpeHR1cmUucHJvZmlsZVV1aWQpKSB9fSBtci0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+e3sgZml4dHVyZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIG15LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBmbG9hdC1yaWdodFwiIGhyZWY9XCIjXCIgcm9sZT1cImJ1dHRvblwiIChjbGljayk9XCJyZW1vdmVGaXh0dXJlKGZpeHR1cmUpOyAoZmFsc2UpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWludXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwicm93IG10LTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICA8IS0tIFRhYiBuYXZpZ2F0aW9uIC0tPlxuICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIG1iLTRcIiBpZD1cIm15VGFiXCIgcm9sZT1cInRhYmxpc3RcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cbiAgICAgICAgICA8YSBjbGFzcz1cIm5hdi1saW5rIGFjdGl2ZVwiIGlkPVwic2V0cy10YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIGhyZWY9XCIjZG14XCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJpY29uLW9sYVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5kbXgnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxuICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIiBpZD1cImNvbXBvc2l0aW9ucy10YWJcIiBkYXRhLXRvZ2dsZT1cInRhYlwiIGhyZWY9XCIjc2V0dGluZ3NcIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ge3sgJ2Rlc2lnbmVyLmZpeHR1cmUtcG9vbC5zZXR0aW5ncycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuXG4gICAgICA8IS0tIFRhYiBjb250ZW50IC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRhYi1jb250ZW50XCIgaWQ9XCJteVRhYkNvbnRlbnRcIj5cbiAgICAgICAgPCEtLSBETVggdW5pdmVyc2Ugb3ZlcnZpZXctLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIHNob3cgYWN0aXZlXCIgaWQ9XCJkbXhcIiByb2xlPVwidGFicGFuZWxcIj5cbiAgICAgICAgICA8IS0tIFNob3cgYWxsIGNoYW5uZWwgbnVtYmVycyAtLT5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGZsZXgtZ3Jvd1wiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy0zIGQtZmxleFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBteS1hdXRvIG1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgaWQ9XCJzaG93Q2hhbm5lbE51bWJlcnNcIiBbbmdNb2RlbF09XCJzaG93Q2hhbm5lbE51bWJlcnNcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2hvd0NoYW5uZWxOdW1iZXJzID0gJGV2ZW50XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cInNob3dDaGFubmVsTnVtYmVyc1wiPlNob3cgY2hhbm5lbHM8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gTGlzdCBvZiBETVggY2hhbm5lbHMgLS0+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoYW5uZWwgb2YgZG14Q2hhbm5lbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICBjbGFzcz1cImRteC1jaGFubmVsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLW9jY3VwaWVkXT1cImNoYW5uZWxPY2N1cGllZChpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kbXgtY2hhbm5lbC1vY2N1cGllZC1zdGFydF09XCJjaGFubmVsT2NjdXBpZWRTdGFydChpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kbXgtY2hhbm5lbC1vY2N1cGllZC1lbmRdPVwiY2hhbm5lbE9jY3VwaWVkRW5kKGkpXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRteC1jaGFubmVsLXNlbGVjdGVkXT1cImNoYW5uZWxTZWxlY3RlZChpKVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kbXgtY2hhbm5lbC1vdmVybGFwcGVkXT1cImNoYW5uZWxPdmVybGFwcGVkKGkpXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJjaGFubmVsTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAobW91c2VvdmVyKT1cImNoYW5uZWxNb3VzZU92ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiXG4gICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBpICsgMSB9fVwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwibW91c2VlbnRlcjptb3VzZWxlYXZlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBkbXgtY2hhbm5lbC10ZXh0XCIgW2F0dHIuZGF0YS1pbmRleF09XCJpXCIgW2NsYXNzLmRteC1jaGFubmVsLXRleHQtdmlzaWJsZV09XCJzaG93Q2hhbm5lbE51bWJlcnNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS1hdXRvXCIgc3R5bGU9XCJmb250LXNpemU6IDExcHhcIiBbYXR0ci5kYXRhLWluZGV4XT1cImlcIj48c21hbGwgW2F0dHIuZGF0YS1pbmRleF09XCJpXCI+Jm5ic3A7PC9zbWFsbD48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGaXh0dXJlIHNldHRpbmdzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmVcIiBpZD1cInNldHRpbmdzXCIgcm9sZT1cInRhYnBhbmVsXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRml4dHVyZSAmJiBzZWxlY3RlZEZpeHR1cmVQcm9maWxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWxnLTMgY29sLWZvcm0tbGFiZWxcIiBmb3I9XCJmaXh0dXJlTmFtZVwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuZml4dHVyZS1uYW1lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZpeHR1cmUubmFtZVwiIG1heGxlbmd0aD1cIjIwMFwiIGlkPVwiZml4dHVyZU5hbWVcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLWxnLTMgY29sLWZvcm0tbGFiZWxcIj57eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLm1vZGUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1sZy05XCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlbGVjdGVkRml4dHVyZS5tb2RlU2hvcnROYW1lXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdGVkRml4dHVyZS5tb2RlU2hvcnROYW1lID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtb2RlIG9mIHNlbGVjdGVkRml4dHVyZVByb2ZpbGUubW9kZXNcIiBbbmdWYWx1ZV09XCJtb2RlLnNob3J0TmFtZSB8fCBtb2RlLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgbW9kZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIC0ge3sgZml4dHVyZVNlcnZpY2UuZ2V0TW9kZUNoYW5uZWxDb3VudChzZWxlY3RlZEZpeHR1cmVQcm9maWxlLCBtb2RlKSB9fVxuICAgICAgICAgICAgICAgICAgICB7eyAnZGVzaWduZXIuZml4dHVyZS1wb29sLmNoYW5uZWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPnt7ICdkZXNpZ25lci5maXh0dXJlLXBvb2wuZmlyc3QtY2hhbm5lbCcgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWxnLTlcIj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1zZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwic2VsZWN0ZWRGaXh0dXJlLmRteEZpcnN0Q2hhbm5lbFwiXG4gICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWxlY3RlZEZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gJGV2ZW50XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjaGFubmVsIG9mIGRteENoYW5uZWxzOyBsZXQgaSA9IGluZGV4XCIgW25nVmFsdWVdPVwiaVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBpICsgMSB9fVxuICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbGctMyBjb2wtZm9ybS1sYWJlbFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctOVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImFkZENvcHkoc2VsZWN0ZWRGaXh0dXJlKVwiPlxuICAgICAgICAgICAgICAgICAge3sgJ2Rlc2lnbmVyLmZpeHR1cmUuYWRkLWNvcHknIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gIDxhIGNsYXNzPVwibXItMyBteS1hdXRvXCIgaHJlZj1cIiNcIiByb2xlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbCgpOyAoZmFsc2UpXCI+XG4gICAge3sgJ2Rlc2lnbmVyLm1pc2MuY2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cIm9rKClcIj57eyAnZGVzaWduZXIubWlzYy5vaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbjwvZGl2PlxuIl19
@@ -3,4 +3,4 @@ export class CachedFixture {
3
3
  this.channels = [];
4
4
  }
5
5
  }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkLWZpeHR1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL21vZGVscy9jYWNoZWQtZml4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLE9BQU8sYUFBYTtJQUExQjtRQUlFLGFBQVEsR0FBMkIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi9jYWNoZWQtZml4dHVyZS1jaGFubmVsJztcbmltcG9ydCB7IEZpeHR1cmUgfSBmcm9tICcuL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZU1vZGUgfSBmcm9tICcuL2ZpeHR1cmUtbW9kZSc7XG5pbXBvcnQgeyBGaXh0dXJlUHJvZmlsZSB9IGZyb20gJy4vZml4dHVyZS1wcm9maWxlJztcblxuZXhwb3J0IGNsYXNzIENhY2hlZEZpeHR1cmUge1xuICBmaXh0dXJlOiBGaXh0dXJlO1xuICBwcm9maWxlOiBGaXh0dXJlUHJvZmlsZTtcbiAgbW9kZTogRml4dHVyZU1vZGU7XG4gIGNoYW5uZWxzOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdID0gW107XG59XG4iXX0=
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkLWZpeHR1cmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL21vZGVscy9jYWNoZWQtZml4dHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxNQUFNLE9BQU8sYUFBYTtJQUExQjtRQUtFLGFBQVEsR0FBMkIsRUFBRSxDQUFDO0lBQ3hDLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi9jYWNoZWQtZml4dHVyZS1jaGFubmVsJztcbmltcG9ydCB7IEZpeHR1cmUgfSBmcm9tICcuL2ZpeHR1cmUnO1xuaW1wb3J0IHsgRml4dHVyZU1vZGUgfSBmcm9tICcuL2ZpeHR1cmUtbW9kZSc7XG5pbXBvcnQgeyBGaXh0dXJlUHJvZmlsZSB9IGZyb20gJy4vZml4dHVyZS1wcm9maWxlJztcblxuZXhwb3J0IGNsYXNzIENhY2hlZEZpeHR1cmUge1xuICBmaXh0dXJlOiBGaXh0dXJlO1xuICBwaXhlbEtleTogc3RyaW5nO1xuICBwcm9maWxlOiBGaXh0dXJlUHJvZmlsZTtcbiAgbW9kZTogRml4dHVyZU1vZGU7XG4gIGNoYW5uZWxzOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdID0gW107XG59XG4iXX0=
@@ -0,0 +1,27 @@
1
+ export class FixtureMatrixPixelGroupConstraints {
2
+ constructor(data) {
3
+ // constraint the pixel keys directly
4
+ this.keys = [];
5
+ // constraints by coordinates
6
+ this.x = [];
7
+ this.y = [];
8
+ this.z = [];
9
+ // a name regexp-constraint
10
+ this.name = [];
11
+ if (!data) {
12
+ return;
13
+ }
14
+ if (Array.isArray(data)) {
15
+ // an array of pixel keys
16
+ this.keys = data;
17
+ }
18
+ else {
19
+ // an object of constraints
20
+ this.x = data.x;
21
+ this.y = data.y;
22
+ this.z = data.z;
23
+ this.name = data.name;
24
+ }
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYXRyaXgtcGl4ZWwtZ3JvdXAtY29uc3RyYWludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL21vZGVscy9maXh0dXJlLW1hdHJpeC1waXhlbC1ncm91cC1jb25zdHJhaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0NBQWtDO0lBWTdDLFlBQVksSUFBVTtRQVh0QixxQ0FBcUM7UUFDckMsU0FBSSxHQUFhLEVBQUUsQ0FBQztRQUVwQiw2QkFBNkI7UUFDN0IsTUFBQyxHQUFhLEVBQUUsQ0FBQztRQUNqQixNQUFDLEdBQWEsRUFBRSxDQUFDO1FBQ2pCLE1BQUMsR0FBYSxFQUFFLENBQUM7UUFFakIsMkJBQTJCO1FBQzNCLFNBQUksR0FBYSxFQUFFLENBQUM7UUFHbEIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4Qix5QkFBeUI7WUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTiwyQkFBMkI7WUFDM0IsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRml4dHVyZU1hdHJpeFBpeGVsR3JvdXBDb25zdHJhaW50cyB7XG4gIC8vIGNvbnN0cmFpbnQgdGhlIHBpeGVsIGtleXMgZGlyZWN0bHlcbiAga2V5czogc3RyaW5nW10gPSBbXTtcblxuICAvLyBjb25zdHJhaW50cyBieSBjb29yZGluYXRlc1xuICB4OiBzdHJpbmdbXSA9IFtdO1xuICB5OiBzdHJpbmdbXSA9IFtdO1xuICB6OiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIGEgbmFtZSByZWdleHAtY29uc3RyYWludFxuICBuYW1lOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgLy8gYW4gYXJyYXkgb2YgcGl4ZWwga2V5c1xuICAgICAgdGhpcy5rZXlzID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYW4gb2JqZWN0IG9mIGNvbnN0cmFpbnRzXG4gICAgICB0aGlzLnggPSBkYXRhLng7XG4gICAgICB0aGlzLnkgPSBkYXRhLnk7XG4gICAgICB0aGlzLnogPSBkYXRhLno7XG4gICAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ import { FixtureMatrixPixelGroupConstraints } from './fixture-matrix-pixel-group-constraints';
2
+ export class FixtureMatrixPixelGroup {
3
+ constructor(isAll = false, constraints) {
4
+ this.isAll = false;
5
+ this.constraints = null;
6
+ this.isAll = isAll;
7
+ if (constraints) {
8
+ this.constraints = new FixtureMatrixPixelGroupConstraints(constraints);
9
+ }
10
+ }
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYXRyaXgtcGl4ZWwtZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL21vZGVscy9maXh0dXJlLW1hdHJpeC1waXhlbC1ncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU5RixNQUFNLE9BQU8sdUJBQXVCO0lBSWxDLFlBQVksUUFBaUIsS0FBSyxFQUFFLFdBQWlCO1FBSHJELFVBQUssR0FBWSxLQUFLLENBQUM7UUFDdkIsZ0JBQVcsR0FBdUMsSUFBSSxDQUFDO1FBR3JELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGtDQUFrQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaXh0dXJlTWF0cml4UGl4ZWxHcm91cENvbnN0cmFpbnRzIH0gZnJvbSAnLi9maXh0dXJlLW1hdHJpeC1waXhlbC1ncm91cC1jb25zdHJhaW50cyc7XG5cbmV4cG9ydCBjbGFzcyBGaXh0dXJlTWF0cml4UGl4ZWxHcm91cCB7XG4gIGlzQWxsOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cmFpbnRzOiBGaXh0dXJlTWF0cml4UGl4ZWxHcm91cENvbnN0cmFpbnRzID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihpc0FsbDogYm9vbGVhbiA9IGZhbHNlLCBjb25zdHJhaW50cz86IGFueSkge1xuICAgIHRoaXMuaXNBbGwgPSBpc0FsbDtcbiAgICBpZiAoY29uc3RyYWludHMpIHtcbiAgICAgIHRoaXMuY29uc3RyYWludHMgPSBuZXcgRml4dHVyZU1hdHJpeFBpeGVsR3JvdXBDb25zdHJhaW50cyhjb25zdHJhaW50cyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,25 @@
1
+ import { FixtureMatrixPixelGroup } from './fixture-matrix-pixel-group';
2
+ export class FixtureMatrix {
3
+ constructor(data) {
4
+ this.pixelCount = [];
5
+ this.pixelGroups = {};
6
+ if (!data) {
7
+ return;
8
+ }
9
+ if (data.pixelKeys) {
10
+ this.pixelKeys = data.pixelKeys;
11
+ }
12
+ if (data.pixelCount) {
13
+ for (const pixelCountEntry of data.pixelCount) {
14
+ this.pixelCount.push(pixelCountEntry);
15
+ }
16
+ }
17
+ if (data.pixelGroups) {
18
+ for (const property of Object.keys(data.pixelGroups)) {
19
+ const pixelGroup = new FixtureMatrixPixelGroup(data.pixelGroups[property]);
20
+ this.pixelGroups[property] = pixelGroup;
21
+ }
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tYXRyaXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL21vZGVscy9maXh0dXJlLW1hdHJpeC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUV2RSxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUFZLElBQVU7UUFIdEIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUMxQixnQkFBVyxHQUFRLEVBQUUsQ0FBQztRQUdwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsS0FBSyxNQUFNLGVBQWUsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUF1QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaXh0dXJlTWF0cml4UGl4ZWxHcm91cCB9IGZyb20gJy4vZml4dHVyZS1tYXRyaXgtcGl4ZWwtZ3JvdXAnO1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZU1hdHJpeCB7XG4gIHBpeGVsS2V5czogc3RyaW5nW11bXTtcbiAgcGl4ZWxDb3VudDogbnVtYmVyW10gPSBbXTtcbiAgcGl4ZWxHcm91cHM6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5waXhlbEtleXMpIHtcbiAgICAgIHRoaXMucGl4ZWxLZXlzID0gZGF0YS5waXhlbEtleXM7XG4gICAgfVxuICAgIGlmIChkYXRhLnBpeGVsQ291bnQpIHtcbiAgICAgIGZvciAoY29uc3QgcGl4ZWxDb3VudEVudHJ5IG9mIGRhdGEucGl4ZWxDb3VudCkge1xuICAgICAgICB0aGlzLnBpeGVsQ291bnQucHVzaChwaXhlbENvdW50RW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGF0YS5waXhlbEdyb3Vwcykge1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyhkYXRhLnBpeGVsR3JvdXBzKSkge1xuICAgICAgICBjb25zdCBwaXhlbEdyb3VwID0gbmV3IEZpeHR1cmVNYXRyaXhQaXhlbEdyb3VwKGRhdGEucGl4ZWxHcm91cHNbcHJvcGVydHldKTtcbiAgICAgICAgdGhpcy5waXhlbEdyb3Vwc1twcm9wZXJ0eV0gPSBwaXhlbEdyb3VwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,26 @@
1
+ export class FixtureModeChannel {
2
+ constructor(data) {
3
+ this.repeatFor = [];
4
+ this.templateChannels = [];
5
+ if (!data) {
6
+ return;
7
+ }
8
+ if (typeof data === 'string') {
9
+ this.name = data;
10
+ }
11
+ else if (typeof data === 'object') {
12
+ // after first saving the project, we have a FixtureModeChannel-object, even if it's just a direct channel with a name
13
+ this.name = data.name;
14
+ this.insert = data.insert;
15
+ if (Array.isArray(data.repeatFor)) {
16
+ this.repeatFor = data.repeatFor;
17
+ }
18
+ else {
19
+ this.repeatFor.push(data.repeatFor);
20
+ }
21
+ this.channelOrder = data.channelOrder;
22
+ this.templateChannels = data.templateChannels;
23
+ }
24
+ }
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1tb2RlLWNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL21vZGVscy9maXh0dXJlLW1vZGUtY2hhbm5lbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0JBQWtCO0lBVTdCLFlBQVksSUFBVTtRQUp0QixjQUFTLEdBQWEsRUFBRSxDQUFDO1FBRXpCLHFCQUFnQixHQUFhLEVBQUUsQ0FBQztRQUc5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsc0hBQXNIO1lBQ3RILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUV0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBGaXh0dXJlTW9kZUNoYW5uZWwge1xuICAvLyBkaXJlY3QgcmVmZXJlbmNlIHRvIGFuIGF2YWlsYWJsZSBjaGFubmVsXG4gIG5hbWU6IHN0cmluZztcblxuICAvLyBhIG1hdHJpeCBjaGFubmVsXG4gIGluc2VydDogc3RyaW5nO1xuICByZXBlYXRGb3I6IHN0cmluZ1tdID0gW107XG4gIGNoYW5uZWxPcmRlcjogc3RyaW5nO1xuICB0ZW1wbGF0ZUNoYW5uZWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBhbnkpIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLm5hbWUgPSBkYXRhO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBhZnRlciBmaXJzdCBzYXZpbmcgdGhlIHByb2plY3QsIHdlIGhhdmUgYSBGaXh0dXJlTW9kZUNoYW5uZWwtb2JqZWN0LCBldmVuIGlmIGl0J3MganVzdCBhIGRpcmVjdCBjaGFubmVsIHdpdGggYSBuYW1lXG4gICAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG5cbiAgICAgIHRoaXMuaW5zZXJ0ID0gZGF0YS5pbnNlcnQ7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnJlcGVhdEZvcikpIHtcbiAgICAgICAgdGhpcy5yZXBlYXRGb3IgPSBkYXRhLnJlcGVhdEZvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVwZWF0Rm9yLnB1c2goZGF0YS5yZXBlYXRGb3IpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGFubmVsT3JkZXIgPSBkYXRhLmNoYW5uZWxPcmRlcjtcbiAgICAgIHRoaXMudGVtcGxhdGVDaGFubmVscyA9IGRhdGEudGVtcGxhdGVDaGFubmVscztcbiAgICB9XG4gIH1cbn1cbiJdfQ==