game-lobby-lib 0.0.17 → 0.0.18

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.
@@ -7,6 +7,7 @@ import * as i3 from "@angular/common";
7
7
  export class BannersComponent {
8
8
  constructor(sanitizer, themeService) {
9
9
  this.sanitizer = sanitizer;
10
+ this.themeService = themeService;
10
11
  this.baseUrl = '';
11
12
  this.routerLinkClicked = new EventEmitter();
12
13
  this.bannerOverlay = null;
@@ -22,30 +23,58 @@ export class BannersComponent {
22
23
  this.baseUrl = this.bannerData?.baseUrl || '';
23
24
  }
24
25
  /**
25
- * Bypasses Angular's HTML sanitization so that button HTML (e.g. anchor tags,
26
- * custom attributes, styled text like "Deposit") renders correctly in the
27
- * consuming project. Safe to use here because the content comes from your
28
- * own controlled bannerData input, not from user-generated content.
26
+ * Rewrites all class names on the injected button HTML to namespaced equivalents
27
+ * prefixed with "lobby_". This prevents the host project's Bootstrap/jQuery stylesheets
28
+ * from targeting generic class names like "btn", "logged-in" etc. and altering
29
+ * the button appearance or triggering jQuery handlers that crash with
30
+ * "Cannot read properties of undefined (reading 'display')".
31
+ *
32
+ * e.g. class="btn cm-slider__btn--cta logged-in"
33
+ * => class="lobby_btn lobby_cm-slider__btn--cta lobby_logged-in"
29
34
  */
30
35
  getSafeHtml(html) {
31
36
  if (!html)
32
37
  return '';
38
+ try {
39
+ const parser = new DOMParser();
40
+ const doc = parser.parseFromString(html, 'text/html');
41
+ const el = doc.body.firstElementChild;
42
+ if (el) {
43
+ // Rewrite each class to a namespaced lobby_ version so the host project
44
+ // stylesheets and jQuery plugins cannot match them
45
+ const originalClasses = Array.from(el.classList);
46
+ el.setAttribute('class', originalClasses.map(c => `lobby_${c}`).join(' '));
47
+ // Remove routerlink so the host project jQuery does not try to handle it.
48
+ // Navigation is handled by Angular's (click) binding on the parent div.
49
+ el.removeAttribute('routerlink');
50
+ // Neutralise the anchor href so the browser does not navigate on click.
51
+ // The parent div's (click) output handles routing instead.
52
+ el.setAttribute('href', 'javascript:void(0)');
53
+ html = el.outerHTML;
54
+ }
55
+ }
56
+ catch (e) {
57
+ console.error('BannersComponent: error rewriting button HTML classes', e);
58
+ }
33
59
  return this.sanitizer.bypassSecurityTrustHtml(html);
34
60
  }
35
- getRouterLinkFromButton(buttonHtml) {
36
- if (!buttonHtml || typeof buttonHtml !== 'string') {
61
+ getRouterLinkFromButton(buttonHtml, event) {
62
+ // Stop the click bubbling up to the host project's jQuery/global listeners
63
+ // which throw "Cannot read properties of undefined (reading 'display')"
64
+ if (event) {
65
+ event.stopPropagation();
66
+ event.preventDefault();
67
+ }
68
+ if (!buttonHtml) {
37
69
  this.routerLinkClicked.emit('');
38
70
  return;
39
71
  }
40
72
  try {
41
73
  const parser = new DOMParser();
42
74
  const doc = parser.parseFromString(buttonHtml, 'text/html');
43
- if (!doc) {
44
- this.routerLinkClicked.emit('');
45
- return;
46
- }
75
+ // Read the original routerlink from the raw HTML before getSafeHtml strips it
47
76
  const anchor = doc.querySelector('a[routerlink]');
48
- if (anchor && anchor.hasAttribute('routerlink')) {
77
+ if (anchor) {
49
78
  const routerLink = anchor.getAttribute('routerlink');
50
79
  this.routerLinkClicked.emit(routerLink || '');
51
80
  }
@@ -54,16 +83,16 @@ export class BannersComponent {
54
83
  }
55
84
  }
56
85
  catch (error) {
57
- console.error('Error parsing button HTML:', error);
86
+ console.error('BannersComponent: error parsing button HTML', error);
58
87
  this.routerLinkClicked.emit('');
59
88
  }
60
89
  }
61
90
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BannersComponent, deps: [{ token: i1.DomSanitizer }, { token: i2.GameLobbyThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
62
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BannersComponent, isStandalone: true, selector: "app-banners", inputs: { bannerData: "bannerData", theme: "theme", bannerOverlay: "bannerOverlay" }, outputs: { routerLinkClicked: "routerLinkClicked" }, viewQueries: [{ propertyName: "btnSpans", predicate: ["btnSpan"], descendants: true }], ngImport: i0, template: "<div class=\"lobby_cm-banner\">\r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container class=\"my-swiper\" slides-per-view=\"1\" pagination=\"true\" pagination-clickable=\"true\" speed=\"500\"\r\n [loop]=\"slides.length > 1\" autoplay=\"true\" autoplay-delay=\"15000\" css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div *ngIf=\"slide && slide.button\" [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n <div class=\"lobby_cm-slider__btn\" [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\" (mouseenter)=\"hoveredSlideId = slide.id\" (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button)\">\r\n <!-- getSafeHtml() bypasses Angular sanitization so button text (e.g. \"Deposit\")\r\n and any anchor/custom attributes render correctly in the consuming project -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important;justify-content:flex-end!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important;justify-content:flex-end!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], encapsulation: i0.ViewEncapsulation.None }); }
91
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BannersComponent, isStandalone: true, selector: "app-banners", inputs: { bannerData: "bannerData", theme: "theme", bannerOverlay: "bannerOverlay" }, outputs: { routerLinkClicked: "routerLinkClicked" }, viewQueries: [{ propertyName: "btnSpans", predicate: ["btnSpan"], descendants: true }], ngImport: i0, template: "<div class=\"lobby_cm-banner\"> \r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container\r\n class=\"my-swiper\"\r\n slides-per-view=\"1\"\r\n pagination=\"true\"\r\n pagination-clickable=\"true\"\r\n speed=\"500\"\r\n [loop]=\"slides.length > 1\"\r\n autoplay=\"true\"\r\n autoplay-delay=\"150000\"\r\n css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n\r\n <!-- Only render when slide.button has content \u2014 prevents jQuery scripts\r\n in the host project from querying an empty element and throwing\r\n \"Cannot read properties of undefined (reading 'display')\" -->\r\n <ng-container *ngIf=\"slide.button\">\r\n <div class=\"lobby_cm-slider__btn\"\r\n [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\"\r\n (mouseenter)=\"hoveredSlideId = slide.id\"\r\n (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button, $event)\">\r\n <!-- getSafeHtml() does two things:\r\n 1. Rewrites class names e.g. \"btn\" => \"lobby_btn\" so host Bootstrap/jQuery\r\n stylesheets cannot match and alter them\r\n 2. Bypasses Angular sanitization so the anchor tag and its text render fully -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{display:inline-block!important;font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px!important;text-decoration:none!important;color:inherit!important;background:transparent!important;cursor:pointer!important}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], encapsulation: i0.ViewEncapsulation.None }); }
63
92
  }
64
93
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BannersComponent, decorators: [{
65
94
  type: Component,
66
- args: [{ selector: 'app-banners', standalone: true, imports: [CommonModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], encapsulation: ViewEncapsulation.None, template: "<div class=\"lobby_cm-banner\">\r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container class=\"my-swiper\" slides-per-view=\"1\" pagination=\"true\" pagination-clickable=\"true\" speed=\"500\"\r\n [loop]=\"slides.length > 1\" autoplay=\"true\" autoplay-delay=\"15000\" css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div *ngIf=\"slide && slide.button\" [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n <div class=\"lobby_cm-slider__btn\" [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\" (mouseenter)=\"hoveredSlideId = slide.id\" (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button)\">\r\n <!-- getSafeHtml() bypasses Angular sanitization so button text (e.g. \"Deposit\")\r\n and any anchor/custom attributes render correctly in the consuming project -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important;justify-content:flex-end!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important;justify-content:flex-end!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"] }]
95
+ args: [{ selector: 'app-banners', standalone: true, imports: [CommonModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], encapsulation: ViewEncapsulation.None, template: "<div class=\"lobby_cm-banner\"> \r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container\r\n class=\"my-swiper\"\r\n slides-per-view=\"1\"\r\n pagination=\"true\"\r\n pagination-clickable=\"true\"\r\n speed=\"500\"\r\n [loop]=\"slides.length > 1\"\r\n autoplay=\"true\"\r\n autoplay-delay=\"150000\"\r\n css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n\r\n <!-- Only render when slide.button has content \u2014 prevents jQuery scripts\r\n in the host project from querying an empty element and throwing\r\n \"Cannot read properties of undefined (reading 'display')\" -->\r\n <ng-container *ngIf=\"slide.button\">\r\n <div class=\"lobby_cm-slider__btn\"\r\n [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\"\r\n (mouseenter)=\"hoveredSlideId = slide.id\"\r\n (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button, $event)\">\r\n <!-- getSafeHtml() does two things:\r\n 1. Rewrites class names e.g. \"btn\" => \"lobby_btn\" so host Bootstrap/jQuery\r\n stylesheets cannot match and alter them\r\n 2. Bypasses Angular sanitization so the anchor tag and its text render fully -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{display:inline-block!important;font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px!important;text-decoration:none!important;color:inherit!important;background:transparent!important;cursor:pointer!important}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"] }]
67
96
  }], ctorParameters: () => [{ type: i1.DomSanitizer }, { type: i2.GameLobbyThemeService }], propDecorators: { btnSpans: [{
68
97
  type: ViewChildren,
69
98
  args: ['btnSpan']
@@ -76,4 +105,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
76
105
  }], bannerOverlay: [{
77
106
  type: Input
78
107
  }] } });
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFubmVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1lLWxvYmJ5LWxpYi9zcmMvbGliL2Jhbm5lcnMvYmFubmVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1lLWxvYmJ5LWxpYi9zcmMvbGliL2Jhbm5lcnMvYmFubmVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBVSxZQUFZLEVBQUUsaUJBQWlCLEVBQXlCLE1BQU0sRUFBRSxZQUFZLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDNUssT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQWMvQyxNQUFNLE9BQU8sZ0JBQWdCO0lBVzNCLFlBQ1UsU0FBdUIsRUFDL0IsWUFBbUM7UUFEM0IsY0FBUyxHQUFULFNBQVMsQ0FBYztRQVBqQyxZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ1gsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNoRCxrQkFBYSxHQUE0QixJQUFJLENBQUM7UUFDdkQsV0FBTSxHQUFVLEVBQUUsQ0FBQztRQUNuQixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFNbkMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxJQUFZO1FBQ3RCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxVQUFrQjtRQUN4QyxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7K0dBOURVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLDBTQ2Y3Qiw2N0NBc0JNLHcxSERiTSxZQUFZOzs0RkFNWCxnQkFBZ0I7a0JBVDVCLFNBQVM7K0JBQ0UsYUFBYSxjQUNYLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxXQUNkLENBQUMsc0JBQXNCLENBQUMsaUJBR2xCLGlCQUFpQixDQUFDLElBQUk7cUhBR1osUUFBUTtzQkFBaEMsWUFBWTt1QkFBQyxTQUFTO2dCQUVkLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRSxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGRyZW4sIFZpZXdFbmNhcHN1bGF0aW9uLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEdhbWVMb2JieVRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lL3RoZW1lU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2FtZUxvYmJ5VGhlbWUgfSBmcm9tICcuLi90aGVtZS9kZWZhdWx0LXRoZW1lJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhbm5lcnMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYW5uZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYmFubmVycy5jb21wb25lbnQuc2NzcycsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFubmVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZHJlbignYnRuU3BhbicpIGJ0blNwYW5zITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG5cclxuICBASW5wdXQoKSBiYW5uZXJEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgdGhlbWU/OiBHYW1lTG9iYnlUaGVtZTtcclxuICBiYXNlVXJsOiBzdHJpbmcgPSAnJztcclxuICBAT3V0cHV0KCkgcm91dGVyTGlua0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBASW5wdXQoKSBiYW5uZXJPdmVybGF5OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgc2xpZGVzOiBhbnlbXSA9IFtdO1xyXG4gIGhvdmVyZWRTbGlkZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgdGhlbWVTZXJ2aWNlOiBHYW1lTG9iYnlUaGVtZVNlcnZpY2VcclxuICApIHtcclxuICAgIHRoZW1lU2VydmljZS50aGVtZSQuc3Vic2NyaWJlKHQgPT4gKHRoaXMudGhlbWUgPSB0KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0RGF0YVRoZW1lcygpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGF0YVRoZW1lcygpOiB2b2lkIHtcclxuICAgIHRoaXMuc2xpZGVzID0gdGhpcy5iYW5uZXJEYXRhPy5iYW5uZXJEYXRhIHx8IFtdO1xyXG4gICAgdGhpcy5iYXNlVXJsID0gdGhpcy5iYW5uZXJEYXRhPy5iYXNlVXJsIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnlwYXNzZXMgQW5ndWxhcidzIEhUTUwgc2FuaXRpemF0aW9uIHNvIHRoYXQgYnV0dG9uIEhUTUwgKGUuZy4gYW5jaG9yIHRhZ3MsXHJcbiAgICogY3VzdG9tIGF0dHJpYnV0ZXMsIHN0eWxlZCB0ZXh0IGxpa2UgXCJEZXBvc2l0XCIpIHJlbmRlcnMgY29ycmVjdGx5IGluIHRoZVxyXG4gICAqIGNvbnN1bWluZyBwcm9qZWN0LiBTYWZlIHRvIHVzZSBoZXJlIGJlY2F1c2UgdGhlIGNvbnRlbnQgY29tZXMgZnJvbSB5b3VyXHJcbiAgICogb3duIGNvbnRyb2xsZWQgYmFubmVyRGF0YSBpbnB1dCwgbm90IGZyb20gdXNlci1nZW5lcmF0ZWQgY29udGVudC5cclxuICAgKi9cclxuICBnZXRTYWZlSHRtbChodG1sOiBzdHJpbmcpOiBTYWZlSHRtbCB7XHJcbiAgICBpZiAoIWh0bWwpIHJldHVybiAnJztcclxuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChodG1sKTtcclxuICB9XHJcblxyXG4gIGdldFJvdXRlckxpbmtGcm9tQnV0dG9uKGJ1dHRvbkh0bWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFidXR0b25IdG1sIHx8IHR5cGVvZiBidXR0b25IdG1sICE9PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLnJvdXRlckxpbmtDbGlja2VkLmVtaXQoJycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGJ1dHRvbkh0bWwsICd0ZXh0L2h0bWwnKTtcclxuICAgICAgaWYgKCFkb2MpIHtcclxuICAgICAgICB0aGlzLnJvdXRlckxpbmtDbGlja2VkLmVtaXQoJycpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBhbmNob3IgPSBkb2MucXVlcnlTZWxlY3RvcignYVtyb3V0ZXJsaW5rXScpO1xyXG4gICAgICBpZiAoYW5jaG9yICYmIGFuY2hvci5oYXNBdHRyaWJ1dGUoJ3JvdXRlcmxpbmsnKSkge1xyXG4gICAgICAgIGNvbnN0IHJvdXRlckxpbmsgPSBhbmNob3IuZ2V0QXR0cmlidXRlKCdyb3V0ZXJsaW5rJyk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJMaW5rQ2xpY2tlZC5lbWl0KHJvdXRlckxpbmsgfHwgJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucm91dGVyTGlua0NsaWNrZWQuZW1pdCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgYnV0dG9uIEhUTUw6JywgZXJyb3IpO1xyXG4gICAgICB0aGlzLnJvdXRlckxpbmtDbGlja2VkLmVtaXQoJycpO1xyXG4gICAgfVxyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJsb2JieV9jbS1iYW5uZXJcIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmFubmVyT3ZlcmxheVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImJhbm5lck92ZXJsYXlcIj48L25nLWNvbnRhaW5lcj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuICA8c3dpcGVyLWNvbnRhaW5lciBjbGFzcz1cIm15LXN3aXBlclwiIHNsaWRlcy1wZXItdmlldz1cIjFcIiBwYWdpbmF0aW9uPVwidHJ1ZVwiIHBhZ2luYXRpb24tY2xpY2thYmxlPVwidHJ1ZVwiIHNwZWVkPVwiNTAwXCJcclxuICAgIFtsb29wXT1cInNsaWRlcy5sZW5ndGggPiAxXCIgYXV0b3BsYXk9XCJ0cnVlXCIgYXV0b3BsYXktZGVsYXk9XCIxNTAwMFwiIGNzcy1tb2RlPVwidHJ1ZVwiPlxyXG4gICAgPHN3aXBlci1zbGlkZSAqbmdGb3I9XCJsZXQgc2xpZGUgb2Ygc2xpZGVzXCI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzbGlkZSAmJiBzbGlkZS5idXR0b25cIiBbaWRdPVwic2xpZGUuaWRcIiBjbGFzcz1cImxvYmJ5X3NsaWRlV3JhcHBlclwiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJiYXNlVXJsICsgJy91cGxvYWRzL2Jhbm5lci8nICsgc2xpZGUuaW1hZ2VQYXRoXCIgW2FsdF09XCJzbGlkZS5uYW1lXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYmJ5X2NtLXNsaWRlcl9fYnRuXCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGhvdmVyZWRTbGlkZUlkID09PSBzbGlkZS5pZCA/ICh0aGVtZT8uYmFja2dyb3VuZCB8fCAnIzI2MjYyNicpIDogKHRoZW1lPy5idXR0b25CYWNrZ3JvdW5kQ29sb3IgfHwgJycpLFxyXG4gICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8udGV4dENvbG9yIHx8ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXIgfHwgJ25vbmUnXHJcbiAgICAgICAgICAgICB9XCIgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZFNsaWRlSWQgPSBzbGlkZS5pZFwiIChtb3VzZWxlYXZlKT1cImhvdmVyZWRTbGlkZUlkID0gbnVsbFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZ2V0Um91dGVyTGlua0Zyb21CdXR0b24oc2xpZGUuYnV0dG9uKVwiPlxyXG4gICAgICAgICAgPCEtLSBnZXRTYWZlSHRtbCgpIGJ5cGFzc2VzIEFuZ3VsYXIgc2FuaXRpemF0aW9uIHNvIGJ1dHRvbiB0ZXh0IChlLmcuIFwiRGVwb3NpdFwiKVxyXG4gICAgICAgICAgICAgICBhbmQgYW55IGFuY2hvci9jdXN0b20gYXR0cmlidXRlcyByZW5kZXIgY29ycmVjdGx5IGluIHRoZSBjb25zdW1pbmcgcHJvamVjdCAtLT5cclxuICAgICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwiZ2V0U2FmZUh0bWwoc2xpZGUuYnV0dG9uKVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3N3aXBlci1zbGlkZT5cclxuICA8L3N3aXBlci1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFubmVycy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1lLWxvYmJ5LWxpYi9zcmMvbGliL2Jhbm5lcnMvYmFubmVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1lLWxvYmJ5LWxpYi9zcmMvbGliL2Jhbm5lcnMvYmFubmVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHNCQUFzQixFQUN0QixLQUFLLEVBRUwsWUFBWSxFQUNaLGlCQUFpQixFQUdqQixNQUFNLEVBQ04sWUFBWSxFQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7QUFjL0MsTUFBTSxPQUFPLGdCQUFnQjtJQVczQixZQUNVLFNBQXVCLEVBQ3ZCLFlBQW1DO1FBRG5DLGNBQVMsR0FBVCxTQUFTLENBQWM7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQXVCO1FBUjdDLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDWCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2hELGtCQUFhLEdBQTRCLElBQUksQ0FBQztRQUN2RCxXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQU1uQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDaEQs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QjttR0FBaEIsZ0JBQWdCLDBTQzNCN0IsZy9EQTBDTSxnc0lEckJNLFlBQVk7OzRGQU1YLGdCQUFnQjtrQkFUNUIsU0FBUzsrQkFDRSxhQUFhLGNBQ1gsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFdBQ2QsQ0FBQyxzQkFBc0IsQ0FBQyxpQkFHbEIsaUJBQWlCLENBQUMsSUFBSTtxSEFHWixRQUFRO3NCQUFoQyxZQUFZO3VCQUFDLFNBQVM7Z0JBRWQsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNFLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBUZW1wbGF0ZVJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IEdhbWVMb2JieVRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lL3RoZW1lU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2FtZUxvYmJ5VGhlbWUgfSBmcm9tICcuLi90aGVtZS9kZWZhdWx0LXRoZW1lJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhbm5lcnMnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9iYW5uZXJzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYmFubmVycy5jb21wb25lbnQuc2NzcycsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFubmVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQFZpZXdDaGlsZHJlbignYnRuU3BhbicpIGJ0blNwYW5zITogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG5cclxuICBASW5wdXQoKSBiYW5uZXJEYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgdGhlbWU/OiBHYW1lTG9iYnlUaGVtZTtcclxuICBiYXNlVXJsOiBzdHJpbmcgPSAnJztcclxuICBAT3V0cHV0KCkgcm91dGVyTGlua0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBASW5wdXQoKSBiYW5uZXJPdmVybGF5OiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgc2xpZGVzOiBhbnlbXSA9IFtdO1xyXG4gIGhvdmVyZWRTbGlkZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICAgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IEdhbWVMb2JieVRoZW1lU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhlbWVTZXJ2aWNlLnRoZW1lJC5zdWJzY3JpYmUodCA9PiAodGhpcy50aGVtZSA9IHQpKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXREYXRhVGhlbWVzKCk7XHJcbiAgfVxyXG5cclxuICBzZXREYXRhVGhlbWVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zbGlkZXMgPSB0aGlzLmJhbm5lckRhdGE/LmJhbm5lckRhdGEgfHwgW107XHJcbiAgICB0aGlzLmJhc2VVcmwgPSB0aGlzLmJhbm5lckRhdGE/LmJhc2VVcmwgfHwgJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXdyaXRlcyBhbGwgY2xhc3MgbmFtZXMgb24gdGhlIGluamVjdGVkIGJ1dHRvbiBIVE1MIHRvIG5hbWVzcGFjZWQgZXF1aXZhbGVudHNcclxuICAgKiBwcmVmaXhlZCB3aXRoIFwibG9iYnlfXCIuIFRoaXMgcHJldmVudHMgdGhlIGhvc3QgcHJvamVjdCdzIEJvb3RzdHJhcC9qUXVlcnkgc3R5bGVzaGVldHNcclxuICAgKiBmcm9tIHRhcmdldGluZyBnZW5lcmljIGNsYXNzIG5hbWVzIGxpa2UgXCJidG5cIiwgXCJsb2dnZWQtaW5cIiBldGMuIGFuZCBhbHRlcmluZ1xyXG4gICAqIHRoZSBidXR0b24gYXBwZWFyYW5jZSBvciB0cmlnZ2VyaW5nIGpRdWVyeSBoYW5kbGVycyB0aGF0IGNyYXNoIHdpdGhcclxuICAgKiBcIkNhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkIChyZWFkaW5nICdkaXNwbGF5JylcIi5cclxuICAgKlxyXG4gICAqIGUuZy4gY2xhc3M9XCJidG4gY20tc2xpZGVyX19idG4tLWN0YSBsb2dnZWQtaW5cIlxyXG4gICAqICAgPT4gY2xhc3M9XCJsb2JieV9idG4gbG9iYnlfY20tc2xpZGVyX19idG4tLWN0YSBsb2JieV9sb2dnZWQtaW5cIlxyXG4gICAqL1xyXG4gIGdldFNhZmVIdG1sKGh0bWw6IHN0cmluZyk6IFNhZmVIdG1sIHtcclxuICAgIGlmICghaHRtbCkgcmV0dXJuICcnO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XHJcbiAgICAgIGNvbnN0IGVsID0gZG9jLmJvZHkuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcblxyXG4gICAgICBpZiAoZWwpIHtcclxuICAgICAgICAvLyBSZXdyaXRlIGVhY2ggY2xhc3MgdG8gYSBuYW1lc3BhY2VkIGxvYmJ5XyB2ZXJzaW9uIHNvIHRoZSBob3N0IHByb2plY3RcclxuICAgICAgICAvLyBzdHlsZXNoZWV0cyBhbmQgalF1ZXJ5IHBsdWdpbnMgY2Fubm90IG1hdGNoIHRoZW1cclxuICAgICAgICBjb25zdCBvcmlnaW5hbENsYXNzZXMgPSBBcnJheS5mcm9tKGVsLmNsYXNzTGlzdCk7XHJcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKFxyXG4gICAgICAgICAgJ2NsYXNzJyxcclxuICAgICAgICAgIG9yaWdpbmFsQ2xhc3Nlcy5tYXAoYyA9PiBgbG9iYnlfJHtjfWApLmpvaW4oJyAnKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSByb3V0ZXJsaW5rIHNvIHRoZSBob3N0IHByb2plY3QgalF1ZXJ5IGRvZXMgbm90IHRyeSB0byBoYW5kbGUgaXQuXHJcbiAgICAgICAgLy8gTmF2aWdhdGlvbiBpcyBoYW5kbGVkIGJ5IEFuZ3VsYXIncyAoY2xpY2spIGJpbmRpbmcgb24gdGhlIHBhcmVudCBkaXYuXHJcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdyb3V0ZXJsaW5rJyk7XHJcblxyXG4gICAgICAgIC8vIE5ldXRyYWxpc2UgdGhlIGFuY2hvciBocmVmIHNvIHRoZSBicm93c2VyIGRvZXMgbm90IG5hdmlnYXRlIG9uIGNsaWNrLlxyXG4gICAgICAgIC8vIFRoZSBwYXJlbnQgZGl2J3MgKGNsaWNrKSBvdXRwdXQgaGFuZGxlcyByb3V0aW5nIGluc3RlYWQuXHJcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdocmVmJywgJ2phdmFzY3JpcHQ6dm9pZCgwKScpO1xyXG5cclxuICAgICAgICBodG1sID0gZWwub3V0ZXJIVE1MO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Jhbm5lcnNDb21wb25lbnQ6IGVycm9yIHJld3JpdGluZyBidXR0b24gSFRNTCBjbGFzc2VzJywgZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGh0bWwpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Um91dGVyTGlua0Zyb21CdXR0b24oYnV0dG9uSHRtbDogc3RyaW5nLCBldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIFN0b3AgdGhlIGNsaWNrIGJ1YmJsaW5nIHVwIHRvIHRoZSBob3N0IHByb2plY3QncyBqUXVlcnkvZ2xvYmFsIGxpc3RlbmVyc1xyXG4gICAgLy8gd2hpY2ggdGhyb3cgXCJDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZCAocmVhZGluZyAnZGlzcGxheScpXCJcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWJ1dHRvbkh0bWwpIHtcclxuICAgICAgdGhpcy5yb3V0ZXJMaW5rQ2xpY2tlZC5lbWl0KCcnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhidXR0b25IdG1sLCAndGV4dC9odG1sJyk7XHJcbiAgICAgIC8vIFJlYWQgdGhlIG9yaWdpbmFsIHJvdXRlcmxpbmsgZnJvbSB0aGUgcmF3IEhUTUwgYmVmb3JlIGdldFNhZmVIdG1sIHN0cmlwcyBpdFxyXG4gICAgICBjb25zdCBhbmNob3IgPSBkb2MucXVlcnlTZWxlY3RvcignYVtyb3V0ZXJsaW5rXScpO1xyXG5cclxuICAgICAgaWYgKGFuY2hvcikge1xyXG4gICAgICAgIGNvbnN0IHJvdXRlckxpbmsgPSBhbmNob3IuZ2V0QXR0cmlidXRlKCdyb3V0ZXJsaW5rJyk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXJMaW5rQ2xpY2tlZC5lbWl0KHJvdXRlckxpbmsgfHwgJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucm91dGVyTGlua0NsaWNrZWQuZW1pdCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Jhbm5lcnNDb21wb25lbnQ6IGVycm9yIHBhcnNpbmcgYnV0dG9uIEhUTUwnLCBlcnJvcik7XHJcbiAgICAgIHRoaXMucm91dGVyTGlua0NsaWNrZWQuZW1pdCgnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cImxvYmJ5X2NtLWJhbm5lclwiPiBcclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmFubmVyT3ZlcmxheVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYmFubmVyT3ZlcmxheVwiPjwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG4gIDxzd2lwZXItY29udGFpbmVyXHJcbiAgICBjbGFzcz1cIm15LXN3aXBlclwiXHJcbiAgICBzbGlkZXMtcGVyLXZpZXc9XCIxXCJcclxuICAgIHBhZ2luYXRpb249XCJ0cnVlXCJcclxuICAgIHBhZ2luYXRpb24tY2xpY2thYmxlPVwidHJ1ZVwiXHJcbiAgICBzcGVlZD1cIjUwMFwiXHJcbiAgICBbbG9vcF09XCJzbGlkZXMubGVuZ3RoID4gMVwiXHJcbiAgICBhdXRvcGxheT1cInRydWVcIlxyXG4gICAgYXV0b3BsYXktZGVsYXk9XCIxNTAwMDBcIlxyXG4gICAgY3NzLW1vZGU9XCJ0cnVlXCI+XHJcbiAgICA8c3dpcGVyLXNsaWRlICpuZ0Zvcj1cImxldCBzbGlkZSBvZiBzbGlkZXNcIj5cclxuICAgICAgPGRpdiBbaWRdPVwic2xpZGUuaWRcIiBjbGFzcz1cImxvYmJ5X3NsaWRlV3JhcHBlclwiPlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJiYXNlVXJsICsgJy91cGxvYWRzL2Jhbm5lci8nICsgc2xpZGUuaW1hZ2VQYXRoXCIgW2FsdF09XCJzbGlkZS5uYW1lXCI+XHJcblxyXG4gICAgICAgIDwhLS0gT25seSByZW5kZXIgd2hlbiBzbGlkZS5idXR0b24gaGFzIGNvbnRlbnQg4oCUIHByZXZlbnRzIGpRdWVyeSBzY3JpcHRzXHJcbiAgICAgICAgICAgICBpbiB0aGUgaG9zdCBwcm9qZWN0IGZyb20gcXVlcnlpbmcgYW4gZW1wdHkgZWxlbWVudCBhbmQgdGhyb3dpbmdcclxuICAgICAgICAgICAgIFwiQ2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiB1bmRlZmluZWQgKHJlYWRpbmcgJ2Rpc3BsYXknKVwiIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzbGlkZS5idXR0b25cIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2JieV9jbS1zbGlkZXJfX2J0blwiXHJcbiAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGhvdmVyZWRTbGlkZUlkID09PSBzbGlkZS5pZCA/ICh0aGVtZT8uYmFja2dyb3VuZCB8fCAnIzI2MjYyNicpIDogKHRoZW1lPy5idXR0b25CYWNrZ3JvdW5kQ29sb3IgfHwgJycpLFxyXG4gICAgICAgICAgICAgICAgICdjb2xvcic6IHRoZW1lPy50ZXh0Q29sb3IgfHwgJyNmZmYnLFxyXG4gICAgICAgICAgICAgICAgICdib3JkZXInOiB0aGVtZT8uYm9yZGVyIHx8ICdub25lJ1xyXG4gICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZFNsaWRlSWQgPSBzbGlkZS5pZFwiXHJcbiAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRTbGlkZUlkID0gbnVsbFwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJnZXRSb3V0ZXJMaW5rRnJvbUJ1dHRvbihzbGlkZS5idXR0b24sICRldmVudClcIj5cclxuICAgICAgICAgICAgPCEtLSBnZXRTYWZlSHRtbCgpIGRvZXMgdHdvIHRoaW5nczpcclxuICAgICAgICAgICAgICAgICAxLiBSZXdyaXRlcyBjbGFzcyBuYW1lcyBlLmcuIFwiYnRuXCIgPT4gXCJsb2JieV9idG5cIiBzbyBob3N0IEJvb3RzdHJhcC9qUXVlcnlcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0cyBjYW5ub3QgbWF0Y2ggYW5kIGFsdGVyIHRoZW1cclxuICAgICAgICAgICAgICAgICAyLiBCeXBhc3NlcyBBbmd1bGFyIHNhbml0aXphdGlvbiBzbyB0aGUgYW5jaG9yIHRhZyBhbmQgaXRzIHRleHQgcmVuZGVyIGZ1bGx5IC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImdldFNhZmVIdG1sKHNsaWRlLmJ1dHRvbilcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9zd2lwZXItc2xpZGU+XHJcbiAgPC9zd2lwZXItY29udGFpbmVyPlxyXG48L2Rpdj4iXX0=
@@ -418,4 +418,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
418
418
  type: ViewChild,
419
419
  args: ['searchInput']
420
420
  }] } });
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzaW5vLWxvYmJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbWUtbG9iYnktbGliL3NyYy9saWIvY2FzaW5vLWxvYmJ5L2Nhc2luby1sb2JieS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1lLWxvYmJ5LWxpYi9zcmMvbGliL2Nhc2luby1sb2JieS9jYXNpbm8tbG9iYnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFvQyxzQkFBc0IsRUFBRSxZQUFZLEVBQXlCLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekwsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBV3BFLE1BQU0sT0FBTyxvQkFBb0I7SUFpQy9CLFlBQVksWUFBbUMsRUFBVSxtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQWhDakcsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUNwQyxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFHM0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRzFDLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFFOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsaUJBQVksR0FBVSxFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7UUFDM0Qsa0JBQWEsR0FBa0IsSUFBSSxDQUFD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QkFDekIsV0FBVztzQkFBcEIsTUFBTTtnQkFDRSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFxQm9CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEdhbWVMb2JieVRoZW1lIH0gZnJvbSAnLi4vdGhlbWUvZGVmYXVsdC10aGVtZSc7XHJcbmltcG9ydCB7IEdhbWVMb2JieVRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lL3RoZW1lU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9iYnlHYW1lcywgR2FtZUdyb3VwLCBHYW1lR3JvdXBzUmVzcG9uc2UsIEdhbWVMb2JieSB9IGZyb20gJy4uL2dhbWUtbG9iYnktbGliLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHYW1lTG9iYnlMaWJTZXJ2aWNlIH0gZnJvbSAnLi4vZ2FtZS1sb2JieS1saWIuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBtYXAsIG9mLCBzd2l0Y2hNYXAsIHRhcCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FzaW5vLWxvYmJ5JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FzaW5vLWxvYmJ5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY2FzaW5vLWxvYmJ5LmNvbXBvbmVudC5zY3NzJyxcclxuICAvLyBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXNpbm9Mb2JieUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgaG92ZXJlZFNsaWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGhvdmVyZWRCdXR0b246IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGhvdmVyZWRHYW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBAVmlld0NoaWxkKCdzd2lwZXJDb250YWluZXInKSBzd2lwZXJDb250YWluZXI6IGFueTtcclxuICBAVmlld0NoaWxkcmVuKCdnYW1lU3dpcGVyQ29udGFpbmVyJykgZ2FtZVN3aXBlckNvbnRhaW5lcnMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgQE91dHB1dCgpIGdhbWVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQElucHV0KCkgY2FzaW5vRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHRoZW1lPzogR2FtZUxvYmJ5VGhlbWU7XHJcbiAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgYnJhbmRDb25maWc6IGFueTtcclxuICB3ZWJzaXRlQ29kZTogc3RyaW5nID0gJyc7XHJcbiAgcHJvdmlkZXJMaXN0OiBhbnlbXSA9IFtdOyAvLyBGSVg6IEluaXRpYWxpemUgYXMgZW1wdHkgYXJyYXlcclxuICBwdWxzaW5nQnV0dG9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBzaG93R2FtZUNhdGVnb3J5VG9wID0gZmFsc2U7XHJcbiAgY2F0ZWdvcnlDaG9zZW4gPSBmYWxzZTtcclxuICBjYXRlZ29yeUxhYmVsOiBzdHJpbmcgPSAnQ0FURUdPUlknO1xyXG4gIHNvcnRlZEdhbWVHcm91cExpc3Q6IGFueVtdID0gW107IC8vIEZJWDogSW5pdGlhbGl6ZSBhcyBlbXB0eSBhcnJheSBpbnN0ZWFkIG9mIHVuZGVmaW5lZFxyXG4gIGhvdmVyZWRWaWV3QWxsSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiBnYW1lcyBsb2dpYyAqL1xyXG4gIGxvYmJ5R2FtZXM6IExvYmJ5R2FtZXNbXSA9IFtdO1xyXG4gIHNvcnRlZEdhbWVHcm91cDogR2FtZUdyb3VwW10gPSBbXTtcclxuICBmaWx0ZXJlZEdhbWVzOiBhbnkgfCBudWxsID0gbnVsbDtcclxuICBmaWx0ZXJTaG93TG9hZE1vcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjdXJyZW50RmlsdGVyUGFnZTogbnVtYmVyID0gMDtcclxuICBub0dhbWVzVG9TaG93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsdGVyQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0OiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgY3VycmVudFNlYXJjaFRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIGN1cnJlbnRTZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0Jykgc2VhcmNoSW5wdXQ6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IodGhlbWVTZXJ2aWNlOiBHYW1lTG9iYnlUaGVtZVNlcnZpY2UsIHByaXZhdGUgZ2FtZUxvYmJ5TGliU2VydmljZTogR2FtZUxvYmJ5TGliU2VydmljZSkge1xyXG4gICAgdGhlbWVTZXJ2aWNlLnRoZW1lJC5zdWJzY3JpYmUodCA9PiAodGhpcy50aGVtZSA9IHQpKTtcclxuICB9XHJcblxyXG4gIHNsaWRlTmV4dChpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzd2lwZXJFbCA9IHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMudG9BcnJheSgpW2luZGV4XT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChzd2lwZXJFbD8uc3dpcGVyKSB7XHJcbiAgICAgIHN3aXBlckVsLnN3aXBlci5zbGlkZU5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNsaWRlUHJldihpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzd2lwZXJFbCA9IHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMudG9BcnJheSgpW2luZGV4XT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChzd2lwZXJFbD8uc3dpcGVyKSB7XHJcbiAgICAgIHN3aXBlckVsLnN3aXBlci5zbGlkZVByZXYoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRHYW1lc1Byb3ZpZGVycygpOyAvLyBGZXRjaCBwcm92aWRlcnMgbGlzdFxyXG4gICAgdGhpcy5sb2FkTG9iYnlHYW1lcyhmYWxzZSk7IC8vIExvYWQgZ2FtZXMgZm9yIG5vbi1sb2dnZWQgaW4gdXNlcnMgYnkgZGVmYXVsdFxyXG4gICAgdGhpcy5zZWFyY2hTdWJqZWN0XHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDAwKSwgLy8gd2FpdCAyMDAwbXMgYWZ0ZXIgdHlwaW5nIHN0b3BzXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgLy8gIGlnbm9yZSBzYW1lIHRleHRcclxuICAgICAgICBzd2l0Y2hNYXAoKHNlYXJjaFRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyUGFnZSA9IDA7IC8vIHJlc2V0IHBhZ2VcclxuICAgICAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2VhcmNoUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBwYWdlOiAxLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLmJyYW5kQ29uZmlnLmxvYWRNb3JlUGFnZVNpemUsXHJcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlLFxyXG4gICAgICAgICAgICBzZWFyY2hUZXh0OiBzZWFyY2hUZXh0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2FtZUxvYmJ5TGliU2VydmljZS5nZXRHYW1lcyhcclxuICAgICAgICAgICAgdGhpcy5icmFuZENvbmZpZz8uYXBpVXJsLFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hQYXJhbXMsXHJcbiAgICAgICAgICAgIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZ2FtZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgaWYgKCFnYW1lcykge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclNob3dMb2FkTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gZ2FtZXM7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTaG93TG9hZE1vcmUgPVxyXG4gICAgICAgICAgZ2FtZXMubGVuZ3RoID09PSB0aGlzLmJyYW5kQ29uZmlnLmxvYWRNb3JlUGFnZVNpemU7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFNlYXJjaFRleHQudHJpbSgpICE9PSAnJyAmJiB0aGlzLmN1cnJlbnRTZWFyY2hUZXh0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUZpbHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrSWZOb0dhbWVzVG9TaG93KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVByb3ZpZGVyU3dpcGVyKCk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUdhbWVTd2lwZXJzKCk7XHJcbiAgICB9LCAyMDAwKTtcclxuICAgIHRoaXMudHJpZ2dlclB1bHNlKCcnKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmICghaW5wdXQpIHJldHVybjtcclxuICAgIGNvbnN0IHZhbHVlID0gaW5wdXQudmFsdWUgPz8gJyc7XHJcbiAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dCh2YWx1ZS50cmltKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUHJvdmlkZXJTd2lwZXIoKSB7XHJcbiAgICBpZiAodGhpcy5zd2lwZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgY29uc3QgcHJvdmlkZXJTd2lwZXJFbCA9IHRoaXMuc3dpcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9IHByb3ZpZGVyU3dpcGVyRWwuY2xvc2VzdCgnLnNlYXJjaEJhcicpIHx8IHByb3ZpZGVyU3dpcGVyRWwuY2xvc2VzdCgnLmZpeGVkLWZvb3Rlci13aWR0aCcpO1xyXG4gICAgICBjb25zdCBwcmV2QnV0dG9uID0gcGFyZW50Q29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKCcuc3dpcGVyLWJ1dHRvbi1wcmV2Jyk7XHJcbiAgICAgIGNvbnN0IG5leHRCdXR0b24gPSBwYXJlbnRDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItYnV0dG9uLW5leHQnKTtcclxuXHJcbiAgICAgIGlmIChwcmV2QnV0dG9uICYmIG5leHRCdXR0b24pIHtcclxuICAgICAgICBwcmV2QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgcHJvdmlkZXJTd2lwZXJFbC5zd2lwZXI/LnNsaWRlUHJldigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICBwcm92aWRlclN3aXBlckVsLnN3aXBlcj8uc2xpZGVOZXh0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUdhbWVTd2lwZXJzKCkge1xyXG4gICAgaWYgKHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMgJiYgdGhpcy5nYW1lU3dpcGVyQ29udGFpbmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMuZm9yRWFjaCgoc3dpcGVyUmVmLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdhbWVTd2lwZXJFbCA9IHN3aXBlclJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgZ2FtZXMtc2VjdGlvbiBmb3IgdGhpcyBzcGVjaWZpYyBzd2lwZXJcclxuICAgICAgICBjb25zdCBnYW1lc1NlY3Rpb24gPSBnYW1lU3dpcGVyRWwuY2xvc2VzdCgnLmdhbWVzLXNlY3Rpb24nKTtcclxuXHJcbiAgICAgICAgaWYgKGdhbWVzU2VjdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgY3VzdG9tUHJldiA9IGdhbWVzU2VjdGlvbi5xdWVyeVNlbGVjdG9yKCcuYnRuLUFycm93LWxlZnQnKTtcclxuICAgICAgICAgIGNvbnN0IGN1c3RvbU5leHQgPSBnYW1lc1NlY3Rpb24ucXVlcnlTZWxlY3RvcignLmJ0bi1BcnJvdy1yaWdodCcpO1xyXG5cclxuICAgICAgICAgIGlmIChjdXN0b21QcmV2KSB7XHJcbiAgICAgICAgICAgIGN1c3RvbVByZXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYEdhbWUgc2VjdGlvbiAke2luZGV4fSAtIFByZXZpb3VzIGNsaWNrZWRgKTtcclxuICAgICAgICAgICAgICBnYW1lU3dpcGVyRWwuc3dpcGVyPy5zbGlkZVByZXYoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY3VzdG9tTmV4dCkge1xyXG4gICAgICAgICAgICBjdXN0b21OZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBHYW1lIHNlY3Rpb24gJHtpbmRleH0gLSBOZXh0IGNsaWNrZWRgKTtcclxuICAgICAgICAgICAgICBnYW1lU3dpcGVyRWwuc3dpcGVyPy5zbGlkZU5leHQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEZJWDogVXBkYXRlZCBsb29wIGxvZ2ljIHRvIHByZXZlbnQgU3dpcGVyIGxvb3Agd2FybmluZ3NcclxuICAvLyBPbmx5IGVuYWJsZSBsb29wIHdoZW4gd2UgaGF2ZSBtb3JlIHNsaWRlcyB0aGFuIHRoZSBtYXhpbXVtIHNsaWRlc1BlclZpZXdcclxuICBzaG91bGRMb29wUHJvdmlkZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnByb3ZpZGVyTGlzdCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLnByb3ZpZGVyTGlzdCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1heCBzbGlkZXNQZXJWaWV3IGlzIDEyIGF0IHRoZSAxMjgwcHggYnJlYWtwb2ludFxyXG4gICAgLy8gT25seSBlbmFibGUgbG9vcCBpZiB3ZSBoYXZlIG1vcmUgcHJvdmlkZXJzIHRoYW4gd2hhdCdzIHZpc2libGVcclxuICAgIGNvbnN0IG1heFNsaWRlc1BlclZpZXcgPSAxMjtcclxuICAgIHJldHVybiB0aGlzLnByb3ZpZGVyTGlzdC5sZW5ndGggPiBtYXhTbGlkZXNQZXJWaWV3O1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkTG9vcEdhbWVzKGdhbWVzOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFnYW1lcyB8fCAhQXJyYXkuaXNBcnJheShnYW1lcykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1heCBzbGlkZXNQZXJWaWV3IGlzIDggYXQgdGhlIDEyODBweCBicmVha3BvaW50XHJcbiAgICAvLyBPbmx5IGVuYWJsZSBsb29wIGlmIHdlIGhhdmUgbW9yZSBnYW1lcyB0aGFuIHdoYXQncyB2aXNpYmxlXHJcbiAgICBjb25zdCBtYXhTbGlkZXNQZXJWaWV3ID0gODtcclxuICAgIHJldHVybiBnYW1lcy5sZW5ndGggPiBtYXhTbGlkZXNQZXJWaWV3O1xyXG4gIH1cclxuXHJcbiAgLy8gTkVXOiBQZXItZ3JvdXAgbG9vcCBsb2dpYyBmb3IgZ2FtZSBzd2lwZXJzXHJcbiAgLy8gVGhpcyBjaGVja3MgZWFjaCBnYW1lIGdyb3VwIGluZGl2aWR1YWxseSB0byBkZXRlcm1pbmUgaWYgbG9vcCBzaG91bGQgYmUgZW5hYmxlZFxyXG4gIHNob3VsZExvb3BHYW1lc0Zvckdyb3VwKGdhbWVzOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFnYW1lcyB8fCAhQXJyYXkuaXNBcnJheShnYW1lcykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1heCBzbGlkZXNQZXJWaWV3IGlzIDggYXQgdGhlIDEyODBweCBicmVha3BvaW50XHJcbiAgICAvLyBPbmx5IGVuYWJsZSBsb29wIGlmIHRoaXMgc3BlY2lmaWMgZ3JvdXAgaGFzIG1vcmUgZ2FtZXMgdGhhbiB3aGF0J3MgdmlzaWJsZVxyXG4gICAgY29uc3QgbWF4U2xpZGVzUGVyVmlldyA9IDg7XHJcbiAgICByZXR1cm4gZ2FtZXMubGVuZ3RoID4gbWF4U2xpZGVzUGVyVmlldztcclxuICB9XHJcblxyXG4gIHRyaWdnZXJQdWxzZShidXR0b246IHN0cmluZykge1xyXG4gICAgdGhpcy5wdWxzaW5nQnV0dG9uID0gYnV0dG9uO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucHVsc2luZ0J1dHRvbiA9IG51bGw7XHJcbiAgICB9LCA0MDApOyAvLyBEdXJhdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGFuaW1hdGlvblxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlR2FtZUNhdGVnb3J5VG9wKCkge1xyXG4gICAgdGhpcy5zaG93R2FtZUNhdGVnb3J5VG9wID0gIXRoaXMuc2hvd0dhbWVDYXRlZ29yeVRvcDtcclxuICAgIHRoaXMuY2F0ZWdvcnlDaG9zZW4gPSB0aGlzLmNhdGVnb3J5TGFiZWwgIT09ICdDQVRFR09SWSc7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeUxhYmVsID09ICdDQVRFR09SWScpIHtcclxuICAgICAgdGhpcy5kZWFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aWV3R2FtZUNhdGVnb3J5KGdyb3VwOiBhbnkpIHtcclxuICAgIHRoaXMuY2F0ZWdvcnlMYWJlbCA9IGdyb3VwLm5hbWU7XHJcbiAgICB0aGlzLnNob3dHYW1lQ2F0ZWdvcnlUb3AgPSBmYWxzZTtcclxuICAgIHRoaXMuZmlsdGVyR3JvdXBHYW1lcygwLCBncm91cC5pZCk7XHJcbiAgfVxyXG5cclxuICBEcm9wZG93bkNsb3NlKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUxhYmVsID09PSAnQ0FURUdPUlknID8gdGhpcy5jYXRlZ29yeUNob3NlbiA9IGZhbHNlIDogdGhpcy5jYXRlZ29yeUNob3NlbiA9IHRydWU7XHJcbiAgICB0aGlzLmNhdGVnb3J5Q2hvc2VuID8gdGhpcy5jYXRlZ29yeUxhYmVsID0gJ0NBVEVHT1JZJyA6IHRoaXMuY2F0ZWdvcnlMYWJlbDtcclxuICAgICF0aGlzLmNhdGVnb3J5Q2hvc2VuID8gdGhpcy5jYXRlZ29yeUNob3NlbiA9IHRydWUgOiB0aGlzLmNhdGVnb3J5Q2hvc2VuID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dHYW1lQ2F0ZWdvcnlUb3AgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TGFiZWwgPT0gJ0NBVEVHT1JZJykge1xyXG4gICAgICB0aGlzLmRlYWN0aXZhdGVGaWx0ZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgZ2V0R2FtZUltYWdlKGdhbWU6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWdhbWU/LmdhbWVDb2RlKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJyYW5kQ29uZmlnLmRlZmF1bHRHYW1lSW1hZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAke3RoaXMuYnJhbmRDb25maWc/LmdhbWVzSW1hZ2VzRGlyfS8ke2dhbWUuZ2FtZUNvZGV9LyR7Z2FtZS5nYW1lQ29kZX0ud2VicGA7XHJcbiAgfVxyXG5cclxuICBvbkltYWdlRXJyb3IoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbWcgPSBldmVudC50YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcclxuICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcFxyXG4gICAgaWYgKGltZy5zcmMuaW5jbHVkZXMoJ2RlZmF1bHQtZ2FtZS1pbWFnZS5qcGcnKSkgcmV0dXJuO1xyXG4gICAgaW1nLnNyYyA9IHRoaXMuYnJhbmRDb25maWcuZGVmYXVsdEdhbWVJbWFnZTtcclxuICB9XHJcblxyXG4gIC8vIEdhbWVzIGZpbHRlcnNcclxuICBmaWx0ZXJHcm91cEdhbWVzKGN1cnJlbnRQYWdlOiBudW1iZXIsIGdhbWVHcm91cElkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2hvd0dhbWVDYXRlZ29yeVRvcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJlZEdhbWVzKGN1cnJlbnRQYWdlLCB0aGlzLmJyYW5kQ29uZmlnLmxvYWRNb3JlUGFnZVNpemUsIHsgZ2FtZUdyb3VwSWQ6IGdhbWVHcm91cElkIH0pO1xyXG4gICAgdGhpcy5hY3RpdmF0ZUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvdmlkZXJHYW1lcyhjdXJyZW50UGFnZTogbnVtYmVyLCB2ZW5kb3JpZDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICB0aGlzLmdldEZpbHRlcmVkR2FtZXMoY3VycmVudFBhZ2UsIHRoaXMuYnJhbmRDb25maWcubG9hZE1vcmVQYWdlU2l6ZSwgeyB2ZW5kb3JJZDogdmVuZG9yaWQgfSk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJIb3RHYW1lcyhjdXJyZW50UGFnZTogbnVtYmVyLCB0YWc6IHN0cmluZykge1xyXG4gICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgdGhpcy5nZXRGaWx0ZXJlZEdhbWVzKGN1cnJlbnRQYWdlLCB0aGlzLmJyYW5kQ29uZmlnLmxvYWRNb3JlUGFnZVNpemUsIHsgdGFnOiB0YWcgfSk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJGYXZvdXJpdGVHYW1lcygpIHtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgIHRoaXMuZ2V0RmF2b3VyaXRlR2FtZXMoKTtcclxuICAgIHRoaXMuYWN0aXZhdGVGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckxhc3RQbGF5ZWRHYW1lcygpIHtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgIHRoaXMuZ2V0TGFzdFBsYXllZCgpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgbG9hZE1vcmVGaWx0ZXJlZEdhbWVzKCkge1xyXG4gICAgdGhpcy5jdXJyZW50U2VhcmNoUGFyYW1zLnBhZ2UgPSB0aGlzLmN1cnJlbnRGaWx0ZXJQYWdlICsgMTsgLy8gSW5jcmVtZW50IHBhZ2UgZm9yIG5leHQgbG9hZFxyXG4gICAgdGhpcy5nZXRGaWx0ZXJlZEdhbWVzKHRoaXMuY3VycmVudEZpbHRlclBhZ2UsIHRoaXMuYnJhbmRDb25maWcubG9hZE1vcmVQYWdlU2l6ZSwgdGhpcy5jdXJyZW50U2VhcmNoUGFyYW1zKTtcclxuICB9XHJcblxyXG4gIGNsZWFyU2VhcmNoKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ0NsZWFyaW5nIHNlYXJjaCBpbnB1dCBhbmQgcmVzZXR0aW5nIGZpbHRlcnMnKTtcclxuICAgIGlmICh0aGlzLnNlYXJjaElucHV0KSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jdXJyZW50U2VhcmNoVGV4dCA9ICcnO1xyXG4gICAgdGhpcy5jdXJyZW50RmlsdGVyUGFnZSA9IDA7XHJcbiAgfVxyXG5cclxuICBhY3RpdmF0ZUZpbHRlcigpIHtcclxuICAgIHRoaXMuZmlsdGVyQWN0aXZlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGRlYWN0aXZhdGVGaWx0ZXIoKSB7XHJcbiAgICB0aGlzLmZpbHRlckFjdGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyZWRHYW1lcyhcclxuICAgIGN1cnJlbnRQYWdlTnVtYmVyOiBudW1iZXIsXHJcbiAgICBwYWdlU2l6ZTogbnVtYmVyLFxyXG4gICAgZmlsdGVycz86IFJlY29yZDxzdHJpbmcsIGFueT5cclxuICApIHtcclxuICAgIGNvbnN0IGJhc2VQYXJhbXMgPSB7XHJcbiAgICAgIHBhZ2U6IGN1cnJlbnRQYWdlTnVtYmVyICsgMSxcclxuICAgICAgc2l6ZTogcGFnZVNpemUsXHJcbiAgICAgIGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xyXG4gICAgICAuLi5iYXNlUGFyYW1zLFxyXG4gICAgICAuLi4oZmlsdGVycyB8fCB7fSlcclxuICAgIH07XHJcbiAgICB0aGlzLmN1cnJlbnRTZWFyY2hQYXJhbXMgPSBxdWVyeVBhcmFtczsgLy8gU3RvcmUgY3VycmVudCBzZWFyY2ggcGFyYW1zIGZvciBsb2FkIG1vcmUgZnVuY3Rpb25hbGl0eVxyXG4gICAgdGhpcy5nYW1lTG9iYnlMaWJTZXJ2aWNlLmdldEdhbWVzKFxyXG4gICAgICB0aGlzLmJyYW5kQ29uZmlnPy5hcGlVcmwsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zLFxyXG4gICAgICB7IHJlZmVyZXI6IHRoaXMuYnJhbmRDb25maWc/LnNpdGVVcmwgfVxyXG4gICAgKS5zdWJzY3JpYmUoKGdhbWVzOiBhbnlbXSkgPT4ge1xyXG5cclxuICAgICAgaWYgKCFnYW1lcykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyU2hvd0xvYWRNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBJZiBmaXJzdCBwYWdlIC0gcmVwbGFjZVxyXG4gICAgICBpZiAoY3VycmVudFBhZ2VOdW1iZXIgPT09IDApIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkR2FtZXMgPSBnYW1lcztcclxuICAgICAgfVxyXG4gICAgICAvLyBJZiBuZXh0IHBhZ2UgLSBhcHBlbmRcclxuICAgICAgZWxzZSBpZiAoY3VycmVudFBhZ2VOdW1iZXIgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gW1xyXG4gICAgICAgICAgLi4udGhpcy5maWx0ZXJlZEdhbWVzLFxyXG4gICAgICAgICAgLi4uZ2FtZXNcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIElmIHJldHVybmVkIGNvdW50ID09PSBwYWdlU2l6ZSAtIG1vcmUgZ2FtZXMgbWlnaHQgZXhpc3RcclxuICAgICAgdGhpcy5maWx0ZXJTaG93TG9hZE1vcmUgPSBnYW1lcy5sZW5ndGggPT09IHBhZ2VTaXplO1xyXG4gICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJQYWdlID0gY3VycmVudFBhZ2VOdW1iZXIgKyAxOyAvLyBVcGRhdGUgY3VycmVudCBwYWdlXHJcbiAgICAgIGlmICghdGhpcy5maWx0ZXJTaG93TG9hZE1vcmUpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRGaWx0ZXJQYWdlID0gMDsgLy8gUmVzZXQgdG8gZmlyc3QgcGFnZSBpZiBubyBtb3JlIGdhbWVzXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGVja0lmTm9HYW1lc1RvU2hvdygpO1xyXG4gICAgICBjb25zb2xlLmxvZygnRmlsdGVyZWQgR2FtZXM6JywgdGhpcy5maWx0ZXJlZEdhbWVzKTtcclxuICAgICAgY29uc29sZS5sb2coJ1Nob3cgTG9hZCBNb3JlOicsIHRoaXMuZmlsdGVyU2hvd0xvYWRNb3JlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEdldCBHYW1lc1xyXG4gIGdldEdhbWVzKHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcikge1xyXG4gICAgdGhpcy5nYW1lTG9iYnlMaWJTZXJ2aWNlLmdldEdhbWVzKFxyXG4gICAgICB0aGlzLmJyYW5kQ29uZmlnPy5hcGlVcmwsXHJcbiAgICAgIHsgcGFnZTogcGFnZU51bWJlciwgc2l6ZTogcGFnZVNpemUsIGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlIH0sXHJcbiAgICAgIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9XHJcbiAgICApLnN1YnNjcmliZShnYW1lcyA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdHYW1lczonLCBnYW1lcyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8gTGFzdCBQbGF5ZWRcclxuICBnZXRMYXN0UGxheWVkKCkge1xyXG4gICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gW107IC8vIFJlc2V0IGJlZm9yZSBsb2FkaW5nIG5ldyBvbmVzXHJcbiAgICB0aGlzLmdhbWVMb2JieUxpYlNlcnZpY2UuZ2V0TGFzdFBsYXllZChcclxuICAgICAgdGhpcy5icmFuZENvbmZpZz8uYXBpVXJsLFxyXG4gICAgICB7IGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlIH0sXHJcbiAgICAgIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9XHJcbiAgICApLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAoIXJlcyB8fCAhcmVzLnN0YXR1cyB8fCByZXMuc3RhdHVzLnRvTG93ZXJDYXNlKCkgIT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGxhc3QgcGxheWVkIGdhbWVzOicsIHJlcyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRHYW1lcyA9IHJlcy5nYW1lc0xpc3Q7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmTm9HYW1lc1RvU2hvdygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8gRmF2b3VyaXRlc1xyXG4gIGdldEZhdm91cml0ZUdhbWVzKCkge1xyXG4gICAgdGhpcy5nYW1lTG9iYnlMaWJTZXJ2aWNlLmdldEZhdm91cml0ZUdhbWVzKFxyXG4gICAgICB0aGlzLmJyYW5kQ29uZmlnPy5hcGlVcmwsXHJcbiAgICAgIHsgbGFuZ3VhZ2VJZDogdGhpcy5icmFuZENvbmZpZz8ubGFuZ0NvZGUgfSxcclxuICAgICAgeyByZWZlcmVyOiB0aGlzLmJyYW5kQ29uZmlnPy5zaXRlVXJsIH1cclxuICAgICkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIGlmICghcmVzIHx8ICFyZXMuc3RhdHVzIHx8IHJlcy5zdGF0dXMudG9Mb3dlckNhc2UoKSAhPT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgZmF2b3VyaXRlIGdhbWVzOicsIHJlcyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRHYW1lcyA9IHJlcy5nYW1lc0xpc3Q7XHJcbiAgICAgICAgdGhpcy5jaGVja0lmTm9HYW1lc1RvU2hvdygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8gUHJvdmlkZXJzXHJcbiAgZ2V0R2FtZXNQcm92aWRlcnMoKSB7XHJcbiAgICB0aGlzLmdhbWVMb2JieUxpYlNlcnZpY2UuZ2V0R2FtZXNQcm92aWRlcnMoXHJcbiAgICAgIHRoaXMuYnJhbmRDb25maWc/LmFwaVVybCxcclxuICAgICAgeyBsYW5ndWFnZUlkOiB0aGlzLmJyYW5kQ29uZmlnPy5sYW5nQ29kZSB9LFxyXG4gICAgICB7IHJlZmVyZXI6IHRoaXMuYnJhbmRDb25maWc/LnNpdGVVcmwgfVxyXG4gICAgKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1Byb3ZpZGVyczonLCByZXM/LmdhbWVQcm92aWRlcnNMaXN0Lmxlbmd0aCk7XHJcbiAgICAgIHRoaXMucHJvdmlkZXJMaXN0ID0gcmVzPy5nYW1lUHJvdmlkZXJzTGlzdCB8fCBbXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbG9hZExvYmJ5R2FtZXMoaXNMb2dnZWRJbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ0xvYWRpbmcgbG9iYnkgZ2FtZXMgZm9yJywgaXNMb2dnZWRJbiA/ICdsb2dnZWQgaW4gdXNlcicgOiAnZ3Vlc3QgdXNlcicpO1xyXG4gICAgdGhpcy5nYW1lTG9iYnlMaWJTZXJ2aWNlLmdldEdhbWVzR3JvdXBzKHRoaXMuYnJhbmRDb25maWc/LmFwaVVybCwgeyBsYW5ndWFnZUlkOiB0aGlzLmJyYW5kQ29uZmlnPy5sYW5nQ29kZSB9LCB7IHJlZmVyZXI6IHRoaXMuYnJhbmRDb25maWc/LnNpdGVVcmwgfSkucGlwZShcclxuICAgICAgLyogU3RlcCAxOiBTZWxlY3QgY29ycmVjdCBsb2JieSBzYWZlbHkgKi9cclxuICAgICAgbWFwKChsb2JiaWVzOiBHYW1lR3JvdXBzUmVzcG9uc2UpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKCFsb2JiaWVzIHx8ICFsb2JiaWVzLmxlbmd0aCkgcmV0dXJuIFtdO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRMb2JieTogR2FtZUxvYmJ5IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAvLyBJZiBvbmx5IG9uZSBsb2JieSByZXR1cm5lZCB1c2UgaXRcclxuICAgICAgICBpZiAobG9iYmllcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIHNlbGVjdGVkTG9iYnkgPSBsb2JiaWVzWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBJZiBtdWx0aXBsZSBhcHBseSBsb2dpbiBsb2dpY1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgc2VsZWN0ZWRMb2JieSA9IGlzTG9nZ2VkSW5cclxuICAgICAgICAgICAgPyBsb2JiaWVzLmZpbmQobCA9PiBsLnRpdGxlLmluY2x1ZGVzKCdIb21lIExvYmJ5JykpXHJcbiAgICAgICAgICAgIDogbG9iYmllcy5maW5kKGwgPT4gIWwudGl0bGUuaW5jbHVkZXMoJ0hvbWUgTG9iYnknKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkTG9iYnk/LmdhbWVHcm91cExpc3Q/Lmxlbmd0aCkgcmV0dXJuIFtdO1xyXG5cclxuICAgICAgICAvLyBTb3J0IGJ5IG9yZGVyXHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkTG9iYnkuZ2FtZUdyb3VwTGlzdFxyXG4gICAgICAgICAgLnNsaWNlKClcclxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmdhbWVfZ3JvdXBfb3JkZXIgLSBiLmdhbWVfZ3JvdXBfb3JkZXIpO1xyXG4gICAgICB9KSxcclxuXHJcbiAgICAgIHRhcChzb3J0ZWRHcm91cHMgPT4ge1xyXG4gICAgICAgIHRoaXMuc29ydGVkR2FtZUdyb3VwID0gc29ydGVkR3JvdXBzO1xyXG4gICAgICB9KSxcclxuXHJcbiAgICAgIC8qIFN0ZXAgMjogRmV0Y2ggZ2FtZXMgaW4gcGFyYWxsZWwgKi9cclxuICAgICAgc3dpdGNoTWFwKChzb3J0ZWRHcm91cHM6IEdhbWVHcm91cFtdKSA9PiB7XHJcblxyXG4gICAgICAgIGlmICghc29ydGVkR3JvdXBzLmxlbmd0aCkgcmV0dXJuIG9mKFtdKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVxdWVzdHMgPSBzb3J0ZWRHcm91cHNcclxuICAgICAgICAgIC5maWx0ZXIoZ3JvdXAgPT4gZ3JvdXAubmFtZSAmJiBncm91cC5uYW1lLnRyaW0oKSAhPT0gJycpXHJcbiAgICAgICAgICAubWFwKGdyb3VwID0+XHJcbiAgICAgICAgICAgIHRoaXMuZ2FtZUxvYmJ5TGliU2VydmljZS5nZXRHYW1lcyh0aGlzLmJyYW5kQ29uZmlnPy5hcGlVcmwsIHtcclxuICAgICAgICAgICAgICBwYWdlOiAxLFxyXG4gICAgICAgICAgICAgIHNpemU6IHRoaXMuYnJhbmRDb25maWc/LmxvYmJ5R2FtZXNQYWdlU2l6ZSxcclxuICAgICAgICAgICAgICBnYW1lR3JvdXBJZDogZ3JvdXAuaWRcclxuICAgICAgICAgICAgfSwgeyByZWZlcmVyOiB0aGlzLmJyYW5kQ29uZmlnPy5zaXRlVXJsIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIGdhbWVHcm91cERldGFpbHM6IGdyb3VwLFxyXG4gICAgICAgICAgICAgICAgZ2FtZXM6IHJlc1xyXG4gICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gZm9ya0pvaW4ocmVxdWVzdHMpO1xyXG4gICAgICB9KVxyXG5cclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3VsdDogTG9iYnlHYW1lc1tdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2JieUdhbWVzID0gcmVzdWx0O1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgbG9iYnkgZ2FtZXM6JywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaGVja0lmTm9HYW1lc1RvU2hvdygpIHtcclxuICAgIGxldCBub0dhbWVzID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJlZEdhbWVzICYmIEFycmF5LmlzQXJyYXkodGhpcy5maWx0ZXJlZEdhbWVzKSAmJiB0aGlzLmZpbHRlcmVkR2FtZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIG5vR2FtZXMgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ub0dhbWVzVG9TaG93ID0gbm9HYW1lcztcclxuICB9XHJcblxyXG4gIGdldGdhbWVDbGlja2VkKGdhbWVDb2RlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2FtZUNsaWNrZWQuZW1pdChnYW1lQ29kZSk7XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cIm1haW4tbG9iYnlcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJnYW1lLWZpbHRlci1iYWNrZ3JvdW5kXCIgW25nU3R5bGVdPVwieyAnYmFja2dyb3VuZCc6IHRoZW1lPy5iYWNrZ3JvdW5kIHx8ICdub25lJyB9XCI+XHJcbiAgICAgICAgPCEtLSBNYWluIEZpbHRlciBTZWN0aW9uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaXhlZC1mb290ZXItd2lkdGggY2xlYXJmaXhcIiBbbmdTdHlsZV09XCJ7ICdib3JkZXItYm90dG9tJzogdGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnbm9uZScgfVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1maWx0ZXItY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBTZWFyY2ggQmFyIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaEJhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLXNlYXJjaFwiIFtuZ1N0eWxlXT1cInsgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZVwiIChzdWJtaXQpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNzZWFyY2hJbnB1dCBjbGFzcz1cImdhbWUtc2VhcmNoLWZvcm1cIiBpZD1cInNlYXJjaElucHV0XCIgbmFtZT1cImdhbWVTZWFyY2hcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiR0FNRSBTRUFSQ0hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWFyY2hcIiAoaW5wdXQpPVwib25TZWFyY2hDaGFuZ2UoJGV2ZW50KVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm92aWRlciBTd2lwZXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXBlckNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3dpcGVyLWNvbnRhaW5lciAjc3dpcGVyQ29udGFpbmVyICpuZ0lmPVwicHJvdmlkZXJMaXN0ICYmIHByb3ZpZGVyTGlzdC5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVzLXBlci12aWV3PVwiMVwiIHNwYWNlLWJldHdlZW49XCI2XCIgc3BlZWQ9XCI1MFwiIFtsb29wXT1cInNob3VsZExvb3BQcm92aWRlcnMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uPVwiZmFsc2VcIiBjc3MtbW9kZT1cInRydWVcIiBbYnJlYWtwb2ludHNdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwMCc6IHsgc2xpZGVzUGVyVmlldzogMyB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzIwMCc6IHsgc2xpZGVzUGVyVmlldzogNCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMyMCc6IHsgc2xpZGVzUGVyVmlldzogNCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQ4MCc6IHsgc2xpZGVzUGVyVmlldzogNiB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzc2OCc6IHsgc2xpZGVzUGVyVmlldzogOCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzk5MSc6IHsgc2xpZGVzUGVyVmlldzogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMjgwJzogeyBzbGlkZXNQZXJWaWV3OiAxMiB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzd2lwZXItc2xpZGUgKm5nRm9yPVwibGV0IHByb3ZpZGVyIG9mIHByb3ZpZGVyTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm92aWRlci1zbGlkZS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJicmFuZENvbmZpZz8ucHJvdmlkZXJzSWNvbnNEaXIgKyAnLycgKyBwcm92aWRlci52ZW5kb3JDb2RlICsgJy5zdmcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwicHJvdmlkZXIubmFtZVwiIChjbGljayk9XCJmaWx0ZXJQcm92aWRlckdhbWVzKDAsIHByb3ZpZGVyLnZlbmRvckNvZGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmc9XCJsYXp5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3dpcGVyLXNsaWRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N3aXBlci1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTmF2aWdhdGlvbiBidXR0b25zIC0gT1VUU0lERSAuc3dpcGVyQ29udGFpbmVyIGJ1dCBJTlNJREUgLnNlYXJjaEJhciAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpcGVyLW5hdmlnYXRpb24tcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzd2lwZXItYnV0dG9uLXByZXZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnLS1zd2lwZXItbmF2aWdhdGlvbi1jb2xvcic6IHRoZW1lPy5idXR0b25CYWNrZ3JvdW5kQ29sb3IgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgcHJvdmlkZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYXJyb3ctbGVmdC1nYW1lc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3dpcGVyLWJ1dHRvbi1uZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJy0tc3dpcGVyLW5hdmlnYXRpb24tY29sb3InOiB0aGVtZT8uYnV0dG9uQmFja2dyb3VuZENvbG9yIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk5leHQgcHJvdmlkZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24tYXJyb3ctcmlnaHQtZ2FtZXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLXByb3ZpZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNrdG9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJmLXRhYnMgcHJvdmlkZXJJY29ucy11bC1kZXNrdG9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPVwiZmF2b3VyaXRlSWNvblwiIFtuZ1N0eWxlXT1cInsgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRpc3BsYXktZmlsdGVyLWNvbnRlbnRcIiAoY2xpY2spPVwiZmlsdGVyRmF2b3VyaXRlR2FtZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicmVjZW50R2FtZXN0dFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IC00MnB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHRpcCB0dGlwLWFycm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXZvcml0ZSBHYW1lc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJvdy1kb3duXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTU2cHhcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1maWx0ZXItY29udGVudCBidHRcIiBpZD1cInJlY2VudEdhbWVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWhlYXJ0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlY2VudCBHYW1lcyBJY29uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBpZD1cInJlY2VudEdhbWVzSWNvblwiIFtuZ1N0eWxlXT1cInsgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRpc3BsYXktZmlsdGVyLWNvbnRlbnRcIiAoY2xpY2spPVwiZmlsdGVyTGFzdFBsYXllZEdhbWVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlY2VudEdhbWVzdHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAtNDJweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInR0aXAgdHRpcC1hcnJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCBwbGF5ZWQgR2FtZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3ctZG93blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01NnB4XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXktZmlsdGVyLWNvbnRlbnQgYnR0XCIgaWQ9XCJyZWNlbnRHYW1lc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jbG9ja1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIb3QgR2FtZXMgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9XCJob3RHYW1lc0ljb25cIiBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiB0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkaXNwbGF5LWZpbHRlci1jb250ZW50XCIgKGNsaWNrKT1cImZpbHRlckhvdEdhbWVzKDAsICdob3QnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaG90R2FtZXN0dFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWxlZnQ6IC0yM3B4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHRpcCB0dGlwLWFycm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3QgR2FtZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3ctZG93blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC0zNXB4XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXktZmlsdGVyLWNvbnRlbnQgYnR0XCIgaWQ9XCJob3RHYW1lc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maXJlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEdhbWUgQ2F0ZWdvcnkgRHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPVwiZ2FtZUNhdGVnb3J5XCIgW25nU3R5bGVdPVwieyAnYm9yZGVyJzogdGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnbm9uZScgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ2FtZS1jYXRlZ29yeS1saW5rIGdhbWUtY2F0ZWdvcnktbGluay1kZXNrdG9wIGhpZGRlbi14cyBoaWRkZW4tc20gZGlzcGxheS1maWx0ZXItY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjYXRlZ29yeS1idG5cIiBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8udGV4dENvbG9yIHx8ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kJzogJ3RyYW5zcGFyZW50J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cInRvZ2dsZUdhbWVDYXRlZ29yeVRvcCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjYXRlZ29yeUxhYmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGlkPVwiZ2FtZUNhdGVnb3J5TGlua1wiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpY29uLWFuZ2xlLWRvd24nOiAhY2F0ZWdvcnlDaG9zZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWNvbi1jbG9zZSc6IGNhdGVnb3J5Q2hvc2VuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1bGwtcmlnaHQnOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBhcmlhLWxhYmVsPVwiVG9nZ2xlIGNhdGVnb3J5IG1lbnVcIiBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8udGV4dENvbG9yIHx8ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kJzogJ3RyYW5zcGFyZW50J1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cImNhdGVnb3J5Q2hvc2VuID8gRHJvcGRvd25DbG9zZSgpIDogdG9nZ2xlR2FtZUNhdGVnb3J5VG9wKClcIj48L2E+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEdhbWUgQ2F0ZWdvcnkgRHJvcGRvd24gTWVudSAocG9zaXRpb25lZCBkaXJlY3RseSBiZWxvdykgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJnYW1lQ2F0ZWdvcnlUb3BcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGVhcmZpeCBnYW1lLWNhdGVnb3J5LWxpc3QgZ2FtZS1jYXRlZ29yeS1saXN0LWZvb3RlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJzaG93R2FtZUNhdGVnb3J5VG9wID8gJ2Jsb2NrJyA6ICdub25lJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdhbWUtY2F0ZWdvcnktbGlzdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImdhbWUtY2F0ZWdvcnktbGlzdC1pdGVtXCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcic6IHRoZW1lPy50ZXh0Q29sb3IgfHwgJyNmZmYnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogdGhlbWU/LmJhY2tncm91bmQgfHwgJyMyNjI2MjYnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3JkZXInOiB0aGVtZT8uYm9yZGVyIHx8ICdub25lJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJnYW1lLWNhdGVnb3J5LWxpc3QtaXRlbS1saVwiICpuZ0Zvcj1cImxldCBncm91cCBvZiBsb2JieUdhbWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tncm91cC5nYW1lR3JvdXBEZXRhaWxzLmlkfX0tTGVmdFNpZGVCdXR0b24tZm9vdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjYXRlZ29yeUxhYmVsID0gZ3JvdXAuZ2FtZUdyb3VwRGV0YWlscy5uYW1lOyBmaWx0ZXJHcm91cEdhbWVzKDAsIGdyb3VwLmdhbWVHcm91cERldGFpbHMuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBncm91cC5nYW1lR3JvdXBEZXRhaWxzLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gIEdhbWVzIFNlY3Rpb24gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FtZXMtYmFja2dyb3VuZFwiIGlkPVwiZ2FtZXNMb2JieVwiICpuZ0lmPVwiIWZpbHRlckFjdGl2ZVwiPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGdyb3VwIG9mIGxvYmJ5R2FtZXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImdhbWVzLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy1nYW1lLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGgzIFtuZ1N0eWxlXT1cInsgJ2NvbG9yJzogdGhlbWU/LnRleHRDb2xvciB8fCAnI0ZGRkZGRicgfVwiPnt7Z3JvdXAuZ2FtZUdyb3VwRGV0YWlscy5uYW1lfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0bi1uZXdnYW1lc3RyaXBcIiBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiAodGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnbm9uZScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGhvdmVyZWRWaWV3QWxsSW5kZXggPT09IGkgPyAodGhlbWU/LmJ1dHRvbkJhY2tncm91bmRDb2xvciB8fCAnJykgOiAodGhlbWU/LmJhY2tncm91bmQgfHwgJyMyNjI2MjYnKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwidmlld0dhbWVDYXRlZ29yeShncm91cC5nYW1lR3JvdXBEZXRhaWxzKVwiIChtb3VzZWVudGVyKT1cImhvdmVyZWRWaWV3QWxsSW5kZXggPSBpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZFZpZXdBbGxJbmRleCA9IG51bGxcIj5WSUVXIEFMTDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0bi1BcnJvdy1sZWZ0XCIgW25nQ2xhc3NdPVwieyAncHVsc2UnOiBwdWxzaW5nQnV0dG9uID09PSAncHJldicgKyBpIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiBob3ZlcmVkQnV0dG9uID09PSAncHJldicgKyBpID8gKHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnKTonMXB4IHNvbGlkICNmZmYnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgZ2FtZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlclB1bHNlKCdwcmV2JyArIGkpOyBzbGlkZVByZXYoaSlcIiAobW91c2VlbnRlcik9XCJob3ZlcmVkQnV0dG9uID0gJ3ByZXYnICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCdXR0b24gPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3ctaWNvbiBhcnJvdy1sZWZ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0bi1BcnJvdy1yaWdodFwiIFtuZ0NsYXNzXT1cInsgJ3B1bHNlJzogcHVsc2luZ0J1dHRvbiA9PT0gJ25leHQnICsgaSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnYm9yZGVyJzogaG92ZXJlZEJ1dHRvbiA9PT0gJ25leHQnICsgaSA/ICh0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJykgOiAnMXB4IHNvbGlkICNmZmYnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBhcmlhLWxhYmVsPVwiTmV4dCBnYW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cmlnZ2VyUHVsc2UoJ25leHQnICsgaSk7IHNsaWRlTmV4dChpKVwiIChtb3VzZWVudGVyKT1cImhvdmVyZWRCdXR0b24gPSAnbmV4dCcgKyBpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJ1dHRvbiA9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcnJvdy1pY29uIGFycm93LXJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3dpcGVyQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgd2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN3aXBlci1jb250YWluZXIgI2dhbWVTd2lwZXJDb250YWluZXIgKm5nSWY9XCJncm91cC5nYW1lcyAmJiBncm91cC5nYW1lcy5sZW5ndGhcIiBzbGlkZXMtcGVyLXZpZXc9XCIxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UtYmV0d2Vlbj1cIjEwXCIgc3BlZWQ9XCI1MFwiIFtsb29wXT1cInNob3VsZExvb3BHYW1lc0Zvckdyb3VwKGdyb3VwLmdhbWVzKVwiIG5hdmlnYXRpb249XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzcy1tb2RlPVwiZmFsc2VcIiBbYnJlYWtwb2ludHNdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE5MCc6IHsgc2xpZGVzUGVyVmlldzogMSwgc3BhY2VCZXR3ZWVuOiAxMCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzM1MCc6IHsgc2xpZGVzUGVyVmlldzogMiwgc3BhY2VCZXR3ZWVuOiAxMCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzUyMCc6IHsgc2xpZGVzUGVyVmlldzogMywgc3BhY2VCZXR3ZWVuOiAxMCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzY3Nic6IHsgc2xpZGVzUGVyVmlldzogNCwgc3BhY2VCZXR3ZWVuOiAxMCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzgzNCc6IHsgc2xpZGVzUGVyVmlldzogNCwgc3BhY2VCZXR3ZWVuOiAxMCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzk5OCc6IHsgc2xpZGVzUGVyVmlldzogNSwgc3BhY2VCZXR3ZWVuOiAxMCB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzExNTgnOiB7IHNsaWRlc1BlclZpZXc6IDYsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMjgwJzogeyBzbGlkZXNQZXJWaWV3OiA2LCBzcGFjZUJldHdlZW46IDEwIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3dpcGVyLXNsaWRlICpuZ0Zvcj1cImxldCBnYW1lIG9mIGdyb3VwLmdhbWVzOyBsZXQgZ2FtZUluZGV4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1nYW1lLWlkXT1cImkgKyAnLScgKyBnYW1lLmdhbWVDb2RlXCIgY2xhc3M9XCJsb2JieV9nYW1lcy1ob21lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdhbWUtY2FyZF9fY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyZWRHYW1lS2V5ID0gZ2FtZUluZGV4ICsgJy0nICsgIGdhbWUuZ2FtZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkR2FtZUtleSA9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdhbWUtY2FyZF9fYWN0aW9uLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhvdmVyZWRHYW1lS2V5ID09PSBnYW1lSW5kZXggKyAnLScgKyBnYW1lLmdhbWVDb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBnYW1lLWNhcmRfX2FjdGlvbi1idG4tLXBsYXlcIiBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcic6IHRoZW1lPy5idXR0b25CYWNrZ3JvdW5kQ29sb3IgfHwgJyNmZjdkMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyJzogdGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnI2ZmN2QwMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0Z2FtZUNsaWNrZWQoZ2FtZS5nYW1lQ29kZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbGF5XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjxzcGFuIFtuZ0NsYXNzXT1cImdhbWUudGFnTGlzdC5pbmNsdWRlcygnbmV3JykgPyAnbmV3JyA6ICcnXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1lLnRhZ0xpc3QuaW5jbHVkZXMoXCJuZXdcIikgPyBcIk5FV1wiIDogXCJcIiB9fTwvc3Bhbj48c3BhbiBbbmdDbGFzc109XCJnYW1lLnRhZ0xpc3QuaW5jbHVkZXMoJ2hvdCcpID8gJ2hvdCcgOiAnJ1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZS50YWdMaXN0LmluY2x1ZGVzKFwiaG90XCIpID8gXCJIT1RcIiA6IFwiXCIgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRfX2ltZyBnYW1lLWNhcmRfX2ltYWdlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1ncmFkaWVudFwiIFtzcmNdPVwiZ2V0R2FtZUltYWdlKGdhbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpPVwib25JbWFnZUVycm9yKCRldmVudClcIiBbYWx0XT1cImdhbWUubmFtZVwiIGxvYWRpbmc9XCJsYXp5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2FtZS5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRfX3RleHRcIiBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8udGV4dENvbG9yIHx8ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogdGhlbWU/LmdhbWV0ZXh0YmFja2dyb3VuZCB8fCAnI2ZmN2QwMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjxzcGFuIGNsYXNzPVwiZ2FtZS1jYXJkX19mYXZpY29uXCI+PGkgY2xhc3M9XCJmYXIgZmEtaGVhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+PHNwYW4gY2xhc3M9XCJnYW1lLWNhcmQtLW5hbWVcIj57eyBnYW1lLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3dpcGVyLXNsaWRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3dpcGVyLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gRmlsdGVyZWQgR2FtZXMgU2VjdGlvbnMtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJnYW1lcy1iYWNrZ3JvdW5kXCIgaWQ9XCJmaWx0ZXJlZC1nYW1lcy1zZWN0aW9uXCIgKm5nSWY9XCJmaWx0ZXJBY3RpdmVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9iYnlfZ2FtZXMtcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRcIiBbYXR0ci5kYXRhLWdhbWUtaWRdPVwiZ2FtZUluZGV4ICsgJy0nICsgZ2FtZS5nYW1lQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZ2FtZSBvZiBmaWx0ZXJlZEdhbWVzOyBsZXQgZ2FtZUluZGV4ID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRfX2NvbnRlbnRcIiAobW91c2VlbnRlcik9XCJob3ZlcmVkR2FtZUtleSA9IGdhbWVJbmRleCArICctJyArICBnYW1lLmdhbWVDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkR2FtZUtleSA9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkX19hY3Rpb24tYnRuXCIgKm5nSWY9XCJob3ZlcmVkR2FtZUtleSA9PT0gZ2FtZUluZGV4ICsgJy0nICsgZ2FtZS5nYW1lQ29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBnYW1lLWNhcmRfX2FjdGlvbi1idG4tLXBsYXlcIiBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2xvcic6IHRoZW1lPy5idXR0b25CYWNrZ3JvdW5kQ29sb3IgfHwgJyNmZjdkMDAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyJzogdGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnI2ZmN2QwMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cImdldGdhbWVDbGlja2VkKGdhbWUuZ2FtZUNvZGUpXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsYXlcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PHNwYW4gW25nQ2xhc3NdPVwiZ2FtZS50YWdMaXN0LmluY2x1ZGVzKCduZXcnKSA/ICduZXcnIDogJydcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbWUudGFnTGlzdC5pbmNsdWRlcyhcIm5ld1wiKSA/IFwiTkVXXCIgOiBcIlwiIH19PC9zcGFuPjxzcGFuIFtuZ0NsYXNzXT1cImdhbWUudGFnTGlzdC5pbmNsdWRlcygnaG90JykgPyAnaG90JyA6ICcnXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1lLnRhZ0xpc3QuaW5jbHVkZXMoXCJob3RcIikgPyBcIkhPVFwiIDogXCJcIiB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkX19pbWcgZ2FtZS1jYXJkX19pbWFnZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImltZy1ncmFkaWVudFwiIFtzcmNdPVwiZ2V0R2FtZUltYWdlKGdhbWUpXCIgKGVycm9yKT1cIm9uSW1hZ2VFcnJvcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbHRdPVwiZ2FtZS5uYW1lXCIgbG9hZGluZz1cImxhenlcIiBbdGl0bGVdPVwiZ2FtZS5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRfX3RleHRcIiBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8udGV4dENvbG9yIHx8ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogdGhlbWU/LmdhbWV0ZXh0YmFja2dyb3VuZCB8fCAnI2ZmN2QwMCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiPjxzcGFuIGNsYXNzPVwiZ2FtZS1jYXJkX19mYXZpY29uXCI+PGkgY2xhc3M9XCJmYXIgZmEtaGVhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPjwvc3Bhbj48c3BhbiBjbGFzcz1cImdhbWUtY2FyZC0tbmFtZVwiPnt7IGdhbWUubmFtZSB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYmJ5X2xvYWRNb3JlQnRuXCIgKm5nSWY9XCJmaWx0ZXJTaG93TG9hZE1vcmVcIj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gbG9hZC1tb3JlLWJ0blwiIFtuZ1N0eWxlXT1cInsgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnIH1cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImxvYWRNb3JlRmlsdGVyZWRHYW1lcygpXCI+XHJcbiAgICAgICAgICAgICAgICBMT0FEIE1PUkVcclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FtZXMtYmFja2dyb3VuZCBsb2JieV9ub0dhbWVzTWVzc2FnZVwiIGlkPVwibm9HYW1lc01lc3NhZ2VcIiAqbmdJZj1cIm5vR2FtZXNUb1Nob3dcIj5cclxuICAgICAgICA8cD5OTyBHQU1FUyBGT1VORDwvcD5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzaW5vLWxvYmJ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbWUtbG9iYnktbGliL3NyYy9saWIvY2FzaW5vLWxvYmJ5L2Nhc2luby1sb2JieS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1lLWxvYmJ5LWxpYi9zcmMvbGliL2Nhc2luby1sb2JieS9jYXNpbm8tbG9iYnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFvQyxzQkFBc0IsRUFBRSxZQUFZLEVBQXlCLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekwsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBV3BFLE1BQU0sT0FBTyxvQkFBb0I7SUFpQy9CLFlBQVksWUFBbUMsRUFBVSxtQkFBd0M7UUFBeEMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQWhDakcsbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUNwQyxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFHM0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRzFDLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFFOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsaUJBQVksR0FBVSxFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7UUFDM0Qsa0JBQWEsR0FBa0IsSUFBSSxDQUFD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QkFDekIsV0FBVztzQkFBcEIsTUFBTTtnQkFDRSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFxQm9CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBBZnRlclZpZXdJbml0LCBWaWV3RW5jYXBzdWxhdGlvbiwgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIEVsZW1lbnRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEdhbWVMb2JieVRoZW1lIH0gZnJvbSAnLi4vdGhlbWUvZGVmYXVsdC10aGVtZSc7XHJcbmltcG9ydCB7IEdhbWVMb2JieVRoZW1lU2VydmljZSB9IGZyb20gJy4uL3RoZW1lL3RoZW1lU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTG9iYnlHYW1lcywgR2FtZUdyb3VwLCBHYW1lR3JvdXBzUmVzcG9uc2UsIEdhbWVMb2JieSB9IGZyb20gJy4uL2dhbWUtbG9iYnktbGliLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHYW1lTG9iYnlMaWJTZXJ2aWNlIH0gZnJvbSAnLi4vZ2FtZS1sb2JieS1saWIuc2VydmljZSc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBtYXAsIG9mLCBzd2l0Y2hNYXAsIHRhcCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItY2FzaW5vLWxvYmJ5JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2FzaW5vLWxvYmJ5LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY2FzaW5vLWxvYmJ5LmNvbXBvbmVudC5zY3NzJyxcclxuICAvLyBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDYXNpbm9Mb2JieUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgaG92ZXJlZFNsaWRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGhvdmVyZWRCdXR0b246IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIGhvdmVyZWRHYW1lS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBAVmlld0NoaWxkKCdzd2lwZXJDb250YWluZXInKSBzd2lwZXJDb250YWluZXI6IGFueTtcclxuICBAVmlld0NoaWxkcmVuKCdnYW1lU3dpcGVyQ29udGFpbmVyJykgZ2FtZVN3aXBlckNvbnRhaW5lcnMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XHJcbiAgQE91dHB1dCgpIGdhbWVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQElucHV0KCkgY2FzaW5vRGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIHRoZW1lPzogR2FtZUxvYmJ5VGhlbWU7XHJcbiAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgYnJhbmRDb25maWc6IGFueTtcclxuICB3ZWJzaXRlQ29kZTogc3RyaW5nID0gJyc7XHJcbiAgcHJvdmlkZXJMaXN0OiBhbnlbXSA9IFtdOyAvLyBGSVg6IEluaXRpYWxpemUgYXMgZW1wdHkgYXJyYXlcclxuICBwdWxzaW5nQnV0dG9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBzaG93R2FtZUNhdGVnb3J5VG9wID0gZmFsc2U7XHJcbiAgY2F0ZWdvcnlDaG9zZW4gPSBmYWxzZTtcclxuICBjYXRlZ29yeUxhYmVsOiBzdHJpbmcgPSAnQ0FURUdPUlknO1xyXG4gIHNvcnRlZEdhbWVHcm91cExpc3Q6IGFueVtdID0gW107IC8vIEZJWDogSW5pdGlhbGl6ZSBhcyBlbXB0eSBhcnJheSBpbnN0ZWFkIG9mIHVuZGVmaW5lZFxyXG4gIGhvdmVyZWRWaWV3QWxsSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKiBnYW1lcyBsb2dpYyAqL1xyXG4gIGxvYmJ5R2FtZXM6IExvYmJ5R2FtZXNbXSA9IFtdO1xyXG4gIHNvcnRlZEdhbWVHcm91cDogR2FtZUdyb3VwW10gPSBbXTtcclxuICBmaWx0ZXJlZEdhbWVzOiBhbnkgfCBudWxsID0gbnVsbDtcclxuICBmaWx0ZXJTaG93TG9hZE1vcmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjdXJyZW50RmlsdGVyUGFnZTogbnVtYmVyID0gMDtcclxuICBub0dhbWVzVG9TaG93OiBib29sZWFuID0gZmFsc2U7XHJcbiAgZmlsdGVyQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZWFyY2hTdWJqZWN0OiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgY3VycmVudFNlYXJjaFRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIGN1cnJlbnRTZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaElucHV0Jykgc2VhcmNoSW5wdXQ6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IodGhlbWVTZXJ2aWNlOiBHYW1lTG9iYnlUaGVtZVNlcnZpY2UsIHByaXZhdGUgZ2FtZUxvYmJ5TGliU2VydmljZTogR2FtZUxvYmJ5TGliU2VydmljZSkge1xyXG4gICAgdGhlbWVTZXJ2aWNlLnRoZW1lJC5zdWJzY3JpYmUodCA9PiAodGhpcy50aGVtZSA9IHQpKTtcclxuICB9XHJcblxyXG4gIHNsaWRlTmV4dChpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzd2lwZXJFbCA9IHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMudG9BcnJheSgpW2luZGV4XT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChzd2lwZXJFbD8uc3dpcGVyKSB7XHJcbiAgICAgIHN3aXBlckVsLnN3aXBlci5zbGlkZU5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNsaWRlUHJldihpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBzd2lwZXJFbCA9IHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMudG9BcnJheSgpW2luZGV4XT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChzd2lwZXJFbD8uc3dpcGVyKSB7XHJcbiAgICAgIHN3aXBlckVsLnN3aXBlci5zbGlkZVByZXYoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5nZXRHYW1lc1Byb3ZpZGVycygpOyAvLyBGZXRjaCBwcm92aWRlcnMgbGlzdFxyXG4gICAgdGhpcy5sb2FkTG9iYnlHYW1lcyhmYWxzZSk7IC8vIExvYWQgZ2FtZXMgZm9yIG5vbi1sb2dnZWQgaW4gdXNlcnMgYnkgZGVmYXVsdFxyXG4gICAgdGhpcy5zZWFyY2hTdWJqZWN0XHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDAwKSwgLy8gd2FpdCAyMDAwbXMgYWZ0ZXIgdHlwaW5nIHN0b3BzXHJcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgLy8gIGlnbm9yZSBzYW1lIHRleHRcclxuICAgICAgICBzd2l0Y2hNYXAoKHNlYXJjaFRleHQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50RmlsdGVyUGFnZSA9IDA7IC8vIHJlc2V0IHBhZ2VcclxuICAgICAgICAgIHRoaXMuY3VycmVudFNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2VhcmNoUGFyYW1zID0ge1xyXG4gICAgICAgICAgICBwYWdlOiAxLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLmJyYW5kQ29uZmlnLmxvYWRNb3JlUGFnZVNpemUsXHJcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlLFxyXG4gICAgICAgICAgICBzZWFyY2hUZXh0OiBzZWFyY2hUZXh0XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2FtZUxvYmJ5TGliU2VydmljZS5nZXRHYW1lcyhcclxuICAgICAgICAgICAgdGhpcy5icmFuZENvbmZpZz8uYXBpVXJsLFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWFyY2hQYXJhbXMsXHJcbiAgICAgICAgICAgIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoZ2FtZXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgaWYgKCFnYW1lcykge1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclNob3dMb2FkTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gZ2FtZXM7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTaG93TG9hZE1vcmUgPVxyXG4gICAgICAgICAgZ2FtZXMubGVuZ3RoID09PSB0aGlzLmJyYW5kQ29uZmlnLmxvYWRNb3JlUGFnZVNpemU7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFNlYXJjaFRleHQudHJpbSgpICE9PSAnJyAmJiB0aGlzLmN1cnJlbnRTZWFyY2hUZXh0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLmFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZUZpbHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNoZWNrSWZOb0dhbWVzVG9TaG93KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVByb3ZpZGVyU3dpcGVyKCk7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUdhbWVTd2lwZXJzKCk7XHJcbiAgICB9LCAyMDAwKTtcclxuICAgIHRoaXMudHJpZ2dlclB1bHNlKCcnKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoQ2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGlmICghaW5wdXQpIHJldHVybjtcclxuICAgIGNvbnN0IHZhbHVlID0gaW5wdXQudmFsdWUgPz8gJyc7XHJcbiAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dCh2YWx1ZS50cmltKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplUHJvdmlkZXJTd2lwZXIoKSB7XHJcbiAgICBpZiAodGhpcy5zd2lwZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgY29uc3QgcHJvdmlkZXJTd2lwZXJFbCA9IHRoaXMuc3dpcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9IHByb3ZpZGVyU3dpcGVyRWwuY2xvc2VzdCgnLnNlYXJjaEJhcicpIHx8IHByb3ZpZGVyU3dpcGVyRWwuY2xvc2VzdCgnLmZpeGVkLWZvb3Rlci13aWR0aCcpO1xyXG4gICAgICBjb25zdCBwcmV2QnV0dG9uID0gcGFyZW50Q29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKCcuc3dpcGVyLWJ1dHRvbi1wcmV2Jyk7XHJcbiAgICAgIGNvbnN0IG5leHRCdXR0b24gPSBwYXJlbnRDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoJy5zd2lwZXItYnV0dG9uLW5leHQnKTtcclxuXHJcbiAgICAgIGlmIChwcmV2QnV0dG9uICYmIG5leHRCdXR0b24pIHtcclxuICAgICAgICBwcmV2QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgcHJvdmlkZXJTd2lwZXJFbC5zd2lwZXI/LnNsaWRlUHJldigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICBwcm92aWRlclN3aXBlckVsLnN3aXBlcj8uc2xpZGVOZXh0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUdhbWVTd2lwZXJzKCkge1xyXG4gICAgaWYgKHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMgJiYgdGhpcy5nYW1lU3dpcGVyQ29udGFpbmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZ2FtZVN3aXBlckNvbnRhaW5lcnMuZm9yRWFjaCgoc3dpcGVyUmVmLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdhbWVTd2lwZXJFbCA9IHN3aXBlclJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgZ2FtZXMtc2VjdGlvbiBmb3IgdGhpcyBzcGVjaWZpYyBzd2lwZXJcclxuICAgICAgICBjb25zdCBnYW1lc1NlY3Rpb24gPSBnYW1lU3dpcGVyRWwuY2xvc2VzdCgnLmdhbWVzLXNlY3Rpb24nKTtcclxuXHJcbiAgICAgICAgaWYgKGdhbWVzU2VjdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgY3VzdG9tUHJldiA9IGdhbWVzU2VjdGlvbi5xdWVyeVNlbGVjdG9yKCcuYnRuLUFycm93LWxlZnQnKTtcclxuICAgICAgICAgIGNvbnN0IGN1c3RvbU5leHQgPSBnYW1lc1NlY3Rpb24ucXVlcnlTZWxlY3RvcignLmJ0bi1BcnJvdy1yaWdodCcpO1xyXG5cclxuICAgICAgICAgIGlmIChjdXN0b21QcmV2KSB7XHJcbiAgICAgICAgICAgIGN1c3RvbVByZXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYEdhbWUgc2VjdGlvbiAke2luZGV4fSAtIFByZXZpb3VzIGNsaWNrZWRgKTtcclxuICAgICAgICAgICAgICBnYW1lU3dpcGVyRWwuc3dpcGVyPy5zbGlkZVByZXYoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoY3VzdG9tTmV4dCkge1xyXG4gICAgICAgICAgICBjdXN0b21OZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBHYW1lIHNlY3Rpb24gJHtpbmRleH0gLSBOZXh0IGNsaWNrZWRgKTtcclxuICAgICAgICAgICAgICBnYW1lU3dpcGVyRWwuc3dpcGVyPy5zbGlkZU5leHQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEZJWDogVXBkYXRlZCBsb29wIGxvZ2ljIHRvIHByZXZlbnQgU3dpcGVyIGxvb3Agd2FybmluZ3NcclxuICAvLyBPbmx5IGVuYWJsZSBsb29wIHdoZW4gd2UgaGF2ZSBtb3JlIHNsaWRlcyB0aGFuIHRoZSBtYXhpbXVtIHNsaWRlc1BlclZpZXdcclxuICBzaG91bGRMb29wUHJvdmlkZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnByb3ZpZGVyTGlzdCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLnByb3ZpZGVyTGlzdCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1heCBzbGlkZXNQZXJWaWV3IGlzIDEyIGF0IHRoZSAxMjgwcHggYnJlYWtwb2ludFxyXG4gICAgLy8gT25seSBlbmFibGUgbG9vcCBpZiB3ZSBoYXZlIG1vcmUgcHJvdmlkZXJzIHRoYW4gd2hhdCdzIHZpc2libGVcclxuICAgIGNvbnN0IG1heFNsaWRlc1BlclZpZXcgPSAxMjtcclxuICAgIHJldHVybiB0aGlzLnByb3ZpZGVyTGlzdC5sZW5ndGggPiBtYXhTbGlkZXNQZXJWaWV3O1xyXG4gIH1cclxuXHJcbiAgc2hvdWxkTG9vcEdhbWVzKGdhbWVzOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFnYW1lcyB8fCAhQXJyYXkuaXNBcnJheShnYW1lcykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1heCBzbGlkZXNQZXJWaWV3IGlzIDggYXQgdGhlIDEyODBweCBicmVha3BvaW50XHJcbiAgICAvLyBPbmx5IGVuYWJsZSBsb29wIGlmIHdlIGhhdmUgbW9yZSBnYW1lcyB0aGFuIHdoYXQncyB2aXNpYmxlXHJcbiAgICBjb25zdCBtYXhTbGlkZXNQZXJWaWV3ID0gODtcclxuICAgIHJldHVybiBnYW1lcy5sZW5ndGggPiBtYXhTbGlkZXNQZXJWaWV3O1xyXG4gIH1cclxuXHJcbiAgLy8gTkVXOiBQZXItZ3JvdXAgbG9vcCBsb2dpYyBmb3IgZ2FtZSBzd2lwZXJzXHJcbiAgLy8gVGhpcyBjaGVja3MgZWFjaCBnYW1lIGdyb3VwIGluZGl2aWR1YWxseSB0byBkZXRlcm1pbmUgaWYgbG9vcCBzaG91bGQgYmUgZW5hYmxlZFxyXG4gIHNob3VsZExvb3BHYW1lc0Zvckdyb3VwKGdhbWVzOiBhbnlbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFnYW1lcyB8fCAhQXJyYXkuaXNBcnJheShnYW1lcykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1heCBzbGlkZXNQZXJWaWV3IGlzIDggYXQgdGhlIDEyODBweCBicmVha3BvaW50XHJcbiAgICAvLyBPbmx5IGVuYWJsZSBsb29wIGlmIHRoaXMgc3BlY2lmaWMgZ3JvdXAgaGFzIG1vcmUgZ2FtZXMgdGhhbiB3aGF0J3MgdmlzaWJsZVxyXG4gICAgY29uc3QgbWF4U2xpZGVzUGVyVmlldyA9IDg7XHJcbiAgICByZXR1cm4gZ2FtZXMubGVuZ3RoID4gbWF4U2xpZGVzUGVyVmlldztcclxuICB9XHJcblxyXG4gIHRyaWdnZXJQdWxzZShidXR0b246IHN0cmluZykge1xyXG4gICAgdGhpcy5wdWxzaW5nQnV0dG9uID0gYnV0dG9uO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucHVsc2luZ0J1dHRvbiA9IG51bGw7XHJcbiAgICB9LCA0MDApOyAvLyBEdXJhdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGFuaW1hdGlvblxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlR2FtZUNhdGVnb3J5VG9wKCkge1xyXG4gICAgdGhpcy5zaG93R2FtZUNhdGVnb3J5VG9wID0gIXRoaXMuc2hvd0dhbWVDYXRlZ29yeVRvcDtcclxuICAgIHRoaXMuY2F0ZWdvcnlDaG9zZW4gPSB0aGlzLmNhdGVnb3J5TGFiZWwgIT09ICdDQVRFR09SWSc7XHJcbiAgICBpZiAodGhpcy5jYXRlZ29yeUxhYmVsID09ICdDQVRFR09SWScpIHtcclxuICAgICAgdGhpcy5kZWFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aWV3R2FtZUNhdGVnb3J5KGdyb3VwOiBhbnkpIHtcclxuICAgIHRoaXMuY2F0ZWdvcnlMYWJlbCA9IGdyb3VwLm5hbWU7XHJcbiAgICB0aGlzLnNob3dHYW1lQ2F0ZWdvcnlUb3AgPSBmYWxzZTtcclxuICAgIHRoaXMuZmlsdGVyR3JvdXBHYW1lcygwLCBncm91cC5pZCk7XHJcbiAgfVxyXG5cclxuICBEcm9wZG93bkNsb3NlKCkge1xyXG4gICAgdGhpcy5jYXRlZ29yeUxhYmVsID09PSAnQ0FURUdPUlknID8gdGhpcy5jYXRlZ29yeUNob3NlbiA9IGZhbHNlIDogdGhpcy5jYXRlZ29yeUNob3NlbiA9IHRydWU7XHJcbiAgICB0aGlzLmNhdGVnb3J5Q2hvc2VuID8gdGhpcy5jYXRlZ29yeUxhYmVsID0gJ0NBVEVHT1JZJyA6IHRoaXMuY2F0ZWdvcnlMYWJlbDtcclxuICAgICF0aGlzLmNhdGVnb3J5Q2hvc2VuID8gdGhpcy5jYXRlZ29yeUNob3NlbiA9IHRydWUgOiB0aGlzLmNhdGVnb3J5Q2hvc2VuID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dHYW1lQ2F0ZWdvcnlUb3AgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmNhdGVnb3J5TGFiZWwgPT0gJ0NBVEVHT1JZJykge1xyXG4gICAgICB0aGlzLmRlYWN0aXZhdGVGaWx0ZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFxyXG5cclxuICBnZXRHYW1lSW1hZ2UoZ2FtZTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmICghZ2FtZT8uZ2FtZUNvZGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmRDb25maWcuZGVmYXVsdEdhbWVJbWFnZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7dGhpcy5icmFuZENvbmZpZz8uZ2FtZXNJbWFnZXNEaXJ9LyR7Z2FtZS5nYW1lQ29kZX0vJHtnYW1lLmdhbWVDb2RlfS53ZWJwYDtcclxuICB9XHJcblxyXG4gIG9uSW1hZ2VFcnJvcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGltZyA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xyXG4gICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wXHJcbiAgICBpZiAoaW1nLnNyYy5pbmNsdWRlcygnZGVmYXVsdC1nYW1lLWltYWdlLmpwZycpKSByZXR1cm47XHJcbiAgICBpbWcuc3JjID0gdGhpcy5icmFuZENvbmZpZy5kZWZhdWx0R2FtZUltYWdlO1xyXG4gIH1cclxuXHJcbiAgLy8gR2FtZXMgZmlsdGVyc1xyXG4gIGZpbHRlckdyb3VwR2FtZXMoY3VycmVudFBhZ2U6IG51bWJlciwgZ2FtZUdyb3VwSWQ6IG51bWJlcikge1xyXG4gICAgdGhpcy5zaG93R2FtZUNhdGVnb3J5VG9wID0gZmFsc2U7XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICB0aGlzLmdldEZpbHRlcmVkR2FtZXMoY3VycmVudFBhZ2UsIHRoaXMuYnJhbmRDb25maWcubG9hZE1vcmVQYWdlU2l6ZSwgeyBnYW1lR3JvdXBJZDogZ2FtZUdyb3VwSWQgfSk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJQcm92aWRlckdhbWVzKGN1cnJlbnRQYWdlOiBudW1iZXIsIHZlbmRvcmlkOiBudW1iZXIpIHtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgIHRoaXMuZ2V0RmlsdGVyZWRHYW1lcyhjdXJyZW50UGFnZSwgdGhpcy5icmFuZENvbmZpZy5sb2FkTW9yZVBhZ2VTaXplLCB7IHZlbmRvcklkOiB2ZW5kb3JpZCB9KTtcclxuICAgIHRoaXMuYWN0aXZhdGVGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckhvdEdhbWVzKGN1cnJlbnRQYWdlOiBudW1iZXIsIHRhZzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICB0aGlzLmdldEZpbHRlcmVkR2FtZXMoY3VycmVudFBhZ2UsIHRoaXMuYnJhbmRDb25maWcubG9hZE1vcmVQYWdlU2l6ZSwgeyB0YWc6IHRhZyB9KTtcclxuICAgIHRoaXMuYWN0aXZhdGVGaWx0ZXIoKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckZhdm91cml0ZUdhbWVzKCkge1xyXG4gICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgdGhpcy5nZXRGYXZvdXJpdGVHYW1lcygpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZUZpbHRlcigpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyTGFzdFBsYXllZEdhbWVzKCkge1xyXG4gICAgdGhpcy5jbGVhclNlYXJjaCgpO1xyXG4gICAgdGhpcy5nZXRMYXN0UGxheWVkKCk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRmlsdGVyKCk7XHJcbiAgfVxyXG5cclxuICBsb2FkTW9yZUZpbHRlcmVkR2FtZXMoKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRTZWFyY2hQYXJhbXMucGFnZSA9IHRoaXMuY3VycmVudEZpbHRlclBhZ2UgKyAxOyAvLyBJbmNyZW1lbnQgcGFnZSBmb3IgbmV4dCBsb2FkXHJcbiAgICB0aGlzLmdldEZpbHRlcmVkR2FtZXModGhpcy5jdXJyZW50RmlsdGVyUGFnZSwgdGhpcy5icmFuZENvbmZpZy5sb2FkTW9yZVBhZ2VTaXplLCB0aGlzLmN1cnJlbnRTZWFyY2hQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJTZWFyY2goKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnQ2xlYXJpbmcgc2VhcmNoIGlucHV0IGFuZCByZXNldHRpbmcgZmlsdGVycycpO1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5wdXQpIHtcclxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnRTZWFyY2hUZXh0ID0gJyc7XHJcbiAgICB0aGlzLmN1cnJlbnRGaWx0ZXJQYWdlID0gMDtcclxuICB9XHJcblxyXG4gIGFjdGl2YXRlRmlsdGVyKCkge1xyXG4gICAgdGhpcy5maWx0ZXJBY3RpdmUgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZGVhY3RpdmF0ZUZpbHRlcigpIHtcclxuICAgIHRoaXMuZmlsdGVyQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRGaWx0ZXJlZEdhbWVzKFxyXG4gICAgY3VycmVudFBhZ2VOdW1iZXI6IG51bWJlcixcclxuICAgIHBhZ2VTaXplOiBudW1iZXIsXHJcbiAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PlxyXG4gICkge1xyXG4gICAgY29uc3QgYmFzZVBhcmFtcyA9IHtcclxuICAgICAgcGFnZTogY3VycmVudFBhZ2VOdW1iZXIgKyAxLFxyXG4gICAgICBzaXplOiBwYWdlU2l6ZSxcclxuICAgICAgbGFuZ3VhZ2VJZDogdGhpcy5icmFuZENvbmZpZz8ubGFuZ0NvZGVcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7XHJcbiAgICAgIC4uLmJhc2VQYXJhbXMsXHJcbiAgICAgIC4uLihmaWx0ZXJzIHx8IHt9KVxyXG4gICAgfTtcclxuICAgIHRoaXMuY3VycmVudFNlYXJjaFBhcmFtcyA9IHF1ZXJ5UGFyYW1zOyAvLyBTdG9yZSBjdXJyZW50IHNlYXJjaCBwYXJhbXMgZm9yIGxvYWQgbW9yZSBmdW5jdGlvbmFsaXR5XHJcbiAgICB0aGlzLmdhbWVMb2JieUxpYlNlcnZpY2UuZ2V0R2FtZXMoXHJcbiAgICAgIHRoaXMuYnJhbmRDb25maWc/LmFwaVVybCxcclxuICAgICAgcXVlcnlQYXJhbXMsXHJcbiAgICAgIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9XHJcbiAgICApLnN1YnNjcmliZSgoZ2FtZXM6IGFueVtdKSA9PiB7XHJcblxyXG4gICAgICBpZiAoIWdhbWVzKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJTaG93TG9hZE1vcmUgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGZpcnN0IHBhZ2UgLSByZXBsYWNlXHJcbiAgICAgIGlmIChjdXJyZW50UGFnZU51bWJlciA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRHYW1lcyA9IGdhbWVzO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIElmIG5leHQgcGFnZSAtIGFwcGVuZFxyXG4gICAgICBlbHNlIGlmIChjdXJyZW50UGFnZU51bWJlciA+IDApIHtcclxuICAgICAgICB0aGlzLmZpbHRlcmVkR2FtZXMgPSBbXHJcbiAgICAgICAgICAuLi50aGlzLmZpbHRlcmVkR2FtZXMsXHJcbiAgICAgICAgICAuLi5nYW1lc1xyXG4gICAgICAgIF07XHJcbiAgICAgIH1cclxuICAgICAgLy8gSWYgcmV0dXJuZWQgY291bnQgPT09IHBhZ2VTaXplIC0gbW9yZSBnYW1lcyBtaWdodCBleGlzdFxyXG4gICAgICB0aGlzLmZpbHRlclNob3dMb2FkTW9yZSA9IGdhbWVzLmxlbmd0aCA9PT0gcGFnZVNpemU7XHJcbiAgICAgIHRoaXMuY3VycmVudEZpbHRlclBhZ2UgPSBjdXJyZW50UGFnZU51bWJlciArIDE7IC8vIFVwZGF0ZSBjdXJyZW50IHBhZ2VcclxuICAgICAgaWYgKCF0aGlzLmZpbHRlclNob3dMb2FkTW9yZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudEZpbHRlclBhZ2UgPSAwOyAvLyBSZXNldCB0byBmaXJzdCBwYWdlIGlmIG5vIG1vcmUgZ2FtZXNcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNoZWNrSWZOb0dhbWVzVG9TaG93KCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdGaWx0ZXJlZCBHYW1lczonLCB0aGlzLmZpbHRlcmVkR2FtZXMpO1xyXG4gICAgICBjb25zb2xlLmxvZygnU2hvdyBMb2FkIE1vcmU6JywgdGhpcy5maWx0ZXJTaG93TG9hZE1vcmUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gR2V0IEdhbWVzXHJcbiAgZ2V0R2FtZXMocGFnZU51bWJlcjogbnVtYmVyLCBwYWdlU2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmdhbWVMb2JieUxpYlNlcnZpY2UuZ2V0R2FtZXMoXHJcbiAgICAgIHRoaXMuYnJhbmRDb25maWc/LmFwaVVybCxcclxuICAgICAgeyBwYWdlOiBwYWdlTnVtYmVyLCBzaXplOiBwYWdlU2l6ZSwgbGFuZ3VhZ2VJZDogdGhpcy5icmFuZENvbmZpZz8ubGFuZ0NvZGUgfSxcclxuICAgICAgeyByZWZlcmVyOiB0aGlzLmJyYW5kQ29uZmlnPy5zaXRlVXJsIH1cclxuICAgICkuc3Vic2NyaWJlKGdhbWVzID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ0dhbWVzOicsIGdhbWVzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyBMYXN0IFBsYXllZFxyXG4gIGdldExhc3RQbGF5ZWQoKSB7XHJcbiAgICB0aGlzLmZpbHRlcmVkR2FtZXMgPSBbXTsgLy8gUmVzZXQgYmVmb3JlIGxvYWRpbmcgbmV3IG9uZXNcclxuICAgIHRoaXMuZ2FtZUxvYmJ5TGliU2VydmljZS5nZXRMYXN0UGxheWVkKFxyXG4gICAgICB0aGlzLmJyYW5kQ29uZmlnPy5hcGlVcmwsXHJcbiAgICAgIHsgbGFuZ3VhZ2VJZDogdGhpcy5icmFuZENvbmZpZz8ubGFuZ0NvZGUgfSxcclxuICAgICAgeyByZWZlcmVyOiB0aGlzLmJyYW5kQ29uZmlnPy5zaXRlVXJsIH1cclxuICAgICkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgIGlmICghcmVzIHx8ICFyZXMuc3RhdHVzIHx8IHJlcy5zdGF0dXMudG9Mb3dlckNhc2UoKSAhPT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgbGFzdCBwbGF5ZWQgZ2FtZXM6JywgcmVzKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gcmVzLmdhbWVzTGlzdDtcclxuICAgICAgICB0aGlzLmNoZWNrSWZOb0dhbWVzVG9TaG93KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyBGYXZvdXJpdGVzXHJcbiAgZ2V0RmF2b3VyaXRlR2FtZXMoKSB7XHJcbiAgICB0aGlzLmdhbWVMb2JieUxpYlNlcnZpY2UuZ2V0RmF2b3VyaXRlR2FtZXMoXHJcbiAgICAgIHRoaXMuYnJhbmRDb25maWc/LmFwaVVybCxcclxuICAgICAgeyBsYW5ndWFnZUlkOiB0aGlzLmJyYW5kQ29uZmlnPy5sYW5nQ29kZSB9LFxyXG4gICAgICB7IHJlZmVyZXI6IHRoaXMuYnJhbmRDb25maWc/LnNpdGVVcmwgfVxyXG4gICAgKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKCFyZXMgfHwgIXJlcy5zdGF0dXMgfHwgcmVzLnN0YXR1cy50b0xvd2VyQ2FzZSgpICE9PSAnc3VjY2VzcycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBmYXZvdXJpdGUgZ2FtZXM6JywgcmVzKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEdhbWVzID0gcmVzLmdhbWVzTGlzdDtcclxuICAgICAgICB0aGlzLmNoZWNrSWZOb0dhbWVzVG9TaG93KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyBQcm92aWRlcnNcclxuICBnZXRHYW1lc1Byb3ZpZGVycygpIHtcclxuICAgIHRoaXMuZ2FtZUxvYmJ5TGliU2VydmljZS5nZXRHYW1lc1Byb3ZpZGVycyhcclxuICAgICAgdGhpcy5icmFuZENvbmZpZz8uYXBpVXJsLFxyXG4gICAgICB7IGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlIH0sXHJcbiAgICAgIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9XHJcbiAgICApLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnUHJvdmlkZXJzOicsIHJlcz8uZ2FtZVByb3ZpZGVyc0xpc3QubGVuZ3RoKTtcclxuICAgICAgdGhpcy5wcm92aWRlckxpc3QgPSByZXM/LmdhbWVQcm92aWRlcnNMaXN0IHx8IFtdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsb2FkTG9iYnlHYW1lcyhpc0xvZ2dlZEluOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnTG9hZGluZyBsb2JieSBnYW1lcyBmb3InLCBpc0xvZ2dlZEluID8gJ2xvZ2dlZCBpbiB1c2VyJyA6ICdndWVzdCB1c2VyJyk7XHJcbiAgICB0aGlzLmdhbWVMb2JieUxpYlNlcnZpY2UuZ2V0R2FtZXNHcm91cHModGhpcy5icmFuZENvbmZpZz8uYXBpVXJsLCB7IGxhbmd1YWdlSWQ6IHRoaXMuYnJhbmRDb25maWc/LmxhbmdDb2RlIH0sIHsgcmVmZXJlcjogdGhpcy5icmFuZENvbmZpZz8uc2l0ZVVybCB9KS5waXBlKFxyXG4gICAgICAvKiBTdGVwIDE6IFNlbGVjdCBjb3JyZWN0IGxvYmJ5IHNhZmVseSAqL1xyXG4gICAgICBtYXAoKGxvYmJpZXM6IEdhbWVHcm91cHNSZXNwb25zZSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoIWxvYmJpZXMgfHwgIWxvYmJpZXMubGVuZ3RoKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZExvYmJ5OiBHYW1lTG9iYnkgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIC8vIElmIG9ubHkgb25lIGxvYmJ5IHJldHVybmVkIHVzZSBpdFxyXG4gICAgICAgIGlmIChsb2JiaWVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgc2VsZWN0ZWRMb2JieSA9IGxvYmJpZXNbMF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIElmIG11bHRpcGxlIGFwcGx5IGxvZ2luIGxvZ2ljXHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBzZWxlY3RlZExvYmJ5ID0gaXNMb2dnZWRJblxyXG4gICAgICAgICAgICA/IGxvYmJpZXMuZmluZChsID0+IGwudGl0bGUuaW5jbHVkZXMoJ0hvbWUgTG9iYnknKSlcclxuICAgICAgICAgICAgOiBsb2JiaWVzLmZpbmQobCA9PiAhbC50aXRsZS5pbmNsdWRlcygnSG9tZSBMb2JieScpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWRMb2JieT8uZ2FtZUdyb3VwTGlzdD8ubGVuZ3RoKSByZXR1cm4gW107XHJcblxyXG4gICAgICAgIC8vIFNvcnQgYnkgb3JkZXJcclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRMb2JieS5nYW1lR3JvdXBMaXN0XHJcbiAgICAgICAgICAuc2xpY2UoKVxyXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuZ2FtZV9ncm91cF9vcmRlciAtIGIuZ2FtZV9ncm91cF9vcmRlcik7XHJcbiAgICAgIH0pLFxyXG5cclxuICAgICAgdGFwKHNvcnRlZEdyb3VwcyA9PiB7XHJcbiAgICAgICAgdGhpcy5zb3J0ZWRHYW1lR3JvdXAgPSBzb3J0ZWRHcm91cHM7XHJcbiAgICAgIH0pLFxyXG5cclxuICAgICAgLyogU3RlcCAyOiBGZXRjaCBnYW1lcyBpbiBwYXJhbGxlbCAqL1xyXG4gICAgICBzd2l0Y2hNYXAoKHNvcnRlZEdyb3VwczogR2FtZUdyb3VwW10pID0+IHtcclxuXHJcbiAgICAgICAgaWYgKCFzb3J0ZWRHcm91cHMubGVuZ3RoKSByZXR1cm4gb2YoW10pO1xyXG5cclxuICAgICAgICBjb25zdCByZXF1ZXN0cyA9IHNvcnRlZEdyb3Vwc1xyXG4gICAgICAgICAgLmZpbHRlcihncm91cCA9PiBncm91cC5uYW1lICYmIGdyb3VwLm5hbWUudHJpbSgpICE9PSAnJylcclxuICAgICAgICAgIC5tYXAoZ3JvdXAgPT5cclxuICAgICAgICAgICAgdGhpcy5nYW1lTG9iYnlMaWJTZXJ2aWNlLmdldEdhbWVzKHRoaXMuYnJhbmRDb25maWc/LmFwaVVybCwge1xyXG4gICAgICAgICAgICAgIHBhZ2U6IDEsXHJcbiAgICAgICAgICAgICAgc2l6ZTogdGhpcy5icmFuZENvbmZpZz8ubG9iYnlHYW1lc1BhZ2VTaXplLFxyXG4gICAgICAgICAgICAgIGdhbWVHcm91cElkOiBncm91cC5pZFxyXG4gICAgICAgICAgICB9LCB7IHJlZmVyZXI6IHRoaXMuYnJhbmRDb25maWc/LnNpdGVVcmwgfSkucGlwZShcclxuICAgICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgZ2FtZUdyb3VwRGV0YWlsczogZ3JvdXAsXHJcbiAgICAgICAgICAgICAgICBnYW1lczogcmVzXHJcbiAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cyk7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzdWx0OiBMb2JieUdhbWVzW10pID0+IHtcclxuICAgICAgICB0aGlzLmxvYmJ5R2FtZXMgPSByZXN1bHQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBsb2JieSBnYW1lczonLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZOb0dhbWVzVG9TaG93KCkge1xyXG4gICAgbGV0IG5vR2FtZXMgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmZpbHRlcmVkR2FtZXMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmZpbHRlcmVkR2FtZXMpICYmIHRoaXMuZmlsdGVyZWRHYW1lcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgbm9HYW1lcyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vR2FtZXNUb1Nob3cgPSBub0dhbWVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0Z2FtZUNsaWNrZWQoZ2FtZUNvZGU6IGFueSk6IHZvaWQge1xyXG4gICAgICB0aGlzLmdhbWVDbGlja2VkLmVtaXQoZ2FtZUNvZGUpO1xyXG4gIH1cclxufSIsIjxkaXYgY2xhc3M9XCJtYWluLWxvYmJ5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1maWx0ZXItYmFja2dyb3VuZFwiIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQnOiB0aGVtZT8uYmFja2dyb3VuZCB8fCAnbm9uZScgfVwiPlxyXG4gICAgICAgIDwhLS0gTWFpbiBGaWx0ZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZml4ZWQtZm9vdGVyLXdpZHRoIGNsZWFyZml4XCIgW25nU3R5bGVdPVwieyAnYm9yZGVyLWJvdHRvbSc6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnIH1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXktZmlsdGVyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gU2VhcmNoIEJhciAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2hCYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1zZWFyY2hcIiBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiB0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmVcIiAoc3VibWl0KT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjc2VhcmNoSW5wdXQgY2xhc3M9XCJnYW1lLXNlYXJjaC1mb3JtXCIgaWQ9XCJzZWFyY2hJbnB1dFwiIG5hbWU9XCJnYW1lU2VhcmNoXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkdBTUUgU0VBUkNIXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoXCIgKGlucHV0KT1cIm9uU2VhcmNoQ2hhbmdlKCRldmVudClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUHJvdmlkZXIgU3dpcGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2lwZXJDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN3aXBlci1jb250YWluZXIgI3N3aXBlckNvbnRhaW5lciAqbmdJZj1cInByb3ZpZGVyTGlzdCAmJiBwcm92aWRlckxpc3QubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlcy1wZXItdmlldz1cIjFcIiBzcGFjZS1iZXR3ZWVuPVwiNlwiIHNwZWVkPVwiNTBcIiBbbG9vcF09XCJzaG91bGRMb29wUHJvdmlkZXJzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbj1cImZhbHNlXCIgY3NzLW1vZGU9XCJ0cnVlXCIgW2JyZWFrcG9pbnRzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDAnOiB7IHNsaWRlc1BlclZpZXc6IDMgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyMDAnOiB7IHNsaWRlc1BlclZpZXc6IDQgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICczMjAnOiB7IHNsaWRlc1BlclZpZXc6IDQgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0ODAnOiB7IHNsaWRlc1BlclZpZXc6IDYgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3NjgnOiB7IHNsaWRlc1BlclZpZXc6IDggfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5OTEnOiB7IHNsaWRlc1BlclZpZXc6IDEwIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTI4MCc6IHsgc2xpZGVzUGVyVmlldzogMTIgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3dpcGVyLXNsaWRlICpuZ0Zvcj1cImxldCBwcm92aWRlciBvZiBwcm92aWRlckxpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItc2xpZGUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiYnJhbmRDb25maWc/LnByb3ZpZGVyc0ljb25zRGlyICsgJy8nICsgcHJvdmlkZXIudmVuZG9yQ29kZSArICcuc3ZnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cInByb3ZpZGVyLm5hbWVcIiAoY2xpY2spPVwiZmlsdGVyUHJvdmlkZXJHYW1lcygwLCBwcm92aWRlci52ZW5kb3JDb2RlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nPVwibGF6eVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N3aXBlci1zbGlkZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zd2lwZXItY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIE5hdmlnYXRpb24gYnV0dG9ucyAtIE9VVFNJREUgLnN3aXBlckNvbnRhaW5lciBidXQgSU5TSURFIC5zZWFyY2hCYXIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXBlci1uYXZpZ2F0aW9uLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3dpcGVyLWJ1dHRvbi1wcmV2XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJy0tc3dpcGVyLW5hdmlnYXRpb24tY29sb3InOiB0aGVtZT8uYnV0dG9uQmFja2dyb3VuZENvbG9yIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlByZXZpb3VzIHByb3ZpZGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWFycm93LWxlZnQtZ2FtZXNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN3aXBlci1idXR0b24tbmV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7ICctLXN3aXBlci1uYXZpZ2F0aW9uLWNvbG9yJzogdGhlbWU/LmJ1dHRvbkJhY2tncm91bmRDb2xvciB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IHByb3ZpZGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWFycm93LXJpZ2h0LWdhbWVzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1wcm92aWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVza3RvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZi10YWJzIHByb3ZpZGVySWNvbnMtdWwtZGVza3RvcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBpZD1cImZhdm91cml0ZUljb25cIiBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiB0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkaXNwbGF5LWZpbHRlci1jb250ZW50XCIgKGNsaWNrKT1cImZpbHRlckZhdm91cml0ZUdhbWVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlY2VudEdhbWVzdHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAtNDJweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInR0aXAgdHRpcC1hcnJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmF2b3JpdGUgR2FtZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3ctZG93blwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01NnB4XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXktZmlsdGVyLWNvbnRlbnQgYnR0XCIgaWQ9XCJyZWNlbnRHYW1lc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1oZWFydFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWNlbnQgR2FtZXMgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgaWQ9XCJyZWNlbnRHYW1lc0ljb25cIiBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiB0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkaXNwbGF5LWZpbHRlci1jb250ZW50XCIgKGNsaWNrKT1cImZpbHRlckxhc3RQbGF5ZWRHYW1lcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWNlbnRHYW1lc3R0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tbGVmdDogLTQycHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0dGlwIHR0aXAtYXJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3QgcGxheWVkIEdhbWVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFycm93LWRvd25cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAtNTZweFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LWZpbHRlci1jb250ZW50IGJ0dFwiIGlkPVwicmVjZW50R2FtZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2xvY2tcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSG90IEdhbWVzIEljb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGlkPVwiaG90R2FtZXNJY29uXCIgW25nU3R5bGVdPVwieyAnYm9yZGVyJzogdGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnbm9uZScgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGlzcGxheS1maWx0ZXItY29udGVudFwiIChjbGljayk9XCJmaWx0ZXJIb3RHYW1lcygwLCAnaG90JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImhvdEdhbWVzdHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1sZWZ0OiAtMjNweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInR0aXAgdHRpcC1hcnJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG90IEdhbWVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFycm93LWRvd25cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAtMzVweFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5LWZpbHRlci1jb250ZW50IGJ0dFwiIGlkPVwiaG90R2FtZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlyZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHYW1lIENhdGVnb3J5IERyb3Bkb3duIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBpZD1cImdhbWVDYXRlZ29yeVwiIFtuZ1N0eWxlXT1cInsgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdhbWUtY2F0ZWdvcnktbGluayBnYW1lLWNhdGVnb3J5LWxpbmstZGVza3RvcCBoaWRkZW4teHMgaGlkZGVuLXNtIGRpc3BsYXktZmlsdGVyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2F0ZWdvcnktYnRuXCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogdGhlbWU/LnRleHRDb2xvciB8fCAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZCc6ICd0cmFuc3BhcmVudCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJ0b2dnbGVHYW1lQ2F0ZWdvcnlUb3AoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY2F0ZWdvcnlMYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBpZD1cImdhbWVDYXRlZ29yeUxpbmtcIiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWNvbi1hbmdsZS1kb3duJzogIWNhdGVnb3J5Q2hvc2VuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ljb24tY2xvc2UnOiBjYXRlZ29yeUNob3NlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWxsLXJpZ2h0JzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgYXJpYS1sYWJlbD1cIlRvZ2dsZSBjYXRlZ29yeSBtZW51XCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogdGhlbWU/LnRleHRDb2xvciB8fCAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZCc6ICd0cmFuc3BhcmVudCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJjYXRlZ29yeUNob3NlbiA/IERyb3Bkb3duQ2xvc2UoKSA6IHRvZ2dsZUdhbWVDYXRlZ29yeVRvcCgpXCI+PC9hPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBHYW1lIENhdGVnb3J5IERyb3Bkb3duIE1lbnUgKHBvc2l0aW9uZWQgZGlyZWN0bHkgYmVsb3cpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiZ2FtZUNhdGVnb3J5VG9wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXJmaXggZ2FtZS1jYXRlZ29yeS1saXN0IGdhbWUtY2F0ZWdvcnktbGlzdC1mb290ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwic2hvd0dhbWVDYXRlZ29yeVRvcCA/ICdibG9jaycgOiAnbm9uZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhdGVnb3J5LWxpc3Qtd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJnYW1lLWNhdGVnb3J5LWxpc3QtaXRlbVwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8udGV4dENvbG9yIHx8ICcjZmZmJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHRoZW1lPy5iYWNrZ3JvdW5kIHx8ICcjMjYyNjI2JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9yZGVyJzogdGhlbWU/LmJvcmRlciB8fCAnbm9uZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZ2FtZS1jYXRlZ29yeS1saXN0LWl0ZW0tbGlcIiAqbmdGb3I9XCJsZXQgZ3JvdXAgb2YgbG9iYnlHYW1lc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7Z3JvdXAuZ2FtZUdyb3VwRGV0YWlscy5pZH19LUxlZnRTaWRlQnV0dG9uLWZvb3RlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2F0ZWdvcnlMYWJlbCA9IGdyb3VwLmdhbWVHcm91cERldGFpbHMubmFtZTsgZmlsdGVyR3JvdXBHYW1lcygwLCBncm91cC5nYW1lR3JvdXBEZXRhaWxzLmlkKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ3JvdXAuZ2FtZUdyb3VwRGV0YWlscy5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tICBHYW1lcyBTZWN0aW9uIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbWVzLWJhY2tncm91bmRcIiBpZD1cImdhbWVzTG9iYnlcIiAqbmdJZj1cIiFmaWx0ZXJBY3RpdmVcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBsb2JieUdhbWVzOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJnYW1lcy1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZXctZ2FtZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoMyBbbmdTdHlsZV09XCJ7ICdjb2xvcic6IHRoZW1lPy50ZXh0Q29sb3IgfHwgJyNGRkZGRkYnIH1cIj57e2dyb3VwLmdhbWVHcm91cERldGFpbHMubmFtZX19PC9oMz5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4tbmV3Z2FtZXN0cmlwXCIgW25nU3R5bGVdPVwieyAnYm9yZGVyJzogKHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJ25vbmUnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiBob3ZlcmVkVmlld0FsbEluZGV4ID09PSBpID8gKHRoZW1lPy5idXR0b25CYWNrZ3JvdW5kQ29sb3IgfHwgJycpIDogKHRoZW1lPy5iYWNrZ3JvdW5kIHx8ICcjMjYyNjI2JylcclxuICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cInZpZXdHYW1lQ2F0ZWdvcnkoZ3JvdXAuZ2FtZUdyb3VwRGV0YWlscylcIiAobW91c2VlbnRlcik9XCJob3ZlcmVkVmlld0FsbEluZGV4ID0gaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRWaWV3QWxsSW5kZXggPSBudWxsXCI+VklFVyBBTEw8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4tQXJyb3ctbGVmdFwiIFtuZ0NsYXNzXT1cInsgJ3B1bHNlJzogcHVsc2luZ0J1dHRvbiA9PT0gJ3ByZXYnICsgaSB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnYm9yZGVyJzogaG92ZXJlZEJ1dHRvbiA9PT0gJ3ByZXYnICsgaSA/ICh0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJyk6JzFweCBzb2xpZCAjZmZmJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIGdhbWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJQdWxzZSgncHJldicgKyBpKTsgc2xpZGVQcmV2KGkpXCIgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZEJ1dHRvbiA9ICdwcmV2JyArIGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkQnV0dG9uID0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFycm93LWljb24gYXJyb3ctbGVmdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4tQXJyb3ctcmlnaHRcIiBbbmdDbGFzc109XCJ7ICdwdWxzZSc6IHB1bHNpbmdCdXR0b24gPT09ICduZXh0JyArIGkgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgJ2JvcmRlcic6IGhvdmVyZWRCdXR0b24gPT09ICduZXh0JyArIGkgPyAodGhlbWU/LmJvcmRlclNlYXJjaCB8fCAnbm9uZScpIDogJzFweCBzb2xpZCAjZmZmJyB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgYXJpYS1sYWJlbD1cIk5leHQgZ2FtZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlclB1bHNlKCduZXh0JyArIGkpOyBzbGlkZU5leHQoaSlcIiAobW91c2VlbnRlcik9XCJob3ZlcmVkQnV0dG9uID0gJ25leHQnICsgaVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRCdXR0b24gPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJyb3ctaWNvbiBhcnJvdy1yaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXBlckNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IHdoaXRlLXNwYWNlOiBub3dyYXA7IHdpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzd2lwZXItY29udGFpbmVyICNnYW1lU3dpcGVyQ29udGFpbmVyICpuZ0lmPVwiZ3JvdXAuZ2FtZXMgJiYgZ3JvdXAuZ2FtZXMubGVuZ3RoXCIgc2xpZGVzLXBlci12aWV3PVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlLWJldHdlZW49XCIxMFwiIHNwZWVkPVwiNTBcIiBbbG9vcF09XCJzaG91bGRMb29wR2FtZXNGb3JHcm91cChncm91cC5nYW1lcylcIiBuYXZpZ2F0aW9uPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MtbW9kZT1cImZhbHNlXCIgW2JyZWFrcG9pbnRzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxOTAnOiB7IHNsaWRlc1BlclZpZXc6IDEsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICczNTAnOiB7IHNsaWRlc1BlclZpZXc6IDIsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1MjAnOiB7IHNsaWRlc1BlclZpZXc6IDMsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2NzYnOiB7IHNsaWRlc1BlclZpZXc6IDQsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4MzQnOiB7IHNsaWRlc1BlclZpZXc6IDQsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5OTgnOiB7IHNsaWRlc1BlclZpZXc6IDUsIHNwYWNlQmV0d2VlbjogMTAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMTU4JzogeyBzbGlkZXNQZXJWaWV3OiA2LCBzcGFjZUJldHdlZW46IDEwIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTI4MCc6IHsgc2xpZGVzUGVyVmlldzogNiwgc3BhY2VCZXR3ZWVuOiAxMCB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN3aXBlci1zbGlkZSAqbmdGb3I9XCJsZXQgZ2FtZSBvZiBncm91cC5nYW1lczsgbGV0IGdhbWVJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZ2FtZS1pZF09XCJpICsgJy0nICsgZ2FtZS5nYW1lQ29kZVwiIGNsYXNzPVwibG9iYnlfZ2FtZXMtaG9tZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdhbWUtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRfX2NvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkR2FtZUtleSA9IGdhbWVJbmRleCArICctJyArICBnYW1lLmdhbWVDb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEdhbWVLZXkgPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJnYW1lLWNhcmRfX2FjdGlvbi1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJob3ZlcmVkR2FtZUtleSA9PT0gZ2FtZUluZGV4ICsgJy0nICsgZ2FtZS5nYW1lQ29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gZ2FtZS1jYXJkX19hY3Rpb24tYnRuLS1wbGF5XCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8uYnV0dG9uQmFja2dyb3VuZENvbG9yIHx8ICcjZmY3ZDAwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJyNmZjdkMDAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldGdhbWVDbGlja2VkKGdhbWUuZ2FtZUNvZGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGxheVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWJib25cIj48c3BhbiBbbmdDbGFzc109XCJnYW1lLnRhZ0xpc3QuaW5jbHVkZXMoJ25ldycpID8gJ25ldycgOiAnJ1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZS50YWdMaXN0LmluY2x1ZGVzKFwibmV3XCIpID8gXCJORVdcIiA6IFwiXCIgfX08L3NwYW4+PHNwYW4gW25nQ2xhc3NdPVwiZ2FtZS50YWdMaXN0LmluY2x1ZGVzKCdob3QnKSA/ICdob3QnIDogJydcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbWUudGFnTGlzdC5pbmNsdWRlcyhcImhvdFwiKSA/IFwiSE9UXCIgOiBcIlwiIH19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkX19pbWcgZ2FtZS1jYXJkX19pbWFnZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctZ3JhZGllbnRcIiBbc3JjXT1cImdldEdhbWVJbWFnZShnYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cIm9uSW1hZ2VFcnJvcigkZXZlbnQpXCIgW2FsdF09XCJnYW1lLm5hbWVcIiBsb2FkaW5nPVwibGF6eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdhbWUubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkX190ZXh0XCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogdGhlbWU/LnRleHRDb2xvciB8fCAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHRoZW1lPy5nYW1ldGV4dGJhY2tncm91bmQgfHwgJyNmZjdkMDAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj48c3BhbiBjbGFzcz1cImdhbWUtY2FyZF9fZmF2aWNvblwiPjxpIGNsYXNzPVwiZmFyIGZhLWhlYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9zcGFuPjxzcGFuIGNsYXNzPVwiZ2FtZS1jYXJkLS1uYW1lXCI+e3sgZ2FtZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N3aXBlci1zbGlkZT5cclxuICAgICAgICAgICAgICAgICAgICA8L3N3aXBlci1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIEZpbHRlcmVkIEdhbWVzIFNlY3Rpb25zLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ2FtZXMtYmFja2dyb3VuZFwiIGlkPVwiZmlsdGVyZWQtZ2FtZXMtc2VjdGlvblwiICpuZ0lmPVwiZmlsdGVyQWN0aXZlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYmJ5X2dhbWVzLXJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkXCIgW2F0dHIuZGF0YS1nYW1lLWlkXT1cImdhbWVJbmRleCArICctJyArIGdhbWUuZ2FtZUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGdhbWUgb2YgZmlsdGVyZWRHYW1lczsgbGV0IGdhbWVJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkX19jb250ZW50XCIgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZEdhbWVLZXkgPSBnYW1lSW5kZXggKyAnLScgKyAgZ2FtZS5nYW1lQ29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEdhbWVLZXkgPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdhbWUtY2FyZF9fYWN0aW9uLWJ0blwiICpuZ0lmPVwiaG92ZXJlZEdhbWVLZXkgPT09IGdhbWVJbmRleCArICctJyArIGdhbWUuZ2FtZUNvZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gZ2FtZS1jYXJkX19hY3Rpb24tYnRuLS1wbGF5XCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29sb3InOiB0aGVtZT8uYnV0dG9uQmFja2dyb3VuZENvbG9yIHx8ICcjZmY3ZDAwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvcmRlcic6IHRoZW1lPy5ib3JkZXJTZWFyY2ggfHwgJyNmZjdkMDAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJnZXRnYW1lQ2xpY2tlZChnYW1lLmdhbWVDb2RlKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbGF5XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjxzcGFuIFtuZ0NsYXNzXT1cImdhbWUudGFnTGlzdC5pbmNsdWRlcygnbmV3JykgPyAnbmV3JyA6ICcnXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1lLnRhZ0xpc3QuaW5jbHVkZXMoXCJuZXdcIikgPyBcIk5FV1wiIDogXCJcIiB9fTwvc3Bhbj48c3BhbiBbbmdDbGFzc109XCJnYW1lLnRhZ0xpc3QuaW5jbHVkZXMoJ2hvdCcpID8gJ2hvdCcgOiAnJ1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZS50YWdMaXN0LmluY2x1ZGVzKFwiaG90XCIpID8gXCJIT1RcIiA6IFwiXCIgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdhbWUtY2FyZF9faW1nIGdhbWUtY2FyZF9faW1hZ2UtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWctZ3JhZGllbnRcIiBbc3JjXT1cImdldEdhbWVJbWFnZShnYW1lKVwiIChlcnJvcik9XCJvbkltYWdlRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWx0XT1cImdhbWUubmFtZVwiIGxvYWRpbmc9XCJsYXp5XCIgW3RpdGxlXT1cImdhbWUubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2FtZS1jYXJkX190ZXh0XCIgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJzogdGhlbWU/LnRleHRDb2xvciB8fCAnI2ZmZicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6IHRoZW1lPy5nYW1ldGV4dGJhY2tncm91bmQgfHwgJyNmZjdkMDAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj48c3BhbiBjbGFzcz1cImdhbWUtY2FyZF9fZmF2aWNvblwiPjxpIGNsYXNzPVwiZmFyIGZhLWhlYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L3NwYW4+PHNwYW4gY2xhc3M9XCJnYW1lLWNhcmQtLW5hbWVcIj57eyBnYW1lLm5hbWUgfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2JieV9sb2FkTW9yZUJ0blwiICpuZ0lmPVwiZmlsdGVyU2hvd0xvYWRNb3JlXCI+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiYnRuIGxvYWQtbW9yZS1idG5cIiBbbmdTdHlsZV09XCJ7ICdib3JkZXInOiB0aGVtZT8uYm9yZGVyU2VhcmNoIHx8ICdub25lJyB9XCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJsb2FkTW9yZUZpbHRlcmVkR2FtZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgTE9BRCBNT1JFXHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImdhbWVzLWJhY2tncm91bmQgbG9iYnlfbm9HYW1lc01lc3NhZ2VcIiBpZD1cIm5vR2FtZXNNZXNzYWdlXCIgKm5nSWY9XCJub0dhbWVzVG9TaG93XCI+XHJcbiAgICAgICAgPHA+Tk8gR0FNRVMgRk9VTkQ8L3A+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+Il19
@@ -60,6 +60,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
60
60
  class BannersComponent {
61
61
  constructor(sanitizer, themeService) {
62
62
  this.sanitizer = sanitizer;
63
+ this.themeService = themeService;
63
64
  this.baseUrl = '';
64
65
  this.routerLinkClicked = new EventEmitter();
65
66
  this.bannerOverlay = null;
@@ -75,30 +76,58 @@ class BannersComponent {
75
76
  this.baseUrl = this.bannerData?.baseUrl || '';
76
77
  }
77
78
  /**
78
- * Bypasses Angular's HTML sanitization so that button HTML (e.g. anchor tags,
79
- * custom attributes, styled text like "Deposit") renders correctly in the
80
- * consuming project. Safe to use here because the content comes from your
81
- * own controlled bannerData input, not from user-generated content.
79
+ * Rewrites all class names on the injected button HTML to namespaced equivalents
80
+ * prefixed with "lobby_". This prevents the host project's Bootstrap/jQuery stylesheets
81
+ * from targeting generic class names like "btn", "logged-in" etc. and altering
82
+ * the button appearance or triggering jQuery handlers that crash with
83
+ * "Cannot read properties of undefined (reading 'display')".
84
+ *
85
+ * e.g. class="btn cm-slider__btn--cta logged-in"
86
+ * => class="lobby_btn lobby_cm-slider__btn--cta lobby_logged-in"
82
87
  */
83
88
  getSafeHtml(html) {
84
89
  if (!html)
85
90
  return '';
91
+ try {
92
+ const parser = new DOMParser();
93
+ const doc = parser.parseFromString(html, 'text/html');
94
+ const el = doc.body.firstElementChild;
95
+ if (el) {
96
+ // Rewrite each class to a namespaced lobby_ version so the host project
97
+ // stylesheets and jQuery plugins cannot match them
98
+ const originalClasses = Array.from(el.classList);
99
+ el.setAttribute('class', originalClasses.map(c => `lobby_${c}`).join(' '));
100
+ // Remove routerlink so the host project jQuery does not try to handle it.
101
+ // Navigation is handled by Angular's (click) binding on the parent div.
102
+ el.removeAttribute('routerlink');
103
+ // Neutralise the anchor href so the browser does not navigate on click.
104
+ // The parent div's (click) output handles routing instead.
105
+ el.setAttribute('href', 'javascript:void(0)');
106
+ html = el.outerHTML;
107
+ }
108
+ }
109
+ catch (e) {
110
+ console.error('BannersComponent: error rewriting button HTML classes', e);
111
+ }
86
112
  return this.sanitizer.bypassSecurityTrustHtml(html);
87
113
  }
88
- getRouterLinkFromButton(buttonHtml) {
89
- if (!buttonHtml || typeof buttonHtml !== 'string') {
114
+ getRouterLinkFromButton(buttonHtml, event) {
115
+ // Stop the click bubbling up to the host project's jQuery/global listeners
116
+ // which throw "Cannot read properties of undefined (reading 'display')"
117
+ if (event) {
118
+ event.stopPropagation();
119
+ event.preventDefault();
120
+ }
121
+ if (!buttonHtml) {
90
122
  this.routerLinkClicked.emit('');
91
123
  return;
92
124
  }
93
125
  try {
94
126
  const parser = new DOMParser();
95
127
  const doc = parser.parseFromString(buttonHtml, 'text/html');
96
- if (!doc) {
97
- this.routerLinkClicked.emit('');
98
- return;
99
- }
128
+ // Read the original routerlink from the raw HTML before getSafeHtml strips it
100
129
  const anchor = doc.querySelector('a[routerlink]');
101
- if (anchor && anchor.hasAttribute('routerlink')) {
130
+ if (anchor) {
102
131
  const routerLink = anchor.getAttribute('routerlink');
103
132
  this.routerLinkClicked.emit(routerLink || '');
104
133
  }
@@ -107,16 +136,16 @@ class BannersComponent {
107
136
  }
108
137
  }
109
138
  catch (error) {
110
- console.error('Error parsing button HTML:', error);
139
+ console.error('BannersComponent: error parsing button HTML', error);
111
140
  this.routerLinkClicked.emit('');
112
141
  }
113
142
  }
114
143
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BannersComponent, deps: [{ token: i1$1.DomSanitizer }, { token: GameLobbyThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
115
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BannersComponent, isStandalone: true, selector: "app-banners", inputs: { bannerData: "bannerData", theme: "theme", bannerOverlay: "bannerOverlay" }, outputs: { routerLinkClicked: "routerLinkClicked" }, viewQueries: [{ propertyName: "btnSpans", predicate: ["btnSpan"], descendants: true }], ngImport: i0, template: "<div class=\"lobby_cm-banner\">\r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container class=\"my-swiper\" slides-per-view=\"1\" pagination=\"true\" pagination-clickable=\"true\" speed=\"500\"\r\n [loop]=\"slides.length > 1\" autoplay=\"true\" autoplay-delay=\"15000\" css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div *ngIf=\"slide && slide.button\" [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n <div class=\"lobby_cm-slider__btn\" [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\" (mouseenter)=\"hoveredSlideId = slide.id\" (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button)\">\r\n <!-- getSafeHtml() bypasses Angular sanitization so button text (e.g. \"Deposit\")\r\n and any anchor/custom attributes render correctly in the consuming project -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important;justify-content:flex-end!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important;justify-content:flex-end!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], encapsulation: i0.ViewEncapsulation.None }); }
144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BannersComponent, isStandalone: true, selector: "app-banners", inputs: { bannerData: "bannerData", theme: "theme", bannerOverlay: "bannerOverlay" }, outputs: { routerLinkClicked: "routerLinkClicked" }, viewQueries: [{ propertyName: "btnSpans", predicate: ["btnSpan"], descendants: true }], ngImport: i0, template: "<div class=\"lobby_cm-banner\"> \r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container\r\n class=\"my-swiper\"\r\n slides-per-view=\"1\"\r\n pagination=\"true\"\r\n pagination-clickable=\"true\"\r\n speed=\"500\"\r\n [loop]=\"slides.length > 1\"\r\n autoplay=\"true\"\r\n autoplay-delay=\"150000\"\r\n css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n\r\n <!-- Only render when slide.button has content \u2014 prevents jQuery scripts\r\n in the host project from querying an empty element and throwing\r\n \"Cannot read properties of undefined (reading 'display')\" -->\r\n <ng-container *ngIf=\"slide.button\">\r\n <div class=\"lobby_cm-slider__btn\"\r\n [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\"\r\n (mouseenter)=\"hoveredSlideId = slide.id\"\r\n (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button, $event)\">\r\n <!-- getSafeHtml() does two things:\r\n 1. Rewrites class names e.g. \"btn\" => \"lobby_btn\" so host Bootstrap/jQuery\r\n stylesheets cannot match and alter them\r\n 2. Bypasses Angular sanitization so the anchor tag and its text render fully -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{display:inline-block!important;font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px!important;text-decoration:none!important;color:inherit!important;background:transparent!important;cursor:pointer!important}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], encapsulation: i0.ViewEncapsulation.None }); }
116
145
  }
117
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BannersComponent, decorators: [{
118
147
  type: Component,
119
- args: [{ selector: 'app-banners', standalone: true, imports: [CommonModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], encapsulation: ViewEncapsulation.None, template: "<div class=\"lobby_cm-banner\">\r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container class=\"my-swiper\" slides-per-view=\"1\" pagination=\"true\" pagination-clickable=\"true\" speed=\"500\"\r\n [loop]=\"slides.length > 1\" autoplay=\"true\" autoplay-delay=\"15000\" css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div *ngIf=\"slide && slide.button\" [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n <div class=\"lobby_cm-slider__btn\" [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\" (mouseenter)=\"hoveredSlideId = slide.id\" (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button)\">\r\n <!-- getSafeHtml() bypasses Angular sanitization so button text (e.g. \"Deposit\")\r\n and any anchor/custom attributes render correctly in the consuming project -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .btn{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important;justify-content:flex-end!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important;justify-content:flex-end!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"] }]
148
+ args: [{ selector: 'app-banners', standalone: true, imports: [CommonModule], schemas: [CUSTOM_ELEMENTS_SCHEMA], encapsulation: ViewEncapsulation.None, template: "<div class=\"lobby_cm-banner\"> \r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container\r\n class=\"my-swiper\"\r\n slides-per-view=\"1\"\r\n pagination=\"true\"\r\n pagination-clickable=\"true\"\r\n speed=\"500\"\r\n [loop]=\"slides.length > 1\"\r\n autoplay=\"true\"\r\n autoplay-delay=\"150000\"\r\n css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n\r\n <!-- Only render when slide.button has content \u2014 prevents jQuery scripts\r\n in the host project from querying an empty element and throwing\r\n \"Cannot read properties of undefined (reading 'display')\" -->\r\n <ng-container *ngIf=\"slide.button\">\r\n <div class=\"lobby_cm-slider__btn\"\r\n [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\"\r\n (mouseenter)=\"hoveredSlideId = slide.id\"\r\n (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button, $event)\">\r\n <!-- getSafeHtml() does two things:\r\n 1. Rewrites class names e.g. \"btn\" => \"lobby_btn\" so host Bootstrap/jQuery\r\n stylesheets cannot match and alter them\r\n 2. Bypasses Angular sanitization so the anchor tag and its text render fully -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>", styles: [".lobby_cm-banner{width:100%!important;max-width:1280px!important;display:block!important;position:relative!important;margin:0 auto!important;padding:0 15px!important;box-sizing:border-box!important}.lobby_cm-banner *{box-sizing:border-box}.lobby_cm-banner img{max-width:unset;margin:0;padding:0;border:none;display:block;vertical-align:unset}.lobby_cm-banner a{text-decoration:none;color:inherit}@media (max-width: 1280px){.lobby_cm-banner{padding:0 20px!important}}@media (max-width: 768px){.lobby_cm-banner{padding:0 15px!important}}@media (max-width: 480px){.lobby_cm-banner{padding:0 10px!important}}.lobby_cm-banner .lobby_slideWrapper{position:relative!important;width:100%!important;font-weight:400;overflow:hidden!important}.lobby_cm-banner .lobby_slideWrapper img{width:100%!important;height:auto!important;max-width:1280px!important;aspect-ratio:1280/340!important;object-fit:cover!important;object-position:center!important;display:block!important;border-radius:4px!important}@media (max-width: 1280px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/5!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:16/6!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper img{aspect-ratio:4/3!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{position:absolute!important;border-radius:4px!important;left:25%;bottom:40px!important;z-index:2!important;padding:20px!important;cursor:pointer!important;transition:all .3s ease}@media (max-width: 1024px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:20%;bottom:40px!important;padding:15px!important}}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{left:50%;transform:translate(-50%);bottom:30px!important;padding:12px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn{bottom:20px!important;padding:10px!important}}.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{display:inline-block!important;font-weight:200!important;border:none!important;border-radius:4px!important;font-size:1rem!important;padding:18px 36px!important;letter-spacing:1px!important;text-decoration:none!important;color:inherit!important;background:transparent!important;cursor:pointer!important}@media (max-width: 768px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.9rem!important;padding:14px 28px!important}}@media (max-width: 480px){.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_btn,.lobby_cm-banner .lobby_slideWrapper .lobby_cm-slider__btn .lobby_cm-slider__btn--cta{font-size:.8rem!important;padding:10px 20px!important}}.lobby_cm-banner .my-swiper{width:100%!important;max-width:1280px!important;--swiper-pagination-bottom: 15px;--swiper-pagination-bullet-inactive-color: #999;--swiper-pagination-color: #fff;--swiper-pagination-bullet-size: 15px}@media (max-width: 768px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 12px;--swiper-pagination-bottom: 10px}}@media (max-width: 480px){.lobby_cm-banner .my-swiper{--swiper-pagination-bullet-size: 10px;--swiper-pagination-bottom: 8px}}.lobby_cm-banner .my-swiper::part(pagination){left:0!important;right:0!important;text-align:center!important;width:100%!important;display:flex!important;justify-content:flex-end!important;align-items:center!important;padding-right:400px!important}@media (max-width: 1280px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:300px!important}}@media (max-width: 768px){.lobby_cm-banner .my-swiper::part(pagination){padding-right:200px!important}}@media (max-width: 480px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:200px!important}}@media (max-width: 80px){.lobby_cm-banner .my-swiper::part(pagination){justify-content:center!important;padding-right:100px!important}}.lobby_cm-banner .my-swiper::part(bullet){background:#999!important}.lobby_cm-banner .my-swiper::part(bullet-active){background:#fff!important}\n"] }]
120
149
  }], ctorParameters: () => [{ type: i1$1.DomSanitizer }, { type: GameLobbyThemeService }], propDecorators: { btnSpans: [{
121
150
  type: ViewChildren,
122
151
  args: ['btnSpan']
@@ -1 +1 @@
1
- {"version":3,"file":"game-lobby-lib.mjs","sources":["../../../projects/game-lobby-lib/src/lib/theme/default-theme.ts","../../../projects/game-lobby-lib/src/lib/theme/theme.token.ts","../../../projects/game-lobby-lib/src/lib/theme/themeService.service.ts","../../../projects/game-lobby-lib/src/lib/banners/banners.component.ts","../../../projects/game-lobby-lib/src/lib/banners/banners.component.html","../../../projects/game-lobby-lib/src/lib/game-lobby-lib.service.ts","../../../projects/game-lobby-lib/src/lib/casino-lobby/casino-lobby.component.ts","../../../projects/game-lobby-lib/src/lib/casino-lobby/casino-lobby.component.html","../../../projects/game-lobby-lib/src/lib/game-lobby-lib.component.ts","../../../projects/game-lobby-lib/src/public-api.ts","../../../projects/game-lobby-lib/src/game-lobby-lib.ts"],"sourcesContent":["export interface GameLobbyTheme {\r\n border: string;\r\n borderSearch: string;\r\n gametextbackground: string;\r\n buttonBackgroundColor: string;\r\n background: string;\r\n textColor: string;\r\n}\r\n\r\nexport const DEFAULT_THEME: GameLobbyTheme = {\r\n border: '2px solid #02B0CB',\r\n gametextbackground: 'rgba(0, 0, 0, 0.5)',\r\n borderSearch: '1px solid #cccccc',\r\n buttonBackgroundColor: '#22c55e',\r\n background: '#ffffff',\r\n textColor: '#ffffff'\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { GameLobbyTheme, DEFAULT_THEME } from './default-theme';\r\n\r\nexport const GAME_LOBBY_THEME_TOKEN =\r\n new InjectionToken<BehaviorSubject<GameLobbyTheme>>(\r\n 'GAME_LOBBY_THEME_TOKEN',\r\n {\r\n providedIn: 'root',\r\n factory: () => new BehaviorSubject(DEFAULT_THEME)\r\n }\r\n );\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { GameLobbyTheme } from './default-theme';\r\nimport { GAME_LOBBY_THEME_TOKEN } from './theme.token';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class GameLobbyThemeService {\r\n\r\n constructor(\r\n @Inject(GAME_LOBBY_THEME_TOKEN)\r\n private readonly themeSubject: BehaviorSubject<GameLobbyTheme>\r\n ) {}\r\n\r\n /** Observable for components */\r\n get theme$(): Observable<GameLobbyTheme> {\r\n return this.themeSubject.asObservable();\r\n }\r\n\r\n /** Current theme snapshot */\r\n get current(): GameLobbyTheme {\r\n return this.themeSubject.value;\r\n }\r\n\r\n /** Update theme at runtime */\r\n setTheme(theme: GameLobbyTheme): void {\r\n this.themeSubject.next(theme);\r\n }\r\n\r\n /** Partial update helper (optional but useful) */\r\n patchTheme(partial: Partial<GameLobbyTheme>): void {\r\n this.themeSubject.next({\r\n ...this.themeSubject.value,\r\n ...partial\r\n });\r\n }\r\n}\r\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, Input, OnInit, ViewChildren, ViewEncapsulation, QueryList, ElementRef, Output, EventEmitter, TemplateRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { GameLobbyThemeService } from '../theme/themeService.service';\r\nimport { GameLobbyTheme } from '../theme/default-theme';\r\n\r\n@Component({\r\n selector: 'app-banners',\r\n standalone: true,\r\n imports: [CommonModule],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './banners.component.html',\r\n styleUrl: './banners.component.scss',\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class BannersComponent implements OnInit {\r\n @ViewChildren('btnSpan') btnSpans!: QueryList<ElementRef>;\r\n\r\n @Input() bannerData: any;\r\n @Input() theme?: GameLobbyTheme;\r\n baseUrl: string = '';\r\n @Output() routerLinkClicked = new EventEmitter<string>();\r\n @Input() bannerOverlay: TemplateRef<any> | null = null;\r\n slides: any[] = [];\r\n hoveredSlideId: number | null = null;\r\n\r\n constructor(\r\n private sanitizer: DomSanitizer,\r\n themeService: GameLobbyThemeService\r\n ) {\r\n themeService.theme$.subscribe(t => (this.theme = t));\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setDataThemes();\r\n }\r\n\r\n setDataThemes(): void {\r\n this.slides = this.bannerData?.bannerData || [];\r\n this.baseUrl = this.bannerData?.baseUrl || '';\r\n }\r\n\r\n /**\r\n * Bypasses Angular's HTML sanitization so that button HTML (e.g. anchor tags,\r\n * custom attributes, styled text like \"Deposit\") renders correctly in the\r\n * consuming project. Safe to use here because the content comes from your\r\n * own controlled bannerData input, not from user-generated content.\r\n */\r\n getSafeHtml(html: string): SafeHtml {\r\n if (!html) return '';\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n }\r\n\r\n getRouterLinkFromButton(buttonHtml: string): void {\r\n if (!buttonHtml || typeof buttonHtml !== 'string') {\r\n this.routerLinkClicked.emit('');\r\n return;\r\n }\r\n\r\n try {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(buttonHtml, 'text/html');\r\n if (!doc) {\r\n this.routerLinkClicked.emit('');\r\n return;\r\n }\r\n const anchor = doc.querySelector('a[routerlink]');\r\n if (anchor && anchor.hasAttribute('routerlink')) {\r\n const routerLink = anchor.getAttribute('routerlink');\r\n this.routerLinkClicked.emit(routerLink || '');\r\n } else {\r\n this.routerLinkClicked.emit('');\r\n }\r\n } catch (error) {\r\n console.error('Error parsing button HTML:', error);\r\n this.routerLinkClicked.emit('');\r\n }\r\n }\r\n}","<div class=\"lobby_cm-banner\">\r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container class=\"my-swiper\" slides-per-view=\"1\" pagination=\"true\" pagination-clickable=\"true\" speed=\"500\"\r\n [loop]=\"slides.length > 1\" autoplay=\"true\" autoplay-delay=\"15000\" css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div *ngIf=\"slide && slide.button\" [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n <div class=\"lobby_cm-slider__btn\" [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\" (mouseenter)=\"hoveredSlideId = slide.id\" (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button)\">\r\n <!-- getSafeHtml() bypasses Angular sanitization so button text (e.g. \"Deposit\")\r\n and any anchor/custom attributes render correctly in the consuming project -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n} from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map, shareReplay } from 'rxjs/operators';\r\n\r\n//Intefaces\r\n\r\nexport interface BaseApiResponse {\r\n status: 'SUCCESS' | 'FAILED' | string;\r\n}\r\n\r\nexport interface GameMultilingualUrl {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface Game {\r\n gameCode: string;\r\n gameId: number | null;\r\n gameType: string;\r\n publishedDate: string | null;\r\n hasDemo: number;\r\n name: string;\r\n multilingualUrl: GameMultilingualUrl;\r\n vendorId: string;\r\n tagList: string[];\r\n displayOrder: number;\r\n gameCategory: string;\r\n vendorName: string;\r\n gameGroupIds: number[] | null;\r\n gameGroupDisplayOrder?: number | null;\r\n}\r\n\r\nexport interface GameProvider {\r\n id: number;\r\n name: string;\r\n prefix: string;\r\n vendorCode: string;\r\n vendorClass: string;\r\n vendorDisplayName: string;\r\n subProviders: any[];\r\n displayOrder: number;\r\n}\r\n\r\nexport interface GetGamesParams {\r\n languageId?: string; // default always 'en'\r\n gameGroupId?: number;\r\n tag?: string;\r\n vendorId?: string;\r\n sorting?: string;\r\n sort?: string;\r\n searchText?: string;\r\n size?: number;\r\n page?: number;\r\n}\r\n\r\nexport interface GetOtherParams {\r\n languageId?: string; // default always 'en'\r\n}\r\n\r\nexport interface GamesListResponse extends BaseApiResponse {\r\n gamesList: Game[];\r\n}\r\n\r\nexport interface ProvidersListResponse extends BaseApiResponse {\r\n gameProvidersList: GameProvider[];\r\n}\r\n\r\nexport interface ToggleFavoriteResponse extends BaseApiResponse {\r\n ecrExternalId: string;\r\n gameId: string;\r\n gameCategoryId: number;\r\n gameTypeId: number;\r\n favoriteAddFlag: boolean;\r\n errorCode: string | null;\r\n errorDescription: string | null;\r\n}\r\n\r\nexport interface GameGroupMultilingualUrl {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface GameGroupProviderIds {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface GameGroup {\r\n id: number;\r\n name: string;\r\n group_type: string;\r\n group_sub_type: string;\r\n game_asset_style: string;\r\n game_group_order: number;\r\n content: string;\r\n metaTitle: string;\r\n metaTags: string;\r\n metaDescription: string;\r\n multilingualUrlGameGroup: GameGroupMultilingualUrl;\r\n gameGroupProviderIdsListResult: GameGroupProviderIds | [];\r\n}\r\n\r\nexport interface GameLobby {\r\n id: number;\r\n title: string;\r\n name: string;\r\n user_segment: string;\r\n lobby_order: number;\r\n content: string;\r\n metaTitle: string;\r\n metaTags: string;\r\n metaDescription: string;\r\n multilingualUrlLobby: GameMultilingualUrl;\r\n gameGroupList: GameGroup[];\r\n}\r\n\r\nexport interface GameGroupsResponse extends Array<GameLobby> { }\r\n\r\nexport interface GameResponse {\r\n content: any[];\r\n totalElements: number;\r\n totalPages: number;\r\n}\r\n\r\n// Final lobbyGames structure \r\nexport interface LobbyGames {\r\n gameGroupDetails: GameGroup;\r\n games: any[];\r\n}\r\n// Service logic\r\n\r\ninterface CachedPost {\r\n observable: Observable<any>;\r\n timestamp: number;\r\n}\r\n\r\ninterface CachedGet {\r\n observable: Observable<any>;\r\n timestamp: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GameLobbyLibService {\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n private postCache = new Map<string, CachedPost>();\r\n private getCache = new Map<string, CachedGet>();\r\n\r\n // common methods to build params and headers for all API calls\r\n\r\n private buildParams(params?: any): HttpParams {\r\n const merged = {\r\n languageId: 'en', // defauit to en\r\n ...params\r\n };\r\n\r\n let httpParams = new HttpParams();\r\n Object.keys(merged).forEach(key => {\r\n httpParams = httpParams.set(key, merged[key] ?? '');\r\n });\r\n\r\n return httpParams;\r\n }\r\n\r\n private buildHeaders(extraHeaders?: { [key: string]: string }): HttpHeaders {\r\n const defaultHeaders = {\r\n accept: 'application/json, text/plain, */*'\r\n };\r\n\r\n return new HttpHeaders({\r\n ...defaultHeaders,\r\n ...extraHeaders\r\n });\r\n }\r\n\r\n // API methods\r\n getGamesGroups(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<GameGroupsResponse> {\r\n\r\n return this.lbGetCachedApi<GameGroupsResponse>(\r\n `${baseUrl}/ajax/game/getLobbyListWithGameGroups`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getGames(\r\n baseUrl: string,\r\n params?: GetGamesParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<Game[]> {\r\n\r\n return this.lbGetCachedApi<Game[]>(\r\n `${baseUrl}/ajax/v2/games`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getLastPlayed(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<GamesListResponse> {\r\n\r\n return this.lbGetCachedApi<GamesListResponse>(\r\n `${baseUrl}/ajax/v2/getUserLastPlayed`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getFavouriteGames(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<GamesListResponse> {\r\n\r\n return this.lbGetCachedApi<GamesListResponse>(\r\n `${baseUrl}/ajax/v2/getFavorites`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getGamesProviders(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<ProvidersListResponse> {\r\n\r\n return this.lbGetCachedApi<ProvidersListResponse>(\r\n `${baseUrl}/ajax/v2/getGameProviders`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n toggleFavoriteGame(\r\n baseUrl: string,\r\n gameId: number,\r\n newState: boolean,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<ToggleFavoriteResponse> {\r\n\r\n const formData = new FormData();\r\n formData.append('gameId', String(gameId));\r\n formData.append('newState', String(newState));\r\n\r\n return this.lbPostCachedApi<ToggleFavoriteResponse>(\r\n `${baseUrl}/ajax/profile/toggleFavoriteGame`,\r\n formData,\r\n {\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n // Caching logic for GET and POST requests\r\n\r\n lbGetCachedApi<T>(\r\n url: string,\r\n options: {\r\n params?: any;\r\n headers?: HttpHeaders | { [header: string]: string | string[] };\r\n withCredentials?: boolean;\r\n } = {},\r\n cache_expire: number = 0\r\n ): Observable<T> {\r\n\r\n const request$ = this.http\r\n .get<T>(url, {\r\n withCredentials: true,\r\n ...options\r\n })\r\n .pipe(\r\n catchError(e => {\r\n return throwError(() => e);\r\n }),\r\n shareReplay(1)\r\n );\r\n\r\n if (cache_expire === 0) {\r\n return request$;\r\n }\r\n\r\n const cacheKey = this.generateCacheKey(url, options?.params);\r\n const now = Date.now();\r\n const cached = this.getCache.get(cacheKey);\r\n\r\n if (cached && now - cached.timestamp < cache_expire) {\r\n return cached.observable;\r\n }\r\n\r\n this.getCache.set(cacheKey, { observable: request$, timestamp: now });\r\n return request$;\r\n }\r\n\r\n lbPostCachedApi<T>(\r\n url: string,\r\n body: any,\r\n options: {\r\n headers?: HttpHeaders | { [header: string]: string | string[] };\r\n withCredentials?: boolean;\r\n } = {},\r\n cache_expire: number = 0\r\n ): Observable<T> {\r\n\r\n const request$ = this.http.post<T>(\r\n url,\r\n body,\r\n {\r\n observe: 'body', //body response\r\n withCredentials: true,\r\n ...options\r\n }\r\n ).pipe(\r\n catchError(e => throwError(() => e)),\r\n shareReplay(1)\r\n );\r\n\r\n if (cache_expire === 0) return request$;\r\n\r\n const cacheKey = this.generateCacheKey(url, body);\r\n const now = Date.now();\r\n const cached = this.postCache.get(cacheKey);\r\n\r\n if (cached && now - cached.timestamp < cache_expire) {\r\n return cached.observable;\r\n }\r\n\r\n this.postCache.set(cacheKey, { observable: request$, timestamp: now });\r\n return request$;\r\n }\r\n\r\n\r\n private generateCacheKey(url: string, params: any): string {\r\n try {\r\n if (!params) return url;\r\n return `${url}::${JSON.stringify(params)}`;\r\n } catch {\r\n return url;\r\n }\r\n }\r\n\r\n clearAllApiCache(): void {\r\n this.postCache.clear();\r\n this.getCache.clear();\r\n }\r\n\r\n\r\n handleHTTPError(e: any) {\r\n if (e.message && e.message.includes(\"countryBlocked\")) {\r\n console.log(\"Country blocked:\" + e.message.split(\":\")[1]);\r\n // notify the host brand\r\n } else if (e.message && e.message.includes(\"session_expired_sso\")) {\r\n console.log(\"Session expired:\" + e.message.split(\":\")[1]);\r\n // notify the host brand\r\n } else {\r\n if (e.status === 401) {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n } else if (e.status === 404) {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n } else if (e.status === 504) {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n } else {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n }\r\n }\r\n }\r\n}\r\n\r\n","import { Component, Input, OnInit, ViewChild, AfterViewInit, ViewEncapsulation, CUSTOM_ELEMENTS_SCHEMA, ViewChildren, QueryList, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GameLobbyTheme } from '../theme/default-theme';\r\nimport { GameLobbyThemeService } from '../theme/themeService.service';\r\nimport { LobbyGames, GameGroup, GameGroupsResponse, GameLobby } from '../game-lobby-lib.service';\r\nimport { GameLobbyLibService } from '../game-lobby-lib.service';\r\nimport { forkJoin, map, of, switchMap, tap, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'lib-casino-lobby',\r\n standalone: true,\r\n imports: [CommonModule],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './casino-lobby.component.html',\r\n styleUrl: './casino-lobby.component.scss',\r\n // encapsulation: ViewEncapsulation.None\r\n})\r\nexport class CasinoLobbyComponent implements OnInit, AfterViewInit {\r\n hoveredSlideId: string | null = null;\r\n hoveredButton: string | null = null;\r\n hoveredGameKey: string | null = null;\r\n @ViewChild('swiperContainer') swiperContainer: any;\r\n @ViewChildren('gameSwiperContainer') gameSwiperContainers!: QueryList<ElementRef>;\r\n @Output() gameClicked = new EventEmitter<string>();\r\n @Input() casinoData: any;\r\n @Input() theme?: GameLobbyTheme;\r\n @Input() baseUrl: string = '';\r\n @Input() brandConfig: any;\r\n websiteCode: string = '';\r\n providerList: any[] = []; // FIX: Initialize as empty array\r\n pulsingButton: string | null = null;\r\n showGameCategoryTop = false;\r\n categoryChosen = false;\r\n categoryLabel: string = 'CATEGORY';\r\n sortedGameGroupList: any[] = []; // FIX: Initialize as empty array instead of undefined\r\n hoveredViewAllIndex: number | null = null;\r\n\r\n /* games logic */\r\n lobbyGames: LobbyGames[] = [];\r\n sortedGameGroup: GameGroup[] = [];\r\n filteredGames: any | null = null;\r\n filterShowLoadMore: boolean = false;\r\n currentFilterPage: number = 0;\r\n noGamesToShow: boolean = false;\r\n filterActive: boolean = false;\r\n private searchSubject: Subject<string> = new Subject<string>();\r\n currentSearchText: string = '';\r\n currentSearchParams: any = {};\r\n @ViewChild('searchInput') searchInput: any;\r\n\r\n constructor(themeService: GameLobbyThemeService, private gameLobbyLibService: GameLobbyLibService) {\r\n themeService.theme$.subscribe(t => (this.theme = t));\r\n }\r\n\r\n slideNext(index: number) {\r\n const swiperEl = this.gameSwiperContainers.toArray()[index]?.nativeElement;\r\n if (swiperEl?.swiper) {\r\n swiperEl.swiper.slideNext();\r\n }\r\n }\r\n\r\n slidePrev(index: number) {\r\n const swiperEl = this.gameSwiperContainers.toArray()[index]?.nativeElement;\r\n if (swiperEl?.swiper) {\r\n swiperEl.swiper.slidePrev();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.getGamesProviders(); // Fetch providers list\r\n this.loadLobbyGames(false); // Load games for non-logged in users by default\r\n this.searchSubject\r\n .pipe(\r\n debounceTime(2000), // wait 2000ms after typing stops\r\n distinctUntilChanged(), // ignore same text\r\n switchMap((searchText: string) => {\r\n this.currentFilterPage = 0; // reset page\r\n this.currentSearchText = searchText;\r\n this.currentSearchParams = {\r\n page: 1,\r\n size: this.brandConfig.loadMorePageSize,\r\n languageId: this.brandConfig?.langCode,\r\n searchText: searchText\r\n };\r\n return this.gameLobbyLibService.getGames(\r\n this.brandConfig?.apiUrl,\r\n this.currentSearchParams,\r\n { referer: this.brandConfig?.siteUrl }\r\n );\r\n })\r\n )\r\n .subscribe((games: any[]) => {\r\n if (!games) {\r\n this.filteredGames = [];\r\n this.filterShowLoadMore = false;\r\n return;\r\n }\r\n\r\n this.filteredGames = games;\r\n this.filterShowLoadMore =\r\n games.length === this.brandConfig.loadMorePageSize;\r\n if (this.currentSearchText.trim() !== '' && this.currentSearchText !== null) {\r\n this.activateFilter();\r\n } else {\r\n this.deactivateFilter();\r\n }\r\n this.checkIfNoGamesToShow();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => {\r\n this.initializeProviderSwiper();\r\n this.initializeGameSwipers();\r\n }, 2000);\r\n this.triggerPulse('');\r\n }\r\n\r\n onSearchChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input) return;\r\n const value = input.value ?? '';\r\n this.searchSubject.next(value.trim());\r\n }\r\n\r\n private initializeProviderSwiper() {\r\n if (this.swiperContainer?.nativeElement) {\r\n const providerSwiperEl = this.swiperContainer.nativeElement;\r\n const parentContainer = providerSwiperEl.closest('.searchBar') || providerSwiperEl.closest('.fixed-footer-width');\r\n const prevButton = parentContainer?.querySelector('.swiper-button-prev');\r\n const nextButton = parentContainer?.querySelector('.swiper-button-next');\r\n\r\n if (prevButton && nextButton) {\r\n prevButton.addEventListener('click', () => {\r\n providerSwiperEl.swiper?.slidePrev();\r\n });\r\n nextButton.addEventListener('click', () => {\r\n providerSwiperEl.swiper?.slideNext();\r\n });\r\n }\r\n }\r\n }\r\n\r\n private initializeGameSwipers() {\r\n if (this.gameSwiperContainers && this.gameSwiperContainers.length > 0) {\r\n this.gameSwiperContainers.forEach((swiperRef, index) => {\r\n const gameSwiperEl = swiperRef.nativeElement;\r\n\r\n // Find the parent games-section for this specific swiper\r\n const gamesSection = gameSwiperEl.closest('.games-section');\r\n\r\n if (gamesSection) {\r\n const customPrev = gamesSection.querySelector('.btn-Arrow-left');\r\n const customNext = gamesSection.querySelector('.btn-Arrow-right');\r\n\r\n if (customPrev) {\r\n customPrev.addEventListener('click', () => {\r\n console.log(`Game section ${index} - Previous clicked`);\r\n gameSwiperEl.swiper?.slidePrev();\r\n });\r\n }\r\n if (customNext) {\r\n customNext.addEventListener('click', () => {\r\n console.log(`Game section ${index} - Next clicked`);\r\n gameSwiperEl.swiper?.slideNext();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // FIX: Updated loop logic to prevent Swiper loop warnings\r\n // Only enable loop when we have more slides than the maximum slidesPerView\r\n shouldLoopProviders(): boolean {\r\n if (!this.providerList || !Array.isArray(this.providerList)) {\r\n return false;\r\n }\r\n\r\n // Max slidesPerView is 12 at the 1280px breakpoint\r\n // Only enable loop if we have more providers than what's visible\r\n const maxSlidesPerView = 12;\r\n return this.providerList.length > maxSlidesPerView;\r\n }\r\n\r\n shouldLoopGames(games: any[]): boolean {\r\n if (!games || !Array.isArray(games)) {\r\n return false;\r\n }\r\n\r\n // Max slidesPerView is 8 at the 1280px breakpoint\r\n // Only enable loop if we have more games than what's visible\r\n const maxSlidesPerView = 8;\r\n return games.length > maxSlidesPerView;\r\n }\r\n\r\n // NEW: Per-group loop logic for game swipers\r\n // This checks each game group individually to determine if loop should be enabled\r\n shouldLoopGamesForGroup(games: any[]): boolean {\r\n if (!games || !Array.isArray(games)) {\r\n return false;\r\n }\r\n\r\n // Max slidesPerView is 8 at the 1280px breakpoint\r\n // Only enable loop if this specific group has more games than what's visible\r\n const maxSlidesPerView = 8;\r\n return games.length > maxSlidesPerView;\r\n }\r\n\r\n triggerPulse(button: string) {\r\n this.pulsingButton = button;\r\n setTimeout(() => {\r\n this.pulsingButton = null;\r\n }, 400); // Duration should match the animation\r\n }\r\n\r\n toggleGameCategoryTop() {\r\n this.showGameCategoryTop = !this.showGameCategoryTop;\r\n this.categoryChosen = this.categoryLabel !== 'CATEGORY';\r\n if (this.categoryLabel == 'CATEGORY') {\r\n this.deactivateFilter();\r\n }\r\n }\r\n\r\n viewGameCategory(group: any) {\r\n this.categoryLabel = group.name;\r\n this.showGameCategoryTop = false;\r\n this.filterGroupGames(0, group.id);\r\n }\r\n\r\n DropdownClose() {\r\n this.categoryLabel === 'CATEGORY' ? this.categoryChosen = false : this.categoryChosen = true;\r\n this.categoryChosen ? this.categoryLabel = 'CATEGORY' : this.categoryLabel;\r\n !this.categoryChosen ? this.categoryChosen = true : this.categoryChosen = false;\r\n this.showGameCategoryTop = false;\r\n if (this.categoryLabel == 'CATEGORY') {\r\n this.deactivateFilter();\r\n }\r\n }\r\n\r\n\r\n\r\n getGameImage(game: any): string {\r\n if (!game?.gameCode) {\r\n return this.brandConfig.defaultGameImage;\r\n }\r\n\r\n return `${this.brandConfig?.gamesImagesDir}/${game.gameCode}/${game.gameCode}.webp`;\r\n }\r\n\r\n onImageError(event: Event): void {\r\n const img = event.target as HTMLImageElement;\r\n // Prevent infinite loop\r\n if (img.src.includes('default-game-image.jpg')) return;\r\n img.src = this.brandConfig.defaultGameImage;\r\n }\r\n\r\n // Games filters\r\n filterGroupGames(currentPage: number, gameGroupId: number) {\r\n this.showGameCategoryTop = false;\r\n this.clearSearch();\r\n this.getFilteredGames(currentPage, this.brandConfig.loadMorePageSize, { gameGroupId: gameGroupId });\r\n this.activateFilter();\r\n }\r\n\r\n filterProviderGames(currentPage: number, vendorid: number) {\r\n this.clearSearch();\r\n this.getFilteredGames(currentPage, this.brandConfig.loadMorePageSize, { vendorId: vendorid });\r\n this.activateFilter();\r\n }\r\n\r\n filterHotGames(currentPage: number, tag: string) {\r\n this.clearSearch();\r\n this.getFilteredGames(currentPage, this.brandConfig.loadMorePageSize, { tag: tag });\r\n this.activateFilter();\r\n }\r\n\r\n filterFavouriteGames() {\r\n this.clearSearch();\r\n this.getFavouriteGames();\r\n this.activateFilter();\r\n }\r\n\r\n filterLastPlayedGames() {\r\n this.clearSearch();\r\n this.getLastPlayed();\r\n this.activateFilter();\r\n }\r\n\r\n loadMoreFilteredGames() {\r\n this.currentSearchParams.page = this.currentFilterPage + 1; // Increment page for next load\r\n this.getFilteredGames(this.currentFilterPage, this.brandConfig.loadMorePageSize, this.currentSearchParams);\r\n }\r\n\r\n clearSearch(): void {\r\n console.log('Clearing search input and resetting filters');\r\n if (this.searchInput) {\r\n this.searchInput.nativeElement.value = '';\r\n }\r\n this.currentSearchText = '';\r\n this.currentFilterPage = 0;\r\n }\r\n\r\n activateFilter() {\r\n this.filterActive = true;\r\n }\r\n\r\n deactivateFilter() {\r\n this.filterActive = false;\r\n }\r\n\r\n getFilteredGames(\r\n currentPageNumber: number,\r\n pageSize: number,\r\n filters?: Record<string, any>\r\n ) {\r\n const baseParams = {\r\n page: currentPageNumber + 1,\r\n size: pageSize,\r\n languageId: this.brandConfig?.langCode\r\n };\r\n\r\n const queryParams = {\r\n ...baseParams,\r\n ...(filters || {})\r\n };\r\n this.currentSearchParams = queryParams; // Store current search params for load more functionality\r\n this.gameLobbyLibService.getGames(\r\n this.brandConfig?.apiUrl,\r\n queryParams,\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe((games: any[]) => {\r\n\r\n if (!games) {\r\n this.filterShowLoadMore = false;\r\n return;\r\n }\r\n\r\n // If first page - replace\r\n if (currentPageNumber === 0) {\r\n this.filteredGames = games;\r\n }\r\n // If next page - append\r\n else if (currentPageNumber > 0) {\r\n this.filteredGames = [\r\n ...this.filteredGames,\r\n ...games\r\n ];\r\n }\r\n // If returned count === pageSize - more games might exist\r\n this.filterShowLoadMore = games.length === pageSize;\r\n this.currentFilterPage = currentPageNumber + 1; // Update current page\r\n if (!this.filterShowLoadMore) {\r\n this.currentFilterPage = 0; // Reset to first page if no more games\r\n }\r\n this.checkIfNoGamesToShow();\r\n console.log('Filtered Games:', this.filteredGames);\r\n console.log('Show Load More:', this.filterShowLoadMore);\r\n });\r\n }\r\n\r\n\r\n // Get Games\r\n getGames(pageNumber: number, pageSize: number) {\r\n this.gameLobbyLibService.getGames(\r\n this.brandConfig?.apiUrl,\r\n { page: pageNumber, size: pageSize, languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(games => {\r\n console.log('Games:', games);\r\n });\r\n }\r\n // Last Played\r\n getLastPlayed() {\r\n this.filteredGames = []; // Reset before loading new ones\r\n this.gameLobbyLibService.getLastPlayed(\r\n this.brandConfig?.apiUrl,\r\n { languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(res => {\r\n if (!res || !res.status || res.status.toLowerCase() !== 'success') {\r\n console.error('Error fetching last played games:', res);\r\n return;\r\n } else {\r\n this.filteredGames = res.gamesList;\r\n this.checkIfNoGamesToShow();\r\n }\r\n });\r\n }\r\n // Favourites\r\n getFavouriteGames() {\r\n this.gameLobbyLibService.getFavouriteGames(\r\n this.brandConfig?.apiUrl,\r\n { languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(res => {\r\n if (!res || !res.status || res.status.toLowerCase() !== 'success') {\r\n console.error('Error fetching favourite games:', res);\r\n return;\r\n } else {\r\n this.filteredGames = res.gamesList;\r\n this.checkIfNoGamesToShow();\r\n }\r\n });\r\n }\r\n // Providers\r\n getGamesProviders() {\r\n this.gameLobbyLibService.getGamesProviders(\r\n this.brandConfig?.apiUrl,\r\n { languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(res => {\r\n console.log('Providers:', res?.gameProvidersList.length);\r\n this.providerList = res?.gameProvidersList || [];\r\n });\r\n }\r\n\r\n loadLobbyGames(isLoggedIn: boolean): void {\r\n console.log('Loading lobby games for', isLoggedIn ? 'logged in user' : 'guest user');\r\n this.gameLobbyLibService.getGamesGroups(this.brandConfig?.apiUrl, { languageId: this.brandConfig?.langCode }, { referer: this.brandConfig?.siteUrl }).pipe(\r\n /* Step 1: Select correct lobby safely */\r\n map((lobbies: GameGroupsResponse) => {\r\n\r\n if (!lobbies || !lobbies.length) return [];\r\n\r\n let selectedLobby: GameLobby | undefined;\r\n\r\n // If only one lobby returned use it\r\n if (lobbies.length === 1) {\r\n selectedLobby = lobbies[0];\r\n }\r\n // If multiple apply login logic\r\n else {\r\n selectedLobby = isLoggedIn\r\n ? lobbies.find(l => l.title.includes('Home Lobby'))\r\n : lobbies.find(l => !l.title.includes('Home Lobby'));\r\n }\r\n\r\n if (!selectedLobby?.gameGroupList?.length) return [];\r\n\r\n // Sort by order\r\n return selectedLobby.gameGroupList\r\n .slice()\r\n .sort((a, b) => a.game_group_order - b.game_group_order);\r\n }),\r\n\r\n tap(sortedGroups => {\r\n this.sortedGameGroup = sortedGroups;\r\n }),\r\n\r\n /* Step 2: Fetch games in parallel */\r\n switchMap((sortedGroups: GameGroup[]) => {\r\n\r\n if (!sortedGroups.length) return of([]);\r\n\r\n const requests = sortedGroups\r\n .filter(group => group.name && group.name.trim() !== '')\r\n .map(group =>\r\n this.gameLobbyLibService.getGames(this.brandConfig?.apiUrl, {\r\n page: 1,\r\n size: this.brandConfig?.lobbyGamesPageSize,\r\n gameGroupId: group.id\r\n }, { referer: this.brandConfig?.siteUrl }).pipe(\r\n map((res: any) => ({\r\n gameGroupDetails: group,\r\n games: res\r\n }))\r\n )\r\n );\r\n\r\n return forkJoin(requests);\r\n })\r\n\r\n ).subscribe({\r\n next: (result: LobbyGames[]) => {\r\n this.lobbyGames = result;\r\n },\r\n error: (err) => {\r\n console.error('Error loading lobby games:', err);\r\n }\r\n });\r\n }\r\n\r\n checkIfNoGamesToShow() {\r\n let noGames = false;\r\n if (this.filteredGames && Array.isArray(this.filteredGames) && this.filteredGames.length === 0) {\r\n noGames = true;\r\n }\r\n this.noGamesToShow = noGames;\r\n }\r\n\r\n getgameClicked(gameCode: any): void {\r\n this.gameClicked.emit(gameCode);\r\n }\r\n}","<div class=\"main-lobby\">\r\n <div class=\"game-filter-background\" [ngStyle]=\"{ 'background': theme?.background || 'none' }\">\r\n <!-- Main Filter Section -->\r\n <div class=\"fixed-footer-width clearfix\" [ngStyle]=\"{ 'border-bottom': theme?.borderSearch || 'none' }\">\r\n <div class=\"display-filter-content\">\r\n <!-- Search Bar -->\r\n <div class=\"searchBar\">\r\n <div class=\"game-search\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\">\r\n <form class=\"form-inline\" (submit)=\"$event.preventDefault()\">\r\n <i class=\"fa fa-search\"></i>\r\n <input #searchInput class=\"game-search-form\" id=\"searchInput\" name=\"gameSearch\" type=\"text\" placeholder=\"GAME SEARCH\"\r\n aria-label=\"Search\" (input)=\"onSearchChange($event)\" />\r\n </form>\r\n </div>\r\n\r\n <!-- Provider Swiper -->\r\n <div class=\"swiperContainer\">\r\n <swiper-container #swiperContainer *ngIf=\"providerList && providerList.length\"\r\n slides-per-view=\"1\" space-between=\"6\" speed=\"50\" [loop]=\"shouldLoopProviders()\"\r\n navigation=\"false\" css-mode=\"true\" [breakpoints]=\"{\r\n '100': { slidesPerView: 3 },\r\n '200': { slidesPerView: 4 },\r\n '320': { slidesPerView: 4 },\r\n '480': { slidesPerView: 6 },\r\n '768': { slidesPerView: 8 },\r\n '991': { slidesPerView: 10 },\r\n '1280': { slidesPerView: 12 }\r\n }\">\r\n <swiper-slide *ngFor=\"let provider of providerList\">\r\n <div class=\"provider-slide-item\">\r\n <img [src]=\"brandConfig?.providersIconsDir + '/' + provider.vendorCode + '.svg'\"\r\n [alt]=\"provider.name\" (click)=\"filterProviderGames(0, provider.vendorCode)\"\r\n loading=\"lazy\" />\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n </div>\r\n\r\n <!-- Navigation buttons - OUTSIDE .swiperContainer but INSIDE .searchBar -->\r\n <div class=\"swiper-navigation-row\">\r\n <button class=\"swiper-button-prev\"\r\n [ngStyle]=\"{ '--swiper-navigation-color': theme?.buttonBackgroundColor }\"\r\n aria-label=\"Previous providers\">\r\n <span class=\"icon-arrow-left-games\"></span>\r\n </button>\r\n\r\n <button class=\"swiper-button-next\"\r\n [ngStyle]=\"{ '--swiper-navigation-color': theme?.buttonBackgroundColor }\"\r\n aria-label=\"Next providers\">\r\n <span class=\"icon-arrow-right-games\"></span>\r\n </button>\r\n </div>\r\n <div class=\"game-provider\">\r\n <div class=\"desktop\">\r\n <ul class=\"f-tabs providerIcons-ul-desktop\">\r\n <li id=\"favouriteIcon\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"display-filter-content\" (click)=\"filterFavouriteGames()\">\r\n <div id=\"recentGamestt\" style=\"display: none; margin-left: -42px\"\r\n class=\"ttip ttip-arrow\">\r\n Favorite Games\r\n <span class=\"arrow-down\" style=\"margin-left: -56px\"></span>\r\n </div>\r\n <div class=\"display-filter-content btt\" id=\"recentGames\">\r\n <i class=\"fa fa-heart\"></i>\r\n </div>\r\n </li>\r\n\r\n <!-- Recent Games Icon -->\r\n <li id=\"recentGamesIcon\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"display-filter-content\" (click)=\"filterLastPlayedGames()\">\r\n <div id=\"recentGamestt\" style=\"display: none; margin-left: -42px\"\r\n class=\"ttip ttip-arrow\">\r\n Last played Games\r\n <span class=\"arrow-down\" style=\"margin-left: -56px\"></span>\r\n </div>\r\n <div class=\"display-filter-content btt\" id=\"recentGames\">\r\n <i class=\"fa fa-clock\"></i>\r\n </div>\r\n </li>\r\n\r\n <!-- Hot Games Icon -->\r\n <li id=\"hotGamesIcon\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"display-filter-content\" (click)=\"filterHotGames(0, 'hot')\">\r\n <div id=\"hotGamestt\" style=\"display: none; margin-left: -23px\"\r\n class=\"ttip ttip-arrow\">\r\n Hot Games\r\n <span class=\"arrow-down\" style=\"margin-left: -35px\"></span>\r\n </div>\r\n <div class=\"display-filter-content btt\" id=\"hotGames\">\r\n <i class=\"fa fa-fire\"></i>\r\n </div>\r\n </li>\r\n\r\n <!-- Game Category Dropdown -->\r\n <li id=\"gameCategory\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"game-category-link game-category-link-desktop hidden-xs hidden-sm display-filter-content\">\r\n <a type=\"button\" class=\"category-btn\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background': 'transparent'\r\n }\" (click)=\"toggleGameCategoryTop()\">\r\n {{ categoryLabel }}\r\n </a>\r\n <a type=\"button\" id=\"gameCategoryLink\" [ngClass]=\"{\r\n 'icon-angle-down': !categoryChosen,\r\n 'icon-close': categoryChosen,\r\n 'pull-right': true\r\n }\" aria-label=\"Toggle category menu\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background': 'transparent'\r\n }\" (click)=\"categoryChosen ? DropdownClose() : toggleGameCategoryTop()\"></a>\r\n\r\n <!-- Game Category Dropdown Menu (positioned directly below) -->\r\n <div id=\"gameCategoryTop\"\r\n class=\"clearfix game-category-list game-category-list-footer\"\r\n [style.display]=\"showGameCategoryTop ? 'block' : 'none'\">\r\n <div class=\"game-category-list-width\">\r\n <ul class=\"game-category-list-item\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background-color': theme?.background || '#262626',\r\n 'border': theme?.border || 'none'\r\n }\">\r\n <li class=\"game-category-list-item-li\" *ngFor=\"let group of lobbyGames\"\r\n id=\"{{group.gameGroupDetails.id}}-LeftSideButton-footer\"\r\n (click)=\"categoryLabel = group.gameGroupDetails.name; filterGroupGames(0, group.gameGroupDetails.id)\">\r\n {{ group.gameGroupDetails.name }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Games Section -->\r\n <div class=\"games-background\" id=\"gamesLobby\" *ngIf=\"!filterActive\">\r\n <div *ngFor=\"let group of lobbyGames; let i = index\" class=\"games-section\">\r\n <div class=\"new-game-header\">\r\n <h3 [ngStyle]=\"{ 'color': theme?.textColor || '#FFFFFF' }\">{{group.gameGroupDetails.name}}</h3>\r\n <div>\r\n <a class=\"btn-newgamestrip\" [ngStyle]=\"{ 'border': (theme?.borderSearch || 'none'),\r\n 'background-color': hoveredViewAllIndex === i ? (theme?.buttonBackgroundColor || '') : (theme?.background || '#262626')\r\n }\" (click)=\"viewGameCategory(group.gameGroupDetails)\" (mouseenter)=\"hoveredViewAllIndex = i\"\r\n (mouseleave)=\"hoveredViewAllIndex = null\">VIEW ALL</a>\r\n <a class=\"btn-Arrow-left\" [ngClass]=\"{ 'pulse': pulsingButton === 'prev' + i }\"\r\n [ngStyle]=\"{ 'border': hoveredButton === 'prev' + i ? (theme?.borderSearch || 'none'):'1px solid #fff' }\"\r\n style=\"cursor: pointer;\" aria-label=\"Previous games\"\r\n (click)=\"triggerPulse('prev' + i); slidePrev(i)\" (mouseenter)=\"hoveredButton = 'prev' + i\"\r\n (mouseleave)=\"hoveredButton = null\">\r\n <span class=\"arrow-icon arrow-left\"></span>\r\n </a>\r\n <a class=\"btn-Arrow-right\" [ngClass]=\"{ 'pulse': pulsingButton === 'next' + i }\"\r\n [ngStyle]=\"{ 'border': hoveredButton === 'next' + i ? (theme?.borderSearch || 'none') : '1px solid #fff' }\"\r\n style=\"cursor: pointer;\" aria-label=\"Next games\"\r\n (click)=\"triggerPulse('next' + i); slideNext(i)\" (mouseenter)=\"hoveredButton = 'next' + i\"\r\n (mouseleave)=\"hoveredButton = null\">\r\n <span class=\"arrow-icon arrow-right\"></span>\r\n </a>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"swiperContainer\">\r\n <div style=\"overflow-x: auto; white-space: nowrap; width: 100%;\">\r\n <swiper-container #gameSwiperContainer *ngIf=\"group.games && group.games.length\" slides-per-view=\"1\"\r\n space-between=\"10\" speed=\"50\" [loop]=\"shouldLoopGamesForGroup(group.games)\" navigation=\"false\"\r\n css-mode=\"false\" [breakpoints]=\"{\r\n '190': { slidesPerView: 1, spaceBetween: 10 },\r\n '350': { slidesPerView: 2, spaceBetween: 10 },\r\n '520': { slidesPerView: 3, spaceBetween: 10 },\r\n '676': { slidesPerView: 4, spaceBetween: 10 },\r\n '834': { slidesPerView: 4, spaceBetween: 10 },\r\n '998': { slidesPerView: 5, spaceBetween: 10 },\r\n '1158': { slidesPerView: 6, spaceBetween: 10 },\r\n '1280': { slidesPerView: 6, spaceBetween: 10 }\r\n }\">\r\n <swiper-slide *ngFor=\"let game of group.games; let gameIndex = index\"\r\n [attr.data-game-id]=\"i + '-' + game.gameCode\" class=\"lobby_games-home\">\r\n <div class=\"game-card\">\r\n <div class=\"game-card__content\"\r\n (mouseenter)=\"hoveredGameKey = gameIndex + '-' + game.gameCode\"\r\n (mouseleave)=\"hoveredGameKey = null\">\r\n <div class=\"game-card__action-btn\"\r\n *ngIf=\"hoveredGameKey === gameIndex + '-' + game.gameCode\">\r\n <a class=\"btn game-card__action-btn--play\" [ngStyle]=\"{\r\n 'color': theme?.buttonBackgroundColor || '#ff7d00',\r\n 'border': theme?.borderSearch || '#ff7d00'\r\n }\"\r\n (click)=\"getgameClicked(game.gameCode)\"\r\n style=\"cursor: pointer;\"\r\n >\r\n <i class=\"fa fa-play\"></i>\r\n </a>\r\n </div>\r\n <div class=\"ribbon\"><span [ngClass]=\"game.tagList.includes('new') ? 'new' : ''\">{{\r\n game.tagList.includes(\"new\") ? \"NEW\" : \"\" }}</span><span [ngClass]=\"game.tagList.includes('hot') ? 'hot' : ''\">{{\r\n game.tagList.includes(\"hot\") ? \"HOT\" : \"\" }}</span></div>\r\n <div class=\"game-card__img game-card__image-container\">\r\n <img class=\"img-gradient\" [src]=\"getGameImage(game)\"\r\n (error)=\"onImageError($event)\" [alt]=\"game.name\" loading=\"lazy\"\r\n [title]=\"game.name\">\r\n </div>\r\n </div>\r\n <div class=\"game-card__text\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background-color': theme?.gametextbackground || '#ff7d00'\r\n }\"><span class=\"game-card__favicon\"><i class=\"far fa-heart\"\r\n aria-hidden=\"true\"></i></span><span class=\"game-card--name\">{{ game.name\r\n }}</span></div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <!-- Filtered Games Sections-->\r\n <div class=\"games-background\" id=\"filtered-games-section\" *ngIf=\"filterActive\">\r\n <div class=\"lobby_games-row\">\r\n <div class=\"game-card\" [attr.data-game-id]=\"gameIndex + '-' + game.gameCode\"\r\n *ngFor=\"let game of filteredGames; let gameIndex = index\">\r\n <div class=\"game-card__content\" (mouseenter)=\"hoveredGameKey = gameIndex + '-' + game.gameCode\"\r\n (mouseleave)=\"hoveredGameKey = null\">\r\n <div class=\"game-card__action-btn\" *ngIf=\"hoveredGameKey === gameIndex + '-' + game.gameCode\">\r\n <a class=\"btn game-card__action-btn--play\" [ngStyle]=\"{\r\n 'color': theme?.buttonBackgroundColor || '#ff7d00',\r\n 'border': theme?.borderSearch || '#ff7d00'\r\n }\" (click)=\"getgameClicked(game.gameCode)\" style=\"cursor: pointer;\">\r\n <i class=\"fa fa-play\"></i>\r\n </a>\r\n </div>\r\n <div class=\"ribbon\"><span [ngClass]=\"game.tagList.includes('new') ? 'new' : ''\">{{\r\n game.tagList.includes(\"new\") ? \"NEW\" : \"\" }}</span><span [ngClass]=\"game.tagList.includes('hot') ? 'hot' : ''\">{{\r\n game.tagList.includes(\"hot\") ? \"HOT\" : \"\" }}</span></div>\r\n <div class=\"game-card__img game-card__image-container\">\r\n <img class=\"img-gradient\" [src]=\"getGameImage(game)\" (error)=\"onImageError($event)\"\r\n [alt]=\"game.name\" loading=\"lazy\" [title]=\"game.name\">\r\n </div>\r\n </div>\r\n <div class=\"game-card__text\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background-color': theme?.gametextbackground || '#ff7d00'\r\n }\"><span class=\"game-card__favicon\"><i class=\"far fa-heart\"\r\n aria-hidden=\"true\"></i></span><span class=\"game-card--name\">{{ game.name }}</span></div>\r\n </div>\r\n </div>\r\n <div class=\"lobby_loadMoreBtn\" *ngIf=\"filterShowLoadMore\">\r\n <a class=\"btn load-more-btn\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n (click)=\"loadMoreFilteredGames()\">\r\n LOAD MORE\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"games-background lobby_noGamesMessage\" id=\"noGamesMessage\" *ngIf=\"noGamesToShow\">\r\n <p>NO GAMES FOUND</p>\r\n </div>\r\n</div>","import { Component, Input, OnInit, ViewEncapsulation, Output, TemplateRef } from '@angular/core';\r\nimport { BannersComponent } from './banners/banners.component';\r\nimport {GameLobbyTheme} from './theme/default-theme';\r\nimport { CasinoLobbyComponent } from './casino-lobby/casino-lobby.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EventEmitter } from '@angular/core';\r\n@Component({\r\n selector: 'lib-game-lobby-lib',\r\n standalone: true,\r\n imports: [CommonModule, BannersComponent, CasinoLobbyComponent],\r\n template: `\r\n <div class=\"lobbyaria-setsize\" [ngStyle]=\"{ 'background-color': (themeObject?.background || '#262626')}\" >\r\n <app-banners [theme]=\"themeObject\" [bannerData]=\"bannerDataInformation\" [bannerOverlay]=\"bannerOverlay\" \r\n (routerLinkClicked)=\"onRouterLinkClicked($event)\"></app-banners>\r\n <lib-casino-lobby [theme]=\"themeObject\" [casinoData]=\"bannerDataInformation\" [brandConfig]=\"brandConfig\" (gameClicked)=\"onGameClicked($event)\"></lib-casino-lobby>\r\n </div>\r\n `,\r\n styles: `.lobbyaria-setsize{\r\n height: 100%; padding: 15px;background-color: #262626;\r\n }`,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class GameLobbyLibComponent implements OnInit {\r\n @Input() bannerData!: any;\r\n @Input() themes!: GameLobbyTheme;\r\n @Input() brandConfig!: any;\r\n @Input() bannerOverlay: TemplateRef<any> | null = null;\r\n @Output() routerLinkClicked = new EventEmitter<string>();\r\n @Output() gameClicked = new EventEmitter<string>();\r\n themeObject: any;\r\n bannerDataInformation:any\r\n constructor() {\r\n // Do not use @Input() values here\r\n }\r\n\r\n setDataThemes(): void {\r\n this.bannerDataInformation = this.bannerData;\r\n this.themeObject = this.themes;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setDataThemes();\r\n }\r\n\r\n onGameClicked(gameCode: string) {\r\n this.gameClicked.emit(gameCode);\r\n }\r\n\r\n onRouterLinkClicked(link: string) {\r\n this.routerLinkClicked.emit(link);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of game-lobby-lib\r\n */\r\nexport * from './lib/banners/banners.component';\r\nexport * from './lib/casino-lobby/casino-lobby.component';\r\nexport * from './lib/game-lobby-lib.service';\r\nexport * from './lib/game-lobby-lib.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.GameLobbyThemeService","i1.GameLobbyThemeService","i2.GameLobbyLibService"],"mappings":"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"}
1
+ {"version":3,"file":"game-lobby-lib.mjs","sources":["../../../projects/game-lobby-lib/src/lib/theme/default-theme.ts","../../../projects/game-lobby-lib/src/lib/theme/theme.token.ts","../../../projects/game-lobby-lib/src/lib/theme/themeService.service.ts","../../../projects/game-lobby-lib/src/lib/banners/banners.component.ts","../../../projects/game-lobby-lib/src/lib/banners/banners.component.html","../../../projects/game-lobby-lib/src/lib/game-lobby-lib.service.ts","../../../projects/game-lobby-lib/src/lib/casino-lobby/casino-lobby.component.ts","../../../projects/game-lobby-lib/src/lib/casino-lobby/casino-lobby.component.html","../../../projects/game-lobby-lib/src/lib/game-lobby-lib.component.ts","../../../projects/game-lobby-lib/src/public-api.ts","../../../projects/game-lobby-lib/src/game-lobby-lib.ts"],"sourcesContent":["export interface GameLobbyTheme {\r\n border: string;\r\n borderSearch: string;\r\n gametextbackground: string;\r\n buttonBackgroundColor: string;\r\n background: string;\r\n textColor: string;\r\n}\r\n\r\nexport const DEFAULT_THEME: GameLobbyTheme = {\r\n border: '2px solid #02B0CB',\r\n gametextbackground: 'rgba(0, 0, 0, 0.5)',\r\n borderSearch: '1px solid #cccccc',\r\n buttonBackgroundColor: '#22c55e',\r\n background: '#ffffff',\r\n textColor: '#ffffff'\r\n};\r\n","import { InjectionToken } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { GameLobbyTheme, DEFAULT_THEME } from './default-theme';\r\n\r\nexport const GAME_LOBBY_THEME_TOKEN =\r\n new InjectionToken<BehaviorSubject<GameLobbyTheme>>(\r\n 'GAME_LOBBY_THEME_TOKEN',\r\n {\r\n providedIn: 'root',\r\n factory: () => new BehaviorSubject(DEFAULT_THEME)\r\n }\r\n );\r\n","import { Inject, Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { GameLobbyTheme } from './default-theme';\r\nimport { GAME_LOBBY_THEME_TOKEN } from './theme.token';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class GameLobbyThemeService {\r\n\r\n constructor(\r\n @Inject(GAME_LOBBY_THEME_TOKEN)\r\n private readonly themeSubject: BehaviorSubject<GameLobbyTheme>\r\n ) {}\r\n\r\n /** Observable for components */\r\n get theme$(): Observable<GameLobbyTheme> {\r\n return this.themeSubject.asObservable();\r\n }\r\n\r\n /** Current theme snapshot */\r\n get current(): GameLobbyTheme {\r\n return this.themeSubject.value;\r\n }\r\n\r\n /** Update theme at runtime */\r\n setTheme(theme: GameLobbyTheme): void {\r\n this.themeSubject.next(theme);\r\n }\r\n\r\n /** Partial update helper (optional but useful) */\r\n patchTheme(partial: Partial<GameLobbyTheme>): void {\r\n this.themeSubject.next({\r\n ...this.themeSubject.value,\r\n ...partial\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n CUSTOM_ELEMENTS_SCHEMA,\r\n Input,\r\n OnInit,\r\n ViewChildren,\r\n ViewEncapsulation,\r\n QueryList,\r\n ElementRef,\r\n Output,\r\n EventEmitter,\r\n TemplateRef\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { GameLobbyThemeService } from '../theme/themeService.service';\r\nimport { GameLobbyTheme } from '../theme/default-theme';\r\n\r\n@Component({\r\n selector: 'app-banners',\r\n standalone: true,\r\n imports: [CommonModule],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './banners.component.html',\r\n styleUrl: './banners.component.scss',\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class BannersComponent implements OnInit {\r\n @ViewChildren('btnSpan') btnSpans!: QueryList<ElementRef>;\r\n\r\n @Input() bannerData: any;\r\n @Input() theme?: GameLobbyTheme;\r\n baseUrl: string = '';\r\n @Output() routerLinkClicked = new EventEmitter<string>();\r\n @Input() bannerOverlay: TemplateRef<any> | null = null;\r\n slides: any[] = [];\r\n hoveredSlideId: number | null = null;\r\n\r\n constructor(\r\n private sanitizer: DomSanitizer,\r\n private themeService: GameLobbyThemeService\r\n ) {\r\n themeService.theme$.subscribe(t => (this.theme = t));\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setDataThemes();\r\n }\r\n\r\n setDataThemes(): void {\r\n this.slides = this.bannerData?.bannerData || [];\r\n this.baseUrl = this.bannerData?.baseUrl || '';\r\n }\r\n\r\n /**\r\n * Rewrites all class names on the injected button HTML to namespaced equivalents\r\n * prefixed with \"lobby_\". This prevents the host project's Bootstrap/jQuery stylesheets\r\n * from targeting generic class names like \"btn\", \"logged-in\" etc. and altering\r\n * the button appearance or triggering jQuery handlers that crash with\r\n * \"Cannot read properties of undefined (reading 'display')\".\r\n *\r\n * e.g. class=\"btn cm-slider__btn--cta logged-in\"\r\n * => class=\"lobby_btn lobby_cm-slider__btn--cta lobby_logged-in\"\r\n */\r\n getSafeHtml(html: string): SafeHtml {\r\n if (!html) return '';\r\n\r\n try {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n const el = doc.body.firstElementChild;\r\n\r\n if (el) {\r\n // Rewrite each class to a namespaced lobby_ version so the host project\r\n // stylesheets and jQuery plugins cannot match them\r\n const originalClasses = Array.from(el.classList);\r\n el.setAttribute(\r\n 'class',\r\n originalClasses.map(c => `lobby_${c}`).join(' ')\r\n );\r\n\r\n // Remove routerlink so the host project jQuery does not try to handle it.\r\n // Navigation is handled by Angular's (click) binding on the parent div.\r\n el.removeAttribute('routerlink');\r\n\r\n // Neutralise the anchor href so the browser does not navigate on click.\r\n // The parent div's (click) output handles routing instead.\r\n el.setAttribute('href', 'javascript:void(0)');\r\n\r\n html = el.outerHTML;\r\n }\r\n } catch (e) {\r\n console.error('BannersComponent: error rewriting button HTML classes', e);\r\n }\r\n\r\n return this.sanitizer.bypassSecurityTrustHtml(html);\r\n }\r\n\r\n getRouterLinkFromButton(buttonHtml: string, event?: MouseEvent): void {\r\n // Stop the click bubbling up to the host project's jQuery/global listeners\r\n // which throw \"Cannot read properties of undefined (reading 'display')\"\r\n if (event) {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n }\r\n\r\n if (!buttonHtml) {\r\n this.routerLinkClicked.emit('');\r\n return;\r\n }\r\n\r\n try {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(buttonHtml, 'text/html');\r\n // Read the original routerlink from the raw HTML before getSafeHtml strips it\r\n const anchor = doc.querySelector('a[routerlink]');\r\n\r\n if (anchor) {\r\n const routerLink = anchor.getAttribute('routerlink');\r\n this.routerLinkClicked.emit(routerLink || '');\r\n } else {\r\n this.routerLinkClicked.emit('');\r\n }\r\n } catch (error) {\r\n console.error('BannersComponent: error parsing button HTML', error);\r\n this.routerLinkClicked.emit('');\r\n }\r\n }\r\n}","<div class=\"lobby_cm-banner\"> \r\n <ng-container *ngIf=\"bannerOverlay\">\r\n <ng-container *ngTemplateOutlet=\"bannerOverlay\"></ng-container>\r\n </ng-container>\r\n <swiper-container\r\n class=\"my-swiper\"\r\n slides-per-view=\"1\"\r\n pagination=\"true\"\r\n pagination-clickable=\"true\"\r\n speed=\"500\"\r\n [loop]=\"slides.length > 1\"\r\n autoplay=\"true\"\r\n autoplay-delay=\"150000\"\r\n css-mode=\"true\">\r\n <swiper-slide *ngFor=\"let slide of slides\">\r\n <div [id]=\"slide.id\" class=\"lobby_slideWrapper\">\r\n <img [src]=\"baseUrl + '/uploads/banner/' + slide.imagePath\" [alt]=\"slide.name\">\r\n\r\n <!-- Only render when slide.button has content — prevents jQuery scripts\r\n in the host project from querying an empty element and throwing\r\n \"Cannot read properties of undefined (reading 'display')\" -->\r\n <ng-container *ngIf=\"slide.button\">\r\n <div class=\"lobby_cm-slider__btn\"\r\n [ngStyle]=\"{\r\n 'background-color': hoveredSlideId === slide.id ? (theme?.background || '#262626') : (theme?.buttonBackgroundColor || ''),\r\n 'color': theme?.textColor || '#fff',\r\n 'border': theme?.border || 'none'\r\n }\"\r\n (mouseenter)=\"hoveredSlideId = slide.id\"\r\n (mouseleave)=\"hoveredSlideId = null\"\r\n (click)=\"getRouterLinkFromButton(slide.button, $event)\">\r\n <!-- getSafeHtml() does two things:\r\n 1. Rewrites class names e.g. \"btn\" => \"lobby_btn\" so host Bootstrap/jQuery\r\n stylesheets cannot match and alter them\r\n 2. Bypasses Angular sanitization so the anchor tag and its text render fully -->\r\n <span [innerHTML]=\"getSafeHtml(slide.button)\"></span>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n</div>","import { Injectable } from '@angular/core';\r\nimport {\r\n HttpClient,\r\n HttpHeaders,\r\n HttpParams,\r\n} from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map, shareReplay } from 'rxjs/operators';\r\n\r\n//Intefaces\r\n\r\nexport interface BaseApiResponse {\r\n status: 'SUCCESS' | 'FAILED' | string;\r\n}\r\n\r\nexport interface GameMultilingualUrl {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface Game {\r\n gameCode: string;\r\n gameId: number | null;\r\n gameType: string;\r\n publishedDate: string | null;\r\n hasDemo: number;\r\n name: string;\r\n multilingualUrl: GameMultilingualUrl;\r\n vendorId: string;\r\n tagList: string[];\r\n displayOrder: number;\r\n gameCategory: string;\r\n vendorName: string;\r\n gameGroupIds: number[] | null;\r\n gameGroupDisplayOrder?: number | null;\r\n}\r\n\r\nexport interface GameProvider {\r\n id: number;\r\n name: string;\r\n prefix: string;\r\n vendorCode: string;\r\n vendorClass: string;\r\n vendorDisplayName: string;\r\n subProviders: any[];\r\n displayOrder: number;\r\n}\r\n\r\nexport interface GetGamesParams {\r\n languageId?: string; // default always 'en'\r\n gameGroupId?: number;\r\n tag?: string;\r\n vendorId?: string;\r\n sorting?: string;\r\n sort?: string;\r\n searchText?: string;\r\n size?: number;\r\n page?: number;\r\n}\r\n\r\nexport interface GetOtherParams {\r\n languageId?: string; // default always 'en'\r\n}\r\n\r\nexport interface GamesListResponse extends BaseApiResponse {\r\n gamesList: Game[];\r\n}\r\n\r\nexport interface ProvidersListResponse extends BaseApiResponse {\r\n gameProvidersList: GameProvider[];\r\n}\r\n\r\nexport interface ToggleFavoriteResponse extends BaseApiResponse {\r\n ecrExternalId: string;\r\n gameId: string;\r\n gameCategoryId: number;\r\n gameTypeId: number;\r\n favoriteAddFlag: boolean;\r\n errorCode: string | null;\r\n errorDescription: string | null;\r\n}\r\n\r\nexport interface GameGroupMultilingualUrl {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface GameGroupProviderIds {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface GameGroup {\r\n id: number;\r\n name: string;\r\n group_type: string;\r\n group_sub_type: string;\r\n game_asset_style: string;\r\n game_group_order: number;\r\n content: string;\r\n metaTitle: string;\r\n metaTags: string;\r\n metaDescription: string;\r\n multilingualUrlGameGroup: GameGroupMultilingualUrl;\r\n gameGroupProviderIdsListResult: GameGroupProviderIds | [];\r\n}\r\n\r\nexport interface GameLobby {\r\n id: number;\r\n title: string;\r\n name: string;\r\n user_segment: string;\r\n lobby_order: number;\r\n content: string;\r\n metaTitle: string;\r\n metaTags: string;\r\n metaDescription: string;\r\n multilingualUrlLobby: GameMultilingualUrl;\r\n gameGroupList: GameGroup[];\r\n}\r\n\r\nexport interface GameGroupsResponse extends Array<GameLobby> { }\r\n\r\nexport interface GameResponse {\r\n content: any[];\r\n totalElements: number;\r\n totalPages: number;\r\n}\r\n\r\n// Final lobbyGames structure \r\nexport interface LobbyGames {\r\n gameGroupDetails: GameGroup;\r\n games: any[];\r\n}\r\n// Service logic\r\n\r\ninterface CachedPost {\r\n observable: Observable<any>;\r\n timestamp: number;\r\n}\r\n\r\ninterface CachedGet {\r\n observable: Observable<any>;\r\n timestamp: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GameLobbyLibService {\r\n\r\n constructor(private http: HttpClient) { }\r\n\r\n private postCache = new Map<string, CachedPost>();\r\n private getCache = new Map<string, CachedGet>();\r\n\r\n // common methods to build params and headers for all API calls\r\n\r\n private buildParams(params?: any): HttpParams {\r\n const merged = {\r\n languageId: 'en', // defauit to en\r\n ...params\r\n };\r\n\r\n let httpParams = new HttpParams();\r\n Object.keys(merged).forEach(key => {\r\n httpParams = httpParams.set(key, merged[key] ?? '');\r\n });\r\n\r\n return httpParams;\r\n }\r\n\r\n private buildHeaders(extraHeaders?: { [key: string]: string }): HttpHeaders {\r\n const defaultHeaders = {\r\n accept: 'application/json, text/plain, */*'\r\n };\r\n\r\n return new HttpHeaders({\r\n ...defaultHeaders,\r\n ...extraHeaders\r\n });\r\n }\r\n\r\n // API methods\r\n getGamesGroups(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<GameGroupsResponse> {\r\n\r\n return this.lbGetCachedApi<GameGroupsResponse>(\r\n `${baseUrl}/ajax/game/getLobbyListWithGameGroups`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getGames(\r\n baseUrl: string,\r\n params?: GetGamesParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<Game[]> {\r\n\r\n return this.lbGetCachedApi<Game[]>(\r\n `${baseUrl}/ajax/v2/games`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getLastPlayed(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<GamesListResponse> {\r\n\r\n return this.lbGetCachedApi<GamesListResponse>(\r\n `${baseUrl}/ajax/v2/getUserLastPlayed`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getFavouriteGames(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<GamesListResponse> {\r\n\r\n return this.lbGetCachedApi<GamesListResponse>(\r\n `${baseUrl}/ajax/v2/getFavorites`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n getGamesProviders(\r\n baseUrl: string,\r\n params?: GetOtherParams,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<ProvidersListResponse> {\r\n\r\n return this.lbGetCachedApi<ProvidersListResponse>(\r\n `${baseUrl}/ajax/v2/getGameProviders`,\r\n {\r\n params: this.buildParams(params),\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n toggleFavoriteGame(\r\n baseUrl: string,\r\n gameId: number,\r\n newState: boolean,\r\n extraHeaders?: { [key: string]: string },\r\n cache_expire: number = 0\r\n ): Observable<ToggleFavoriteResponse> {\r\n\r\n const formData = new FormData();\r\n formData.append('gameId', String(gameId));\r\n formData.append('newState', String(newState));\r\n\r\n return this.lbPostCachedApi<ToggleFavoriteResponse>(\r\n `${baseUrl}/ajax/profile/toggleFavoriteGame`,\r\n formData,\r\n {\r\n headers: this.buildHeaders(extraHeaders)\r\n },\r\n cache_expire\r\n );\r\n }\r\n\r\n // Caching logic for GET and POST requests\r\n\r\n lbGetCachedApi<T>(\r\n url: string,\r\n options: {\r\n params?: any;\r\n headers?: HttpHeaders | { [header: string]: string | string[] };\r\n withCredentials?: boolean;\r\n } = {},\r\n cache_expire: number = 0\r\n ): Observable<T> {\r\n\r\n const request$ = this.http\r\n .get<T>(url, {\r\n withCredentials: true,\r\n ...options\r\n })\r\n .pipe(\r\n catchError(e => {\r\n return throwError(() => e);\r\n }),\r\n shareReplay(1)\r\n );\r\n\r\n if (cache_expire === 0) {\r\n return request$;\r\n }\r\n\r\n const cacheKey = this.generateCacheKey(url, options?.params);\r\n const now = Date.now();\r\n const cached = this.getCache.get(cacheKey);\r\n\r\n if (cached && now - cached.timestamp < cache_expire) {\r\n return cached.observable;\r\n }\r\n\r\n this.getCache.set(cacheKey, { observable: request$, timestamp: now });\r\n return request$;\r\n }\r\n\r\n lbPostCachedApi<T>(\r\n url: string,\r\n body: any,\r\n options: {\r\n headers?: HttpHeaders | { [header: string]: string | string[] };\r\n withCredentials?: boolean;\r\n } = {},\r\n cache_expire: number = 0\r\n ): Observable<T> {\r\n\r\n const request$ = this.http.post<T>(\r\n url,\r\n body,\r\n {\r\n observe: 'body', //body response\r\n withCredentials: true,\r\n ...options\r\n }\r\n ).pipe(\r\n catchError(e => throwError(() => e)),\r\n shareReplay(1)\r\n );\r\n\r\n if (cache_expire === 0) return request$;\r\n\r\n const cacheKey = this.generateCacheKey(url, body);\r\n const now = Date.now();\r\n const cached = this.postCache.get(cacheKey);\r\n\r\n if (cached && now - cached.timestamp < cache_expire) {\r\n return cached.observable;\r\n }\r\n\r\n this.postCache.set(cacheKey, { observable: request$, timestamp: now });\r\n return request$;\r\n }\r\n\r\n\r\n private generateCacheKey(url: string, params: any): string {\r\n try {\r\n if (!params) return url;\r\n return `${url}::${JSON.stringify(params)}`;\r\n } catch {\r\n return url;\r\n }\r\n }\r\n\r\n clearAllApiCache(): void {\r\n this.postCache.clear();\r\n this.getCache.clear();\r\n }\r\n\r\n\r\n handleHTTPError(e: any) {\r\n if (e.message && e.message.includes(\"countryBlocked\")) {\r\n console.log(\"Country blocked:\" + e.message.split(\":\")[1]);\r\n // notify the host brand\r\n } else if (e.message && e.message.includes(\"session_expired_sso\")) {\r\n console.log(\"Session expired:\" + e.message.split(\":\")[1]);\r\n // notify the host brand\r\n } else {\r\n if (e.status === 401) {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n } else if (e.status === 404) {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n } else if (e.status === 504) {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n } else {\r\n console.log(\"Error Code:\" + e.status);\r\n // notify the host brand\r\n }\r\n }\r\n }\r\n}\r\n\r\n","import { Component, Input, OnInit, ViewChild, AfterViewInit, ViewEncapsulation, CUSTOM_ELEMENTS_SCHEMA, ViewChildren, QueryList, ElementRef, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GameLobbyTheme } from '../theme/default-theme';\r\nimport { GameLobbyThemeService } from '../theme/themeService.service';\r\nimport { LobbyGames, GameGroup, GameGroupsResponse, GameLobby } from '../game-lobby-lib.service';\r\nimport { GameLobbyLibService } from '../game-lobby-lib.service';\r\nimport { forkJoin, map, of, switchMap, tap, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'lib-casino-lobby',\r\n standalone: true,\r\n imports: [CommonModule],\r\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\r\n templateUrl: './casino-lobby.component.html',\r\n styleUrl: './casino-lobby.component.scss',\r\n // encapsulation: ViewEncapsulation.None\r\n})\r\nexport class CasinoLobbyComponent implements OnInit, AfterViewInit {\r\n hoveredSlideId: string | null = null;\r\n hoveredButton: string | null = null;\r\n hoveredGameKey: string | null = null;\r\n @ViewChild('swiperContainer') swiperContainer: any;\r\n @ViewChildren('gameSwiperContainer') gameSwiperContainers!: QueryList<ElementRef>;\r\n @Output() gameClicked = new EventEmitter<string>();\r\n @Input() casinoData: any;\r\n @Input() theme?: GameLobbyTheme;\r\n @Input() baseUrl: string = '';\r\n @Input() brandConfig: any;\r\n websiteCode: string = '';\r\n providerList: any[] = []; // FIX: Initialize as empty array\r\n pulsingButton: string | null = null;\r\n showGameCategoryTop = false;\r\n categoryChosen = false;\r\n categoryLabel: string = 'CATEGORY';\r\n sortedGameGroupList: any[] = []; // FIX: Initialize as empty array instead of undefined\r\n hoveredViewAllIndex: number | null = null;\r\n\r\n /* games logic */\r\n lobbyGames: LobbyGames[] = [];\r\n sortedGameGroup: GameGroup[] = [];\r\n filteredGames: any | null = null;\r\n filterShowLoadMore: boolean = false;\r\n currentFilterPage: number = 0;\r\n noGamesToShow: boolean = false;\r\n filterActive: boolean = false;\r\n private searchSubject: Subject<string> = new Subject<string>();\r\n currentSearchText: string = '';\r\n currentSearchParams: any = {};\r\n @ViewChild('searchInput') searchInput: any;\r\n\r\n constructor(themeService: GameLobbyThemeService, private gameLobbyLibService: GameLobbyLibService) {\r\n themeService.theme$.subscribe(t => (this.theme = t));\r\n }\r\n\r\n slideNext(index: number) {\r\n const swiperEl = this.gameSwiperContainers.toArray()[index]?.nativeElement;\r\n if (swiperEl?.swiper) {\r\n swiperEl.swiper.slideNext();\r\n }\r\n }\r\n\r\n slidePrev(index: number) {\r\n const swiperEl = this.gameSwiperContainers.toArray()[index]?.nativeElement;\r\n if (swiperEl?.swiper) {\r\n swiperEl.swiper.slidePrev();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.getGamesProviders(); // Fetch providers list\r\n this.loadLobbyGames(false); // Load games for non-logged in users by default\r\n this.searchSubject\r\n .pipe(\r\n debounceTime(2000), // wait 2000ms after typing stops\r\n distinctUntilChanged(), // ignore same text\r\n switchMap((searchText: string) => {\r\n this.currentFilterPage = 0; // reset page\r\n this.currentSearchText = searchText;\r\n this.currentSearchParams = {\r\n page: 1,\r\n size: this.brandConfig.loadMorePageSize,\r\n languageId: this.brandConfig?.langCode,\r\n searchText: searchText\r\n };\r\n return this.gameLobbyLibService.getGames(\r\n this.brandConfig?.apiUrl,\r\n this.currentSearchParams,\r\n { referer: this.brandConfig?.siteUrl }\r\n );\r\n })\r\n )\r\n .subscribe((games: any[]) => {\r\n if (!games) {\r\n this.filteredGames = [];\r\n this.filterShowLoadMore = false;\r\n return;\r\n }\r\n\r\n this.filteredGames = games;\r\n this.filterShowLoadMore =\r\n games.length === this.brandConfig.loadMorePageSize;\r\n if (this.currentSearchText.trim() !== '' && this.currentSearchText !== null) {\r\n this.activateFilter();\r\n } else {\r\n this.deactivateFilter();\r\n }\r\n this.checkIfNoGamesToShow();\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => {\r\n this.initializeProviderSwiper();\r\n this.initializeGameSwipers();\r\n }, 2000);\r\n this.triggerPulse('');\r\n }\r\n\r\n onSearchChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input) return;\r\n const value = input.value ?? '';\r\n this.searchSubject.next(value.trim());\r\n }\r\n\r\n private initializeProviderSwiper() {\r\n if (this.swiperContainer?.nativeElement) {\r\n const providerSwiperEl = this.swiperContainer.nativeElement;\r\n const parentContainer = providerSwiperEl.closest('.searchBar') || providerSwiperEl.closest('.fixed-footer-width');\r\n const prevButton = parentContainer?.querySelector('.swiper-button-prev');\r\n const nextButton = parentContainer?.querySelector('.swiper-button-next');\r\n\r\n if (prevButton && nextButton) {\r\n prevButton.addEventListener('click', () => {\r\n providerSwiperEl.swiper?.slidePrev();\r\n });\r\n nextButton.addEventListener('click', () => {\r\n providerSwiperEl.swiper?.slideNext();\r\n });\r\n }\r\n }\r\n }\r\n\r\n private initializeGameSwipers() {\r\n if (this.gameSwiperContainers && this.gameSwiperContainers.length > 0) {\r\n this.gameSwiperContainers.forEach((swiperRef, index) => {\r\n const gameSwiperEl = swiperRef.nativeElement;\r\n\r\n // Find the parent games-section for this specific swiper\r\n const gamesSection = gameSwiperEl.closest('.games-section');\r\n\r\n if (gamesSection) {\r\n const customPrev = gamesSection.querySelector('.btn-Arrow-left');\r\n const customNext = gamesSection.querySelector('.btn-Arrow-right');\r\n\r\n if (customPrev) {\r\n customPrev.addEventListener('click', () => {\r\n console.log(`Game section ${index} - Previous clicked`);\r\n gameSwiperEl.swiper?.slidePrev();\r\n });\r\n }\r\n if (customNext) {\r\n customNext.addEventListener('click', () => {\r\n console.log(`Game section ${index} - Next clicked`);\r\n gameSwiperEl.swiper?.slideNext();\r\n });\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n // FIX: Updated loop logic to prevent Swiper loop warnings\r\n // Only enable loop when we have more slides than the maximum slidesPerView\r\n shouldLoopProviders(): boolean {\r\n if (!this.providerList || !Array.isArray(this.providerList)) {\r\n return false;\r\n }\r\n\r\n // Max slidesPerView is 12 at the 1280px breakpoint\r\n // Only enable loop if we have more providers than what's visible\r\n const maxSlidesPerView = 12;\r\n return this.providerList.length > maxSlidesPerView;\r\n }\r\n\r\n shouldLoopGames(games: any[]): boolean {\r\n if (!games || !Array.isArray(games)) {\r\n return false;\r\n }\r\n\r\n // Max slidesPerView is 8 at the 1280px breakpoint\r\n // Only enable loop if we have more games than what's visible\r\n const maxSlidesPerView = 8;\r\n return games.length > maxSlidesPerView;\r\n }\r\n\r\n // NEW: Per-group loop logic for game swipers\r\n // This checks each game group individually to determine if loop should be enabled\r\n shouldLoopGamesForGroup(games: any[]): boolean {\r\n if (!games || !Array.isArray(games)) {\r\n return false;\r\n }\r\n\r\n // Max slidesPerView is 8 at the 1280px breakpoint\r\n // Only enable loop if this specific group has more games than what's visible\r\n const maxSlidesPerView = 8;\r\n return games.length > maxSlidesPerView;\r\n }\r\n\r\n triggerPulse(button: string) {\r\n this.pulsingButton = button;\r\n setTimeout(() => {\r\n this.pulsingButton = null;\r\n }, 400); // Duration should match the animation\r\n }\r\n\r\n toggleGameCategoryTop() {\r\n this.showGameCategoryTop = !this.showGameCategoryTop;\r\n this.categoryChosen = this.categoryLabel !== 'CATEGORY';\r\n if (this.categoryLabel == 'CATEGORY') {\r\n this.deactivateFilter();\r\n }\r\n }\r\n\r\n viewGameCategory(group: any) {\r\n this.categoryLabel = group.name;\r\n this.showGameCategoryTop = false;\r\n this.filterGroupGames(0, group.id);\r\n }\r\n\r\n DropdownClose() {\r\n this.categoryLabel === 'CATEGORY' ? this.categoryChosen = false : this.categoryChosen = true;\r\n this.categoryChosen ? this.categoryLabel = 'CATEGORY' : this.categoryLabel;\r\n !this.categoryChosen ? this.categoryChosen = true : this.categoryChosen = false;\r\n this.showGameCategoryTop = false;\r\n if (this.categoryLabel == 'CATEGORY') {\r\n this.deactivateFilter();\r\n }\r\n }\r\n\r\n \r\n\r\n getGameImage(game: any): string {\r\n if (!game?.gameCode) {\r\n return this.brandConfig.defaultGameImage;\r\n }\r\n\r\n return `${this.brandConfig?.gamesImagesDir}/${game.gameCode}/${game.gameCode}.webp`;\r\n }\r\n\r\n onImageError(event: Event): void {\r\n const img = event.target as HTMLImageElement;\r\n // Prevent infinite loop\r\n if (img.src.includes('default-game-image.jpg')) return;\r\n img.src = this.brandConfig.defaultGameImage;\r\n }\r\n\r\n // Games filters\r\n filterGroupGames(currentPage: number, gameGroupId: number) {\r\n this.showGameCategoryTop = false;\r\n this.clearSearch();\r\n this.getFilteredGames(currentPage, this.brandConfig.loadMorePageSize, { gameGroupId: gameGroupId });\r\n this.activateFilter();\r\n }\r\n\r\n filterProviderGames(currentPage: number, vendorid: number) {\r\n this.clearSearch();\r\n this.getFilteredGames(currentPage, this.brandConfig.loadMorePageSize, { vendorId: vendorid });\r\n this.activateFilter();\r\n }\r\n\r\n filterHotGames(currentPage: number, tag: string) {\r\n this.clearSearch();\r\n this.getFilteredGames(currentPage, this.brandConfig.loadMorePageSize, { tag: tag });\r\n this.activateFilter();\r\n }\r\n\r\n filterFavouriteGames() {\r\n this.clearSearch();\r\n this.getFavouriteGames();\r\n this.activateFilter();\r\n }\r\n\r\n filterLastPlayedGames() {\r\n this.clearSearch();\r\n this.getLastPlayed();\r\n this.activateFilter();\r\n }\r\n\r\n loadMoreFilteredGames() {\r\n this.currentSearchParams.page = this.currentFilterPage + 1; // Increment page for next load\r\n this.getFilteredGames(this.currentFilterPage, this.brandConfig.loadMorePageSize, this.currentSearchParams);\r\n }\r\n\r\n clearSearch(): void {\r\n console.log('Clearing search input and resetting filters');\r\n if (this.searchInput) {\r\n this.searchInput.nativeElement.value = '';\r\n }\r\n this.currentSearchText = '';\r\n this.currentFilterPage = 0;\r\n }\r\n\r\n activateFilter() {\r\n this.filterActive = true;\r\n }\r\n\r\n deactivateFilter() {\r\n this.filterActive = false;\r\n }\r\n\r\n getFilteredGames(\r\n currentPageNumber: number,\r\n pageSize: number,\r\n filters?: Record<string, any>\r\n ) {\r\n const baseParams = {\r\n page: currentPageNumber + 1,\r\n size: pageSize,\r\n languageId: this.brandConfig?.langCode\r\n };\r\n\r\n const queryParams = {\r\n ...baseParams,\r\n ...(filters || {})\r\n };\r\n this.currentSearchParams = queryParams; // Store current search params for load more functionality\r\n this.gameLobbyLibService.getGames(\r\n this.brandConfig?.apiUrl,\r\n queryParams,\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe((games: any[]) => {\r\n\r\n if (!games) {\r\n this.filterShowLoadMore = false;\r\n return;\r\n }\r\n\r\n // If first page - replace\r\n if (currentPageNumber === 0) {\r\n this.filteredGames = games;\r\n }\r\n // If next page - append\r\n else if (currentPageNumber > 0) {\r\n this.filteredGames = [\r\n ...this.filteredGames,\r\n ...games\r\n ];\r\n }\r\n // If returned count === pageSize - more games might exist\r\n this.filterShowLoadMore = games.length === pageSize;\r\n this.currentFilterPage = currentPageNumber + 1; // Update current page\r\n if (!this.filterShowLoadMore) {\r\n this.currentFilterPage = 0; // Reset to first page if no more games\r\n }\r\n this.checkIfNoGamesToShow();\r\n console.log('Filtered Games:', this.filteredGames);\r\n console.log('Show Load More:', this.filterShowLoadMore);\r\n });\r\n }\r\n\r\n\r\n // Get Games\r\n getGames(pageNumber: number, pageSize: number) {\r\n this.gameLobbyLibService.getGames(\r\n this.brandConfig?.apiUrl,\r\n { page: pageNumber, size: pageSize, languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(games => {\r\n console.log('Games:', games);\r\n });\r\n }\r\n // Last Played\r\n getLastPlayed() {\r\n this.filteredGames = []; // Reset before loading new ones\r\n this.gameLobbyLibService.getLastPlayed(\r\n this.brandConfig?.apiUrl,\r\n { languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(res => {\r\n if (!res || !res.status || res.status.toLowerCase() !== 'success') {\r\n console.error('Error fetching last played games:', res);\r\n return;\r\n } else {\r\n this.filteredGames = res.gamesList;\r\n this.checkIfNoGamesToShow();\r\n }\r\n });\r\n }\r\n // Favourites\r\n getFavouriteGames() {\r\n this.gameLobbyLibService.getFavouriteGames(\r\n this.brandConfig?.apiUrl,\r\n { languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(res => {\r\n if (!res || !res.status || res.status.toLowerCase() !== 'success') {\r\n console.error('Error fetching favourite games:', res);\r\n return;\r\n } else {\r\n this.filteredGames = res.gamesList;\r\n this.checkIfNoGamesToShow();\r\n }\r\n });\r\n }\r\n // Providers\r\n getGamesProviders() {\r\n this.gameLobbyLibService.getGamesProviders(\r\n this.brandConfig?.apiUrl,\r\n { languageId: this.brandConfig?.langCode },\r\n { referer: this.brandConfig?.siteUrl }\r\n ).subscribe(res => {\r\n console.log('Providers:', res?.gameProvidersList.length);\r\n this.providerList = res?.gameProvidersList || [];\r\n });\r\n }\r\n\r\n loadLobbyGames(isLoggedIn: boolean): void {\r\n console.log('Loading lobby games for', isLoggedIn ? 'logged in user' : 'guest user');\r\n this.gameLobbyLibService.getGamesGroups(this.brandConfig?.apiUrl, { languageId: this.brandConfig?.langCode }, { referer: this.brandConfig?.siteUrl }).pipe(\r\n /* Step 1: Select correct lobby safely */\r\n map((lobbies: GameGroupsResponse) => {\r\n\r\n if (!lobbies || !lobbies.length) return [];\r\n\r\n let selectedLobby: GameLobby | undefined;\r\n\r\n // If only one lobby returned use it\r\n if (lobbies.length === 1) {\r\n selectedLobby = lobbies[0];\r\n }\r\n // If multiple apply login logic\r\n else {\r\n selectedLobby = isLoggedIn\r\n ? lobbies.find(l => l.title.includes('Home Lobby'))\r\n : lobbies.find(l => !l.title.includes('Home Lobby'));\r\n }\r\n\r\n if (!selectedLobby?.gameGroupList?.length) return [];\r\n\r\n // Sort by order\r\n return selectedLobby.gameGroupList\r\n .slice()\r\n .sort((a, b) => a.game_group_order - b.game_group_order);\r\n }),\r\n\r\n tap(sortedGroups => {\r\n this.sortedGameGroup = sortedGroups;\r\n }),\r\n\r\n /* Step 2: Fetch games in parallel */\r\n switchMap((sortedGroups: GameGroup[]) => {\r\n\r\n if (!sortedGroups.length) return of([]);\r\n\r\n const requests = sortedGroups\r\n .filter(group => group.name && group.name.trim() !== '')\r\n .map(group =>\r\n this.gameLobbyLibService.getGames(this.brandConfig?.apiUrl, {\r\n page: 1,\r\n size: this.brandConfig?.lobbyGamesPageSize,\r\n gameGroupId: group.id\r\n }, { referer: this.brandConfig?.siteUrl }).pipe(\r\n map((res: any) => ({\r\n gameGroupDetails: group,\r\n games: res\r\n }))\r\n )\r\n );\r\n\r\n return forkJoin(requests);\r\n })\r\n\r\n ).subscribe({\r\n next: (result: LobbyGames[]) => {\r\n this.lobbyGames = result;\r\n },\r\n error: (err) => {\r\n console.error('Error loading lobby games:', err);\r\n }\r\n });\r\n }\r\n\r\n checkIfNoGamesToShow() {\r\n let noGames = false;\r\n if (this.filteredGames && Array.isArray(this.filteredGames) && this.filteredGames.length === 0) {\r\n noGames = true;\r\n }\r\n this.noGamesToShow = noGames;\r\n }\r\n\r\n getgameClicked(gameCode: any): void {\r\n this.gameClicked.emit(gameCode);\r\n }\r\n}","<div class=\"main-lobby\">\r\n <div class=\"game-filter-background\" [ngStyle]=\"{ 'background': theme?.background || 'none' }\">\r\n <!-- Main Filter Section -->\r\n <div class=\"fixed-footer-width clearfix\" [ngStyle]=\"{ 'border-bottom': theme?.borderSearch || 'none' }\">\r\n <div class=\"display-filter-content\">\r\n <!-- Search Bar -->\r\n <div class=\"searchBar\">\r\n <div class=\"game-search\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\">\r\n <form class=\"form-inline\" (submit)=\"$event.preventDefault()\">\r\n <i class=\"fa fa-search\"></i>\r\n <input #searchInput class=\"game-search-form\" id=\"searchInput\" name=\"gameSearch\" type=\"text\" placeholder=\"GAME SEARCH\"\r\n aria-label=\"Search\" (input)=\"onSearchChange($event)\" />\r\n </form>\r\n </div>\r\n\r\n <!-- Provider Swiper -->\r\n <div class=\"swiperContainer\">\r\n <swiper-container #swiperContainer *ngIf=\"providerList && providerList.length\"\r\n slides-per-view=\"1\" space-between=\"6\" speed=\"50\" [loop]=\"shouldLoopProviders()\"\r\n navigation=\"false\" css-mode=\"true\" [breakpoints]=\"{\r\n '100': { slidesPerView: 3 },\r\n '200': { slidesPerView: 4 },\r\n '320': { slidesPerView: 4 },\r\n '480': { slidesPerView: 6 },\r\n '768': { slidesPerView: 8 },\r\n '991': { slidesPerView: 10 },\r\n '1280': { slidesPerView: 12 }\r\n }\">\r\n <swiper-slide *ngFor=\"let provider of providerList\">\r\n <div class=\"provider-slide-item\">\r\n <img [src]=\"brandConfig?.providersIconsDir + '/' + provider.vendorCode + '.svg'\"\r\n [alt]=\"provider.name\" (click)=\"filterProviderGames(0, provider.vendorCode)\"\r\n loading=\"lazy\" />\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n </div>\r\n\r\n <!-- Navigation buttons - OUTSIDE .swiperContainer but INSIDE .searchBar -->\r\n <div class=\"swiper-navigation-row\">\r\n <button class=\"swiper-button-prev\"\r\n [ngStyle]=\"{ '--swiper-navigation-color': theme?.buttonBackgroundColor }\"\r\n aria-label=\"Previous providers\">\r\n <span class=\"icon-arrow-left-games\"></span>\r\n </button>\r\n\r\n <button class=\"swiper-button-next\"\r\n [ngStyle]=\"{ '--swiper-navigation-color': theme?.buttonBackgroundColor }\"\r\n aria-label=\"Next providers\">\r\n <span class=\"icon-arrow-right-games\"></span>\r\n </button>\r\n </div>\r\n <div class=\"game-provider\">\r\n <div class=\"desktop\">\r\n <ul class=\"f-tabs providerIcons-ul-desktop\">\r\n <li id=\"favouriteIcon\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"display-filter-content\" (click)=\"filterFavouriteGames()\">\r\n <div id=\"recentGamestt\" style=\"display: none; margin-left: -42px\"\r\n class=\"ttip ttip-arrow\">\r\n Favorite Games\r\n <span class=\"arrow-down\" style=\"margin-left: -56px\"></span>\r\n </div>\r\n <div class=\"display-filter-content btt\" id=\"recentGames\">\r\n <i class=\"fa fa-heart\"></i>\r\n </div>\r\n </li>\r\n\r\n <!-- Recent Games Icon -->\r\n <li id=\"recentGamesIcon\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"display-filter-content\" (click)=\"filterLastPlayedGames()\">\r\n <div id=\"recentGamestt\" style=\"display: none; margin-left: -42px\"\r\n class=\"ttip ttip-arrow\">\r\n Last played Games\r\n <span class=\"arrow-down\" style=\"margin-left: -56px\"></span>\r\n </div>\r\n <div class=\"display-filter-content btt\" id=\"recentGames\">\r\n <i class=\"fa fa-clock\"></i>\r\n </div>\r\n </li>\r\n\r\n <!-- Hot Games Icon -->\r\n <li id=\"hotGamesIcon\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"display-filter-content\" (click)=\"filterHotGames(0, 'hot')\">\r\n <div id=\"hotGamestt\" style=\"display: none; margin-left: -23px\"\r\n class=\"ttip ttip-arrow\">\r\n Hot Games\r\n <span class=\"arrow-down\" style=\"margin-left: -35px\"></span>\r\n </div>\r\n <div class=\"display-filter-content btt\" id=\"hotGames\">\r\n <i class=\"fa fa-fire\"></i>\r\n </div>\r\n </li>\r\n\r\n <!-- Game Category Dropdown -->\r\n <li id=\"gameCategory\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n class=\"game-category-link game-category-link-desktop hidden-xs hidden-sm display-filter-content\">\r\n <a type=\"button\" class=\"category-btn\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background': 'transparent'\r\n }\" (click)=\"toggleGameCategoryTop()\">\r\n {{ categoryLabel }}\r\n </a>\r\n <a type=\"button\" id=\"gameCategoryLink\" [ngClass]=\"{\r\n 'icon-angle-down': !categoryChosen,\r\n 'icon-close': categoryChosen,\r\n 'pull-right': true\r\n }\" aria-label=\"Toggle category menu\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background': 'transparent'\r\n }\" (click)=\"categoryChosen ? DropdownClose() : toggleGameCategoryTop()\"></a>\r\n\r\n <!-- Game Category Dropdown Menu (positioned directly below) -->\r\n <div id=\"gameCategoryTop\"\r\n class=\"clearfix game-category-list game-category-list-footer\"\r\n [style.display]=\"showGameCategoryTop ? 'block' : 'none'\">\r\n <div class=\"game-category-list-width\">\r\n <ul class=\"game-category-list-item\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background-color': theme?.background || '#262626',\r\n 'border': theme?.border || 'none'\r\n }\">\r\n <li class=\"game-category-list-item-li\" *ngFor=\"let group of lobbyGames\"\r\n id=\"{{group.gameGroupDetails.id}}-LeftSideButton-footer\"\r\n (click)=\"categoryLabel = group.gameGroupDetails.name; filterGroupGames(0, group.gameGroupDetails.id)\">\r\n {{ group.gameGroupDetails.name }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Games Section -->\r\n <div class=\"games-background\" id=\"gamesLobby\" *ngIf=\"!filterActive\">\r\n <div *ngFor=\"let group of lobbyGames; let i = index\" class=\"games-section\">\r\n <div class=\"new-game-header\">\r\n <h3 [ngStyle]=\"{ 'color': theme?.textColor || '#FFFFFF' }\">{{group.gameGroupDetails.name}}</h3>\r\n <div>\r\n <a class=\"btn-newgamestrip\" [ngStyle]=\"{ 'border': (theme?.borderSearch || 'none'),\r\n 'background-color': hoveredViewAllIndex === i ? (theme?.buttonBackgroundColor || '') : (theme?.background || '#262626')\r\n }\" (click)=\"viewGameCategory(group.gameGroupDetails)\" (mouseenter)=\"hoveredViewAllIndex = i\"\r\n (mouseleave)=\"hoveredViewAllIndex = null\">VIEW ALL</a>\r\n <a class=\"btn-Arrow-left\" [ngClass]=\"{ 'pulse': pulsingButton === 'prev' + i }\"\r\n [ngStyle]=\"{ 'border': hoveredButton === 'prev' + i ? (theme?.borderSearch || 'none'):'1px solid #fff' }\"\r\n style=\"cursor: pointer;\" aria-label=\"Previous games\"\r\n (click)=\"triggerPulse('prev' + i); slidePrev(i)\" (mouseenter)=\"hoveredButton = 'prev' + i\"\r\n (mouseleave)=\"hoveredButton = null\">\r\n <span class=\"arrow-icon arrow-left\"></span>\r\n </a>\r\n <a class=\"btn-Arrow-right\" [ngClass]=\"{ 'pulse': pulsingButton === 'next' + i }\"\r\n [ngStyle]=\"{ 'border': hoveredButton === 'next' + i ? (theme?.borderSearch || 'none') : '1px solid #fff' }\"\r\n style=\"cursor: pointer;\" aria-label=\"Next games\"\r\n (click)=\"triggerPulse('next' + i); slideNext(i)\" (mouseenter)=\"hoveredButton = 'next' + i\"\r\n (mouseleave)=\"hoveredButton = null\">\r\n <span class=\"arrow-icon arrow-right\"></span>\r\n </a>\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"swiperContainer\">\r\n <div style=\"overflow-x: auto; white-space: nowrap; width: 100%;\">\r\n <swiper-container #gameSwiperContainer *ngIf=\"group.games && group.games.length\" slides-per-view=\"1\"\r\n space-between=\"10\" speed=\"50\" [loop]=\"shouldLoopGamesForGroup(group.games)\" navigation=\"false\"\r\n css-mode=\"false\" [breakpoints]=\"{\r\n '190': { slidesPerView: 1, spaceBetween: 10 },\r\n '350': { slidesPerView: 2, spaceBetween: 10 },\r\n '520': { slidesPerView: 3, spaceBetween: 10 },\r\n '676': { slidesPerView: 4, spaceBetween: 10 },\r\n '834': { slidesPerView: 4, spaceBetween: 10 },\r\n '998': { slidesPerView: 5, spaceBetween: 10 },\r\n '1158': { slidesPerView: 6, spaceBetween: 10 },\r\n '1280': { slidesPerView: 6, spaceBetween: 10 }\r\n }\">\r\n <swiper-slide *ngFor=\"let game of group.games; let gameIndex = index\"\r\n [attr.data-game-id]=\"i + '-' + game.gameCode\" class=\"lobby_games-home\">\r\n <div class=\"game-card\">\r\n <div class=\"game-card__content\"\r\n (mouseenter)=\"hoveredGameKey = gameIndex + '-' + game.gameCode\"\r\n (mouseleave)=\"hoveredGameKey = null\">\r\n <div class=\"game-card__action-btn\"\r\n *ngIf=\"hoveredGameKey === gameIndex + '-' + game.gameCode\">\r\n <a class=\"btn game-card__action-btn--play\" [ngStyle]=\"{\r\n 'color': theme?.buttonBackgroundColor || '#ff7d00',\r\n 'border': theme?.borderSearch || '#ff7d00'\r\n }\"\r\n (click)=\"getgameClicked(game.gameCode)\"\r\n style=\"cursor: pointer;\"\r\n >\r\n <i class=\"fa fa-play\"></i>\r\n </a>\r\n </div>\r\n <div class=\"ribbon\"><span [ngClass]=\"game.tagList.includes('new') ? 'new' : ''\">{{\r\n game.tagList.includes(\"new\") ? \"NEW\" : \"\" }}</span><span [ngClass]=\"game.tagList.includes('hot') ? 'hot' : ''\">{{\r\n game.tagList.includes(\"hot\") ? \"HOT\" : \"\" }}</span></div>\r\n <div class=\"game-card__img game-card__image-container\">\r\n <img class=\"img-gradient\" [src]=\"getGameImage(game)\"\r\n (error)=\"onImageError($event)\" [alt]=\"game.name\" loading=\"lazy\"\r\n [title]=\"game.name\">\r\n </div>\r\n </div>\r\n <div class=\"game-card__text\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background-color': theme?.gametextbackground || '#ff7d00'\r\n }\"><span class=\"game-card__favicon\"><i class=\"far fa-heart\"\r\n aria-hidden=\"true\"></i></span><span class=\"game-card--name\">{{ game.name\r\n }}</span></div>\r\n </div>\r\n </swiper-slide>\r\n </swiper-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <!-- Filtered Games Sections-->\r\n <div class=\"games-background\" id=\"filtered-games-section\" *ngIf=\"filterActive\">\r\n <div class=\"lobby_games-row\">\r\n <div class=\"game-card\" [attr.data-game-id]=\"gameIndex + '-' + game.gameCode\"\r\n *ngFor=\"let game of filteredGames; let gameIndex = index\">\r\n <div class=\"game-card__content\" (mouseenter)=\"hoveredGameKey = gameIndex + '-' + game.gameCode\"\r\n (mouseleave)=\"hoveredGameKey = null\">\r\n <div class=\"game-card__action-btn\" *ngIf=\"hoveredGameKey === gameIndex + '-' + game.gameCode\">\r\n <a class=\"btn game-card__action-btn--play\" [ngStyle]=\"{\r\n 'color': theme?.buttonBackgroundColor || '#ff7d00',\r\n 'border': theme?.borderSearch || '#ff7d00'\r\n }\" (click)=\"getgameClicked(game.gameCode)\" style=\"cursor: pointer;\">\r\n <i class=\"fa fa-play\"></i>\r\n </a>\r\n </div>\r\n <div class=\"ribbon\"><span [ngClass]=\"game.tagList.includes('new') ? 'new' : ''\">{{\r\n game.tagList.includes(\"new\") ? \"NEW\" : \"\" }}</span><span [ngClass]=\"game.tagList.includes('hot') ? 'hot' : ''\">{{\r\n game.tagList.includes(\"hot\") ? \"HOT\" : \"\" }}</span></div>\r\n <div class=\"game-card__img game-card__image-container\">\r\n <img class=\"img-gradient\" [src]=\"getGameImage(game)\" (error)=\"onImageError($event)\"\r\n [alt]=\"game.name\" loading=\"lazy\" [title]=\"game.name\">\r\n </div>\r\n </div>\r\n <div class=\"game-card__text\" [ngStyle]=\"{\r\n 'color': theme?.textColor || '#fff',\r\n 'background-color': theme?.gametextbackground || '#ff7d00'\r\n }\"><span class=\"game-card__favicon\"><i class=\"far fa-heart\"\r\n aria-hidden=\"true\"></i></span><span class=\"game-card--name\">{{ game.name }}</span></div>\r\n </div>\r\n </div>\r\n <div class=\"lobby_loadMoreBtn\" *ngIf=\"filterShowLoadMore\">\r\n <a class=\"btn load-more-btn\" [ngStyle]=\"{ 'border': theme?.borderSearch || 'none' }\"\r\n (click)=\"loadMoreFilteredGames()\">\r\n LOAD MORE\r\n </a>\r\n </div>\r\n </div>\r\n <div class=\"games-background lobby_noGamesMessage\" id=\"noGamesMessage\" *ngIf=\"noGamesToShow\">\r\n <p>NO GAMES FOUND</p>\r\n </div>\r\n</div>","import { Component, Input, OnInit, ViewEncapsulation, Output, TemplateRef } from '@angular/core';\r\nimport { BannersComponent } from './banners/banners.component';\r\nimport {GameLobbyTheme} from './theme/default-theme';\r\nimport { CasinoLobbyComponent } from './casino-lobby/casino-lobby.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EventEmitter } from '@angular/core';\r\n@Component({\r\n selector: 'lib-game-lobby-lib',\r\n standalone: true,\r\n imports: [CommonModule, BannersComponent, CasinoLobbyComponent],\r\n template: `\r\n <div class=\"lobbyaria-setsize\" [ngStyle]=\"{ 'background-color': (themeObject?.background || '#262626')}\" >\r\n <app-banners [theme]=\"themeObject\" [bannerData]=\"bannerDataInformation\" [bannerOverlay]=\"bannerOverlay\" \r\n (routerLinkClicked)=\"onRouterLinkClicked($event)\"></app-banners>\r\n <lib-casino-lobby [theme]=\"themeObject\" [casinoData]=\"bannerDataInformation\" [brandConfig]=\"brandConfig\" (gameClicked)=\"onGameClicked($event)\"></lib-casino-lobby>\r\n </div>\r\n `,\r\n styles: `.lobbyaria-setsize{\r\n height: 100%; padding: 15px;background-color: #262626;\r\n }`,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class GameLobbyLibComponent implements OnInit {\r\n @Input() bannerData!: any;\r\n @Input() themes!: GameLobbyTheme;\r\n @Input() brandConfig!: any;\r\n @Input() bannerOverlay: TemplateRef<any> | null = null;\r\n @Output() routerLinkClicked = new EventEmitter<string>();\r\n @Output() gameClicked = new EventEmitter<string>();\r\n themeObject: any;\r\n bannerDataInformation:any\r\n constructor() {\r\n // Do not use @Input() values here\r\n }\r\n\r\n setDataThemes(): void {\r\n this.bannerDataInformation = this.bannerData;\r\n this.themeObject = this.themes;\r\n }\r\n\r\n ngOnInit(): void {\r\n this.setDataThemes();\r\n }\r\n\r\n onGameClicked(gameCode: string) {\r\n this.gameClicked.emit(gameCode);\r\n }\r\n\r\n onRouterLinkClicked(link: string) {\r\n this.routerLinkClicked.emit(link);\r\n }\r\n}\r\n","/*\r\n * Public API Surface of game-lobby-lib\r\n */\r\nexport * from './lib/banners/banners.component';\r\nexport * from './lib/casino-lobby/casino-lobby.component';\r\nexport * from './lib/game-lobby-lib.service';\r\nexport * from './lib/game-lobby-lib.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.GameLobbyThemeService","i1.GameLobbyThemeService","i2.GameLobbyLibService"],"mappings":"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"}
@@ -5,6 +5,7 @@ import { GameLobbyTheme } from '../theme/default-theme';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class BannersComponent implements OnInit {
7
7
  private sanitizer;
8
+ private themeService;
8
9
  btnSpans: QueryList<ElementRef>;
9
10
  bannerData: any;
10
11
  theme?: GameLobbyTheme;
@@ -17,13 +18,17 @@ export declare class BannersComponent implements OnInit {
17
18
  ngOnInit(): void;
18
19
  setDataThemes(): void;
19
20
  /**
20
- * Bypasses Angular's HTML sanitization so that button HTML (e.g. anchor tags,
21
- * custom attributes, styled text like "Deposit") renders correctly in the
22
- * consuming project. Safe to use here because the content comes from your
23
- * own controlled bannerData input, not from user-generated content.
21
+ * Rewrites all class names on the injected button HTML to namespaced equivalents
22
+ * prefixed with "lobby_". This prevents the host project's Bootstrap/jQuery stylesheets
23
+ * from targeting generic class names like "btn", "logged-in" etc. and altering
24
+ * the button appearance or triggering jQuery handlers that crash with
25
+ * "Cannot read properties of undefined (reading 'display')".
26
+ *
27
+ * e.g. class="btn cm-slider__btn--cta logged-in"
28
+ * => class="lobby_btn lobby_cm-slider__btn--cta lobby_logged-in"
24
29
  */
25
30
  getSafeHtml(html: string): SafeHtml;
26
- getRouterLinkFromButton(buttonHtml: string): void;
31
+ getRouterLinkFromButton(buttonHtml: string, event?: MouseEvent): void;
27
32
  static ɵfac: i0.ɵɵFactoryDeclaration<BannersComponent, never>;
28
33
  static ɵcmp: i0.ɵɵComponentDeclaration<BannersComponent, "app-banners", never, { "bannerData": { "alias": "bannerData"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "bannerOverlay": { "alias": "bannerOverlay"; "required": false; }; }, { "routerLinkClicked": "routerLinkClicked"; }, never, never, true, never>;
29
34
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "game-lobby-lib",
3
- "version": "0.0.17",
3
+ "version": "0.0.18",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^17.3.0",
6
6
  "@angular/core": "^17.3.0",