ngx-sp-auth 1.0.5 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +207 -24
  2. package/fesm2022/ngx-sp-auth.mjs +381 -409
  3. package/fesm2022/ngx-sp-auth.mjs.map +1 -1
  4. package/lib/auth.module.d.ts +8 -15
  5. package/lib/components/menu-lateral/dropdown/primary-dropdown/primary-dropdown.component.d.ts +1 -1
  6. package/lib/components/menu-lateral/dropdown/secondary-dropdown/secondary-dropdown.component.d.ts +1 -1
  7. package/lib/components/menu-lateral/menu/menu-lateral.component.d.ts +13 -13
  8. package/lib/components/menu-lateral/menu/selecao-estabelecimentos-modal/selecao-estabelecimentos-modal.component.d.ts +1 -1
  9. package/lib/components/menu-lateral/submenus/dynamic-menu/dynamic-menu.component.d.ts +1 -1
  10. package/lib/components/menu-lateral/submenus/notif-submenu/notif-submenu.component.d.ts +1 -1
  11. package/lib/components/nova-senha/nova-senhacomponent.d.ts +1 -1
  12. package/package.json +2 -4
  13. package/esm2022/lib/auth.module.mjs +0 -87
  14. package/esm2022/lib/auth.service.mjs +0 -306
  15. package/esm2022/lib/components/login/login.component.mjs +0 -323
  16. package/esm2022/lib/components/menu-lateral/dropdown/primary-dropdown/primary-dropdown.component.mjs +0 -67
  17. package/esm2022/lib/components/menu-lateral/dropdown/secondary-dropdown/secondary-dropdown.component.mjs +0 -32
  18. package/esm2022/lib/components/menu-lateral/menu/list-estab.service.mjs +0 -55
  19. package/esm2022/lib/components/menu-lateral/menu/menu-lateral.component.mjs +0 -233
  20. package/esm2022/lib/components/menu-lateral/menu/selecao-estabelecimentos-modal/selecao-estabelecimentos-modal.component.mjs +0 -200
  21. package/esm2022/lib/components/menu-lateral/menu-services.service.mjs +0 -151
  22. package/esm2022/lib/components/menu-lateral/model/iestabelecimento.model.mjs +0 -2
  23. package/esm2022/lib/components/menu-lateral/model/imenu-item-structure.model.mjs +0 -2
  24. package/esm2022/lib/components/menu-lateral/model/imenu.model.mjs +0 -12
  25. package/esm2022/lib/components/menu-lateral/model/infrausuarioimg.mjs +0 -12
  26. package/esm2022/lib/components/menu-lateral/model/isubmenu-item-structure.model.mjs +0 -2
  27. package/esm2022/lib/components/menu-lateral/model/ret-estabelecimento-session.mjs +0 -10
  28. package/esm2022/lib/components/menu-lateral/model/ret-infrausuarioemail.mjs +0 -8
  29. package/esm2022/lib/components/menu-lateral/model/ret-infrausuarioimg.mjs +0 -11
  30. package/esm2022/lib/components/menu-lateral/model/usuario-img.mjs +0 -8
  31. package/esm2022/lib/components/menu-lateral/submenus/dynamic-menu/dynamic-menu.component.mjs +0 -54
  32. package/esm2022/lib/components/menu-lateral/submenus/notif-submenu/notif-submenu.component.mjs +0 -14
  33. package/esm2022/lib/components/nova-senha/nova-senhacomponent.mjs +0 -191
  34. package/esm2022/lib/custom/custom-login.service.mjs +0 -52
  35. package/esm2022/lib/custom/custom-menu.service.mjs +0 -88
  36. package/esm2022/lib/custom/custom-storage.service.mjs +0 -70
  37. package/esm2022/lib/custom/menu-config.service.mjs +0 -70
  38. package/esm2022/lib/custom/models/icustom-login-service.mjs +0 -2
  39. package/esm2022/lib/custom/models/icustom-menu-service.mjs +0 -2
  40. package/esm2022/lib/custom/models/icustom-storage-service.mjs +0 -2
  41. package/esm2022/lib/custom/models/imenu-config.mjs +0 -2
  42. package/esm2022/lib/environments/environments.service.mjs +0 -21
  43. package/esm2022/lib/environments/models/ienvironments.mjs +0 -2
  44. package/esm2022/lib/guards/auth-guard.mjs +0 -34
  45. package/esm2022/lib/guards/external-login-guard.mjs +0 -88
  46. package/esm2022/lib/guards/login-guard.mjs +0 -35
  47. package/esm2022/lib/interceptors/auth-aplic.interceptor.mjs +0 -41
  48. package/esm2022/lib/interceptors/auth-infra.interceptor.mjs +0 -30
  49. package/esm2022/lib/models/code-2fa.mjs +0 -2
  50. package/esm2022/lib/models/custom-propriedades-login.mjs +0 -3
  51. package/esm2022/lib/models/forgotten-password-form.mjs +0 -2
  52. package/esm2022/lib/models/login-form.mjs +0 -2
  53. package/esm2022/lib/models/login.mjs +0 -2
  54. package/esm2022/lib/models/nova-senha-form.mjs +0 -2
  55. package/esm2022/lib/models/password-recup.mjs +0 -2
  56. package/esm2022/lib/models/payload.mjs +0 -2
  57. package/esm2022/lib/models/ret-login.mjs +0 -21
  58. package/esm2022/lib/models/ret-token.mjs +0 -8
  59. package/esm2022/lib/models/token.mjs +0 -2
  60. package/esm2022/lib/server/ret-server-config.mjs +0 -9
  61. package/esm2022/lib/server/server.service.mjs +0 -38
  62. package/esm2022/lib/storage/auth-storage.service.mjs +0 -365
  63. package/esm2022/ngx-sp-auth.mjs +0 -5
  64. package/esm2022/public-api.mjs +0 -39
@@ -1,32 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "ngx-sp-infra";
5
- //import { environment } from '../../../../environments/environments';
6
- // import { ProjectUtilservice } from 'src/app/project/utils/project-utils.service';
7
- export class SecondaryDropdownComponent {
8
- constructor() {
9
- this.modulo = { id: null, icon: null, label: null, URL: null, secondary_level: null };
10
- this.backPrimaryDropdown = new EventEmitter();
11
- }
12
- ngOnInit() {
13
- }
14
- backToPrimary() {
15
- this.backPrimaryDropdown.emit(true);
16
- }
17
- redirectToModulo(modulo) {
18
- const url = `https://siscandesv6.sispro.com.br/SisproErpCloud/${modulo}`;
19
- window.open(url, '_blank');
20
- }
21
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SecondaryDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SecondaryDropdownComponent, selector: "app-secondary-dropdown", inputs: { modulo: "modulo" }, outputs: { backPrimaryDropdown: "backPrimaryDropdown" }, ngImport: i0, template: "<div class=\"d-flex flex-row\">\r\n <button class=\"chevron d-flex m-0 p-0 align-items-start\" (click)=\"backToPrimary()\"> \r\n <lib-icon iconName=\"seta-esquerda\" iconSize=\"small\"/>\r\n </button>\r\n\r\n <div class=\"d-flex flex-column flex-row\">\r\n <li *ngIf=\"modulo != null\">\r\n <img class=\"ms-1 mb-2\" src=\"{{ modulo.icon }}\" alt=\"{{ modulo.label }}\">\r\n <span>{{ modulo.label }}</span>\r\n </li>\r\n <div *ngIf=\"modulo && modulo.secondary_level != null\">\r\n <li *ngFor=\"let moduloItem of modulo.secondary_level;\" (click)=\"redirectToModulo(moduloItem.URL)\">\r\n <a class=\"dropdown-item mb-2 ms-2\">\r\n <img src=\"{{ moduloItem.icon }}\" alt=\"{{ moduloItem.label }}\">\r\n {{ moduloItem.label }}\r\n </a>\r\n <li>\r\n </div>\r\n </div>\r\n</div>", styles: ["*{padding:0;margin:0}.chevron{margin-bottom:16px;margin-left:14px}li img{margin-left:8px;margin-right:4px}li span{font-weight:700}li a:hover{font-weight:700;background-color:transparent}.dropdown-item{margin-left:32px}button{background-color:transparent;border:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.LibIconsComponent, selector: "lib-icon", inputs: ["iconName", "iconColor", "iconSize", "iconFill"] }] }); }
23
- }
24
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SecondaryDropdownComponent, decorators: [{
25
- type: Component,
26
- args: [{ selector: 'app-secondary-dropdown', template: "<div class=\"d-flex flex-row\">\r\n <button class=\"chevron d-flex m-0 p-0 align-items-start\" (click)=\"backToPrimary()\"> \r\n <lib-icon iconName=\"seta-esquerda\" iconSize=\"small\"/>\r\n </button>\r\n\r\n <div class=\"d-flex flex-column flex-row\">\r\n <li *ngIf=\"modulo != null\">\r\n <img class=\"ms-1 mb-2\" src=\"{{ modulo.icon }}\" alt=\"{{ modulo.label }}\">\r\n <span>{{ modulo.label }}</span>\r\n </li>\r\n <div *ngIf=\"modulo && modulo.secondary_level != null\">\r\n <li *ngFor=\"let moduloItem of modulo.secondary_level;\" (click)=\"redirectToModulo(moduloItem.URL)\">\r\n <a class=\"dropdown-item mb-2 ms-2\">\r\n <img src=\"{{ moduloItem.icon }}\" alt=\"{{ moduloItem.label }}\">\r\n {{ moduloItem.label }}\r\n </a>\r\n <li>\r\n </div>\r\n </div>\r\n</div>", styles: ["*{padding:0;margin:0}.chevron{margin-bottom:16px;margin-left:14px}li img{margin-left:8px;margin-right:4px}li span{font-weight:700}li a:hover{font-weight:700;background-color:transparent}.dropdown-item{margin-left:32px}button{background-color:transparent;border:none}\n"] }]
27
- }], ctorParameters: () => [], propDecorators: { modulo: [{
28
- type: Input
29
- }], backPrimaryDropdown: [{
30
- type: Output
31
- }] } });
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vjb25kYXJ5LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcC1hdXRoL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWxhdGVyYWwvZHJvcGRvd24vc2Vjb25kYXJ5LWRyb3Bkb3duL3NlY29uZGFyeS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvbWVudS1sYXRlcmFsL2Ryb3Bkb3duL3NlY29uZGFyeS1kcm9wZG93bi9zZWNvbmRhcnktZHJvcGRvd24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7OztBQUMvRSxzRUFBc0U7QUFDdEUsb0ZBQW9GO0FBT3BGLE1BQU0sT0FBTywwQkFBMEI7SUFNakM7UUFKZ0IsV0FBTSxHQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQzlGO1FBQ1Usd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztJQUVuRCxDQUFDO0lBRWpCLFFBQVE7SUFDUixDQUFDO0lBRU0sYUFBYTtRQUNkLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVNLGdCQUFnQixDQUFDLE1BQWM7UUFDaEMsTUFBTSxHQUFHLEdBQVcsb0RBQW9ELE1BQU0sRUFBRSxDQUFDO1FBRWpGLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7K0dBbkJNLDBCQUEwQjttR0FBMUIsMEJBQTBCLHFKQ1Z2Qyw4MEJBbUJNOzs0RkRUTywwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ00sd0JBQXdCO3dEQU1sQixNQUFNO3NCQUFyQixLQUFLO2dCQUVXLG1CQUFtQjtzQkFBbkMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuLy8gaW1wb3J0IHsgUHJvamVjdFV0aWxzZXJ2aWNlIH0gZnJvbSAnc3JjL2FwcC9wcm9qZWN0L3V0aWxzL3Byb2plY3QtdXRpbHMuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgICAgc2VsZWN0b3I6ICdhcHAtc2Vjb25kYXJ5LWRyb3Bkb3duJyxcclxuICAgICAgdGVtcGxhdGVVcmw6ICcuL3NlY29uZGFyeS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICAgIHN0eWxlVXJsczogWycuL3NlY29uZGFyeS1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2Vjb25kYXJ5RHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgICAgQElucHV0KCkgcHVibGljIG1vZHVsbzogYW55ID0geyBpZDogbnVsbCwgaWNvbjogbnVsbCwgbGFiZWw6IG51bGwsIFVSTDogbnVsbCwgc2Vjb25kYXJ5X2xldmVsOiBudWxsIH1cclxuICAgICAgICAgICAgO1xyXG4gICAgICBAT3V0cHV0KCkgcHVibGljIGJhY2tQcmltYXJ5RHJvcGRvd24gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAgICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyBiYWNrVG9QcmltYXJ5KCkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tQcmltYXJ5RHJvcGRvd24uZW1pdCh0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIHJlZGlyZWN0VG9Nb2R1bG8obW9kdWxvOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICAgICAgY29uc3QgdXJsOiBzdHJpbmcgPSBgaHR0cHM6Ly9zaXNjYW5kZXN2Ni5zaXNwcm8uY29tLmJyL1Npc3Byb0VycENsb3VkLyR7bW9kdWxvfWA7XHJcblxyXG4gICAgICAgICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICAgICAgfVxyXG5cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93XCI+XHJcbiAgPGJ1dHRvbiBjbGFzcz1cImNoZXZyb24gZC1mbGV4IG0tMCBwLTAgYWxpZ24taXRlbXMtc3RhcnRcIiAoY2xpY2spPVwiYmFja1RvUHJpbWFyeSgpXCI+IFxyXG4gICAgPGxpYi1pY29uIGljb25OYW1lPVwic2V0YS1lc3F1ZXJkYVwiIGljb25TaXplPVwic21hbGxcIi8+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZmxleC1yb3dcIj5cclxuICAgIDxsaSAqbmdJZj1cIm1vZHVsbyAhPSBudWxsXCI+XHJcbiAgICAgIDxpbWcgY2xhc3M9XCJtcy0xIG1iLTJcIiBzcmM9XCJ7eyBtb2R1bG8uaWNvbiB9fVwiIGFsdD1cInt7IG1vZHVsby5sYWJlbCB9fVwiPlxyXG4gICAgICA8c3Bhbj57eyBtb2R1bG8ubGFiZWwgfX08L3NwYW4+XHJcbiAgICA8L2xpPlxyXG4gICAgPGRpdiAqbmdJZj1cIm1vZHVsbyAmJiBtb2R1bG8uc2Vjb25kYXJ5X2xldmVsICE9IG51bGxcIj5cclxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBtb2R1bG9JdGVtIG9mIG1vZHVsby5zZWNvbmRhcnlfbGV2ZWw7XCIgKGNsaWNrKT1cInJlZGlyZWN0VG9Nb2R1bG8obW9kdWxvSXRlbS5VUkwpXCI+XHJcbiAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtIG1iLTIgbXMtMlwiPlxyXG4gICAgICAgICAgPGltZyBzcmM9XCJ7eyBtb2R1bG9JdGVtLmljb24gfX1cIiBhbHQ9XCJ7eyBtb2R1bG9JdGVtLmxhYmVsIH19XCI+XHJcbiAgICAgICAgICB7eyBtb2R1bG9JdGVtLmxhYmVsIH19XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICA8bGk+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19
@@ -1,55 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { merge, of, tap } from 'rxjs';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common/http";
5
- export class ListEstabService {
6
- constructor(http) {
7
- this.http = http;
8
- this.cacheName = "";
9
- this.menuKey = `${this.cacheName}_ListaEstabs`;
10
- this.baseUrl = "assets/jsons/lista-estabs.json";
11
- this.storage = window.localStorage;
12
- }
13
- getList() {
14
- let iMenu = this.get();
15
- let httpCall = this.http.get(this.baseUrl).pipe(tap((iMenuFromServer) => {
16
- this.set(iMenuFromServer);
17
- }));
18
- // Caso o menu já esteja gravado no local, é retornado ele no observable e logo em seguida
19
- // é realizada a chamada HTTP para buscar o mais novo menu.
20
- if (iMenu) {
21
- let obs = of(iMenu);
22
- let obsMerged = merge(obs, httpCall);
23
- return obsMerged;
24
- }
25
- return httpCall;
26
- }
27
- set(value) {
28
- let iMenuJson = JSON.stringify(value);
29
- this.storage.setItem(this.menuKey, iMenuJson);
30
- }
31
- get() {
32
- let possibleIMenus = this.storage.getItem(this.menuKey);
33
- if (possibleIMenus) {
34
- let iMenus = JSON.parse(possibleIMenus);
35
- return iMenus;
36
- }
37
- return null;
38
- }
39
- remove() {
40
- this.storage.removeItem(this.menuKey);
41
- }
42
- getCacheName(cacheName) {
43
- //passando propriedades do produto para a service
44
- this.cacheName = cacheName;
45
- }
46
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListEstabService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
47
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListEstabService, providedIn: 'root' }); }
48
- }
49
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListEstabService, decorators: [{
50
- type: Injectable,
51
- args: [{
52
- providedIn: 'root'
53
- }]
54
- }], ctorParameters: () => [{ type: i1.HttpClient }] });
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1lc3RhYi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWF1dGgvc3JjL2xpYi9jb21wb25lbnRzL21lbnUtbGF0ZXJhbC9tZW51L2xpc3QtZXN0YWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBT2xELE1BQU0sT0FBTyxnQkFBZ0I7SUFTM0IsWUFBb0IsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQU43QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRWQsWUFBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsY0FBYyxDQUFDO1FBRTFELFlBQU8sR0FBRyxnQ0FBZ0MsQ0FBQztRQUd6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDckMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLEtBQUssR0FBOEIsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xELElBQUksUUFBUSxHQUFtQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBcUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDakcsR0FBRyxDQUFDLENBQUMsZUFBbUMsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLDBGQUEwRjtRQUMxRiwyREFBMkQ7UUFDM0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksR0FBRyxHQUFtQyxFQUFFLENBQUMsS0FBTSxDQUFDLENBQUM7WUFDckQsSUFBSSxTQUFTLEdBQW1DLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFckUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxHQUFHLENBQUMsS0FBeUI7UUFDM0IsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxHQUFHO1FBQ0QsSUFBSSxjQUFjLEdBQWtCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2RSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksTUFBTSxHQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTVELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTSxZQUFZLENBQUMsU0FBaUI7UUFDbkMsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7K0dBekRVLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7NEZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCB0YXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IElFc3RhYmVsZWNpbWVudG8gfSBmcm9tICcuLi9tb2RlbC9pZXN0YWJlbGVjaW1lbnRvLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIExpc3RFc3RhYlNlcnZpY2Uge1xyXG4gIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZTtcclxuXHJcbiAgcHVibGljIGNhY2hlTmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IG1lbnVLZXkgPSBgJHt0aGlzLmNhY2hlTmFtZX1fTGlzdGFFc3RhYnNgO1xyXG5cclxuICBiYXNlVXJsID0gXCJhc3NldHMvanNvbnMvbGlzdGEtZXN0YWJzLmpzb25cIjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7XHJcbiAgICB0aGlzLnN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdCgpOiBPYnNlcnZhYmxlPElFc3RhYmVsZWNpbWVudG9bXT4ge1xyXG4gICAgbGV0IGlNZW51OiBJRXN0YWJlbGVjaW1lbnRvW10gfCBudWxsID0gdGhpcy5nZXQoKTtcclxuICAgIGxldCBodHRwQ2FsbDogT2JzZXJ2YWJsZTxJRXN0YWJlbGVjaW1lbnRvW10+ID0gdGhpcy5odHRwLmdldDxJRXN0YWJlbGVjaW1lbnRvW10+KHRoaXMuYmFzZVVybCkucGlwZShcclxuICAgICAgdGFwKChpTWVudUZyb21TZXJ2ZXI6IElFc3RhYmVsZWNpbWVudG9bXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0KGlNZW51RnJvbVNlcnZlcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIENhc28gbyBtZW51IGrDoSBlc3RlamEgZ3JhdmFkbyBubyBsb2NhbCwgw6kgcmV0b3JuYWRvIGVsZSBubyBvYnNlcnZhYmxlIGUgbG9nbyBlbSBzZWd1aWRhXHJcbiAgICAvLyDDqSByZWFsaXphZGEgYSBjaGFtYWRhIEhUVFAgcGFyYSBidXNjYXIgbyBtYWlzIG5vdm8gbWVudS5cclxuICAgIGlmIChpTWVudSkge1xyXG4gICAgICBsZXQgb2JzOiBPYnNlcnZhYmxlPElFc3RhYmVsZWNpbWVudG9bXT4gPSBvZihpTWVudSEpO1xyXG4gICAgICBsZXQgb2JzTWVyZ2VkOiBPYnNlcnZhYmxlPElFc3RhYmVsZWNpbWVudG9bXT4gPSBtZXJnZShvYnMsIGh0dHBDYWxsKTtcclxuXHJcbiAgICAgIHJldHVybiBvYnNNZXJnZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGh0dHBDYWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0KHZhbHVlOiBJRXN0YWJlbGVjaW1lbnRvW10pOiB2b2lkIHtcclxuICAgIGxldCBpTWVudUpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLm1lbnVLZXksIGlNZW51SnNvbik7XHJcbiAgfVxyXG5cclxuICBnZXQoKTogSUVzdGFiZWxlY2ltZW50b1tdIHwgbnVsbCB7XHJcbiAgICBsZXQgcG9zc2libGVJTWVudXM6IHN0cmluZyB8IG51bGwgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm1lbnVLZXkpO1xyXG5cclxuICAgIGlmIChwb3NzaWJsZUlNZW51cykge1xyXG4gICAgICBsZXQgaU1lbnVzOiBJRXN0YWJlbGVjaW1lbnRvW10gPSBKU09OLnBhcnNlKHBvc3NpYmxlSU1lbnVzKTtcclxuXHJcbiAgICAgIHJldHVybiBpTWVudXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICByZW1vdmUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLm1lbnVLZXkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENhY2hlTmFtZShjYWNoZU5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgLy9wYXNzYW5kbyBwcm9wcmllZGFkZXMgZG8gcHJvZHV0byBwYXJhIGEgc2VydmljZVxyXG4gICAgdGhpcy5jYWNoZU5hbWUgPSBjYWNoZU5hbWU7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIl19
@@ -1,233 +0,0 @@
1
- import { Component, ContentChild, TemplateRef, ViewChild } from '@angular/core';
2
- import { NavigationEnd } from '@angular/router';
3
- import { filter, Subject } from 'rxjs';
4
- import { MenuConfigService } from '../../../custom/menu-config.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./../../../custom/custom-menu.service";
7
- import * as i2 from "../../../storage/auth-storage.service";
8
- import * as i3 from "ngx-bootstrap/modal";
9
- import * as i4 from "../menu-services.service";
10
- import * as i5 from "ngx-sp-infra";
11
- import * as i6 from "@angular/router";
12
- import * as i7 from "../../../auth.service";
13
- import * as i8 from "@angular/common";
14
- import * as i9 from "ngx-bootstrap/popover";
15
- import * as i10 from "ngx-bootstrap/tooltip";
16
- import * as i11 from "../dropdown/primary-dropdown/primary-dropdown.component";
17
- import * as i12 from "./selecao-estabelecimentos-modal/selecao-estabelecimentos-modal.component";
18
- import * as i13 from "../submenus/dynamic-menu/dynamic-menu.component";
19
- import * as i14 from "../submenus/notif-submenu/notif-submenu.component";
20
- export class MenuLateralComponent {
21
- constructor(_customMenuService, _authStorageService, _bsModalService, _menuServices, _messageService,
22
- //private _projectUtilService: ProjectUtilservice,
23
- _router, _authService) {
24
- this._customMenuService = _customMenuService;
25
- this._authStorageService = _authStorageService;
26
- this._bsModalService = _bsModalService;
27
- this._menuServices = _menuServices;
28
- this._messageService = _messageService;
29
- this._router = _router;
30
- this._authService = _authService;
31
- this.MODAL_ESTABELECIMENTO = 1;
32
- this.nomeEstabelecimento = 'Estabelecimento padrão';
33
- this.titleSubmenu = "";
34
- this.submenuList = [];
35
- this.messageIfClicked = new Subject();
36
- /** Esta variável é usada na abertura do submenu e do submenu secundário para
37
- * que a função onClickedOutside() que está na segunda div principal do HTML do
38
- * componente não seja ativada, pois se ela for ativada ela irá fechar o menu
39
- * lateral, e quando vamos do submenu para o submenu secundário não queremos
40
- * fechar o menu lateral, e quando vamos do submenu secundário para o submenu
41
- * também não queremos fechar o menu lateral;
42
- */
43
- this.closeMenu = true;
44
- /** Utilizada como a fonte da imagem de perfil do usuário logado no sistema. */
45
- this.footerUserImgSrc = "";
46
- /** Emai do usuário logado para ser exibido no popover */
47
- this.footerUserEmail = "";
48
- /** Nome do usuário logado para ser exibido no rodapé do menu. */
49
- this.footerUserName = "Usuário";
50
- this.isPopoverVisible = false;
51
- this.showBalloon = false;
52
- // propriedades iniciadas quando passar o CustomMenuService
53
- this.menuDynamic = false;
54
- this.menuConfig = new MenuConfigService;
55
- // Implementação que verifica eventos acionados na classe de service.
56
- this._menuServices.getNewUserImageEvent().subscribe(() => { this.getMenuUserImg(); });
57
- }
58
- ngOnInit() {
59
- // Inscreva-se no evento NavigationEnd para receber notificações quando a rota mudar, serve para atualizar a seleção do menu corretamente
60
- this._router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe((event) => {
61
- this._customMenuService.menuItems = this._customMenuService.menuConfig.updateRouteSelection(this._router.url, this._customMenuService.menuItems);
62
- });
63
- if (!this._customMenuService.menuDynamic) {
64
- this._customMenuService.menuConfig.setMenuStatic(true);
65
- this._customMenuService.menuItems = this._customMenuService.menuConfig.initializeMenu(this._router.url);
66
- // Método com customizações para inicialização do Menu Estático
67
- this._customMenuService.menuStaticOnInit();
68
- }
69
- else {
70
- // Método com customizações para inicialização do Menu Dinâmico
71
- this._customMenuService.menuDynamicOnInit();
72
- }
73
- this.nomeEstabelecimento = this._authStorageService.infraEstabNome;
74
- this.footerUserName = this._authStorageService.userName;
75
- this.checkForCachedImage();
76
- this.getUserEmail();
77
- }
78
- // #endregion PUBLIC
79
- // #endregion ==========> PROPERTIES <==========
80
- // #region ==========> SERVICES <==========
81
- // #region GET
82
- getEstabelecimentoSession(estabID) {
83
- this._menuServices.getEstabelecimentoSession(estabID).subscribe({
84
- next: response => {
85
- this.nomeEstabelecimento = response.InfraEstabNome;
86
- this._authStorageService.infraEmpresaId = response.InfraEmpresaId;
87
- this._authStorageService.infraEmpresaNome = response.InfraEmpresaNome;
88
- },
89
- error: error => {
90
- //this._projectUtilService.showHttpError(error);
91
- this._messageService.showAlertDanger(error);
92
- throw new Error(error);
93
- }
94
- });
95
- }
96
- getMenuUserImg() {
97
- this._menuServices.getImagemMenu().subscribe({
98
- next: response => { this.footerUserImgSrc = response.InfraUsuarioImg.Imagem; },
99
- error: error => {
100
- //this._projectUtilService.showHttpError(error);
101
- this._messageService.showAlertDanger(error);
102
- throw new Error(error);
103
- }
104
- });
105
- }
106
- getUserEmail() {
107
- this._menuServices.getUsuarioEmail().subscribe({
108
- next: response => { this.footerUserEmail = response.Email; },
109
- error: error => {
110
- //this._projectUtilService.showHttpError(error);
111
- this._messageService.showAlertDanger(error);
112
- throw new Error(error);
113
- }
114
- });
115
- }
116
- // #endregion GET
117
- // #region UPDATE
118
- updateLastLogEstabelecimento(estab) {
119
- this._menuServices.updateLastLogEstabID(estab.split(" - ")[0]).subscribe({
120
- next: () => {
121
- this._messageService.showAlertSuccess('Estabelecimento alterado com sucesso!');
122
- this.getEstabelecimentoSession(estab.split(" - ")[0]);
123
- }
124
- });
125
- this._authStorageService.infraEstabId = estab.split(" - ")[0];
126
- this._authStorageService.infraEstabNome = estab.split(" - ")[1];
127
- }
128
- // #endregion UPDATE
129
- // #endregion ==========> SERVICES <==========
130
- // #region ==========> UTILITIES <==========
131
- togglePopover() { this.showBalloon = !this.showBalloon; }
132
- dropdownWasOpened(value) { this.messageIfClicked.next(value); }
133
- openExpansibleMenu(ref) {
134
- ref.classList.toggle("closed");
135
- ref.classList.toggle("col");
136
- document.querySelector(".sidebar-control")?.classList.toggle("col");
137
- // Método com customizações para inicialização do Menu Estático
138
- this._customMenuService.menuopenExpansibleMenu(ref);
139
- }
140
- openSubmenu(menu, ref, desiredMenu) {
141
- if (menu.children && menu.children.length > 0) {
142
- this.titleSubmenu = menu.label;
143
- this.desiredContent = desiredMenu;
144
- ref.classList.remove("opened-notif-sub");
145
- if (this.submenuList === menu.children) {
146
- this.closeMenu = false;
147
- }
148
- else if (!ref.classList.contains("opened-sub")) {
149
- ref.classList.toggle("opened-sub");
150
- }
151
- this.submenuList = menu.children;
152
- }
153
- else if (!menu.children || (menu.children && menu.children.length == 0)) {
154
- this.submenuList = [];
155
- ref.classList.toggle("selectedItem");
156
- this.onClickedOutside(new Event(""), ref);
157
- }
158
- }
159
- // public onClickedOutside(e: Event, ref: HTMLDivElement): void {
160
- // ref.classList.remove("opened-sub");
161
- // this.submenuList = [];
162
- // }
163
- onClickedOutside(e, ref) {
164
- if (ref) {
165
- ref.classList.remove("opened-sub");
166
- this.submenuList = [];
167
- }
168
- else {
169
- console.warn('ref is undefined or null');
170
- }
171
- }
172
- // #region MENU FOOTER USER IMAGE
173
- validateCachedImg(footerImg) {
174
- let usuarioId = this._authStorageService.infraUsuarioId;
175
- if (!footerImg || footerImg == null) {
176
- return true;
177
- }
178
- if (usuarioId != footerImg.USUARIOID) {
179
- return true;
180
- }
181
- this.footerUserImgSrc = footerImg.FILE;
182
- return false;
183
- }
184
- checkForCachedImage() {
185
- const isAPIRequestNeeded = this.validateCachedImg(this._menuServices.getMenuFooterImg());
186
- if (isAPIRequestNeeded) {
187
- this.getMenuUserImg();
188
- }
189
- }
190
- // #endregion MENU FOOTER USER IMAGE
191
- logout() {
192
- this._authService.logout();
193
- }
194
- getExternalUrl(url) {
195
- return `https://siscandesv6.sispro.com.br/SisproErpCloud/${url}`;
196
- }
197
- // #endregion ==========> UTILITIES <==========
198
- // #region ==========> MODALS <==========
199
- /** Função simples com o objetivo de abrir os modais no centro da tela.
200
- * @param template Template HTML do modal que será aberto.
201
- * @param modalID ID do modal que será aberto, para que possa ser referenciado depois.
202
- */
203
- openModal(template, modalID) {
204
- this._bsModalService.show(template, {
205
- class: 'modal-dialog-centered modal-lg',
206
- ignoreBackdropClick: false,
207
- keyboard: false,
208
- id: modalID
209
- });
210
- }
211
- /** Função simples com o objetivo de fechar os modais que estiverem abertos (baseados pelo ID).
212
- * @param modalID ID do modal que será fechado.
213
- */
214
- closeModal(modalID) {
215
- this._bsModalService.hide(modalID);
216
- }
217
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MenuLateralComponent, deps: [{ token: i1.LibCustomMenuService }, { token: i2.AuthStorageService }, { token: i3.BsModalService }, { token: i4.MenuServicesService }, { token: i5.MessageService }, { token: i6.Router }, { token: i7.AuthService }], target: i0.ɵɵFactoryTarget.Component }); }
218
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MenuLateralComponent, selector: "app-menu-lateral", queries: [{ propertyName: "desiredContent", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "notif_template", first: true, predicate: ["notif_menu"], descendants: true }, { propertyName: "menuLink", first: true, predicate: ["menuLink"], descendants: true }], ngImport: i0, template: "<!-- #region MAIN CONTENT -->\r\n<div class=\"main col-12\">\r\n\r\n <div style=\"height: 100vh; z-index: 3;\" class=\"sidebar-control position-relative d-flex flex-row\" \r\n (clickOutside)=\"closeMenu == true ? onClickedOutside($event, submenu_ref) : closeMenu = true\">\r\n <div class=\"sidebar {{_customMenuService.themeColor}} closed\" #sidebar>\r\n <div class=\"menu-header\">\r\n <ul>\r\n <li class=\"mb-3\">\r\n <div class=\"logo-hamburguer\">\r\n <img src=\"assets/icons/logotipo-sispro.svg\" alt=\"logo-sispro\" class=\"logo-sispro\" title=\"logo\" width=\"136px\" height=\"48px\">\r\n <button class=\"button-hamburguer\" (click)=\"openExpansibleMenu(sidebar)\">\r\n <img src=\"assets/icons/menu.svg\" alt=\"menu hamburguer\">\r\n </button>\r\n </div>\r\n </li>\r\n\r\n <!-- #region M\u00D3DULOS -->\r\n <li class=\"mb-3\" style=\"margin-left: 8px; margin-right: 8px\">\r\n <div class=\"btn-group\">\r\n <button (click)=\"dropdownWasOpened(true)\" type=\"button\" class=\"dropdown-button\" data-bs-toggle=\"dropdown\"\r\n aria-expanded=\"false\" data-bs-auto-close=\"outside\">\r\n\r\n <ng-container>\r\n <img *ngIf=\"_customMenuService.moduleImg != ''; else moduleSVG\" [src]=\"_customMenuService.moduleImg\" alt=\"\">\r\n <span class=\"ps-2\"> {{ this._customMenuService.moduleName }} <lib-icon iconName=\"seta-direita\" iconColor=\"white\" /> </span>\r\n\r\n <ng-template #moduleSVG>\r\n <lib-icon iconColor=\"white\" [iconName]=\"_customMenuService.moduleSvg\"/>\r\n </ng-template>\r\n </ng-container>\r\n\r\n </button>\r\n <ul class=\"dropdown-menu\" #dropdown_ref>\r\n <app-primary-dropdown [buttonWasClicked]=\"messageIfClicked\"></app-primary-dropdown>\r\n </ul>\r\n </div>\r\n </li>\r\n <!-- #endregion M\u00D3DULOS -->\r\n\r\n <!-- #region ESTABELECIMENTOS -->\r\n <li class=\"mx-3\" style=\"margin-bottom: 16px;\">\r\n <div class=\"icon-estabelecimento\">\r\n <button class=\"row justify-content-between bg-transparent border-0\"\r\n (click)=\"openModal(modalEstabelecimento, MODAL_ESTABELECIMENTO)\"\r\n [tooltip]=\"!sidebar.classList.contains('closed') ? '' : nomeEstabelecimento\" placement=\"right\">\r\n\r\n <lib-icon class=\"col-1\" iconName=\"predio\" iconColor=\"white\" />\r\n <span *ngIf=\"!sidebar.classList.contains('closed')\" class=\"col-9 ps-2 glb-text-width-160 text-start text-truncate\"> {{ nomeEstabelecimento }} </span>\r\n <lib-icon *ngIf=\"!sidebar.classList.contains('closed')\" class=\"col-1\" iconName=\"seta-direita\" iconColor=\"white\" />\r\n </button>\r\n </div>\r\n </li>\r\n <!-- #endregion ESTABELECIMENTOS -->\r\n\r\n </ul>\r\n\r\n </div>\r\n\r\n <!-- #region MENUS DE NAVEGA\u00C7\u00C3O -->\r\n <div class=\"main-menu\">\r\n <div class=\"scroll\">\r\n <div class=\"list-menu px-2 pb-1\">\r\n\r\n <!-- #region MENU DIN\u00C2MICO -->\r\n <div class=\"dynamic-menu\">\r\n <ul #dynamic_menu_items *ngIf=\"_customMenuService.menuItems; else isLoading\">\r\n\r\n <li *ngFor=\"let menuItem of _customMenuService.menuItems; let i = index\" \r\n class=\"p-1 rounded\" \r\n (click)=\"openSubmenu(menuItem, submenu_ref, dynamic_menu)\" \r\n [class.selectedItem]=\"menuItem.isSelected\">\r\n\r\n <a *ngIf=\"!menuItem.isExternal; else externalMenu\"\r\n [routerLink]=\"menuItem.route != '' ? menuItem.route : null\" \r\n [id]=\"'item' + menuItem.id\" \r\n [tooltip]=\"!sidebar.classList.contains('closed') ? '' : menuItem.label\" \r\n placement=\"left\" class=\"w-100 d-flex align-items-center button-icons text-decoration-none p-1 glb-cursor-pointer\" \r\n [class]=\"sidebar.classList.contains('closed') ? 'justify-content-center' : 'justify-content-between'\">\r\n\r\n <div class=\"container\">\r\n <lib-icon *ngIf=\"!menuItem.icon.includes('assets/icons'); else iconImg\" [iconName]=\"menuItem.icon\" iconColor=\"white\"/>\r\n <span class=\"span-main\">{{ menuItem.label }}</span>\r\n <ng-template #iconImg>\r\n <img [src]=\"menuItem.icon\" [alt]=\"'icone: ' + menuItem.label\">\r\n </ng-template>\r\n </div>\r\n <lib-icon *ngIf=\"(menuItem.children && menuItem.children.length > 0) && !sidebar.classList.contains('closed')\" \r\n iconName=\"seta-direita\" iconColor=\"white\"/>\r\n </a>\r\n \r\n <ng-template #externalMenu>\r\n <a [href]=\"getExternalUrl(menuItem.route)\"\r\n target=\"_blank\" \r\n [id]=\"'item' + menuItem.id\" \r\n [tooltip]=\"!sidebar.classList.contains('closed') ? '' : menuItem.label\" \r\n placement=\"left\" class=\"w-100 d-flex align-items-center button-icons text-decoration-none p-1 glb-cursor-pointer\" \r\n [class]=\"sidebar.classList.contains('closed') ? 'justify-content-center' : 'justify-content-between'\">\r\n\r\n <div class=\"container\">\r\n <lib-icon *ngIf=\"!menuItem.icon.includes('assets/icons'); else iconImgExternal\" [iconName]=\"menuItem.icon\" iconColor=\"white\"/>\r\n <span class=\"span-main\">{{ menuItem.label }}</span>\r\n <ng-template #iconImgExternal>\r\n <img [src]=\"menuItem.icon\" [alt]=\"'icone: ' + menuItem.label\">\r\n </ng-template>\r\n </div>\r\n <lib-icon *ngIf=\"(menuItem.children && menuItem.children.length > 0) && !sidebar.classList.contains('closed')\" \r\n iconName=\"seta-direita\" iconColor=\"white\"/>\r\n </a>\r\n </ng-template>\r\n </li>\r\n\r\n </ul>\r\n </div>\r\n\r\n <ng-template #isLoading>\r\n <li class=\"spinner-border spinner-border-sm mt-2\" role=\"status\" aria-hidden=\"true\"></li>\r\n </ng-template>\r\n <!-- #endregion MENU DIN\u00C2MICO -->\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- #endregion MENUS DE NAVEGA\u00C7\u00C3O -->\r\n\r\n <!-- #region FOOTER -->\r\n <div class=\"footer-menu\" (mouseenter)=\"showBalloon = true\" (mouseleave)=\"showBalloon = false\"\r\n [popover]=\"popoverContent\" placement=\"right bottom\" [outsideClick]=\"true\" containerClass=\"width: 200px\" >\r\n <div class=\"footer-components ps-1 pt-2\" [class.open]=\"showBalloon\">\r\n <button type=\"button\" class=\"btn btn-primary\">\r\n <img *ngIf=\"footerUserImgSrc; else noUserImg\" class=\"photo-profile ms-1\"\r\n [src]=\"['data:image/jpeg;base64,' + footerUserImgSrc]\" alt=\"foto-perfil\">\r\n <ng-template #noUserImg>\r\n <lib-icon iconName=\"contraparte\" iconColor=\"white\"/>\r\n </ng-template>\r\n <span class=\"glb-text-width-120 w-auto fw-bold text-start text-truncate ms-1 me-1\">\r\n {{ footerUserName }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <ng-template #popoverContent>\r\n <div class=\"footer-menu\" style=\"width: 1000px;\">\r\n <div class=\"d-flex align-items-center\"> \r\n <img *ngIf=\"footerUserImgSrc; else noUserImg\" class=\"photo-profile\"\r\n [src]=\"['data:image/jpeg;base64,' + footerUserImgSrc]\" alt=\"foto-perfil\"> \r\n <ng-template #noUserImg>\r\n <lib-icon iconName=\"contraparte\" iconColor=\"white\"/>\r\n </ng-template>\r\n <div class=\"d-flex flex-column ms-1\"> \r\n <div [tooltip]=\"footerUserName\" class=\"dynamic-container\" style=\"white-space: nowrap; flex-grow: 1;max-width: 200px; font-size: 16px;\">{{footerUserName}}</div>\r\n <div [tooltip]=\"footerUserEmail\" class=\"dynamic-container\" style=\"white-space: nowrap; font-size: 12px; flex-grow: 1;max-width: 200px;\">{{footerUserEmail}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <hr class=\"mb-2 mt-2\">\r\n <div routerLink=\"meu-perfil\" style=\"cursor: pointer;\" (click)=\"togglePopover(); $event.stopPropagation()\">\r\n <lib-icon [iconSize]=\"'small'\" iconName=\"contraparte\"/> Meu Perfil\r\n </div>\r\n <div class=\"mt-2\" (click)=\"logout()\" style=\"cursor: pointer;\">\r\n <lib-icon [iconSize]=\"'small'\" iconName=\"logout\"/> Sair\r\n </div>\r\n </ng-template>\r\n <!-- #endregion FOOTER -->\r\n\r\n </div>\r\n\r\n <div class=\"submenu\" #submenu_ref>\r\n <ng-template [ngIf]=\"desiredContent !== null\">\r\n <ng-content *ngTemplateOutlet=\"desiredContent!; context: {$implicit: submenuList}\"></ng-content>\r\n </ng-template>\r\n </div>\r\n </div>\r\n \r\n <div class=\"main-content col d-flex flex-column align-content-between\" id=\"body-content\">\r\n <div class=\"content\" style=\"position: relative;\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div app-footer></div>\r\n </div>\r\n\r\n</div>\r\n<!-- #endregion MAIN CONTENT -->\r\n\r\n<!-- #region TEMPLATES -->\r\n<!-- tem que perguntar pro Erick -->\r\n<!-- [submenuRef]=\"submenu_ref\" -->\r\n<ng-template #dynamic_menu let-data>\r\n <app-dynamic-menu \r\n [submenuList]=\"data\"\r\n [titleSubmenu]=\"titleSubmenu\"\r\n [submenuRef]=\"submenu_ref\"\r\n [recebeParam]=\"onClickedOutside.bind(this)\">\r\n </app-dynamic-menu>\r\n</ng-template>\r\n\r\n<ng-template #notif_menu>\r\n <app-notif-submenu></app-notif-submenu>\r\n</ng-template>\r\n\r\n<!-- #region MODAL SELECAO ESTABELECIMENTO -->\r\n<ng-template #modalEstabelecimento>\r\n <selecao-estabelecimentos-modal (onClose)=\"closeModal(MODAL_ESTABELECIMENTO)\"\r\n (onSelected)=\"closeModal(MODAL_ESTABELECIMENTO); updateLastLogEstabelecimento($event);\"></selecao-estabelecimentos-modal>\r\n</ng-template>\r\n<!-- #endregion MODAL SELECAO ESTABELECIMENTO -->\r\n\r\n<!-- #endregion TEMPLATES -->\r\n", styles: [".main{display:flex;width:100%;height:100%;background:#eee}::-webkit-scrollbar{width:8px;background:transparent}::-webkit-scrollbar-thumb{background:#bbb;border-radius:16px}.main-content{width:100%;z-index:0;overflow-y:auto;overflow:overlay;height:100vh}.main-content .content{padding:0 16px 16px;background-color:#eee!important}.disable-scroll{overflow-y:hidden}*{padding:0;margin:0;font-family:Open sans,Arial,Helvetica,sans-serif;font-size:14px}span{color:#fff}ul{list-style:none;padding-left:0;white-space:nowrap}.dropdown-button{padding:8px;border-radius:8px;background-color:#3265ee;border:none;font-size:14px;font-weight:700;width:100%;display:flex}.dropdown-button span{width:100%;display:flex;justify-content:space-between}.dropdown-menu{width:212px;border-radius:8px}.dropdown-menu li{margin:16px 8px}.dropdown-menu li a{font-size:14px}.dropdown-menu li a:hover{font-weight:700;background-color:transparent}.dropdown-menu .dropdown-divider{height:0}.link-portal{color:#213b70;text-decoration:underline;text-align:center;font-weight:700;font-size:14px}.container{display:flex;width:max-content}.sidebar{display:flex;flex-direction:column;height:100%;grid-template-rows:min-content;box-sizing:border-box;transition:width .5s;background-color:#213b70;max-width:inherit}.sidebar .footer-menu{justify-content:flex-end}.menu-header{display:flex;flex-direction:column;white-space:nowrap;padding:32px 0 0;background-color:#213b70}.menu-header ul li{margin-left:16px;margin-right:16px}.menu-header ul>li:last-child{border-bottom:1px solid #3265ee;padding-bottom:15px;height:auto}.dropdown{margin:0}.btn-group{width:100%}.sidebar.closed .menu-header ul li{margin-left:0;margin-right:0}.sidebar.closed .menu-header{display:flex;flex-direction:column;align-items:center}.icon-estabelecimento button{display:flex;flex-direction:row;width:100%;align-items:center;justify-content:center}.icon-estabelecimento button span:hover{font-weight:700}.header-content{display:flex;flex-direction:column;justify-content:space-evenly;height:100%;margin:0 20px}.logo-hamburguer{display:flex;justify-content:space-between;margin-right:8px}.logo-hamburguer .button-hamburguer{border:none;background-color:transparent}.sidebar.closed .logo-hamburguer{justify-content:center;margin-right:0}.scroll{overflow-y:auto;overflow-x:hidden;min-height:20%;margin-right:2px}.list-menu{padding-left:16px;padding-right:8px;display:flex;flex-direction:column;justify-content:center;white-space:nowrap}.list-menu .text-closed{padding-top:15px;display:none;color:#fff}.list-menu .text-opened{color:#fff;font-size:12px;padding-top:15px;visibility:visible;white-space:nowrap}.list-menu .li-main{padding:10px 7px;border-radius:8px}.list-menu .onSelect{background-color:#3265ee}.list-menu div.static-menu>ul>li:first-child{margin-top:16px}.list-menu .span-main{font-size:14px;margin-left:8px;opacity:1;pointer-events:auto;white-space:break-spaces}.list-menu .span-main:hover,.list-menu .list-options span:hover{font-weight:700}.list-menu p{font-size:10px;font-weight:700;text-transform:uppercase;border-bottom:1px solid #3265ee;visibility:hidden}.selectedItem{background-color:#3265ee}.selectedItem span{font-weight:700;background-color:transparent}.notif{padding:2px 13px;margin-bottom:none;background-color:#000;border-radius:8px;font-weight:700}.sidebar.closed .chevron{display:none}.sidebar.closed .icon-estabelecimento{margin:0}.sidebar.closed .icon-estabelecimento button{justify-content:center}.sidebar.closed .icon-estabelecimento button img{margin:0}.align-chevron{width:100%;text-align:justify;align-items:center;display:flex;justify-content:space-between}.selected-color{background-color:#3265ee}.main-menu{display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:20%}.button-icons{border:none;background-color:transparent}.footer-menu{display:flex;flex-direction:column;padding-bottom:8px}.footer-menu .footer-components{display:flex;justify-content:space-between;border-top:1px solid #3265ee;white-space:nowrap;align-items:center}.footer-menu .footer-components .button-closed{display:none}.footer-menu button{border:none;background-color:transparent;border-radius:8px}.footer-menu .points{padding:4px 0;margin:4px 0;border-radius:8px}.footer-menu .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.footer-menu .open-user{background-color:#3265ee}.submenu{width:341px;display:none;background-color:#3265ee;box-sizing:border-box;flex-direction:column;overflow:hidden;box-shadow:0 4px 8px #0000004d}.submenu ul{display:flex;flex-direction:column;margin:25px 26px 0 24px}.submenu ul li{font-size:20px;font-weight:600;line-height:22px;padding-bottom:18px}.submenu .itens-list{display:flex;justify-content:space-between;align-items:center}.submenu .itens-list .favoritos,.submenu .itens-list span{cursor:pointer}.submenu .footer-menu{display:flex;flex-direction:row;justify-content:center;padding-bottom:16px;overflow:hidden}.submenu .footer-menu .footer-components{border-top:1px solid #3265ee;padding-top:16px;padding-left:17px;white-space:nowrap}.submenu .footer-menu button{position:relative;left:35%;border:none;background-color:transparent}.submenu .footer-menu .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.submenu .footer-components{display:flex;justify-content:center;align-items:center}.submenu button{position:relative;left:10%;border:none;background-color:transparent}.submenu .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.submenu.opened-sub{z-index:1;display:flex;position:absolute;left:100%;height:100vh;justify-content:space-between}.submenu-footer{display:flex;flex-direction:row;justify-content:center;align-content:center;margin-bottom:14px;border-top:1px solid #2847a0;box-shadow:0 4px 8px #0000004d}.submenu-footer .subfooter-components{padding-top:16px}.submenu-footer span{font-weight:700;padding-left:10px}.search-bar{max-width:368px;height:38px;margin-top:24px;border:1px solid #ced4da;box-sizing:border-box;border-radius:8px}.opened-notif-sub{min-width:452px;display:none;background-color:#3265ee;box-sizing:border-box;flex-direction:column;overflow:hidden}.sidebar.closed{max-width:73px}.sidebar.closed span{display:none}.sidebar.closed span{white-space:nowrap;overflow:hidden}.sidebar.closed .logo-sispro{display:none}.sidebar.closed .list-menu{padding:0;margin-left:0;margin-right:0;display:flex;flex-direction:column;align-items:center}.sidebar.closed .list-menu span{opacity:0;pointer-events:none}.sidebar.closed .list-menu .text-closed{padding-bottom:11px;visibility:visible;display:block}.sidebar.closed .list-menu .text-opened{display:none;font-size:8px}.sidebar.closed .list-menu .chevron,.sidebar.closed .favoritos,.sidebar.closed .footer-components .button-opened{display:none}.sidebar.closed .footer-components .button-closed{display:block}.sidebar.closed .button-icons{border:none;background-color:transparent}.sidebar.closed .footer-components{display:flex;align-items:center}.sidebar.closed button{border:none;background-color:transparent;display:block}.sidebar.closed .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.sidebar-control{height:100vh;max-width:227.667px}.sidebar-control .main-content.closed{margin-left:0}.glb-text-width-120{max-width:120px}.profile-picture{display:inline-block;position:relative;width:100px;height:100px;border-radius:50%;overflow:hidden}.profile-picture img{width:100%;height:100%;object-fit:cover;border-radius:50%;clip-path:circle(50% at 50% 50%)}.image-div{width:50px;min-width:50px;height:50px;border-radius:100%;position:relative;overflow:hidden;z-index:1}.image-div #photoUser{width:146px;height:146px;top:-1px;left:-1px;object-fit:cover;position:relative;z-index:1;border:none;border-color:transparent}.dynamic-container{display:inline-block;white-space:nowrap;overflow:hidden}.custom-popover{width:1000px}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.ClickOutsideDirective, selector: "[clickOutside], [libClickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: i5.LibIconsComponent, selector: "lib-icon", inputs: ["iconName", "iconColor", "iconSize", "iconFill"] }, { kind: "component", type: i5.FooterComponent, selector: "[app-footer], app-footer, lib-footer" }, { kind: "directive", type: i9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i10.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: i6.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i6.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i11.PrimaryDropdownComponent, selector: "app-primary-dropdown", inputs: ["buttonWasClicked"] }, { kind: "component", type: i12.SelecaoEstabelecimentosModalComponent, selector: "selecao-estabelecimentos-modal", outputs: ["onClose", "onSelected"] }, { kind: "component", type: i13.DynamicMenuComponent, selector: "app-dynamic-menu", inputs: ["submenuRef", "recebeParam", "titleSubmenu", "submenuList"], outputs: ["selectTemplate"] }, { kind: "component", type: i14.NotifSubmenuComponent, selector: "app-notif-submenu" }] }); }
219
- }
220
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MenuLateralComponent, decorators: [{
221
- type: Component,
222
- args: [{ selector: 'app-menu-lateral', template: "<!-- #region MAIN CONTENT -->\r\n<div class=\"main col-12\">\r\n\r\n <div style=\"height: 100vh; z-index: 3;\" class=\"sidebar-control position-relative d-flex flex-row\" \r\n (clickOutside)=\"closeMenu == true ? onClickedOutside($event, submenu_ref) : closeMenu = true\">\r\n <div class=\"sidebar {{_customMenuService.themeColor}} closed\" #sidebar>\r\n <div class=\"menu-header\">\r\n <ul>\r\n <li class=\"mb-3\">\r\n <div class=\"logo-hamburguer\">\r\n <img src=\"assets/icons/logotipo-sispro.svg\" alt=\"logo-sispro\" class=\"logo-sispro\" title=\"logo\" width=\"136px\" height=\"48px\">\r\n <button class=\"button-hamburguer\" (click)=\"openExpansibleMenu(sidebar)\">\r\n <img src=\"assets/icons/menu.svg\" alt=\"menu hamburguer\">\r\n </button>\r\n </div>\r\n </li>\r\n\r\n <!-- #region M\u00D3DULOS -->\r\n <li class=\"mb-3\" style=\"margin-left: 8px; margin-right: 8px\">\r\n <div class=\"btn-group\">\r\n <button (click)=\"dropdownWasOpened(true)\" type=\"button\" class=\"dropdown-button\" data-bs-toggle=\"dropdown\"\r\n aria-expanded=\"false\" data-bs-auto-close=\"outside\">\r\n\r\n <ng-container>\r\n <img *ngIf=\"_customMenuService.moduleImg != ''; else moduleSVG\" [src]=\"_customMenuService.moduleImg\" alt=\"\">\r\n <span class=\"ps-2\"> {{ this._customMenuService.moduleName }} <lib-icon iconName=\"seta-direita\" iconColor=\"white\" /> </span>\r\n\r\n <ng-template #moduleSVG>\r\n <lib-icon iconColor=\"white\" [iconName]=\"_customMenuService.moduleSvg\"/>\r\n </ng-template>\r\n </ng-container>\r\n\r\n </button>\r\n <ul class=\"dropdown-menu\" #dropdown_ref>\r\n <app-primary-dropdown [buttonWasClicked]=\"messageIfClicked\"></app-primary-dropdown>\r\n </ul>\r\n </div>\r\n </li>\r\n <!-- #endregion M\u00D3DULOS -->\r\n\r\n <!-- #region ESTABELECIMENTOS -->\r\n <li class=\"mx-3\" style=\"margin-bottom: 16px;\">\r\n <div class=\"icon-estabelecimento\">\r\n <button class=\"row justify-content-between bg-transparent border-0\"\r\n (click)=\"openModal(modalEstabelecimento, MODAL_ESTABELECIMENTO)\"\r\n [tooltip]=\"!sidebar.classList.contains('closed') ? '' : nomeEstabelecimento\" placement=\"right\">\r\n\r\n <lib-icon class=\"col-1\" iconName=\"predio\" iconColor=\"white\" />\r\n <span *ngIf=\"!sidebar.classList.contains('closed')\" class=\"col-9 ps-2 glb-text-width-160 text-start text-truncate\"> {{ nomeEstabelecimento }} </span>\r\n <lib-icon *ngIf=\"!sidebar.classList.contains('closed')\" class=\"col-1\" iconName=\"seta-direita\" iconColor=\"white\" />\r\n </button>\r\n </div>\r\n </li>\r\n <!-- #endregion ESTABELECIMENTOS -->\r\n\r\n </ul>\r\n\r\n </div>\r\n\r\n <!-- #region MENUS DE NAVEGA\u00C7\u00C3O -->\r\n <div class=\"main-menu\">\r\n <div class=\"scroll\">\r\n <div class=\"list-menu px-2 pb-1\">\r\n\r\n <!-- #region MENU DIN\u00C2MICO -->\r\n <div class=\"dynamic-menu\">\r\n <ul #dynamic_menu_items *ngIf=\"_customMenuService.menuItems; else isLoading\">\r\n\r\n <li *ngFor=\"let menuItem of _customMenuService.menuItems; let i = index\" \r\n class=\"p-1 rounded\" \r\n (click)=\"openSubmenu(menuItem, submenu_ref, dynamic_menu)\" \r\n [class.selectedItem]=\"menuItem.isSelected\">\r\n\r\n <a *ngIf=\"!menuItem.isExternal; else externalMenu\"\r\n [routerLink]=\"menuItem.route != '' ? menuItem.route : null\" \r\n [id]=\"'item' + menuItem.id\" \r\n [tooltip]=\"!sidebar.classList.contains('closed') ? '' : menuItem.label\" \r\n placement=\"left\" class=\"w-100 d-flex align-items-center button-icons text-decoration-none p-1 glb-cursor-pointer\" \r\n [class]=\"sidebar.classList.contains('closed') ? 'justify-content-center' : 'justify-content-between'\">\r\n\r\n <div class=\"container\">\r\n <lib-icon *ngIf=\"!menuItem.icon.includes('assets/icons'); else iconImg\" [iconName]=\"menuItem.icon\" iconColor=\"white\"/>\r\n <span class=\"span-main\">{{ menuItem.label }}</span>\r\n <ng-template #iconImg>\r\n <img [src]=\"menuItem.icon\" [alt]=\"'icone: ' + menuItem.label\">\r\n </ng-template>\r\n </div>\r\n <lib-icon *ngIf=\"(menuItem.children && menuItem.children.length > 0) && !sidebar.classList.contains('closed')\" \r\n iconName=\"seta-direita\" iconColor=\"white\"/>\r\n </a>\r\n \r\n <ng-template #externalMenu>\r\n <a [href]=\"getExternalUrl(menuItem.route)\"\r\n target=\"_blank\" \r\n [id]=\"'item' + menuItem.id\" \r\n [tooltip]=\"!sidebar.classList.contains('closed') ? '' : menuItem.label\" \r\n placement=\"left\" class=\"w-100 d-flex align-items-center button-icons text-decoration-none p-1 glb-cursor-pointer\" \r\n [class]=\"sidebar.classList.contains('closed') ? 'justify-content-center' : 'justify-content-between'\">\r\n\r\n <div class=\"container\">\r\n <lib-icon *ngIf=\"!menuItem.icon.includes('assets/icons'); else iconImgExternal\" [iconName]=\"menuItem.icon\" iconColor=\"white\"/>\r\n <span class=\"span-main\">{{ menuItem.label }}</span>\r\n <ng-template #iconImgExternal>\r\n <img [src]=\"menuItem.icon\" [alt]=\"'icone: ' + menuItem.label\">\r\n </ng-template>\r\n </div>\r\n <lib-icon *ngIf=\"(menuItem.children && menuItem.children.length > 0) && !sidebar.classList.contains('closed')\" \r\n iconName=\"seta-direita\" iconColor=\"white\"/>\r\n </a>\r\n </ng-template>\r\n </li>\r\n\r\n </ul>\r\n </div>\r\n\r\n <ng-template #isLoading>\r\n <li class=\"spinner-border spinner-border-sm mt-2\" role=\"status\" aria-hidden=\"true\"></li>\r\n </ng-template>\r\n <!-- #endregion MENU DIN\u00C2MICO -->\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- #endregion MENUS DE NAVEGA\u00C7\u00C3O -->\r\n\r\n <!-- #region FOOTER -->\r\n <div class=\"footer-menu\" (mouseenter)=\"showBalloon = true\" (mouseleave)=\"showBalloon = false\"\r\n [popover]=\"popoverContent\" placement=\"right bottom\" [outsideClick]=\"true\" containerClass=\"width: 200px\" >\r\n <div class=\"footer-components ps-1 pt-2\" [class.open]=\"showBalloon\">\r\n <button type=\"button\" class=\"btn btn-primary\">\r\n <img *ngIf=\"footerUserImgSrc; else noUserImg\" class=\"photo-profile ms-1\"\r\n [src]=\"['data:image/jpeg;base64,' + footerUserImgSrc]\" alt=\"foto-perfil\">\r\n <ng-template #noUserImg>\r\n <lib-icon iconName=\"contraparte\" iconColor=\"white\"/>\r\n </ng-template>\r\n <span class=\"glb-text-width-120 w-auto fw-bold text-start text-truncate ms-1 me-1\">\r\n {{ footerUserName }}\r\n </span>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <ng-template #popoverContent>\r\n <div class=\"footer-menu\" style=\"width: 1000px;\">\r\n <div class=\"d-flex align-items-center\"> \r\n <img *ngIf=\"footerUserImgSrc; else noUserImg\" class=\"photo-profile\"\r\n [src]=\"['data:image/jpeg;base64,' + footerUserImgSrc]\" alt=\"foto-perfil\"> \r\n <ng-template #noUserImg>\r\n <lib-icon iconName=\"contraparte\" iconColor=\"white\"/>\r\n </ng-template>\r\n <div class=\"d-flex flex-column ms-1\"> \r\n <div [tooltip]=\"footerUserName\" class=\"dynamic-container\" style=\"white-space: nowrap; flex-grow: 1;max-width: 200px; font-size: 16px;\">{{footerUserName}}</div>\r\n <div [tooltip]=\"footerUserEmail\" class=\"dynamic-container\" style=\"white-space: nowrap; font-size: 12px; flex-grow: 1;max-width: 200px;\">{{footerUserEmail}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n <hr class=\"mb-2 mt-2\">\r\n <div routerLink=\"meu-perfil\" style=\"cursor: pointer;\" (click)=\"togglePopover(); $event.stopPropagation()\">\r\n <lib-icon [iconSize]=\"'small'\" iconName=\"contraparte\"/> Meu Perfil\r\n </div>\r\n <div class=\"mt-2\" (click)=\"logout()\" style=\"cursor: pointer;\">\r\n <lib-icon [iconSize]=\"'small'\" iconName=\"logout\"/> Sair\r\n </div>\r\n </ng-template>\r\n <!-- #endregion FOOTER -->\r\n\r\n </div>\r\n\r\n <div class=\"submenu\" #submenu_ref>\r\n <ng-template [ngIf]=\"desiredContent !== null\">\r\n <ng-content *ngTemplateOutlet=\"desiredContent!; context: {$implicit: submenuList}\"></ng-content>\r\n </ng-template>\r\n </div>\r\n </div>\r\n \r\n <div class=\"main-content col d-flex flex-column align-content-between\" id=\"body-content\">\r\n <div class=\"content\" style=\"position: relative;\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n <div app-footer></div>\r\n </div>\r\n\r\n</div>\r\n<!-- #endregion MAIN CONTENT -->\r\n\r\n<!-- #region TEMPLATES -->\r\n<!-- tem que perguntar pro Erick -->\r\n<!-- [submenuRef]=\"submenu_ref\" -->\r\n<ng-template #dynamic_menu let-data>\r\n <app-dynamic-menu \r\n [submenuList]=\"data\"\r\n [titleSubmenu]=\"titleSubmenu\"\r\n [submenuRef]=\"submenu_ref\"\r\n [recebeParam]=\"onClickedOutside.bind(this)\">\r\n </app-dynamic-menu>\r\n</ng-template>\r\n\r\n<ng-template #notif_menu>\r\n <app-notif-submenu></app-notif-submenu>\r\n</ng-template>\r\n\r\n<!-- #region MODAL SELECAO ESTABELECIMENTO -->\r\n<ng-template #modalEstabelecimento>\r\n <selecao-estabelecimentos-modal (onClose)=\"closeModal(MODAL_ESTABELECIMENTO)\"\r\n (onSelected)=\"closeModal(MODAL_ESTABELECIMENTO); updateLastLogEstabelecimento($event);\"></selecao-estabelecimentos-modal>\r\n</ng-template>\r\n<!-- #endregion MODAL SELECAO ESTABELECIMENTO -->\r\n\r\n<!-- #endregion TEMPLATES -->\r\n", styles: [".main{display:flex;width:100%;height:100%;background:#eee}::-webkit-scrollbar{width:8px;background:transparent}::-webkit-scrollbar-thumb{background:#bbb;border-radius:16px}.main-content{width:100%;z-index:0;overflow-y:auto;overflow:overlay;height:100vh}.main-content .content{padding:0 16px 16px;background-color:#eee!important}.disable-scroll{overflow-y:hidden}*{padding:0;margin:0;font-family:Open sans,Arial,Helvetica,sans-serif;font-size:14px}span{color:#fff}ul{list-style:none;padding-left:0;white-space:nowrap}.dropdown-button{padding:8px;border-radius:8px;background-color:#3265ee;border:none;font-size:14px;font-weight:700;width:100%;display:flex}.dropdown-button span{width:100%;display:flex;justify-content:space-between}.dropdown-menu{width:212px;border-radius:8px}.dropdown-menu li{margin:16px 8px}.dropdown-menu li a{font-size:14px}.dropdown-menu li a:hover{font-weight:700;background-color:transparent}.dropdown-menu .dropdown-divider{height:0}.link-portal{color:#213b70;text-decoration:underline;text-align:center;font-weight:700;font-size:14px}.container{display:flex;width:max-content}.sidebar{display:flex;flex-direction:column;height:100%;grid-template-rows:min-content;box-sizing:border-box;transition:width .5s;background-color:#213b70;max-width:inherit}.sidebar .footer-menu{justify-content:flex-end}.menu-header{display:flex;flex-direction:column;white-space:nowrap;padding:32px 0 0;background-color:#213b70}.menu-header ul li{margin-left:16px;margin-right:16px}.menu-header ul>li:last-child{border-bottom:1px solid #3265ee;padding-bottom:15px;height:auto}.dropdown{margin:0}.btn-group{width:100%}.sidebar.closed .menu-header ul li{margin-left:0;margin-right:0}.sidebar.closed .menu-header{display:flex;flex-direction:column;align-items:center}.icon-estabelecimento button{display:flex;flex-direction:row;width:100%;align-items:center;justify-content:center}.icon-estabelecimento button span:hover{font-weight:700}.header-content{display:flex;flex-direction:column;justify-content:space-evenly;height:100%;margin:0 20px}.logo-hamburguer{display:flex;justify-content:space-between;margin-right:8px}.logo-hamburguer .button-hamburguer{border:none;background-color:transparent}.sidebar.closed .logo-hamburguer{justify-content:center;margin-right:0}.scroll{overflow-y:auto;overflow-x:hidden;min-height:20%;margin-right:2px}.list-menu{padding-left:16px;padding-right:8px;display:flex;flex-direction:column;justify-content:center;white-space:nowrap}.list-menu .text-closed{padding-top:15px;display:none;color:#fff}.list-menu .text-opened{color:#fff;font-size:12px;padding-top:15px;visibility:visible;white-space:nowrap}.list-menu .li-main{padding:10px 7px;border-radius:8px}.list-menu .onSelect{background-color:#3265ee}.list-menu div.static-menu>ul>li:first-child{margin-top:16px}.list-menu .span-main{font-size:14px;margin-left:8px;opacity:1;pointer-events:auto;white-space:break-spaces}.list-menu .span-main:hover,.list-menu .list-options span:hover{font-weight:700}.list-menu p{font-size:10px;font-weight:700;text-transform:uppercase;border-bottom:1px solid #3265ee;visibility:hidden}.selectedItem{background-color:#3265ee}.selectedItem span{font-weight:700;background-color:transparent}.notif{padding:2px 13px;margin-bottom:none;background-color:#000;border-radius:8px;font-weight:700}.sidebar.closed .chevron{display:none}.sidebar.closed .icon-estabelecimento{margin:0}.sidebar.closed .icon-estabelecimento button{justify-content:center}.sidebar.closed .icon-estabelecimento button img{margin:0}.align-chevron{width:100%;text-align:justify;align-items:center;display:flex;justify-content:space-between}.selected-color{background-color:#3265ee}.main-menu{display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:20%}.button-icons{border:none;background-color:transparent}.footer-menu{display:flex;flex-direction:column;padding-bottom:8px}.footer-menu .footer-components{display:flex;justify-content:space-between;border-top:1px solid #3265ee;white-space:nowrap;align-items:center}.footer-menu .footer-components .button-closed{display:none}.footer-menu button{border:none;background-color:transparent;border-radius:8px}.footer-menu .points{padding:4px 0;margin:4px 0;border-radius:8px}.footer-menu .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.footer-menu .open-user{background-color:#3265ee}.submenu{width:341px;display:none;background-color:#3265ee;box-sizing:border-box;flex-direction:column;overflow:hidden;box-shadow:0 4px 8px #0000004d}.submenu ul{display:flex;flex-direction:column;margin:25px 26px 0 24px}.submenu ul li{font-size:20px;font-weight:600;line-height:22px;padding-bottom:18px}.submenu .itens-list{display:flex;justify-content:space-between;align-items:center}.submenu .itens-list .favoritos,.submenu .itens-list span{cursor:pointer}.submenu .footer-menu{display:flex;flex-direction:row;justify-content:center;padding-bottom:16px;overflow:hidden}.submenu .footer-menu .footer-components{border-top:1px solid #3265ee;padding-top:16px;padding-left:17px;white-space:nowrap}.submenu .footer-menu button{position:relative;left:35%;border:none;background-color:transparent}.submenu .footer-menu .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.submenu .footer-components{display:flex;justify-content:center;align-items:center}.submenu button{position:relative;left:10%;border:none;background-color:transparent}.submenu .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.submenu.opened-sub{z-index:1;display:flex;position:absolute;left:100%;height:100vh;justify-content:space-between}.submenu-footer{display:flex;flex-direction:row;justify-content:center;align-content:center;margin-bottom:14px;border-top:1px solid #2847a0;box-shadow:0 4px 8px #0000004d}.submenu-footer .subfooter-components{padding-top:16px}.submenu-footer span{font-weight:700;padding-left:10px}.search-bar{max-width:368px;height:38px;margin-top:24px;border:1px solid #ced4da;box-sizing:border-box;border-radius:8px}.opened-notif-sub{min-width:452px;display:none;background-color:#3265ee;box-sizing:border-box;flex-direction:column;overflow:hidden}.sidebar.closed{max-width:73px}.sidebar.closed span{display:none}.sidebar.closed span{white-space:nowrap;overflow:hidden}.sidebar.closed .logo-sispro{display:none}.sidebar.closed .list-menu{padding:0;margin-left:0;margin-right:0;display:flex;flex-direction:column;align-items:center}.sidebar.closed .list-menu span{opacity:0;pointer-events:none}.sidebar.closed .list-menu .text-closed{padding-bottom:11px;visibility:visible;display:block}.sidebar.closed .list-menu .text-opened{display:none;font-size:8px}.sidebar.closed .list-menu .chevron,.sidebar.closed .favoritos,.sidebar.closed .footer-components .button-opened{display:none}.sidebar.closed .footer-components .button-closed{display:block}.sidebar.closed .button-icons{border:none;background-color:transparent}.sidebar.closed .footer-components{display:flex;align-items:center}.sidebar.closed button{border:none;background-color:transparent;display:block}.sidebar.closed .photo-profile{width:32px;height:32px;border-radius:50%;margin:0}.sidebar-control{height:100vh;max-width:227.667px}.sidebar-control .main-content.closed{margin-left:0}.glb-text-width-120{max-width:120px}.profile-picture{display:inline-block;position:relative;width:100px;height:100px;border-radius:50%;overflow:hidden}.profile-picture img{width:100%;height:100%;object-fit:cover;border-radius:50%;clip-path:circle(50% at 50% 50%)}.image-div{width:50px;min-width:50px;height:50px;border-radius:100%;position:relative;overflow:hidden;z-index:1}.image-div #photoUser{width:146px;height:146px;top:-1px;left:-1px;object-fit:cover;position:relative;z-index:1;border:none;border-color:transparent}.dynamic-container{display:inline-block;white-space:nowrap;overflow:hidden}.custom-popover{width:1000px}\n"] }]
223
- }], ctorParameters: () => [{ type: i1.LibCustomMenuService }, { type: i2.AuthStorageService }, { type: i3.BsModalService }, { type: i4.MenuServicesService }, { type: i5.MessageService }, { type: i6.Router }, { type: i7.AuthService }], propDecorators: { notif_template: [{
224
- type: ViewChild,
225
- args: ["notif_menu"]
226
- }], menuLink: [{
227
- type: ViewChild,
228
- args: ['menuLink']
229
- }], desiredContent: [{
230
- type: ContentChild,
231
- args: [TemplateRef]
232
- }] } });
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1sYXRlcmFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcC1hdXRoL3NyYy9saWIvY29tcG9uZW50cy9tZW51LWxhdGVyYWwvbWVudS9tZW51LWxhdGVyYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWF1dGgvc3JjL2xpYi9jb21wb25lbnRzL21lbnUtbGF0ZXJhbC9tZW51L21lbnUtbGF0ZXJhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBVSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxhQUFhLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUd4RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU12QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVl4RSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQ1Msa0JBQXdDLEVBQ3ZDLG1CQUF1QyxFQUN2QyxlQUErQixFQUMvQixhQUFrQyxFQUNsQyxlQUErQjtJQUN2QyxrREFBa0Q7SUFDMUMsT0FBZSxFQUNmLFlBQXlCO1FBUDFCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBc0I7UUFDdkMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUN2QyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0Isa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBQ2xDLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUUvQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsaUJBQVksR0FBWixZQUFZLENBQWE7UUE2Q25CLDBCQUFxQixHQUFXLENBQUMsQ0FBQztRQUUzQyx3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ekM7OztNQUdFO0lBQ0YsU0FBUyxDQUFDLFFBQTBCLEVBQUUsT0FBZTtRQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEMsS0FBSyxFQUFFLGdDQUFnQztZQUN2QyxtQkFBbUIsRUFBRSxLQUFLO1lBQzFCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsRUFBRSxFQUFFLE9BQU87U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVLENBQUMsT0FBZTtRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQTFQVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixvR0FvRGpCLFdBQVcscVBDMUUzQixxcFZBaU5BOzs0RkQzTGEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGtCQUFrQjtxUUFtREssY0FBYztzQkFBOUMsU0FBUzt1QkFBQyxZQUFZO2dCQUlPLFFBQVE7c0JBQXJDLFNBQVM7dUJBQUMsVUFBVTtnQkFDYSxjQUFjO3NCQUEvQyxZQUFZO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmd4LXNwLWluZnJhJztcclxuaW1wb3J0IHsgZmlsdGVyLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IExpYkN1c3RvbU1lbnVTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi8uLi9jdXN0b20vY3VzdG9tLW1lbnUuc2VydmljZSc7XHJcblxyXG4vL2ltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50cyc7XHJcbi8vaW1wb3J0IHsgUHJvamVjdFV0aWxzZXJ2aWNlIH0gZnJvbSAnc3JjL2FwcC9wcm9qZWN0L3V0aWxzL3Byb2plY3QtdXRpbHMuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVudUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jdXN0b20vbWVudS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JhZ2UvYXV0aC1zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZW51U2VydmljZXNTZXJ2aWNlIH0gZnJvbSAnLi4vbWVudS1zZXJ2aWNlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSU1lbnVJdGVtU3RydWN0dXJlIH0gZnJvbSAnLi4vbW9kZWwvaW1lbnUtaXRlbS1zdHJ1Y3R1cmUubW9kZWwnO1xyXG5pbXBvcnQgeyBJU3VibWVudUl0ZW1TdHJ1Y3R1cmUgfSBmcm9tICcuLi9tb2RlbC9pc3VibWVudS1pdGVtLXN0cnVjdHVyZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVzdWFyaW9fSU1HIH0gZnJvbSAnLi4vbW9kZWwvdXN1YXJpby1pbWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtbWVudS1sYXRlcmFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWVudS1sYXRlcmFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tZW51LWxhdGVyYWwuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1lbnVMYXRlcmFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBfY3VzdG9tTWVudVNlcnZpY2U6IExpYkN1c3RvbU1lbnVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXV0aFN0b3JhZ2VTZXJ2aWNlOiBBdXRoU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9ic01vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZW51U2VydmljZXM6IE1lbnVTZXJ2aWNlc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICAvL3ByaXZhdGUgX3Byb2plY3RVdGlsU2VydmljZTogUHJvamVjdFV0aWxzZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIF9hdXRoU2VydmljZTogQXV0aFNlcnZpY2VcclxuICApIHtcclxuICAgIC8vIEltcGxlbWVudGHDp8OjbyBxdWUgdmVyaWZpY2EgZXZlbnRvcyBhY2lvbmFkb3MgbmEgY2xhc3NlIGRlIHNlcnZpY2UuXHJcbiAgICB0aGlzLl9tZW51U2VydmljZXMuZ2V0TmV3VXNlckltYWdlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4geyB0aGlzLmdldE1lbnVVc2VySW1nKCk7IH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgLy8gSW5zY3JldmEtc2Ugbm8gZXZlbnRvIE5hdmlnYXRpb25FbmQgcGFyYSByZWNlYmVyIG5vdGlmaWNhw6fDtWVzIHF1YW5kbyBhIHJvdGEgbXVkYXIsIHNlcnZlIHBhcmEgYXR1YWxpemFyIGEgc2VsZcOnw6NvIGRvIG1lbnUgY29ycmV0YW1lbnRlXHJcbiAgICB0aGlzLl9yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLl9jdXN0b21NZW51U2VydmljZS5tZW51SXRlbXMgPSB0aGlzLl9jdXN0b21NZW51U2VydmljZS5tZW51Q29uZmlnLnVwZGF0ZVJvdXRlU2VsZWN0aW9uKHRoaXMuX3JvdXRlci51cmwsIHRoaXMuX2N1c3RvbU1lbnVTZXJ2aWNlLm1lbnVJdGVtcylcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghdGhpcy5fY3VzdG9tTWVudVNlcnZpY2UubWVudUR5bmFtaWMpIHtcclxuICAgICAgdGhpcy5fY3VzdG9tTWVudVNlcnZpY2UubWVudUNvbmZpZy5zZXRNZW51U3RhdGljKHRydWUpO1xyXG4gICAgICB0aGlzLl9jdXN0b21NZW51U2VydmljZS5tZW51SXRlbXMgPSB0aGlzLl9jdXN0b21NZW51U2VydmljZS5tZW51Q29uZmlnLmluaXRpYWxpemVNZW51KHRoaXMuX3JvdXRlci51cmwpO1xyXG5cclxuICAgICAgLy8gTcOpdG9kbyBjb20gY3VzdG9taXphw6fDtWVzIHBhcmEgaW5pY2lhbGl6YcOnw6NvIGRvIE1lbnUgRXN0w6F0aWNvXHJcbiAgICAgIHRoaXMuX2N1c3RvbU1lbnVTZXJ2aWNlLm1lbnVTdGF0aWNPbkluaXQoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBNw6l0b2RvIGNvbSBjdXN0b21pemHDp8O1ZXMgcGFyYSBpbmljaWFsaXphw6fDo28gZG8gTWVudSBEaW7Dom1pY29cclxuICAgICAgdGhpcy5fY3VzdG9tTWVudVNlcnZpY2UubWVudUR5bmFtaWNPbkluaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vbWVFc3RhYmVsZWNpbWVudG8gPSB0aGlzLl9hdXRoU3RvcmFnZVNlcnZpY2UuaW5mcmFFc3RhYk5vbWU7XHJcbiAgICB0aGlzLmZvb3RlclVzZXJOYW1lID0gdGhpcy5fYXV0aFN0b3JhZ2VTZXJ2aWNlLnVzZXJOYW1lO1xyXG5cclxuICAgIHRoaXMuY2hlY2tGb3JDYWNoZWRJbWFnZSgpO1xyXG5cclxuICAgIHRoaXMuZ2V0VXNlckVtYWlsKCk7XHJcbiAgfVxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IFBST1BFUlRJRVMgPD09PT09PT09PT1cclxuXHJcbiAgLy8gI3JlZ2lvbiBQUklWQVRFXHJcblxyXG4gIC8vIEVSSUNLOiB2b3UgbWFudGVyIGVzdGUgcG9yIGVucXVhbnRvIHBhcmEgcXVhbmRvIGZvciBuZWNlc3PDoXJpbyBlc3RhIGZ1bmNpb25hbGlkYWRlIGV1IGNvbnNpZ2EgcmVmYXrDqi1sYXMgc2VtIG11aXRvIHByb2JsZW1hXHJcbiAgQFZpZXdDaGlsZChcIm5vdGlmX21lbnVcIikgcHJpdmF0ZSBub3RpZl90ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8vICNyZWdpb24gUFVCTElDXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ21lbnVMaW5rJykgcHVibGljIG1lbnVMaW5rPzogSFRNTEFuY2hvckVsZW1lbnQ7XHJcbiAgQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgcHVibGljIGRlc2lyZWRDb250ZW50PzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IE1PREFMX0VTVEFCRUxFQ0lNRU5UTzogbnVtYmVyID0gMTtcclxuXHJcbiAgcHVibGljIG5vbWVFc3RhYmVsZWNpbWVudG86IHN0cmluZyA9ICdFc3RhYmVsZWNpbWVudG8gcGFkcsOjbyc7XHJcbiAgcHVibGljIHRpdGxlU3VibWVudTogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgc3VibWVudUxpc3Q6IChJU3VibWVudUl0ZW1TdHJ1Y3R1cmUgfCB1bmRlZmluZWQpW10gPSBbXTtcclxuXHJcbiAgcHVibGljIG1lc3NhZ2VJZkNsaWNrZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAvKiogRXN0YSB2YXJpw6F2ZWwgw6kgdXNhZGEgbmEgYWJlcnR1cmEgZG8gc3VibWVudSBlIGRvIHN1Ym1lbnUgc2VjdW5kw6FyaW8gcGFyYSBcclxuICAgICogcXVlIGEgZnVuw6fDo28gb25DbGlja2VkT3V0c2lkZSgpIHF1ZSBlc3TDoSBuYSBzZWd1bmRhIGRpdiBwcmluY2lwYWwgZG8gSFRNTCBkb1xyXG4gICAgKiBjb21wb25lbnRlIG7Do28gc2VqYSBhdGl2YWRhLCBwb2lzIHNlIGVsYSBmb3IgYXRpdmFkYSBlbGEgaXLDoSBmZWNoYXIgbyBtZW51XHJcbiAgICAqIGxhdGVyYWwsIGUgcXVhbmRvIHZhbW9zIGRvIHN1Ym1lbnUgcGFyYSBvIHN1Ym1lbnUgc2VjdW5kw6FyaW8gbsOjbyBxdWVyZW1vc1xyXG4gICAgKiBmZWNoYXIgbyBtZW51IGxhdGVyYWwsIGUgcXVhbmRvIHZhbW9zIGRvIHN1Ym1lbnUgc2VjdW5kw6FyaW8gcGFyYSBvIHN1Ym1lbnVcclxuICAgICogdGFtYsOpbSBuw6NvIHF1ZXJlbW9zIGZlY2hhciBvIG1lbnUgbGF0ZXJhbDtcclxuICAqL1xyXG4gIHB1YmxpYyBjbG9zZU1lbnU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKiogVXRpbGl6YWRhIGNvbW8gYSBmb250ZSBkYSBpbWFnZW0gZGUgcGVyZmlsIGRvIHVzdcOhcmlvIGxvZ2FkbyBubyBzaXN0ZW1hLiAqL1xyXG4gIHB1YmxpYyBmb290ZXJVc2VySW1nU3JjOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvKiogRW1haSBkbyB1c3XDoXJpbyBsb2dhZG8gcGFyYSBzZXIgZXhpYmlkbyBubyBwb3BvdmVyICovXHJcbiAgcHVibGljIGZvb3RlclVzZXJFbWFpbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgLyoqIE5vbWUgZG8gdXN1w6FyaW8gbG9nYWRvIHBhcmEgc2VyIGV4aWJpZG8gbm8gcm9kYXDDqSBkbyBtZW51LiAqL1xyXG4gIHB1YmxpYyBmb290ZXJVc2VyTmFtZTogc3RyaW5nID0gXCJVc3XDoXJpb1wiO1xyXG5cclxuICBwdWJsaWMgaXNQb3BvdmVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93QmFsbG9vbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblxyXG4gIC8vIHByb3ByaWVkYWRlcyBpbmljaWFkYXMgcXVhbmRvIHBhc3NhciBvIEN1c3RvbU1lbnVTZXJ2aWNlXHJcblxyXG4gIHB1YmxpYyBtZW51RHluYW1pYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBtZW51Q29uZmlnOiBNZW51Q29uZmlnU2VydmljZSA9IG5ldyBNZW51Q29uZmlnU2VydmljZTtcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiBQVUJMSUNcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBQUk9QRVJUSUVTIDw9PT09PT09PT09XHJcblxyXG4gIC8vICNyZWdpb24gPT09PT09PT09PT4gU0VSVklDRVMgPD09PT09PT09PT1cclxuXHJcbiAgLy8gI3JlZ2lvbiBHRVRcclxuICBwcml2YXRlIGdldEVzdGFiZWxlY2ltZW50b1Nlc3Npb24oZXN0YWJJRDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl9tZW51U2VydmljZXMuZ2V0RXN0YWJlbGVjaW1lbnRvU2Vzc2lvbihlc3RhYklEKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgdGhpcy5ub21lRXN0YWJlbGVjaW1lbnRvID0gcmVzcG9uc2UuSW5mcmFFc3RhYk5vbWU7XHJcbiAgICAgICAgdGhpcy5fYXV0aFN0b3JhZ2VTZXJ2aWNlLmluZnJhRW1wcmVzYUlkID0gcmVzcG9uc2UuSW5mcmFFbXByZXNhSWQ7XHJcbiAgICAgICAgdGhpcy5fYXV0aFN0b3JhZ2VTZXJ2aWNlLmluZnJhRW1wcmVzYU5vbWUgPSByZXNwb25zZS5JbmZyYUVtcHJlc2FOb21lO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogZXJyb3IgPT4ge1xyXG4gICAgICAgIC8vdGhpcy5fcHJvamVjdFV0aWxTZXJ2aWNlLnNob3dIdHRwRXJyb3IoZXJyb3IpOyBcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zaG93QWxlcnREYW5nZXIoZXJyb3IpO1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE1lbnVVc2VySW1nKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fbWVudVNlcnZpY2VzLmdldEltYWdlbU1lbnUoKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiByZXNwb25zZSA9PiB7IHRoaXMuZm9vdGVyVXNlckltZ1NyYyA9IHJlc3BvbnNlLkluZnJhVXN1YXJpb0ltZy5JbWFnZW07IH0sXHJcbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XHJcbiAgICAgICAgLy90aGlzLl9wcm9qZWN0VXRpbFNlcnZpY2Uuc2hvd0h0dHBFcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc2hvd0FsZXJ0RGFuZ2VyKGVycm9yKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFVzZXJFbWFpbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX21lbnVTZXJ2aWNlcy5nZXRVc3VhcmlvRW1haWwoKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiByZXNwb25zZSA9PiB7IHRoaXMuZm9vdGVyVXNlckVtYWlsID0gcmVzcG9uc2UuRW1haWw7IH0sXHJcbiAgICAgIGVycm9yOiBlcnJvciA9PiB7XHJcbiAgICAgICAgLy90aGlzLl9wcm9qZWN0VXRpbFNlcnZpY2Uuc2hvd0h0dHBFcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc2hvd0FsZXJ0RGFuZ2VyKGVycm9yKTtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uIEdFVFxyXG5cclxuICAvLyAjcmVnaW9uIFVQREFURVxyXG4gIHB1YmxpYyB1cGRhdGVMYXN0TG9nRXN0YWJlbGVjaW1lbnRvKGVzdGFiOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuX21lbnVTZXJ2aWNlcy51cGRhdGVMYXN0TG9nRXN0YWJJRChlc3RhYi5zcGxpdChcIiAtIFwiKVswXSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnNob3dBbGVydFN1Y2Nlc3MoJ0VzdGFiZWxlY2ltZW50byBhbHRlcmFkbyBjb20gc3VjZXNzbyEnKTtcclxuXHJcbiAgICAgICAgdGhpcy5nZXRFc3RhYmVsZWNpbWVudG9TZXNzaW9uKGVzdGFiLnNwbGl0KFwiIC0gXCIpWzBdKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLl9hdXRoU3RvcmFnZVNlcnZpY2UuaW5mcmFFc3RhYklkID0gZXN0YWIuc3BsaXQoXCIgLSBcIilbMF07XHJcbiAgICB0aGlzLl9hdXRoU3RvcmFnZVNlcnZpY2UuaW5mcmFFc3RhYk5vbWUgPSBlc3RhYi5zcGxpdChcIiAtIFwiKVsxXTtcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvbiBVUERBVEVcclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBTRVJWSUNFUyA8PT09PT09PT09PVxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IFVUSUxJVElFUyA8PT09PT09PT09PVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlUG9wb3ZlcigpIHsgdGhpcy5zaG93QmFsbG9vbiA9ICF0aGlzLnNob3dCYWxsb29uOyB9XHJcblxyXG4gIHB1YmxpYyBkcm9wZG93bldhc09wZW5lZCh2YWx1ZTogYm9vbGVhbik6IHZvaWQgeyB0aGlzLm1lc3NhZ2VJZkNsaWNrZWQubmV4dCh2YWx1ZSk7IH1cclxuXHJcbiAgcHVibGljIG9wZW5FeHBhbnNpYmxlTWVudShyZWY6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XHJcbiAgICByZWYuY2xhc3NMaXN0LnRvZ2dsZShcImNsb3NlZFwiKTtcclxuICAgIHJlZi5jbGFzc0xpc3QudG9nZ2xlKFwiY29sXCIpO1xyXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5zaWRlYmFyLWNvbnRyb2xcIik/LmNsYXNzTGlzdC50b2dnbGUoXCJjb2xcIik7XHJcblxyXG4gICAgLy8gTcOpdG9kbyBjb20gY3VzdG9taXphw6fDtWVzIHBhcmEgaW5pY2lhbGl6YcOnw6NvIGRvIE1lbnUgRXN0w6F0aWNvXHJcbiAgICB0aGlzLl9jdXN0b21NZW51U2VydmljZS5tZW51b3BlbkV4cGFuc2libGVNZW51KHJlZik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlblN1Ym1lbnUobWVudTogSU1lbnVJdGVtU3RydWN0dXJlLCByZWY6IEhUTUxEaXZFbGVtZW50LCBkZXNpcmVkTWVudTogVGVtcGxhdGVSZWY8YW55Pik6IHZvaWQge1xyXG5cclxuICAgIGlmIChtZW51LmNoaWxkcmVuICYmIG1lbnUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnRpdGxlU3VibWVudSA9IG1lbnUubGFiZWxcclxuICAgICAgdGhpcy5kZXNpcmVkQ29udGVudCA9IGRlc2lyZWRNZW51O1xyXG4gICAgICByZWYuY2xhc3NMaXN0LnJlbW92ZShcIm9wZW5lZC1ub3RpZi1zdWJcIik7XHJcblxyXG4gICAgICBpZiAodGhpcy5zdWJtZW51TGlzdCA9PT0gbWVudS5jaGlsZHJlbikge1xyXG4gICAgICAgIHRoaXMuY2xvc2VNZW51ID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoIXJlZi5jbGFzc0xpc3QuY29udGFpbnMoXCJvcGVuZWQtc3ViXCIpKSB7IHJlZi5jbGFzc0xpc3QudG9nZ2xlKFwib3BlbmVkLXN1YlwiKTsgfVxyXG4gICAgICB0aGlzLnN1Ym1lbnVMaXN0ID0gbWVudS5jaGlsZHJlbjtcclxuICAgIH1cclxuXHJcbiAgICBlbHNlIGlmICghbWVudS5jaGlsZHJlbiB8fCAobWVudS5jaGlsZHJlbiAmJiBtZW51LmNoaWxkcmVuLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLnN1Ym1lbnVMaXN0ID0gW107XHJcbiAgICAgIHJlZi5jbGFzc0xpc3QudG9nZ2xlKFwic2VsZWN0ZWRJdGVtXCIpO1xyXG4gICAgICB0aGlzLm9uQ2xpY2tlZE91dHNpZGUobmV3IEV2ZW50KFwiXCIpLCByZWYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gcHVibGljIG9uQ2xpY2tlZE91dHNpZGUoZTogRXZlbnQsIHJlZjogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcclxuICAvLyAgIHJlZi5jbGFzc0xpc3QucmVtb3ZlKFwib3BlbmVkLXN1YlwiKTtcclxuICAvLyAgIHRoaXMuc3VibWVudUxpc3QgPSBbXTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrZWRPdXRzaWRlKGU6IEV2ZW50LCByZWY6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XHJcbiAgICBpZiAocmVmKSB7XHJcbiAgICAgIHJlZi5jbGFzc0xpc3QucmVtb3ZlKFwib3BlbmVkLXN1YlwiKTtcclxuICAgICAgdGhpcy5zdWJtZW51TGlzdCA9IFtdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdyZWYgaXMgdW5kZWZpbmVkIG9yIG51bGwnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gTUVOVSBGT09URVIgVVNFUiBJTUFHRVxyXG4gIHByaXZhdGUgdmFsaWRhdGVDYWNoZWRJbWcoZm9vdGVySW1nOiBVc3VhcmlvX0lNRyB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIGxldCB1c3VhcmlvSWQ6IHN0cmluZyA9IHRoaXMuX2F1dGhTdG9yYWdlU2VydmljZS5pbmZyYVVzdWFyaW9JZDtcclxuXHJcbiAgICBpZiAoIWZvb3RlckltZyB8fCBmb290ZXJJbWcgPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIGlmICh1c3VhcmlvSWQgIT0gZm9vdGVySW1nLlVTVUFSSU9JRCkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgIHRoaXMuZm9vdGVyVXNlckltZ1NyYyA9IGZvb3RlckltZy5GSUxFO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0ZvckNhY2hlZEltYWdlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNBUElSZXF1ZXN0TmVlZGVkID0gdGhpcy52YWxpZGF0ZUNhY2hlZEltZyh0aGlzLl9tZW51U2VydmljZXMuZ2V0TWVudUZvb3RlckltZygpKTtcclxuICAgIGlmIChpc0FQSVJlcXVlc3ROZWVkZWQpIHsgdGhpcy5nZXRNZW51VXNlckltZygpOyB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb24gTUVOVSBGT09URVIgVVNFUiBJTUFHRVxyXG5cclxuICBwdWJsaWMgbG9nb3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYXV0aFNlcnZpY2UubG9nb3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0RXh0ZXJuYWxVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBgaHR0cHM6Ly9zaXNjYW5kZXN2Ni5zaXNwcm8uY29tLmJyL1Npc3Byb0VycENsb3VkLyR7dXJsfWA7XHJcbiAgfVxyXG5cclxuICAvLyAjZW5kcmVnaW9uID09PT09PT09PT0+IFVUSUxJVElFUyA8PT09PT09PT09PVxyXG5cclxuICAvLyAjcmVnaW9uID09PT09PT09PT0+IE1PREFMUyA8PT09PT09PT09PVxyXG5cclxuICAvKiogRnVuw6fDo28gc2ltcGxlcyBjb20gbyBvYmpldGl2byBkZSBhYnJpciBvcyBtb2RhaXMgbm8gY2VudHJvIGRhIHRlbGEuXHJcbiAgICogQHBhcmFtIHRlbXBsYXRlIFRlbXBsYXRlIEhUTUwgZG8gbW9kYWwgcXVlIHNlcsOhIGFiZXJ0by5cclxuICAgKiBAcGFyYW0gbW9kYWxJRCBJRCBkbyBtb2RhbCBxdWUgc2Vyw6EgYWJlcnRvLCBwYXJhIHF1ZSBwb3NzYSBzZXIgcmVmZXJlbmNpYWRvIGRlcG9pcy5cclxuICAqL1xyXG4gIG9wZW5Nb2RhbCh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiwgbW9kYWxJRDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9ic01vZGFsU2VydmljZS5zaG93KHRlbXBsYXRlLCB7XHJcbiAgICAgIGNsYXNzOiAnbW9kYWwtZGlhbG9nLWNlbnRlcmVkIG1vZGFsLWxnJyxcclxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogZmFsc2UsXHJcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcclxuICAgICAgaWQ6IG1vZGFsSURcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEZ1bsOnw6NvIHNpbXBsZXMgY29tIG8gb2JqZXRpdm8gZGUgZmVjaGFyIG9zIG1vZGFpcyBxdWUgZXN0aXZlcmVtIGFiZXJ0b3MgKGJhc2VhZG9zIHBlbG8gSUQpLlxyXG4gICAqIEBwYXJhbSBtb2RhbElEIElEIGRvIG1vZGFsIHF1ZSBzZXLDoSBmZWNoYWRvLlxyXG4gICAqL1xyXG4gIGNsb3NlTW9kYWwobW9kYWxJRDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9ic01vZGFsU2VydmljZS5oaWRlKG1vZGFsSUQpO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBNT0RBTFMgPD09PT09PT09PT1cclxuXHJcbn1cclxuIiwiPCEtLSAjcmVnaW9uIE1BSU4gQ09OVEVOVCAtLT5cclxuPGRpdiBjbGFzcz1cIm1haW4gY29sLTEyXCI+XHJcblxyXG4gIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMHZoOyB6LWluZGV4OiAzO1wiIGNsYXNzPVwic2lkZWJhci1jb250cm9sIHBvc2l0aW9uLXJlbGF0aXZlIGQtZmxleCBmbGV4LXJvd1wiIFxyXG4gICAgKGNsaWNrT3V0c2lkZSk9XCJjbG9zZU1lbnUgPT0gdHJ1ZSA/IG9uQ2xpY2tlZE91dHNpZGUoJGV2ZW50LCBzdWJtZW51X3JlZikgOiBjbG9zZU1lbnUgPSB0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2lkZWJhciB7e19jdXN0b21NZW51U2VydmljZS50aGVtZUNvbG9yfX0gY2xvc2VkXCIgI3NpZGViYXI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWhlYWRlclwiPlxyXG4gICAgICAgIDx1bD5cclxuICAgICAgICAgIDxsaSBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28taGFtYnVyZ3VlclwiPlxyXG4gICAgICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2xvZ290aXBvLXNpc3Byby5zdmdcIiBhbHQ9XCJsb2dvLXNpc3Byb1wiIGNsYXNzPVwibG9nby1zaXNwcm9cIiB0aXRsZT1cImxvZ29cIiB3aWR0aD1cIjEzNnB4XCIgaGVpZ2h0PVwiNDhweFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24taGFtYnVyZ3VlclwiIChjbGljayk9XCJvcGVuRXhwYW5zaWJsZU1lbnUoc2lkZWJhcilcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL21lbnUuc3ZnXCIgYWx0PVwibWVudSBoYW1idXJndWVyXCI+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuXHJcbiAgICAgICAgICA8IS0tICNyZWdpb24gTcOTRFVMT1MgLS0+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJtYi0zXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4OyBtYXJnaW4tcmlnaHQ6IDhweFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZHJvcGRvd25XYXNPcGVuZWQodHJ1ZSlcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkcm9wZG93bi1idXR0b25cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJcclxuICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGRhdGEtYnMtYXV0by1jbG9zZT1cIm91dHNpZGVcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiX2N1c3RvbU1lbnVTZXJ2aWNlLm1vZHVsZUltZyAhPSAnJzsgZWxzZSBtb2R1bGVTVkdcIiBbc3JjXT1cIl9jdXN0b21NZW51U2VydmljZS5tb2R1bGVJbWdcIiBhbHQ9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcy0yXCI+IHt7IHRoaXMuX2N1c3RvbU1lbnVTZXJ2aWNlLm1vZHVsZU5hbWUgfX0gPGxpYi1pY29uIGljb25OYW1lPVwic2V0YS1kaXJlaXRhXCIgaWNvbkNvbG9yPVwid2hpdGVcIiAvPiA8L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21vZHVsZVNWRz5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLWljb24gaWNvbkNvbG9yPVwid2hpdGVcIiBbaWNvbk5hbWVdPVwiX2N1c3RvbU1lbnVTZXJ2aWNlLm1vZHVsZVN2Z1wiLz5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgI2Ryb3Bkb3duX3JlZj5cclxuICAgICAgICAgICAgICAgIDxhcHAtcHJpbWFyeS1kcm9wZG93biBbYnV0dG9uV2FzQ2xpY2tlZF09XCJtZXNzYWdlSWZDbGlja2VkXCI+PC9hcHAtcHJpbWFyeS1kcm9wZG93bj5cclxuICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICA8IS0tICNlbmRyZWdpb24gTcOTRFVMT1MgLS0+XHJcblxyXG4gICAgICAgICAgPCEtLSAjcmVnaW9uIEVTVEFCRUxFQ0lNRU5UT1MgLS0+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJteC0zXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1lc3RhYmVsZWNpbWVudG9cIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGJnLXRyYW5zcGFyZW50IGJvcmRlci0wXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuTW9kYWwobW9kYWxFc3RhYmVsZWNpbWVudG8sIE1PREFMX0VTVEFCRUxFQ0lNRU5UTylcIlxyXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiIXNpZGViYXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKSA/ICcnIDogbm9tZUVzdGFiZWxlY2ltZW50b1wiIHBsYWNlbWVudD1cInJpZ2h0XCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxpYi1pY29uIGNsYXNzPVwiY29sLTFcIiBpY29uTmFtZT1cInByZWRpb1wiIGljb25Db2xvcj1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXNpZGViYXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKVwiIGNsYXNzPVwiY29sLTkgcHMtMiBnbGItdGV4dC13aWR0aC0xNjAgdGV4dC1zdGFydCB0ZXh0LXRydW5jYXRlXCI+IHt7IG5vbWVFc3RhYmVsZWNpbWVudG8gfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGxpYi1pY29uICpuZ0lmPVwiIXNpZGViYXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKVwiIGNsYXNzPVwiY29sLTFcIiBpY29uTmFtZT1cInNldGEtZGlyZWl0YVwiIGljb25Db2xvcj1cIndoaXRlXCIgLz5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIEVTVEFCRUxFQ0lNRU5UT1MgLS0+XHJcblxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gI3JlZ2lvbiBNRU5VUyBERSBOQVZFR0HDh8ODTyAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1haW4tbWVudVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LW1lbnUgcHgtMiBwYi0xXCI+XHJcblxyXG4gICAgICAgICAgICA8IS0tICNyZWdpb24gTUVOVSBESU7Dgk1JQ08gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLW1lbnVcIj5cclxuICAgICAgICAgICAgICA8dWwgI2R5bmFtaWNfbWVudV9pdGVtcyAqbmdJZj1cIl9jdXN0b21NZW51U2VydmljZS5tZW51SXRlbXM7IGVsc2UgaXNMb2FkaW5nXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBtZW51SXRlbSBvZiBfY3VzdG9tTWVudVNlcnZpY2UubWVudUl0ZW1zOyBsZXQgaSA9IGluZGV4XCIgXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC0xIHJvdW5kZWRcIiBcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TdWJtZW51KG1lbnVJdGVtLCBzdWJtZW51X3JlZiwgZHluYW1pY19tZW51KVwiIFxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRJdGVtXT1cIm1lbnVJdGVtLmlzU2VsZWN0ZWRcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxhICpuZ0lmPVwiIW1lbnVJdGVtLmlzRXh0ZXJuYWw7IGVsc2UgZXh0ZXJuYWxNZW51XCJcclxuICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJtZW51SXRlbS5yb3V0ZSAhPSAnJyA/IG1lbnVJdGVtLnJvdXRlIDogbnVsbFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCInaXRlbScgKyBtZW51SXRlbS5pZFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIiFzaWRlYmFyLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykgPyAnJyA6IG1lbnVJdGVtLmxhYmVsXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiIGNsYXNzPVwidy0xMDAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBidXR0b24taWNvbnMgdGV4dC1kZWNvcmF0aW9uLW5vbmUgcC0xIGdsYi1jdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJzaWRlYmFyLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJykgPyAnanVzdGlmeS1jb250ZW50LWNlbnRlcicgOiAnanVzdGlmeS1jb250ZW50LWJldHdlZW4nXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxsaWItaWNvbiAqbmdJZj1cIiFtZW51SXRlbS5pY29uLmluY2x1ZGVzKCdhc3NldHMvaWNvbnMnKTsgZWxzZSBpY29uSW1nXCIgW2ljb25OYW1lXT1cIm1lbnVJdGVtLmljb25cIiBpY29uQ29sb3I9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Bhbi1tYWluXCI+e3sgbWVudUl0ZW0ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25JbWc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJtZW51SXRlbS5pY29uXCIgW2FsdF09XCInaWNvbmU6ICcgKyBtZW51SXRlbS5sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bGliLWljb24gKm5nSWY9XCIobWVudUl0ZW0uY2hpbGRyZW4gJiYgbWVudUl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkgJiYgIXNpZGViYXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9XCJzZXRhLWRpcmVpdGFcIiBpY29uQ29sb3I9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNleHRlcm5hbE1lbnU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiZ2V0RXh0ZXJuYWxVcmwobWVudUl0ZW0ucm91dGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIidpdGVtJyArIG1lbnVJdGVtLmlkXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCIhc2lkZWJhci5jbGFzc0xpc3QuY29udGFpbnMoJ2Nsb3NlZCcpID8gJycgOiBtZW51SXRlbS5sYWJlbFwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiIGNsYXNzPVwidy0xMDAgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBidXR0b24taWNvbnMgdGV4dC1kZWNvcmF0aW9uLW5vbmUgcC0xIGdsYi1jdXJzb3ItcG9pbnRlclwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cInNpZGViYXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdjbG9zZWQnKSA/ICdqdXN0aWZ5LWNvbnRlbnQtY2VudGVyJyA6ICdqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbidcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItaWNvbiAqbmdJZj1cIiFtZW51SXRlbS5pY29uLmluY2x1ZGVzKCdhc3NldHMvaWNvbnMnKTsgZWxzZSBpY29uSW1nRXh0ZXJuYWxcIiBbaWNvbk5hbWVdPVwibWVudUl0ZW0uaWNvblwiIGljb25Db2xvcj1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNwYW4tbWFpblwiPnt7IG1lbnVJdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ljb25JbWdFeHRlcm5hbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwibWVudUl0ZW0uaWNvblwiIFthbHRdPVwiJ2ljb25lOiAnICsgbWVudUl0ZW0ubGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpYi1pY29uICpuZ0lmPVwiKG1lbnVJdGVtLmNoaWxkcmVuICYmIG1lbnVJdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApICYmICFzaWRlYmFyLmNsYXNzTGlzdC5jb250YWlucygnY2xvc2VkJylcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5hbWU9XCJzZXRhLWRpcmVpdGFcIiBpY29uQ29sb3I9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG5cclxuICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaXNMb2FkaW5nPlxyXG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIG10LTJcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9saT5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPCEtLSAjZW5kcmVnaW9uIE1FTlUgRElOw4JNSUNPIC0tPlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIE1FTlVTIERFIE5BVkVHQcOHw4NPIC0tPlxyXG5cclxuICAgICAgPCEtLSAjcmVnaW9uIEZPT1RFUiAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1tZW51XCIgKG1vdXNlZW50ZXIpPVwic2hvd0JhbGxvb24gPSB0cnVlXCIgKG1vdXNlbGVhdmUpPVwic2hvd0JhbGxvb24gPSBmYWxzZVwiXHJcbiAgICAgICAgW3BvcG92ZXJdPVwicG9wb3ZlckNvbnRlbnRcIiBwbGFjZW1lbnQ9XCJyaWdodCBib3R0b21cIiBbb3V0c2lkZUNsaWNrXT1cInRydWVcIiBjb250YWluZXJDbGFzcz1cIndpZHRoOiAyMDBweFwiID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWNvbXBvbmVudHMgcHMtMSBwdC0yXCIgW2NsYXNzLm9wZW5dPVwic2hvd0JhbGxvb25cIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJmb290ZXJVc2VySW1nU3JjOyBlbHNlIG5vVXNlckltZ1wiIGNsYXNzPVwicGhvdG8tcHJvZmlsZSBtcy0xXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cIlsnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgZm9vdGVyVXNlckltZ1NyY11cIiBhbHQ9XCJmb3RvLXBlcmZpbFwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vVXNlckltZz5cclxuICAgICAgICAgICAgICA8bGliLWljb24gaWNvbk5hbWU9XCJjb250cmFwYXJ0ZVwiIGljb25Db2xvcj1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImdsYi10ZXh0LXdpZHRoLTEyMCB3LWF1dG8gZnctYm9sZCB0ZXh0LXN0YXJ0IHRleHQtdHJ1bmNhdGUgbXMtMSBtZS0xXCI+XHJcbiAgICAgICAgICAgICAge3sgZm9vdGVyVXNlck5hbWUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICBcclxuICAgICAgPG5nLXRlbXBsYXRlICNwb3BvdmVyQ29udGVudD5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLW1lbnVcIiBzdHlsZT1cIndpZHRoOiAxMDAwcHg7XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPiBcclxuICAgICAgICAgICAgPGltZyAqbmdJZj1cImZvb3RlclVzZXJJbWdTcmM7IGVsc2Ugbm9Vc2VySW1nXCIgY2xhc3M9XCJwaG90by1wcm9maWxlXCJcclxuICAgICAgICAgICAgICBbc3JjXT1cIlsnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgZm9vdGVyVXNlckltZ1NyY11cIiBhbHQ9XCJmb3RvLXBlcmZpbFwiPiBcclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub1VzZXJJbWc+XHJcbiAgICAgICAgICAgICAgPGxpYi1pY29uIGljb25OYW1lPVwiY29udHJhcGFydGVcIiBpY29uQ29sb3I9XCJ3aGl0ZVwiLz5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBtcy0xXCI+IFxyXG4gICAgICAgICAgICAgIDxkaXYgW3Rvb2x0aXBdPVwiZm9vdGVyVXNlck5hbWVcIiBjbGFzcz1cImR5bmFtaWMtY29udGFpbmVyXCIgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwOyBmbGV4LWdyb3c6IDE7bWF4LXdpZHRoOiAyMDBweDsgZm9udC1zaXplOiAxNnB4O1wiPnt7Zm9vdGVyVXNlck5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgW3Rvb2x0aXBdPVwiZm9vdGVyVXNlckVtYWlsXCIgY2xhc3M9XCJkeW5hbWljLWNvbnRhaW5lclwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IG5vd3JhcDsgZm9udC1zaXplOiAxMnB4OyBmbGV4LWdyb3c6IDE7bWF4LXdpZHRoOiAyMDBweDtcIj57e2Zvb3RlclVzZXJFbWFpbH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGhyIGNsYXNzPVwibWItMiBtdC0yXCI+XHJcbiAgICAgICAgPGRpdiByb3V0ZXJMaW5rPVwibWV1LXBlcmZpbFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJ0b2dnbGVQb3BvdmVyKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgPGxpYi1pY29uIFtpY29uU2l6ZV09XCInc21hbGwnXCIgaWNvbk5hbWU9XCJjb250cmFwYXJ0ZVwiLz4gTWV1IFBlcmZpbFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKGNsaWNrKT1cImxvZ291dCgpXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgICA8bGliLWljb24gW2ljb25TaXplXT1cIidzbWFsbCdcIiAgaWNvbk5hbWU9XCJsb2dvdXRcIi8+IFNhaXJcclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPCEtLSAjZW5kcmVnaW9uIEZPT1RFUiAtLT5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic3VibWVudVwiICNzdWJtZW51X3JlZj5cclxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImRlc2lyZWRDb250ZW50ICE9PSBudWxsXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkZXNpcmVkQ29udGVudCE7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHN1Ym1lbnVMaXN0fVwiPjwvbmctY29udGVudD5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIFxyXG4gIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRlbnQgY29sIGQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1jb250ZW50LWJldHdlZW5cIiBpZD1cImJvZHktY29udGVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGFwcC1mb290ZXI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Rpdj5cclxuPCEtLSAjZW5kcmVnaW9uIE1BSU4gQ09OVEVOVCAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBURU1QTEFURVMgLS0+XHJcbjwhLS0gdGVtIHF1ZSBwZXJndW50YXIgcHJvIEVyaWNrIC0tPlxyXG48IS0tIFtzdWJtZW51UmVmXT1cInN1Ym1lbnVfcmVmXCIgIC0tPlxyXG48bmctdGVtcGxhdGUgI2R5bmFtaWNfbWVudSBsZXQtZGF0YT5cclxuICA8YXBwLWR5bmFtaWMtbWVudSBcclxuICAgIFtzdWJtZW51TGlzdF09XCJkYXRhXCJcclxuICAgIFt0aXRsZVN1Ym1lbnVdPVwidGl0bGVTdWJtZW51XCJcclxuICAgIFtzdWJtZW51UmVmXT1cInN1Ym1lbnVfcmVmXCJcclxuICAgIFtyZWNlYmVQYXJhbV09XCJvbkNsaWNrZWRPdXRzaWRlLmJpbmQodGhpcylcIj5cclxuICA8L2FwcC1keW5hbWljLW1lbnU+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI25vdGlmX21lbnU+XHJcbiAgPGFwcC1ub3RpZi1zdWJtZW51PjwvYXBwLW5vdGlmLXN1Ym1lbnU+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tICNyZWdpb24gTU9EQUwgU0VMRUNBTyBFU1RBQkVMRUNJTUVOVE8gLS0+XHJcbjxuZy10ZW1wbGF0ZSAjbW9kYWxFc3RhYmVsZWNpbWVudG8+XHJcbiAgPHNlbGVjYW8tZXN0YWJlbGVjaW1lbnRvcy1tb2RhbCAob25DbG9zZSk9XCJjbG9zZU1vZGFsKE1PREFMX0VTVEFCRUxFQ0lNRU5UTylcIlxyXG4gICAgKG9uU2VsZWN0ZWQpPVwiY2xvc2VNb2RhbChNT0RBTF9FU1RBQkVMRUNJTUVOVE8pOyB1cGRhdGVMYXN0TG9nRXN0YWJlbGVjaW1lbnRvKCRldmVudCk7XCI+PC9zZWxlY2FvLWVzdGFiZWxlY2ltZW50b3MtbW9kYWw+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gI2VuZHJlZ2lvbiBNT0RBTCBTRUxFQ0FPIEVTVEFCRUxFQ0lNRU5UTyAtLT5cclxuXHJcbjwhLS0gI2VuZHJlZ2lvbiBURU1QTEFURVMgLS0+XHJcbiJdfQ==