@updevs/components 1.0.0-alpha.44 → 1.0.0-alpha.46

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.
@@ -22,6 +22,10 @@ export class HeaderComponent extends BaseComponent {
22
22
  this.nextThemeIcon = computed(() => this.currentPreferences()?.isDarkTheme ? 'sun' : 'moon-stars');
23
23
  this.currentNotificationsIcon = computed(() => this.hasNewNotifications() ? 'bell-ringing' : 'bell');
24
24
  this.hasNewNotifications = computed(() => this.currentNotifications().some(n => !n.dateRead));
25
+ this.userInfo = computed(() => this.securityStorage.getUserInfo());
26
+ this.textService = inject(TextService);
27
+ this.isSidebarMobileOpen = signal(false);
28
+ this.shouldBlinkIfNewNotifications = computed(() => !!this.coreLayoutConfigService.config.shouldBlinkIfNewNotifications);
25
29
  this.languagesOptions = computed(() => {
26
30
  const allLanguagesOptions = [];
27
31
  const availableLanguages = (this.coreLayoutConfigService.config.availableLanguages || {});
@@ -45,12 +49,10 @@ export class HeaderComponent extends BaseComponent {
45
49
  }));
46
50
  return userActions;
47
51
  });
48
- this.userInfo = computed(() => this.securityStorage.getUserInfo());
49
52
  this.userIdentification = computed(() => !!this.userInfo() ? this.coreLayoutConfigService.config.getUserName(this.userInfo()) : '');
50
53
  this.userDescription = computed(() => !!this.coreLayoutConfigService.config.getUserDescription
51
54
  ? this.coreLayoutConfigService.config.getUserDescription(this.userInfo())
52
55
  : '');
53
- this.shouldBlinkIfNewNotifications = computed(() => !!this.coreLayoutConfigService.config.shouldBlinkIfNewNotifications);
54
56
  this.latestNotifications = computed(() => {
55
57
  const unreadNotifications = this.currentNotifications()
56
58
  .filter(n => !n.dateRead)
@@ -65,8 +67,12 @@ export class HeaderComponent extends BaseComponent {
65
67
  ...readNotifications
66
68
  ].slice(0, this.coreLayoutConfigService.config.numberOfLastNotificationsDisplayed);
67
69
  });
68
- this.textService = inject(TextService);
69
- this.isSidebarMobileOpen = signal(false);
70
+ this.userInitials = computed(() => {
71
+ const firstChar = this.userIdentification().charAt(0);
72
+ const lastSpaceIndex = this.userIdentification().lastIndexOf(' ');
73
+ const firstAfterLastSpace = lastSpaceIndex !== -1 ? this.userIdentification().charAt(lastSpaceIndex + 1) : '';
74
+ return `${firstChar}${firstAfterLastSpace}`;
75
+ });
70
76
  this.securityStorage = inject(SecurityStorage);
71
77
  this.coreLayoutConfigService = inject(UpdCoreLayoutConfigService);
72
78
  this.layoutService = inject(LayoutService);
@@ -122,13 +128,13 @@ export class HeaderComponent extends BaseComponent {
122
128
  this.isSidebarMobileOpen.set(!this.isSidebarMobileOpen());
123
129
  }
124
130
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
125
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i4.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
131
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n } @else {\n <span class=\"avatar avatar-sm\">{{ userInitials() }}</span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i4.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
126
132
  }
127
133
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, decorators: [{
128
134
  type: Component,
129
- args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
135
+ args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n } @else {\n <span class=\"avatar avatar-sm\">{{ userInitials() }}</span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
130
136
  }], propDecorators: { classes: [{
131
137
  type: HostBinding,
132
138
  args: ['class']
133
139
  }] } });
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sYXlvdXQvc3JjL3BhcnRpYWxzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xheW91dC9zcmMvcGFydGlhbHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixXQUFXLEVBRVgsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsRUFBRSxLQUFLLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFVdkQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBYTtJQU5sRDs7UUFXSSx3QkFBbUIsR0FBRyxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RSxxQkFBZ0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RSxrQkFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENB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S0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFckcsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLEdBQUcsQ0FBQyxhQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLFlBQStCO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsa0JBQWtCLENBQUMsWUFBK0I7UUFDOUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQscUJBQXFCO1FBQ2pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7OEdBdElRLGVBQWU7a0dBQWYsZUFBZSxnVkFLdUMsVUFBVSwrSEFDaEIsVUFBVSx5SEFDaEIsVUFBVSxvRUNsQ2pFLHlsUEEwSEE7OzJGRC9GYSxlQUFlO2tCQU4zQixTQUFTOytCQUNJLFlBQVksaUJBR1AsaUJBQWlCLENBQUMsSUFBSTs4QkFHWCxPQUFPO3NCQUFoQyxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBIb3N0QmluZGluZyxcbiAgICBPbkluaXQsXG4gICAgaW5qZWN0LFxuICAgIGNvbXB1dGVkLFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG4gICAgRWxlbWVudFJlZiwgaW5wdXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJsZXJJY29uc1R5cGUgfSBmcm9tICdAdXBkZXZzL2ljb25zJztcbmltcG9ydCB7IFRleHRTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsnO1xuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgTGF5b3V0U2VydmljZSwgUHJlZmVyZW5jZXNTdG9yYWdlLCBVcGRDb3JlTGF5b3V0Q29uZmlnU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL2xheW91dCc7XG5pbXBvcnQgeyBEcm9wZG93bkl0ZW0gfSBmcm9tICdAdXBkZXZzL2NvbXBvbmVudHMvZHJvcGRvd24nO1xuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0Bqc3ZlcnNlL3RyYW5zbG9jbyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25Nb2RlbCwgTm90aWZpY2F0aW9uc1NlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkay9ub3RpZmljYXRpb25zJztcbmltcG9ydCB7IFNlY3VyaXR5U3RvcmFnZSB9IGZyb20gJ0B1cGRldnMvc2RrL3NlY3VyaXR5JztcblxuaW1wb3J0IHsgSGVhZGVyU3R5bGVUeXBlIH0gZnJvbSAnLi9oZWFkZXItc3R5bGUudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBkLWhlYWRlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hlYWRlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaGVhZGVyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBIZWFkZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGNsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlckNsYXNzZXMoKTtcbiAgICB9XG5cbiAgICBsYW5ndWFnZVN3aXRjaGVyUmVmID0gdmlld0NoaWxkKCdsYW5ndWFnZVN3aXRjaGVyQnRuJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIG5vdGlmaWNhdGlvbnNSZWYgPSB2aWV3Q2hpbGQoJ25vdGlmaWNhdGlvbnNCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgbG9nZ2VkVXNlclJlZiA9IHZpZXdDaGlsZCgnbG9nZ2VkVXNlckJ0bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAgIGlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlzTm90aWZpY2F0aW9uc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIGlzTG9nZ2VkVXNlckRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gICAgcmVhZG9ubHkgc3R5bGUgPSBpbnB1dDxIZWFkZXJTdHlsZVR5cGU+KCdsaWdodCcpO1xuICAgIHJlYWRvbmx5IG5leHRUaGVtZUljb24gPSBjb21wdXRlZDxUYWJsZXJJY29uc1R5cGU+KCgpID0+IHRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lID8gJ3N1bicgOiAnbW9vbi1zdGFycycpO1xuICAgIHJlYWRvbmx5IGN1cnJlbnROb3RpZmljYXRpb25zSWNvbiA9IGNvbXB1dGVkPFRhYmxlckljb25zVHlwZT4oKCkgPT4gdGhpcy5oYXNOZXdOb3RpZmljYXRpb25zKCkgPyAnYmVsbC1yaW5naW5nJyA6ICdiZWxsJyk7XG4gICAgcmVhZG9ubHkgaGFzTmV3Tm90aWZpY2F0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3VycmVudE5vdGlmaWNhdGlvbnMoKS5zb21lKG4gPT4gIW4uZGF0ZVJlYWQpKTtcbiAgICByZWFkb25seSBsYW5ndWFnZXNPcHRpb25zID0gY29tcHV0ZWQ8RHJvcGRvd25JdGVtW10+KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWxsTGFuZ3VhZ2VzT3B0aW9uczogRHJvcGRvd25JdGVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gKHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmF2YWlsYWJsZUxhbmd1YWdlcyB8fCB7fSk7XG5cbiAgICAgICAgT2JqZWN0LmtleXMoYXZhaWxhYmxlTGFuZ3VhZ2VzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBhbGxMYW5ndWFnZXNPcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBrZXksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgIHRleHQ6IGF2YWlsYWJsZUxhbmd1YWdlc1trZXldLFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUtleSgpID09PSBrZXlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWxsTGFuZ3VhZ2VzT3B0aW9ucztcbiAgICB9KTtcbiAgICByZWFkb25seSBsb2dnZWRVc2VyT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duSXRlbVtdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJBY3Rpb25zOiBEcm9wZG93bkl0ZW1bXSA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmxvZ2dlZFVzZXJNZW51QWN0aW9ucy5mb3JFYWNoKGFjdCA9PiB1c2VyQWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIGlkOiBhY3QuaWQhKCksXG4gICAgICAgICAgICB0ZXh0OiBhY3QudGV4dCEoKSxcbiAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIGljb246IGFjdC5pY29uTW9kZWw/LigpXG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gdXNlckFjdGlvbnM7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgdXNlckluZm8gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNlY3VyaXR5U3RvcmFnZS5nZXRVc2VySW5mbygpKTtcbiAgICByZWFkb25seSB1c2VySWRlbnRpZmljYXRpb24gPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICAhIXRoaXMudXNlckluZm8oKSA/IHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmdldFVzZXJOYW1lKHRoaXMudXNlckluZm8oKSEpIDogJydcbiAgICApO1xuICAgIHJlYWRvbmx5IHVzZXJEZXNjcmlwdGlvbiA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgICEhdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcuZ2V0VXNlckRlc2NyaXB0aW9uXG4gICAgICAgICAgICA/IHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLmdldFVzZXJEZXNjcmlwdGlvbih0aGlzLnVzZXJJbmZvKCkhKVxuICAgICAgICAgICAgOiAnJ1xuICAgICk7XG4gICAgcmVhZG9ubHkgc2hvdWxkQmxpbmtJZk5ld05vdGlmaWNhdGlvbnMgPSBjb21wdXRlZCgoKSA9PiAhIXRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLnNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zKTtcbiAgICByZWFkb25seSBsYXRlc3ROb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB1bnJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gIW4uZGF0ZVJlYWQpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYi5kYXRlUmVjZWl2ZWQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcubnVtYmVyT2ZMYXN0Tm90aWZpY2F0aW9uc0Rpc3BsYXllZCk7XG4gICAgICAgIGNvbnN0IHJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gISFuLmRhdGVSZWFkKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGIuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmRhdGVSZWNlaXZlZCkuZ2V0VGltZSgpKVxuICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLm51bWJlck9mTGFzdE5vdGlmaWNhdGlvbnNEaXNwbGF5ZWQpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi51bnJlYWROb3RpZmljYXRpb25zLFxuICAgICAgICAgICAgLi4ucmVhZE5vdGlmaWNhdGlvbnNcbiAgICAgICAgXS5zbGljZSgwLCB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5udW1iZXJPZkxhc3ROb3RpZmljYXRpb25zRGlzcGxheWVkKTtcbiAgICB9KTtcbiAgICByZWFkb25seSB0ZXh0U2VydmljZSA9IGluamVjdChUZXh0U2VydmljZSk7XG4gICAgcmVhZG9ubHkgaXNTaWRlYmFyTW9iaWxlT3BlbiA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlY3VyaXR5U3RvcmFnZSA9IGluamVjdChTZWN1cml0eVN0b3JhZ2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29yZUxheW91dENvbmZpZ1NlcnZpY2UgPSBpbmplY3QoVXBkQ29yZUxheW91dENvbmZpZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0U2VydmljZSA9IGluamVjdChMYXlvdXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jb1NlcnZpY2UgPSBpbmplY3QoVHJhbnNsb2NvU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJlbmNlc1N0b3JhZ2UgPSBpbmplY3QoUHJlZmVyZW5jZXNTdG9yYWdlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRQcmVmZXJlbmNlcyA9IHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLmdldFByZWZlcmVuY2VzKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50Tm90aWZpY2F0aW9ucyA9IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uubm90aWZpY2F0aW9ucztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5ndWFnZUtleSA9IHNpZ25hbCgnJyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IGBuYXZiYXIgbmF2YmFyLWV4cGFuZC1tZCBkLW5vbmUgZC1sZy1mbGV4IGQtcHJpbnQtbm9uZSBuYXZiYXItJHt0aGlzLnN0eWxlKCl9YCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHJlYWRvbmx5IGNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGF5b3V0U2VydmljZS5tYWluSGVhZGVyQ29uZmlnKCkpO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uuc2V0RGFya01vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmN1cnJlbnRMYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmN1cnJlbnRQcmVmZXJlbmNlcygpIS5jdXJyZW50TGFuZ3VhZ2VDb2RlITtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VLZXkuc2V0KGNvZGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUaGVtZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLnRvZ2dsZURhcmtNb2RlKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoTGFuZ3VhZ2UoaXRlbTogRHJvcGRvd25JdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlS2V5LnNldChpdGVtLmlkKTtcbiAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoaXRlbS5pZCk7XG4gICAgICAgIHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLnNhdmVQcmVmZXJlbmNlcyh7IC4uLnRoaXMuY3VycmVudFByZWZlcmVuY2VzKCksIGN1cnJlbnRMYW5ndWFnZUNvZGU6IGl0ZW0uaWQgfSk7XG4gICAgICAgIHRoaXMubGF5b3V0U2VydmljZS5ub3RpZnlVc2VyQ2hhbmdlZExhbmd1YWdlKGl0ZW0uaWQpO1xuXG4gICAgICAgIHRoaXMuaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKGl0ZW06IERyb3Bkb3duSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBidG4gPSB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5sb2dnZWRVc2VyTWVudUFjdGlvbnMuZmluZChiID0+IGIuaWQhKCkgPT09IGl0ZW0uaWQpO1xuXG4gICAgICAgIGlmICghIWJ0bj8uY2xpY2tGdW5jdGlvbikge1xuICAgICAgICAgICAgYnRuLmNsaWNrRnVuY3Rpb24hKHsgZGF0YTogdGhpcy51c2VySW5mbygpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmRhdGVSZWFkKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLm1hcmtBc1JlYWQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuY2xpY2tPbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHJlbW92ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UucmVtb3ZlTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xuICAgIH1cblxuICAgIHRvZ2dsZVNpZGViYXJPbk1vYmlsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1NpZGViYXJNb2JpbGVPcGVuLnNldCghdGhpcy5pc1NpZGViYXJNb2JpbGVPcGVuKCkpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXIteGxcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVNpZGViYXJPbk1vYmlsZSgpXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc1NpZGViYXJNb2JpbGVPcGVuKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZiYXItdG9nZ2xlci1pY29uXCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZiYXItbmF2IGZsZXgtcm93IG9yZGVyLW1kLWxhc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLW1kLWZsZXggbWUtM1wiPlxuICAgICAgICAgICAgQGlmICghIWNvbmZpZygpLnNob3dUaGVtZVN3aXRjaGVyKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtbGluayBbaXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJbJ3B4LTAnXVwiIChjbGlja2VkKT1cInN3aXRjaFRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCJuZXh0VGhlbWVJY29uKClcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghIWNvbmZpZygpLnNob3dMYW5ndWFnZVN3aXRjaGVyICYmIGxhbmd1YWdlc09wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtbGluayBbaXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJbJ3B4LTAnXVwiIChjbGlja2VkKT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3Blbj10cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjbGFuZ3VhZ2VTd2l0Y2hlckJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwibGFuZ3VhZ2VcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWRyb3Bkb3duIHdyYXBwZXJDbGFzc2VzPVwibXQtMVwiIFtpc09wZW5dPVwiaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93blJlZmVyZW5jZV09XCJsYW5ndWFnZVN3aXRjaGVyUmVmKClcIiBbaXRlbXNdPVwibGFuZ3VhZ2VzT3B0aW9ucygpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlbiA9ICRldmVudFwiIChzZWxlY3RlZEl0ZW0pPVwic3dpdGNoTGFuZ3VhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93Tm90aWZpY2F0aW9ucyAmJiAhIXVzZXJJbmZvKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd24gZC1ub25lIGQtbWQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc05vdGlmaWNhdGlvbnNEcm9wZG93bk9wZW4gPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjbm90aWZpY2F0aW9uc0J0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCJjdXJyZW50Tm90aWZpY2F0aW9uc0ljb24oKVwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc05ld05vdGlmaWNhdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcmVkXCIgW2NsYXNzLmJhZGdlLWJsaW5rXT1cInNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zKClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdXBkLWxpbms+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtZHJvcGRvd24gd3JhcHBlckNsYXNzZXM9XCJtdC0xIGRyb3Bkb3duLW1lbnUtY2FyZFwiIFtpc09wZW5dPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93blJlZmVyZW5jZV09XCJub3RpZmljYXRpb25zUmVmKClcIiBbc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc09wZW5DaGFuZ2UpPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuID0gJGV2ZW50XCIgW21pbldpZHRoXT1cIjQwMFwiIGFycm93VHlwZT1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgJ1VwRGV2cy5Ob3RpZmljYXRpb25DZW50ZXIuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChub3RpZmljYXRpb24gb2YgbGF0ZXN0Tm90aWZpY2F0aW9ucygpOyB0cmFjayBub3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCBsaXN0LWdyb3VwLWhvdmVyYWJsZVwiIChjbGljayk9XCJyZWFkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFub3RpZmljYXRpb24uZGF0ZVJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZC1ibG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtZG90LWFuaW1hdGVkIGJnLXByaW1hcnkgZC1ibG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwidGV4dC1ib2R5IGQtYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mdy1ib2xkXT1cIiFub3RpZmljYXRpb24uZGF0ZVJlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0U2VydmljZS5nZXRUZXh0KG5vdGlmaWNhdGlvbi50aXRsZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFub3RpZmljYXRpb24uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ibG9jayB0ZXh0LXNlY29uZGFyeSB0ZXh0LXRydW5jYXRlIG10LW4xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRleHRTZXJ2aWNlLmdldFRleHQobm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2N1c3RvbUNsYXNzZXNdPVwiWydsaXN0LWdyb3VwLWl0ZW0tYWN0aW9ucyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJyZW1vdmVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwieFwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC1ib2R5LXRlcnRpYXJ5XCI+e3sgJ1VwRGV2cy5Ob3RpZmljYXRpb25DZW50ZXIuTm9Ob3RpZmljYXRpb25zJyB8IHRyYW5zbG9jbyB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93VXNlck1lbnUgJiYgISF1c2VySW5mbygpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW4gPSB0cnVlXCIgI2xvZ2dlZFVzZXJCdG4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoISF1c2VySW5mbygpIS5hdmF0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyIGF2YXRhci1zbVwiIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7dXNlckluZm8oKT8uYXZhdGFyfX0pXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLXhsLWJsb2NrIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgdXNlcklkZW50aWZpY2F0aW9uKCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISF1c2VyRGVzY3JpcHRpb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtYWxsIHRleHQtbXV0ZWRcIj57eyB1c2VyRGVzY3JpcHRpb24oKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgIEBpZiAobG9nZ2VkVXNlck9wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtZHJvcGRvd24gd3JhcHBlckNsYXNzZXM9XCJtdC0xXCIgW2lzT3Blbl09XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW5cIiBbZHJvcGRvd25SZWZlcmVuY2VdPVwibG9nZ2VkVXNlclJlZigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJsb2dnZWRVc2VyT3B0aW9ucygpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiIChzZWxlY3RlZEl0ZW0pPVwic2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW4gPSAkZXZlbnRcIiBhcnJvd1R5cGU9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoISFjb25maWcoKS5zaG93U2VhcmNoQmFyICYmICEhdXNlckluZm8oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlXCIgW2NsYXNzLnNob3ddPVwiaXNTaWRlYmFyTW9iaWxlT3BlbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiIFtjbGFzcy53LTEwMF09XCJjb25maWcoKS5zaG91bGRVc2VGdWxsU2VhcmNoQmFyXCI+XG4gICAgICAgICAgICAgICAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgbm92YWxpZGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtaWNvbi1hZGRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwic2VhcmNoXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cInt7J1VwRGV2cy5IZWFkZXIuU2VhcmNoJyB8IHRyYW5zbG9jb319Li4uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sYXlvdXQvc3JjL3BhcnRpYWxzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xheW91dC9zcmMvcGFydGlhbHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULGlCQUFpQixFQUNqQixXQUFXLEVBRVgsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsRUFBRSxLQUFLLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQXFCLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7QUFVdkQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsYUFBYTtJQU5sRDs7UUFXSSx3QkFBbUIsR0FBRyxTQUFTLENBQUMscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RSxxQkFBZ0IsR0FBRyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUN2RSxrQkFBYSxHQUFHLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENB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LEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQzs4R0E3SVEsZUFBZTtrR0FBZixlQUFlLGdWQUt1QyxVQUFVLCtIQUNoQixVQUFVLHlIQUNoQixVQUFVLG9FQ2xDakUsOHNQQTRIQTs7MkZEakdhLGVBQWU7a0JBTjNCLFNBQVM7K0JBQ0ksWUFBWSxpQkFHUCxpQkFBaUIsQ0FBQyxJQUFJOzhCQUdYLE9BQU87c0JBQWhDLFdBQVc7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIE9uSW5pdCxcbiAgICBpbmplY3QsXG4gICAgY29tcHV0ZWQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmLCBpbnB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYmxlckljb25zVHlwZSB9IGZyb20gJ0B1cGRldnMvaWNvbnMnO1xuaW1wb3J0IHsgVGV4dFNlcnZpY2UgfSBmcm9tICdAdXBkZXZzL3Nkayc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBMYXlvdXRTZXJ2aWNlLCBQcmVmZXJlbmNlc1N0b3JhZ2UsIFVwZENvcmVMYXlvdXRDb25maWdTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsvbGF5b3V0JztcbmltcG9ydCB7IERyb3Bkb3duSXRlbSB9IGZyb20gJ0B1cGRldnMvY29tcG9uZW50cy9kcm9wZG93bic7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQGpzdmVyc2UvdHJhbnNsb2NvJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbk1vZGVsLCBOb3RpZmljYXRpb25zU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL25vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgU2VjdXJpdHlTdG9yYWdlIH0gZnJvbSAnQHVwZGV2cy9zZGsvc2VjdXJpdHknO1xuXG5pbXBvcnQgeyBIZWFkZXJTdHlsZVR5cGUgfSBmcm9tICcuL2hlYWRlci1zdHlsZS50eXBlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd1cGQtaGVhZGVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9oZWFkZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEhlYWRlckNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MnKSBnZXQgY2xhc3NlcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVyQ2xhc3NlcygpO1xuICAgIH1cblxuICAgIGxhbmd1YWdlU3dpdGNoZXJSZWYgPSB2aWV3Q2hpbGQoJ2xhbmd1YWdlU3dpdGNoZXJCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgbm90aWZpY2F0aW9uc1JlZiA9IHZpZXdDaGlsZCgnbm90aWZpY2F0aW9uc0J0bicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBsb2dnZWRVc2VyUmVmID0gdmlld0NoaWxkKCdsb2dnZWRVc2VyQnRuJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG4gICAgaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgaXNMb2dnZWRVc2VyRHJvcGRvd25PcGVuID0gZmFsc2U7XG5cbiAgICByZWFkb25seSBzdHlsZSA9IGlucHV0PEhlYWRlclN0eWxlVHlwZT4oJ2xpZ2h0Jyk7XG4gICAgcmVhZG9ubHkgbmV4dFRoZW1lSWNvbiA9IGNvbXB1dGVkPFRhYmxlckljb25zVHlwZT4oKCkgPT4gdGhpcy5jdXJyZW50UHJlZmVyZW5jZXMoKT8uaXNEYXJrVGhlbWUgPyAnc3VuJyA6ICdtb29uLXN0YXJzJyk7XG4gICAgcmVhZG9ubHkgY3VycmVudE5vdGlmaWNhdGlvbnNJY29uID0gY29tcHV0ZWQ8VGFibGVySWNvbnNUeXBlPigoKSA9PiB0aGlzLmhhc05ld05vdGlmaWNhdGlvbnMoKSA/ICdiZWxsLXJpbmdpbmcnIDogJ2JlbGwnKTtcbiAgICByZWFkb25seSBoYXNOZXdOb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpLnNvbWUobiA9PiAhbi5kYXRlUmVhZCkpO1xuICAgIHJlYWRvbmx5IHVzZXJJbmZvID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWN1cml0eVN0b3JhZ2UuZ2V0VXNlckluZm8oKSk7XG4gICAgcmVhZG9ubHkgdGV4dFNlcnZpY2UgPSBpbmplY3QoVGV4dFNlcnZpY2UpO1xuICAgIHJlYWRvbmx5IGlzU2lkZWJhck1vYmlsZU9wZW4gPSBzaWduYWwoZmFsc2UpO1xuICAgIHJlYWRvbmx5IHNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4gISF0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5zaG91bGRCbGlua0lmTmV3Tm90aWZpY2F0aW9ucyk7XG4gICAgcmVhZG9ubHkgbGFuZ3VhZ2VzT3B0aW9ucyA9IGNvbXB1dGVkPERyb3Bkb3duSXRlbVtdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbExhbmd1YWdlc09wdGlvbnM6IERyb3Bkb3duSXRlbVtdID0gW107XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZUxhbmd1YWdlcyA9ICh0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5hdmFpbGFibGVMYW5ndWFnZXMgfHwge30pO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGF2YWlsYWJsZUxhbmd1YWdlcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgYWxsTGFuZ3VhZ2VzT3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDoga2V5LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICB0ZXh0OiBhdmFpbGFibGVMYW5ndWFnZXNba2V5XSxcbiAgICAgICAgICAgICAgICBpc0FjdGl2ZTogdGhpcy5jdXJyZW50TGFuZ3VhZ2VLZXkoKSA9PT0ga2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFsbExhbmd1YWdlc09wdGlvbnM7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgbG9nZ2VkVXNlck9wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bkl0ZW1bXT4oKCkgPT4ge1xuICAgICAgICBjb25zdCB1c2VyQWN0aW9uczogRHJvcGRvd25JdGVtW10gPSBbXTtcblxuICAgICAgICB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5sb2dnZWRVc2VyTWVudUFjdGlvbnMuZm9yRWFjaChhY3QgPT4gdXNlckFjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBpZDogYWN0LmlkISgpLFxuICAgICAgICAgICAgdGV4dDogYWN0LnRleHQhKCksXG4gICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICBpY29uOiBhY3QuaWNvbk1vZGVsPy4oKVxuICAgICAgICB9KSk7XG5cbiAgICAgICAgcmV0dXJuIHVzZXJBY3Rpb25zO1xuICAgIH0pO1xuICAgIHJlYWRvbmx5IHVzZXJJZGVudGlmaWNhdGlvbiA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgICEhdGhpcy51c2VySW5mbygpID8gdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcuZ2V0VXNlck5hbWUodGhpcy51c2VySW5mbygpISkgOiAnJ1xuICAgICk7XG4gICAgcmVhZG9ubHkgdXNlckRlc2NyaXB0aW9uID0gY29tcHV0ZWQoKCkgPT5cbiAgICAgICAgISF0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5nZXRVc2VyRGVzY3JpcHRpb25cbiAgICAgICAgICAgID8gdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcuZ2V0VXNlckRlc2NyaXB0aW9uKHRoaXMudXNlckluZm8oKSEpXG4gICAgICAgICAgICA6ICcnXG4gICAgKTtcbiAgICByZWFkb25seSBsYXRlc3ROb3RpZmljYXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB1bnJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gIW4uZGF0ZVJlYWQpXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYi5kYXRlUmVjZWl2ZWQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5jb3JlTGF5b3V0Q29uZmlnU2VydmljZS5jb25maWcubnVtYmVyT2ZMYXN0Tm90aWZpY2F0aW9uc0Rpc3BsYXllZCk7XG4gICAgICAgIGNvbnN0IHJlYWROb3RpZmljYXRpb25zID0gdGhpcy5jdXJyZW50Tm90aWZpY2F0aW9ucygpXG4gICAgICAgICAgICAuZmlsdGVyKG4gPT4gISFuLmRhdGVSZWFkKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGIuZGF0ZVJlY2VpdmVkKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmRhdGVSZWNlaXZlZCkuZ2V0VGltZSgpKVxuICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuY29yZUxheW91dENvbmZpZ1NlcnZpY2UuY29uZmlnLm51bWJlck9mTGFzdE5vdGlmaWNhdGlvbnNEaXNwbGF5ZWQpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAuLi51bnJlYWROb3RpZmljYXRpb25zLFxuICAgICAgICAgICAgLi4ucmVhZE5vdGlmaWNhdGlvbnNcbiAgICAgICAgXS5zbGljZSgwLCB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5udW1iZXJPZkxhc3ROb3RpZmljYXRpb25zRGlzcGxheWVkKTtcbiAgICB9KTtcbiAgICByZWFkb25seSB1c2VySW5pdGlhbHMgPSBjb21wdXRlZDxzdHJpbmc+KCgpID0+IHtcbiAgICAgICAgY29uc3QgZmlyc3RDaGFyID0gdGhpcy51c2VySWRlbnRpZmljYXRpb24oKS5jaGFyQXQoMCk7XG4gICAgICAgIGNvbnN0IGxhc3RTcGFjZUluZGV4ID0gdGhpcy51c2VySWRlbnRpZmljYXRpb24oKS5sYXN0SW5kZXhPZignICcpO1xuICAgICAgICBjb25zdCBmaXJzdEFmdGVyTGFzdFNwYWNlID0gbGFzdFNwYWNlSW5kZXggIT09IC0xID8gdGhpcy51c2VySWRlbnRpZmljYXRpb24oKS5jaGFyQXQobGFzdFNwYWNlSW5kZXggKyAxKSA6ICcnO1xuXG4gICAgICAgIHJldHVybiBgJHtmaXJzdENoYXJ9JHtmaXJzdEFmdGVyTGFzdFNwYWNlfWA7XG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlY3VyaXR5U3RvcmFnZSA9IGluamVjdChTZWN1cml0eVN0b3JhZ2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29yZUxheW91dENvbmZpZ1NlcnZpY2UgPSBpbmplY3QoVXBkQ29yZUxheW91dENvbmZpZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0U2VydmljZSA9IGluamVjdChMYXlvdXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jb1NlcnZpY2UgPSBpbmplY3QoVHJhbnNsb2NvU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVmZXJlbmNlc1N0b3JhZ2UgPSBpbmplY3QoUHJlZmVyZW5jZXNTdG9yYWdlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KE5vdGlmaWNhdGlvbnNTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRQcmVmZXJlbmNlcyA9IHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLmdldFByZWZlcmVuY2VzKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50Tm90aWZpY2F0aW9ucyA9IHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2Uubm90aWZpY2F0aW9ucztcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5ndWFnZUtleSA9IHNpZ25hbCgnJyk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB3cmFwcGVyQ2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IGBuYXZiYXIgbmF2YmFyLWV4cGFuZC1tZCBkLW5vbmUgZC1sZy1mbGV4IGQtcHJpbnQtbm9uZSBuYXZiYXItJHt0aGlzLnN0eWxlKCl9YCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZ1xuICAgIHJlYWRvbmx5IGNvbmZpZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMubGF5b3V0U2VydmljZS5tYWluSGVhZGVyQ29uZmlnKCkpO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmlzRGFya1RoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uuc2V0RGFya01vZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIXRoaXMuY3VycmVudFByZWZlcmVuY2VzKCk/LmN1cnJlbnRMYW5ndWFnZUNvZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLmN1cnJlbnRQcmVmZXJlbmNlcygpIS5jdXJyZW50TGFuZ3VhZ2VDb2RlITtcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VLZXkuc2V0KGNvZGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2hUaGVtZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLnRvZ2dsZURhcmtNb2RlKCk7XG4gICAgfVxuXG4gICAgc3dpdGNoTGFuZ3VhZ2UoaXRlbTogRHJvcGRvd25JdGVtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlS2V5LnNldChpdGVtLmlkKTtcbiAgICAgICAgdGhpcy50cmFuc2xvY29TZXJ2aWNlLnNldEFjdGl2ZUxhbmcoaXRlbS5pZCk7XG4gICAgICAgIHRoaXMucHJlZmVyZW5jZXNTdG9yYWdlLnNhdmVQcmVmZXJlbmNlcyh7IC4uLnRoaXMuY3VycmVudFByZWZlcmVuY2VzKCksIGN1cnJlbnRMYW5ndWFnZUNvZGU6IGl0ZW0uaWQgfSk7XG4gICAgICAgIHRoaXMubGF5b3V0U2VydmljZS5ub3RpZnlVc2VyQ2hhbmdlZExhbmd1YWdlKGl0ZW0uaWQpO1xuXG4gICAgICAgIHRoaXMuaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgc2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKGl0ZW06IERyb3Bkb3duSXRlbSk6IHZvaWQge1xuICAgICAgICBjb25zdCBidG4gPSB0aGlzLmNvcmVMYXlvdXRDb25maWdTZXJ2aWNlLmNvbmZpZy5sb2dnZWRVc2VyTWVudUFjdGlvbnMuZmluZChiID0+IGIuaWQhKCkgPT09IGl0ZW0uaWQpO1xuXG4gICAgICAgIGlmICghIWJ0bj8uY2xpY2tGdW5jdGlvbikge1xuICAgICAgICAgICAgYnRuLmNsaWNrRnVuY3Rpb24hKHsgZGF0YTogdGhpcy51c2VySW5mbygpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghbm90aWZpY2F0aW9uLmRhdGVSZWFkKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnNTZXJ2aWNlLm1hcmtBc1JlYWQobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UuY2xpY2tPbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgIH1cblxuICAgIHJlbW92ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uc1NlcnZpY2UucmVtb3ZlTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xuICAgIH1cblxuICAgIHRvZ2dsZVNpZGViYXJPbk1vYmlsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1NpZGViYXJNb2JpbGVPcGVuLnNldCghdGhpcy5pc1NpZGViYXJNb2JpbGVPcGVuKCkpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXIteGxcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZVNpZGViYXJPbk1vYmlsZSgpXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc1NpZGViYXJNb2JpbGVPcGVuKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJuYXZiYXItdG9nZ2xlci1pY29uXCI+PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXYgY2xhc3M9XCJuYXZiYXItbmF2IGZsZXgtcm93IG9yZGVyLW1kLWxhc3RcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLW1kLWZsZXggbWUtM1wiPlxuICAgICAgICAgICAgQGlmICghIWNvbmZpZygpLnNob3dUaGVtZVN3aXRjaGVyKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtbGluayBbaXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJbJ3B4LTAnXVwiIChjbGlja2VkKT1cInN3aXRjaFRoZW1lKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCJuZXh0VGhlbWVJY29uKClcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmICghIWNvbmZpZygpLnNob3dMYW5ndWFnZVN3aXRjaGVyICYmIGxhbmd1YWdlc09wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5hdi1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtbGluayBbaXNOYXZpZ2F0aW9uXT1cInRydWVcIiBbY3VzdG9tQ2xhc3Nlc109XCJbJ3B4LTAnXVwiIChjbGlja2VkKT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3Blbj10cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjbGFuZ3VhZ2VTd2l0Y2hlckJ0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwibGFuZ3VhZ2VcIj48L3VwZC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWRyb3Bkb3duIHdyYXBwZXJDbGFzc2VzPVwibXQtMVwiIFtpc09wZW5dPVwiaXNMYW5ndWFnZVN3aXRjaGVyRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93blJlZmVyZW5jZV09XCJsYW5ndWFnZVN3aXRjaGVyUmVmKClcIiBbaXRlbXNdPVwibGFuZ3VhZ2VzT3B0aW9ucygpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cImlzTGFuZ3VhZ2VTd2l0Y2hlckRyb3Bkb3duT3BlbiA9ICRldmVudFwiIChzZWxlY3RlZEl0ZW0pPVwic3dpdGNoTGFuZ3VhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93Tm90aWZpY2F0aW9ucyAmJiAhIXVzZXJJbmZvKCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd24gZC1ub25lIGQtbWQtZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc05vdGlmaWNhdGlvbnNEcm9wZG93bk9wZW4gPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAjbm90aWZpY2F0aW9uc0J0bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiBbdGFibGVySWNvbl09XCJjdXJyZW50Tm90aWZpY2F0aW9uc0ljb24oKVwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGhhc05ld05vdGlmaWNhdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctcmVkXCIgW2NsYXNzLmJhZGdlLWJsaW5rXT1cInNob3VsZEJsaW5rSWZOZXdOb3RpZmljYXRpb25zKClcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvdXBkLWxpbms+XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtZHJvcGRvd24gd3JhcHBlckNsYXNzZXM9XCJtdC0xIGRyb3Bkb3duLW1lbnUtY2FyZFwiIFtpc09wZW5dPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93blJlZmVyZW5jZV09XCJub3RpZmljYXRpb25zUmVmKClcIiBbc2hvdWxkQ2xvc2VPbk91dHNpZGVDbGlja109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpc09wZW5DaGFuZ2UpPVwiaXNOb3RpZmljYXRpb25zRHJvcGRvd25PcGVuID0gJGV2ZW50XCIgW21pbldpZHRoXT1cIjQwMFwiIGFycm93VHlwZT1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3sgJ1VwRGV2cy5Ob3RpZmljYXRpb25DZW50ZXIuVGl0bGUnIHwgdHJhbnNsb2NvIH19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChub3RpZmljYXRpb24gb2YgbGF0ZXN0Tm90aWZpY2F0aW9ucygpOyB0cmFjayBub3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaCBsaXN0LWdyb3VwLWhvdmVyYWJsZVwiIChjbGljayk9XCJyZWFkTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFub3RpZmljYXRpb24uZGF0ZVJlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1kb3QgZC1ibG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWRvdCBzdGF0dXMtZG90LWFuaW1hdGVkIGJnLXByaW1hcnkgZC1ibG9ja1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgdGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGNsYXNzPVwidGV4dC1ib2R5IGQtYmxvY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5mdy1ib2xkXT1cIiFub3RpZmljYXRpb24uZGF0ZVJlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0U2VydmljZS5nZXRUZXh0KG5vdGlmaWNhdGlvbi50aXRsZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISFub3RpZmljYXRpb24uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1ibG9jayB0ZXh0LXNlY29uZGFyeSB0ZXh0LXRydW5jYXRlIG10LW4xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHRleHRTZXJ2aWNlLmdldFRleHQobm90aWZpY2F0aW9uLmRlc2NyaXB0aW9uKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2N1c3RvbUNsYXNzZXNdPVwiWydsaXN0LWdyb3VwLWl0ZW0tYWN0aW9ucyddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJyZW1vdmVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwieFwiPjwvdXBkLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbXB0eSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwidGV4dC1ib2R5LXRlcnRpYXJ5XCI+e3sgJ1VwRGV2cy5Ob3RpZmljYXRpb25DZW50ZXIuTm9Ob3RpZmljYXRpb25zJyB8IHRyYW5zbG9jbyB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoISFjb25maWcoKS5zaG93VXNlck1lbnUgJiYgISF1c2VySW5mbygpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWl0ZW0gZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICA8dXBkLWxpbmsgW2lzTmF2aWdhdGlvbl09XCJ0cnVlXCIgW2N1c3RvbUNsYXNzZXNdPVwiWydweC0wJ11cIiAoY2xpY2tlZCk9XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW4gPSB0cnVlXCIgI2xvZ2dlZFVzZXJCdG4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoISF1c2VySW5mbygpIS5hdmF0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyIGF2YXRhci1zbVwiIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKHt7dXNlckluZm8oKT8uYXZhdGFyfX0pXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyIGF2YXRhci1zbVwiPnt7IHVzZXJJbml0aWFscygpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtbm9uZSBkLXhsLWJsb2NrIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgdXNlcklkZW50aWZpY2F0aW9uKCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoISF1c2VyRGVzY3JpcHRpb24oKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIHNtYWxsIHRleHQtbXV0ZWRcIj57eyB1c2VyRGVzY3JpcHRpb24oKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3VwZC1saW5rPlxuICAgICAgICAgICAgICAgIEBpZiAobG9nZ2VkVXNlck9wdGlvbnMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIDx1cGQtZHJvcGRvd24gd3JhcHBlckNsYXNzZXM9XCJtdC0xXCIgW2lzT3Blbl09XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW5cIiBbZHJvcGRvd25SZWZlcmVuY2VdPVwibG9nZ2VkVXNlclJlZigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJsb2dnZWRVc2VyT3B0aW9ucygpXCIgW3Nob3VsZENsb3NlT25PdXRzaWRlQ2xpY2tdPVwidHJ1ZVwiIChzZWxlY3RlZEl0ZW0pPVwic2VsZWN0TG9nZ2VkVXNlck1lbnVJdGVtKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJpc0xvZ2dlZFVzZXJEcm9wZG93bk9wZW4gPSAkZXZlbnRcIiBhcnJvd1R5cGU9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICA8L3VwZC1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIEBpZiAoISFjb25maWcoKS5zaG93U2VhcmNoQmFyICYmICEhdXNlckluZm8oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UgbmF2YmFyLWNvbGxhcHNlXCIgW2NsYXNzLnNob3ddPVwiaXNTaWRlYmFyTW9iaWxlT3BlbigpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWUtMlwiIFtjbGFzcy53LTEwMF09XCJjb25maWcoKS5zaG91bGRVc2VGdWxsU2VhcmNoQmFyXCI+XG4gICAgICAgICAgICAgICAgPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgbm92YWxpZGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtaWNvbi1hZGRvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cGQtaWNvbiB0YWJsZXJJY29uPVwic2VhcmNoXCI+PC91cGQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHZhbHVlPVwiXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cInt7J1VwRGV2cy5IZWFkZXIuU2VhcmNoJyB8IHRyYW5zbG9jb319Li4uXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
@@ -41,6 +41,7 @@ export class PopoverDirective {
41
41
  initPopover() {
42
42
  this.setupPopover();
43
43
  this.popoverComponentRef.instance.setVisible(true);
44
+ this.popoverComponentRef.changeDetectorRef.detectChanges();
44
45
  this.ngZone.runOutsideAngular(() => this.positioningService
45
46
  .computePosition(this.elementRef, this.popoverComponentRef.location, { placement: this.placement })
46
47
  .subscribe(resp => this.updatePosition(resp)));
@@ -61,34 +62,35 @@ export class PopoverDirective {
61
62
  }
62
63
  updatePosition(result) {
63
64
  const nativeElement = this.popoverComponentRef.location.nativeElement;
64
- // arrowElement needs some time for the popover to be displayed.
65
- setTimeout(() => {
66
- const arrowElement = this.popoverComponentRef.location.nativeElement.querySelector('.popover-arrow');
67
- const popoverBox = nativeElement.getBoundingClientRect();
68
- const arrowBox = arrowElement.getBoundingClientRect();
69
- switch (this.placement) {
70
- case 'top':
71
- this.renderer.setStyle(nativeElement, 'top', `${result.y - arrowBox.height}px`);
72
- this.renderer.setStyle(nativeElement, 'left', `${result.x}px`);
73
- this.renderer.setStyle(arrowElement, 'left', `${(popoverBox.width / 2) - (arrowBox.width / 2)}px`);
74
- break;
75
- case 'bottom':
76
- this.renderer.setStyle(nativeElement, 'top', `${result.y + arrowBox.height}px`);
77
- this.renderer.setStyle(nativeElement, 'left', `${result.x}px`);
78
- this.renderer.setStyle(arrowElement, 'left', `${(popoverBox.width / 2) - (arrowBox.width / 2)}px`);
79
- break;
80
- case 'left':
81
- this.renderer.setStyle(nativeElement, 'top', `${result.y}px`);
82
- this.renderer.setStyle(nativeElement, 'left', `${result.x - arrowBox.width}px`);
83
- this.renderer.setStyle(arrowElement, 'top', `${(popoverBox.height / 2) - (arrowBox.height / 2)}px`);
84
- break;
85
- case 'right':
86
- this.renderer.setStyle(nativeElement, 'top', `${result.y}px`);
87
- this.renderer.setStyle(nativeElement, 'left', `${result.x + arrowBox.width}px`);
88
- this.renderer.setStyle(arrowElement, 'top', `${(popoverBox.height / 2) - (arrowBox.height / 2)}px`);
89
- break;
90
- }
91
- }, 10);
65
+ const arrowElement = this.popoverComponentRef.location.nativeElement.querySelector('.popover-arrow');
66
+ if (!arrowElement) {
67
+ console.warn('Popover arrow element not found. Positioning may be incorrect.');
68
+ return;
69
+ }
70
+ const popoverBox = nativeElement.getBoundingClientRect();
71
+ const arrowBox = arrowElement.getBoundingClientRect();
72
+ switch (this.placement) {
73
+ case 'top':
74
+ this.renderer.setStyle(nativeElement, 'top', `${result.y - arrowBox.height}px`);
75
+ this.renderer.setStyle(nativeElement, 'left', `${result.x}px`);
76
+ this.renderer.setStyle(arrowElement, 'left', `${(popoverBox.width / 2) - (arrowBox.width / 2)}px`);
77
+ break;
78
+ case 'bottom':
79
+ this.renderer.setStyle(nativeElement, 'top', `${result.y + arrowBox.height}px`);
80
+ this.renderer.setStyle(nativeElement, 'left', `${result.x}px`);
81
+ this.renderer.setStyle(arrowElement, 'left', `${(popoverBox.width / 2) - (arrowBox.width / 2)}px`);
82
+ break;
83
+ case 'left':
84
+ this.renderer.setStyle(nativeElement, 'top', `${result.y}px`);
85
+ this.renderer.setStyle(nativeElement, 'left', `${result.x - arrowBox.width}px`);
86
+ this.renderer.setStyle(arrowElement, 'top', `${(popoverBox.height / 2) - (arrowBox.height / 2)}px`);
87
+ break;
88
+ case 'right':
89
+ this.renderer.setStyle(nativeElement, 'top', `${result.y}px`);
90
+ this.renderer.setStyle(nativeElement, 'left', `${result.x + arrowBox.width}px`);
91
+ this.renderer.setStyle(arrowElement, 'top', `${(popoverBox.height / 2) - (arrowBox.height / 2)}px`);
92
+ break;
93
+ }
92
94
  }
93
95
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: PopoverDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
94
96
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.0", type: PopoverDirective, selector: "[updPopover]", inputs: { text: ["updPopover", "text"], title: ["updPopoverTitle", "title"], popoverTitleTemplate: ["updPopoverTitleTemplate", "popoverTitleTemplate"], popoverTemplate: ["updPopoverTemplate", "popoverTemplate"], placement: ["updPopoverPlacement", "placement"], customClasses: ["updPopoverCustomClasses", "customClasses"], actAsTooltip: ["updPopoverActAsTooltip", "actAsTooltip"] }, host: { listeners: { "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "click": "onClick()" } }, ngImport: i0 }); }
@@ -129,4 +131,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
129
131
  type: HostListener,
130
132
  args: ['click']
131
133
  }] } });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcG9wb3Zlci9zcmMvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixNQUFNLEVBRU4sWUFBWSxFQUFFLE1BQU0sRUFDdkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUF5Qiw2QkFBNkIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUt2RCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBUWtDLGNBQVMsR0FBMkIsS0FBSyxDQUFDO1FBRXhFOzs7V0FHRztRQUM4QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUlyQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELGtDQUE2QixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0tBdUYxRjtJQXBGRyxZQUFZO1FBQ1IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lB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QUMscUJBQXFCO2dCQUNNLGFBQWE7c0JBQTlDLEtBQUs7dUJBQUMseUJBQXlCO2dCQUtDLFlBQVk7c0JBQTVDLEtBQUs7dUJBQUMsd0JBQXdCO2dCQWEvQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWTtnQkFRMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFlBQVk7Z0JBUTFCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgSW5wdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NvbnRhaW5lclJlZixcbiAgICBSZW5kZXJlcjIsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3RvcixcbiAgICBOZ1pvbmUsXG4gICAgQ29tcG9uZW50UmVmLFxuICAgIEhvc3RMaXN0ZW5lciwgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9wQm90dG9tTGVmdFJpZ2h0VHlwZSB9IGZyb20gJ0B1cGRldnMvc2RrL3R5cGVzJztcbmltcG9ydCB7IFBvc2l0aW9uaW5nU2VydmljZSwgQ29tcHV0ZVBvc2l0aW9uUmVzdWx0LCBEeW5hbWljQ29tcG9uZW50TG9hZGVyU2VydmljZSB9IGZyb20gJ0B1cGRldnMvc2RrL2xheW91dCc7XG5cbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuL3BvcG92ZXIuY29tcG9uZW50JztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdXBkUG9wb3Zlcl0nXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJEaXJlY3RpdmUge1xuICAgIEBJbnB1dCgndXBkUG9wb3ZlcicpIHRleHQ/OiBzdHJpbmc7XG4gICAgQElucHV0KCd1cGRQb3BvdmVyVGl0bGUnKSB0aXRsZT86IHN0cmluZztcbiAgICBASW5wdXQoJ3VwZFBvcG92ZXJUaXRsZVRlbXBsYXRlJykgcG9wb3ZlclRpdGxlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBJbnB1dCgndXBkUG9wb3ZlclRlbXBsYXRlJykgcG9wb3ZlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBASW5wdXQoJ3VwZFBvcG92ZXJQbGFjZW1lbnQnKSBwbGFjZW1lbnQ6IFRvcEJvdHRvbUxlZnRSaWdodFR5cGUgPSAndG9wJztcbiAgICBASW5wdXQoJ3VwZFBvcG92ZXJDdXN0b21DbGFzc2VzJykgY3VzdG9tQ2xhc3Nlcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIG1ha2VzIHRoZSBwb3BvdmVyIGJlaGF2ZSBsaWtlIGEgdG9vbHRpcC5cbiAgICAgKiBJdCBtZWFucyBpdCdsbCBzaG93L2hpZGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG1vdXNlIGlzIG92ZXIgb3Igbm90IHRoZSBlbGVtZW50LlxuICAgICAqL1xuICAgIEBJbnB1dCgndXBkUG9wb3ZlckFjdEFzVG9vbHRpcCcpIGFjdEFzVG9vbHRpcCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBwb3BvdmVyQ29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPFBvcG92ZXJDb21wb25lbnQ+O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvc2l0aW9uaW5nU2VydmljZSA9IGluamVjdChQb3NpdGlvbmluZ1NlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbXBvbmVudExvYWRlclNlcnZpY2UgPSBpbmplY3QoRHluYW1pY0NvbXBvbmVudExvYWRlclNlcnZpY2UpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicpXG4gICAgb25Nb3VzZUVudGVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RBc1Rvb2x0aXApIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFBvcG92ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIG9uTW91c2VMZWF2ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0QXNUb29sdGlwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VQb3BvdmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gICAgb25DbGljaygpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmFjdEFzVG9vbHRpcCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZj8uaW5zdGFuY2UuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlUG9wb3ZlcigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQb3BvdmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRQb3BvdmVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldHVwUG9wb3ZlcigpO1xuICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYhLmluc3RhbmNlLnNldFZpc2libGUodHJ1ZSk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uaW5nU2VydmljZVxuICAgICAgICAgICAgICAgIC5jb21wdXRlUG9zaXRpb24odGhpcy5lbGVtZW50UmVmLCB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYhLmxvY2F0aW9uLCB7IHBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQgfSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4gdGhpcy51cGRhdGVQb3NpdGlvbihyZXNwKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3Bvc2VQb3BvdmVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5pbnN0YW5jZS5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwUG9wb3ZlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50TG9hZGVyU2VydmljZS5sb2FkKFBvcG92ZXJDb21wb25lbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgdGhpcy5pbmplY3Rvcik7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2UudGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYhLmluc3RhbmNlLnRleHQgPSB0aGlzLnRleHQ7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2UudGl0bGVUZW1wbGF0ZSA9IHRoaXMucG9wb3ZlclRpdGxlVGVtcGxhdGU7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2UudGVtcGxhdGUgPSB0aGlzLnBvcG92ZXJUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5pbnN0YW5jZS5wbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudDtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5pbnN0YW5jZS5jdXN0b21DbGFzc2VzID0gdGhpcy5jdXN0b21DbGFzc2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUG9zaXRpb24ocmVzdWx0OiBDb21wdXRlUG9zaXRpb25SZXN1bHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyBhcnJvd0VsZW1lbnQgbmVlZHMgc29tZSB0aW1lIGZvciB0aGUgcG9wb3ZlciB0byBiZSBkaXNwbGF5ZWQuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJyb3dFbGVtZW50ID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLWFycm93Jyk7XG4gICAgICAgICAgICBjb25zdCBwb3BvdmVyQm94ID0gbmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGFycm93Qm94ID0gYXJyb3dFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAndG9wJywgYCR7cmVzdWx0LnkgLSBhcnJvd0JveC5oZWlnaHR9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAke3Jlc3VsdC54fXB4YCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoYXJyb3dFbGVtZW50LCAnbGVmdCcsIGAkeyhwb3BvdmVyQm94LndpZHRoIC8gMikgLSAoYXJyb3dCb3gud2lkdGggLyAyKX1weGApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICd0b3AnLCBgJHtyZXN1bHQueSArIGFycm93Qm94LmhlaWdodH1weGApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7cmVzdWx0Lnh9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShhcnJvd0VsZW1lbnQsICdsZWZ0JywgYCR7KHBvcG92ZXJCb3gud2lkdGggLyAyKSAtIChhcnJvd0JveC53aWR0aCAvIDIpfXB4YCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICd0b3AnLCBgJHtyZXN1bHQueX1weGApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7cmVzdWx0LnggLSBhcnJvd0JveC53aWR0aH1weGApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGFycm93RWxlbWVudCwgJ3RvcCcsIGAkeyhwb3BvdmVyQm94LmhlaWdodCAvIDIpIC0gKGFycm93Qm94LmhlaWdodCAvIDIpfXB4YCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAndG9wJywgYCR7cmVzdWx0Lnl9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAke3Jlc3VsdC54ICsgYXJyb3dCb3gud2lkdGh9cHhgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShhcnJvd0VsZW1lbnQsICd0b3AnLCBgJHsocG9wb3ZlckJveC5oZWlnaHQgLyAyKSAtIChhcnJvd0JveC5oZWlnaHQgLyAyKX1weGApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTApO1xuICAgIH1cbn1cbiJdfQ==
134
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvcG9wb3Zlci9zcmMvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFFBQVEsRUFDUixNQUFNLEVBRU4sWUFBWSxFQUFFLE1BQU0sRUFDdkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGtCQUFrQixFQUF5Qiw2QkFBNkIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUt2RCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBUWtDLGNBQVMsR0FBMkIsS0FBSyxDQUFDO1FBRXhFOzs7V0FHRztRQUM4QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUlyQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0IscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUMsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELGtDQUE2QixHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0tBMEYxRjtJQXZGRyxZQUFZO1FBQ1IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lB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Szt1QkFBQyx5QkFBeUI7Z0JBQ0gsZUFBZTtzQkFBM0MsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBQ0csU0FBUztzQkFBdEMsS0FBSzt1QkFBQyxxQkFBcUI7Z0JBQ00sYUFBYTtzQkFBOUMsS0FBSzt1QkFBQyx5QkFBeUI7Z0JBS0MsWUFBWTtzQkFBNUMsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBYS9CLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxZQUFZO2dCQVExQixZQUFZO3NCQURYLFlBQVk7dUJBQUMsWUFBWTtnQkFRMUIsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBJbnB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFJlbmRlcmVyMixcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdG9yLFxuICAgIE5nWm9uZSxcbiAgICBDb21wb25lbnRSZWYsXG4gICAgSG9zdExpc3RlbmVyLCBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUb3BCb3R0b21MZWZ0UmlnaHRUeXBlIH0gZnJvbSAnQHVwZGV2cy9zZGsvdHlwZXMnO1xuaW1wb3J0IHsgUG9zaXRpb25pbmdTZXJ2aWNlLCBDb21wdXRlUG9zaXRpb25SZXN1bHQsIER5bmFtaWNDb21wb25lbnRMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnQHVwZGV2cy9zZGsvbGF5b3V0JztcblxuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4vcG9wb3Zlci5jb21wb25lbnQnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1t1cGRQb3BvdmVyXSdcbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckRpcmVjdGl2ZSB7XG4gICAgQElucHV0KCd1cGRQb3BvdmVyJykgdGV4dD86IHN0cmluZztcbiAgICBASW5wdXQoJ3VwZFBvcG92ZXJUaXRsZScpIHRpdGxlPzogc3RyaW5nO1xuICAgIEBJbnB1dCgndXBkUG9wb3ZlclRpdGxlVGVtcGxhdGUnKSBwb3BvdmVyVGl0bGVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCd1cGRQb3BvdmVyVGVtcGxhdGUnKSBwb3BvdmVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBJbnB1dCgndXBkUG9wb3ZlclBsYWNlbWVudCcpIHBsYWNlbWVudDogVG9wQm90dG9tTGVmdFJpZ2h0VHlwZSA9ICd0b3AnO1xuICAgIEBJbnB1dCgndXBkUG9wb3ZlckN1c3RvbUNsYXNzZXMnKSBjdXN0b21DbGFzc2VzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgbWFrZXMgdGhlIHBvcG92ZXIgYmVoYXZlIGxpa2UgYSB0b29sdGlwLlxuICAgICAqIEl0IG1lYW5zIGl0J2xsIHNob3cvaGlkZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbW91c2UgaXMgb3ZlciBvciBub3QgdGhlIGVsZW1lbnQuXG4gICAgICovXG4gICAgQElucHV0KCd1cGRQb3BvdmVyQWN0QXNUb29sdGlwJykgYWN0QXNUb29sdGlwID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHBvcG92ZXJDb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8UG9wb3ZlckNvbXBvbmVudD47XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZiA9IGluamVjdChWaWV3Q29udGFpbmVyUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZSA9IGluamVjdChOZ1pvbmUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9zaXRpb25pbmdTZXJ2aWNlID0gaW5qZWN0KFBvc2l0aW9uaW5nU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljQ29tcG9uZW50TG9hZGVyU2VydmljZSA9IGluamVjdChEeW5hbWljQ29tcG9uZW50TG9hZGVyU2VydmljZSk7XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgICBvbk1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFjdEFzVG9vbHRpcCkge1xuICAgICAgICAgICAgdGhpcy5pbml0UG9wb3ZlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScpXG4gICAgb25Nb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3RBc1Rvb2x0aXApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVBvcG92ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJylcbiAgICBvbkNsaWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYWN0QXNUb29sdGlwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmPy5pbnN0YW5jZS5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2VQb3BvdmVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBvcG92ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBvcG92ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0dXBQb3BvdmVyKCk7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2Uuc2V0VmlzaWJsZSh0cnVlKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uaW5nU2VydmljZVxuICAgICAgICAgICAgICAgIC5jb21wdXRlUG9zaXRpb24odGhpcy5lbGVtZW50UmVmLCB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYhLmxvY2F0aW9uLCB7IHBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQgfSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3AgPT4gdGhpcy51cGRhdGVQb3NpdGlvbihyZXNwKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRpc3Bvc2VQb3BvdmVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5pbnN0YW5jZS5zZXRWaXNpYmxlKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwUG9wb3ZlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50TG9hZGVyU2VydmljZS5sb2FkKFBvcG92ZXJDb21wb25lbnQsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgdGhpcy5pbmplY3Rvcik7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2UudGl0bGUgPSB0aGlzLnRpdGxlO1xuICAgICAgICB0aGlzLnBvcG92ZXJDb21wb25lbnRSZWYhLmluc3RhbmNlLnRleHQgPSB0aGlzLnRleHQ7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2UudGl0bGVUZW1wbGF0ZSA9IHRoaXMucG9wb3ZlclRpdGxlVGVtcGxhdGU7XG4gICAgICAgIHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEuaW5zdGFuY2UudGVtcGxhdGUgPSB0aGlzLnBvcG92ZXJUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5pbnN0YW5jZS5wbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudDtcbiAgICAgICAgdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5pbnN0YW5jZS5jdXN0b21DbGFzc2VzID0gdGhpcy5jdXN0b21DbGFzc2VzO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlUG9zaXRpb24ocmVzdWx0OiBDb21wdXRlUG9zaXRpb25SZXN1bHQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMucG9wb3ZlckNvbXBvbmVudFJlZiEubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgYXJyb3dFbGVtZW50ID0gdGhpcy5wb3BvdmVyQ29tcG9uZW50UmVmIS5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wb3BvdmVyLWFycm93Jyk7XG5cbiAgICAgICAgaWYgKCFhcnJvd0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignUG9wb3ZlciBhcnJvdyBlbGVtZW50IG5vdCBmb3VuZC4gUG9zaXRpb25pbmcgbWF5IGJlIGluY29ycmVjdC4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcG92ZXJCb3ggPSBuYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBhcnJvd0JveCA9IGFycm93RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsIGAke3Jlc3VsdC55IC0gYXJyb3dCb3guaGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAke3Jlc3VsdC54fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShhcnJvd0VsZW1lbnQsICdsZWZ0JywgYCR7KHBvcG92ZXJCb3gud2lkdGggLyAyKSAtIChhcnJvd0JveC53aWR0aCAvIDIpfXB4YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsIGAke3Jlc3VsdC55ICsgYXJyb3dCb3guaGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAke3Jlc3VsdC54fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShhcnJvd0VsZW1lbnQsICdsZWZ0JywgYCR7KHBvcG92ZXJCb3gud2lkdGggLyAyKSAtIChhcnJvd0JveC53aWR0aCAvIDIpfXB4YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICd0b3AnLCBgJHtyZXN1bHQueX1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ2xlZnQnLCBgJHtyZXN1bHQueCAtIGFycm93Qm94LndpZHRofXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShhcnJvd0VsZW1lbnQsICd0b3AnLCBgJHsocG9wb3ZlckJveC5oZWlnaHQgLyAyKSAtIChhcnJvd0JveC5oZWlnaHQgLyAyKX1weGApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ3RvcCcsIGAke3Jlc3VsdC55fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShuYXRpdmVFbGVtZW50LCAnbGVmdCcsIGAke3Jlc3VsdC54ICsgYXJyb3dCb3gud2lkdGh9cHhgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGFycm93RWxlbWVudCwgJ3RvcCcsIGAkeyhwb3BvdmVyQm94LmhlaWdodCAvIDIpIC0gKGFycm93Qm94LmhlaWdodCAvIDIpfXB4YCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -130,6 +130,10 @@ class HeaderComponent extends BaseComponent {
130
130
  this.nextThemeIcon = computed(() => this.currentPreferences()?.isDarkTheme ? 'sun' : 'moon-stars');
131
131
  this.currentNotificationsIcon = computed(() => this.hasNewNotifications() ? 'bell-ringing' : 'bell');
132
132
  this.hasNewNotifications = computed(() => this.currentNotifications().some(n => !n.dateRead));
133
+ this.userInfo = computed(() => this.securityStorage.getUserInfo());
134
+ this.textService = inject(TextService);
135
+ this.isSidebarMobileOpen = signal(false);
136
+ this.shouldBlinkIfNewNotifications = computed(() => !!this.coreLayoutConfigService.config.shouldBlinkIfNewNotifications);
133
137
  this.languagesOptions = computed(() => {
134
138
  const allLanguagesOptions = [];
135
139
  const availableLanguages = (this.coreLayoutConfigService.config.availableLanguages || {});
@@ -153,12 +157,10 @@ class HeaderComponent extends BaseComponent {
153
157
  }));
154
158
  return userActions;
155
159
  });
156
- this.userInfo = computed(() => this.securityStorage.getUserInfo());
157
160
  this.userIdentification = computed(() => !!this.userInfo() ? this.coreLayoutConfigService.config.getUserName(this.userInfo()) : '');
158
161
  this.userDescription = computed(() => !!this.coreLayoutConfigService.config.getUserDescription
159
162
  ? this.coreLayoutConfigService.config.getUserDescription(this.userInfo())
160
163
  : '');
161
- this.shouldBlinkIfNewNotifications = computed(() => !!this.coreLayoutConfigService.config.shouldBlinkIfNewNotifications);
162
164
  this.latestNotifications = computed(() => {
163
165
  const unreadNotifications = this.currentNotifications()
164
166
  .filter(n => !n.dateRead)
@@ -173,8 +175,12 @@ class HeaderComponent extends BaseComponent {
173
175
  ...readNotifications
174
176
  ].slice(0, this.coreLayoutConfigService.config.numberOfLastNotificationsDisplayed);
175
177
  });
176
- this.textService = inject(TextService);
177
- this.isSidebarMobileOpen = signal(false);
178
+ this.userInitials = computed(() => {
179
+ const firstChar = this.userIdentification().charAt(0);
180
+ const lastSpaceIndex = this.userIdentification().lastIndexOf(' ');
181
+ const firstAfterLastSpace = lastSpaceIndex !== -1 ? this.userIdentification().charAt(lastSpaceIndex + 1) : '';
182
+ return `${firstChar}${firstAfterLastSpace}`;
183
+ });
178
184
  this.securityStorage = inject(SecurityStorage);
179
185
  this.coreLayoutConfigService = inject(UpdCoreLayoutConfigService);
180
186
  this.layoutService = inject(LayoutService);
@@ -230,11 +236,11 @@ class HeaderComponent extends BaseComponent {
230
236
  this.isSidebarMobileOpen.set(!this.isSidebarMobileOpen());
231
237
  }
232
238
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1$2.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i1$1.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
239
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: HeaderComponent, selector: "upd-header", inputs: { style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "languageSwitcherRef", first: true, predicate: ["languageSwitcherBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "notificationsRef", first: true, predicate: ["notificationsBtn"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "loggedUserRef", first: true, predicate: ["loggedUserBtn"], descendants: true, read: ElementRef, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n } @else {\n <span class=\"avatar avatar-sm\">{{ userInitials() }}</span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: i1$2.IconComponent, selector: "upd-icon", inputs: ["model", "wrapperClasses", "color", "colorClass", "removeDefaultClasses", "customClasses", "tablerIcon", "tablerIconWeight", "tablerIconType", "tablerIconSize", "heroIcon", "heroIconSize", "heroIconType"] }, { kind: "component", type: i2.DropdownComponent, selector: "upd-dropdown", inputs: ["items", "header", "isOpen", "shouldCloseOnOutsideClick", "arrowType", "wrapperClasses", "elementsExcludedFromOutsideClick", "minHeight", "maxHeight", "minWidth", "maxWidth", "dropdownReference", "dropdownReferencePosition", "textOverflowStrategy"], outputs: ["isOpenChange", "selectedItem", "checkboxChanged"] }, { kind: "component", type: i3.LinkComponent, selector: "upd-link", inputs: ["href", "target", "customClasses", "isNavigation"], outputs: ["clicked"] }, { kind: "pipe", type: i1$1.TranslocoPipe, name: "transloco" }], encapsulation: i0.ViewEncapsulation.None }); }
234
240
  }
235
241
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: HeaderComponent, decorators: [{
236
242
  type: Component,
237
- args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
243
+ args: [{ selector: 'upd-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"container-xl\">\n <button class=\"navbar-toggler\" type=\"button\" (click)=\"toggleSidebarOnMobile()\" [attr.aria-expanded]=\"isSidebarMobileOpen()\">\n <span class=\"navbar-toggler-icon\"></span>\n </button>\n <div class=\"navbar-nav flex-row order-md-last\">\n <div class=\"d-none d-md-flex me-3\">\n @if (!!config().showThemeSwitcher) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"switchTheme()\">\n <upd-icon [tablerIcon]=\"nextThemeIcon()\"></upd-icon>\n </upd-link>\n </div>\n }\n @if (!!config().showLanguageSwitcher && languagesOptions().length > 0) {\n <div class=\"nav-item\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLanguageSwitcherDropdownOpen=true\"\n #languageSwitcherBtn>\n <upd-icon tablerIcon=\"language\"></upd-icon>\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLanguageSwitcherDropdownOpen\"\n [dropdownReference]=\"languageSwitcherRef()\" [items]=\"languagesOptions()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isLanguageSwitcherDropdownOpen = $event\" (selectedItem)=\"switchLanguage($event)\">\n </upd-dropdown>\n </div>\n }\n @if (!!config().showNotifications && !!userInfo()) {\n <div class=\"nav-item dropdown d-none d-md-flex\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isNotificationsDropdownOpen = true\"\n #notificationsBtn>\n <upd-icon [tablerIcon]=\"currentNotificationsIcon()\"></upd-icon>\n @if (hasNewNotifications()) {\n <span class=\"badge bg-red\" [class.badge-blink]=\"shouldBlinkIfNewNotifications()\"></span>\n }\n </upd-link>\n <upd-dropdown wrapperClasses=\"mt-1 dropdown-menu-card\" [isOpen]=\"isNotificationsDropdownOpen\"\n [dropdownReference]=\"notificationsRef()\" [shouldCloseOnOutsideClick]=\"true\"\n (isOpenChange)=\"isNotificationsDropdownOpen = $event\" [minWidth]=\"400\" arrowType=\"right\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h3 class=\"card-title\">{{ 'UpDevs.NotificationCenter.Title' | transloco }}</h3>\n </div>\n @for (notification of latestNotifications(); track notification) {\n <div class=\"list-group list-group-flush list-group-hoverable\" (click)=\"readNotification(notification)\">\n <div class=\"list-group-item\">\n <div class=\"row align-items-center\">\n <div class=\"col-auto\">\n @if (!!notification.dateRead) {\n <span class=\"status-dot d-block\"></span>\n } @else {\n <span class=\"status-dot status-dot-animated bg-primary d-block\"></span>\n }\n </div>\n <div class=\"col text-truncate\">\n <a href=\"javascript:void(0)\" class=\"text-body d-block\"\n [class.fw-bold]=\"!notification.dateRead\">\n {{ textService.getText(notification.title) }}\n </a>\n @if (!!notification.description) {\n <div class=\"d-block text-secondary text-truncate mt-n1\">\n {{ textService.getText(notification.description) }}\n </div>\n }\n </div>\n <div class=\"col-auto\">\n <upd-link [customClasses]=\"['list-group-item-actions']\"\n (clicked)=\"removeNotification(notification)\">\n <upd-icon tablerIcon=\"x\"></upd-icon>\n </upd-link>\n </div>\n </div>\n </div>\n </div>\n } @empty {\n <div class=\"empty\">\n <h1 class=\"text-body-tertiary\">{{ 'UpDevs.NotificationCenter.NoNotifications' | transloco }}</h1>\n </div>\n }\n </div>\n </upd-dropdown>\n </div>\n }\n </div>\n @if (!!config().showUserMenu && !!userInfo()) {\n <div class=\"nav-item dropdown\">\n <upd-link [isNavigation]=\"true\" [customClasses]=\"['px-0']\" (clicked)=\"isLoggedUserDropdownOpen = true\" #loggedUserBtn>\n @if (!!userInfo()!.avatar) {\n <span class=\"avatar avatar-sm\" style=\"background-image: url({{userInfo()?.avatar}})\"></span>\n } @else {\n <span class=\"avatar avatar-sm\">{{ userInitials() }}</span>\n }\n\n <div class=\"d-none d-xl-block px-2\">\n <div>{{ userIdentification() }}</div>\n @if (!!userDescription()) {\n <div class=\"mt-1 small text-muted\">{{ userDescription() }}</div>\n }\n </div>\n </upd-link>\n @if (loggedUserOptions().length > 0) {\n <upd-dropdown wrapperClasses=\"mt-1\" [isOpen]=\"isLoggedUserDropdownOpen\" [dropdownReference]=\"loggedUserRef()\"\n [items]=\"loggedUserOptions()\" [shouldCloseOnOutsideClick]=\"true\" (selectedItem)=\"selectLoggedUserMenuItem($event)\"\n (isOpenChange)=\"isLoggedUserDropdownOpen = $event\" arrowType=\"right\">\n </upd-dropdown>\n }\n </div>\n }\n </div>\n @if (!!config().showSearchBar && !!userInfo()) {\n <div class=\"collapse navbar-collapse\" [class.show]=\"isSidebarMobileOpen()\">\n <div class=\"me-2\" [class.w-100]=\"config().shouldUseFullSearchBar\">\n <form autocomplete=\"off\" novalidate>\n <div class=\"input-icon\">\n <span class=\"input-icon-addon\">\n <upd-icon tablerIcon=\"search\"></upd-icon>\n </span>\n <input type=\"text\" value=\"\" class=\"form-control\" placeholder=\"{{'UpDevs.Header.Search' | transloco}}...\">\n </div>\n </form>\n </div>\n </div>\n } @else {\n <div></div>\n }\n</div>\n" }]
238
244
  }], propDecorators: { classes: [{
239
245
  type: HostBinding,
240
246
  args: ['class']