@yelon/bis 15.1.2 → 15.2.1

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 (73) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +23 -23
  3. package/esm2020/bis.mjs +4 -4
  4. package/esm2020/index.mjs +1 -1
  5. package/esm2020/layout/bis.config.mjs +10 -10
  6. package/esm2020/layout/html-names.mjs +33 -0
  7. package/esm2020/layout/icon/style-icons.mjs +795 -795
  8. package/esm2020/layout/layout-basic/index.mjs +2 -2
  9. package/esm2020/layout/layout-basic/interface.mjs +6 -6
  10. package/esm2020/layout/layout-basic/layout-basic.component.mjs +356 -332
  11. package/esm2020/layout/layout-nav/index.mjs +4 -4
  12. package/esm2020/layout/layout-nav/layout-nav-application.component.mjs +327 -283
  13. package/esm2020/layout/layout-nav/layout-nav-group.component.mjs +124 -120
  14. package/esm2020/layout/layout-nav/layout-nav-tile.component.mjs +14 -14
  15. package/esm2020/layout/layout-nav/types.mjs +1 -1
  16. package/esm2020/layout/layout.mjs +4 -4
  17. package/esm2020/layout/public_api.mjs +13 -12
  18. package/esm2020/layout/widgets/index.mjs +6 -6
  19. package/esm2020/layout/widgets/yunzai-clear-storage.component.mjs +44 -44
  20. package/esm2020/layout/widgets/yunzai-fullscreen.component.mjs +44 -44
  21. package/esm2020/layout/widgets/yunzai-i18n.component.mjs +146 -142
  22. package/esm2020/layout/widgets/yunzai-notify.component.mjs +182 -182
  23. package/esm2020/layout/widgets/yunzai-theme-btn.component.mjs +201 -195
  24. package/esm2020/layout/widgets/yunzai-user.component.mjs +130 -116
  25. package/esm2020/layout/yunzai-act.guard.mjs +106 -106
  26. package/esm2020/layout/yunzai-auth.service.mjs +169 -167
  27. package/esm2020/layout/yunzai-default.interceptor.mjs +208 -208
  28. package/esm2020/layout/yunzai-i18n.service.mjs +130 -130
  29. package/esm2020/layout/yunzai-lang.mjs +113 -113
  30. package/esm2020/layout/yunzai-layout.module.mjs +75 -75
  31. package/esm2020/layout/yunzai-startup.service.mjs +156 -156
  32. package/esm2020/public_api.mjs +1 -1
  33. package/fesm2015/bis.mjs +6 -6
  34. package/fesm2015/layout.mjs +3232 -3101
  35. package/fesm2015/layout.mjs.map +1 -1
  36. package/fesm2020/bis.mjs +6 -6
  37. package/fesm2020/layout.mjs +3240 -3109
  38. package/fesm2020/layout.mjs.map +1 -1
  39. package/index.d.ts +1 -1
  40. package/index.less +1 -1
  41. package/layout/bis.config.d.ts +3 -3
  42. package/layout/html-names.d.ts +31 -0
  43. package/layout/icon/style-icons.d.ts +1 -1
  44. package/layout/index.d.ts +5 -5
  45. package/layout/layout-basic/index.d.ts +2 -2
  46. package/layout/layout-basic/interface.d.ts +24 -24
  47. package/layout/layout-basic/layout-basic.component.d.ts +32 -32
  48. package/layout/layout-nav/index.d.ts +4 -4
  49. package/layout/layout-nav/layout-nav-application.component.d.ts +27 -27
  50. package/layout/layout-nav/layout-nav-group.component.d.ts +17 -17
  51. package/layout/layout-nav/layout-nav-tile.component.d.ts +6 -6
  52. package/layout/layout-nav/types.d.ts +15 -15
  53. package/layout/public_api.d.ts +12 -11
  54. package/layout/style/index.less +154 -154
  55. package/layout/widgets/index.d.ts +6 -6
  56. package/layout/widgets/yunzai-clear-storage.component.d.ts +11 -11
  57. package/layout/widgets/yunzai-fullscreen.component.d.ts +8 -8
  58. package/layout/widgets/yunzai-i18n.component.d.ts +21 -21
  59. package/layout/widgets/yunzai-notify.component.d.ts +30 -30
  60. package/layout/widgets/yunzai-theme-btn.component.d.ts +32 -32
  61. package/layout/widgets/yunzai-user.component.d.ts +28 -28
  62. package/layout/yunzai-act.guard.d.ts +22 -22
  63. package/layout/yunzai-auth.service.d.ts +21 -21
  64. package/layout/yunzai-default.interceptor.d.ts +27 -27
  65. package/layout/yunzai-i18n.service.d.ts +33 -33
  66. package/layout/yunzai-lang.d.ts +11 -11
  67. package/layout/yunzai-layout.module.d.ts +21 -21
  68. package/layout/yunzai-startup.service.d.ts +37 -37
  69. package/package.json +47 -47
  70. package/public_api.d.ts +2 -2
  71. package/theme-compact.less +3 -3
  72. package/theme-dark.less +46 -46
  73. package/theme-default.less +46 -46
@@ -1,142 +1,146 @@
1
- import { __decorate } from "tslib";
2
- import { DOCUMENT } from '@angular/common';
3
- import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
4
- import { Subject, takeUntil } from 'rxjs';
5
- import { YUNZAI_I18N_TOKEN } from '@yelon/theme';
6
- import { InputBoolean } from '@yelon/util/decorator';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@yelon/theme";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "ng-zorro-antd/core/transition-patch";
11
- import * as i4 from "ng-zorro-antd/menu";
12
- import * as i5 from "ng-zorro-antd/dropdown";
13
- import * as i6 from "ng-zorro-antd/icon";
14
- import * as i7 from "../yunzai-i18n.service";
15
- export class YunzaiI18NComponent {
16
- get curLangCode() {
17
- return this.settings.layout.lang;
18
- }
19
- constructor(settings, i18n, doc) {
20
- this.settings = settings;
21
- this.i18n = i18n;
22
- this.doc = doc;
23
- this.destroy$ = new Subject();
24
- /** Whether to display language text */
25
- this.showLangText = true;
26
- this.langs = [];
27
- this.i18n
28
- .getLangs()
29
- .pipe(takeUntil(this.destroy$))
30
- .subscribe(langs => {
31
- this.langs = langs;
32
- });
33
- }
34
- change(lang) {
35
- const spinEl = this.doc.createElement('div');
36
- spinEl.setAttribute('class', `page-loading ant-spin ant-spin-lg ant-spin-spinning`);
37
- spinEl.innerHTML = `<span class="ant-spin-dot ant-spin-dot-spin"><i></i><i></i><i></i><i></i></span>`;
38
- this.doc.body.appendChild(spinEl);
39
- this.i18n.loadLangData(lang).subscribe(res => {
40
- this.i18n.use(lang, res);
41
- this.settings.setLayout('lang', lang);
42
- setTimeout(() => this.doc.location.reload());
43
- });
44
- }
45
- ngOnDestroy() {
46
- this.destroy$.complete();
47
- }
48
- }
49
- YunzaiI18NComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: YunzaiI18NComponent, deps: [{ token: i1.SettingsService }, { token: YUNZAI_I18N_TOKEN }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
50
- YunzaiI18NComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.0", type: YunzaiI18NComponent, selector: "yunzai-i18n", inputs: { showLangText: "showLangText" }, ngImport: i0, template: `
51
- <div *ngIf="showLangText" nz-dropdown [nzDropdownMenu]="langMenu" nzPlacement="bottomRight">
52
- <i nz-icon nzType="global"></i>
53
- {{ 'lang.nav' | i18n }}
54
- <i nz-icon nzType="down"></i>
55
- </div>
56
- <i
57
- *ngIf="!showLangText"
58
- nz-dropdown
59
- [nzDropdownMenu]="langMenu"
60
- nzPlacement="bottomRight"
61
- nz-icon
62
- nzType="global"
63
- ></i>
64
- <nz-dropdown-menu #langMenu="nzDropdownMenu">
65
- <ul nz-menu>
66
- <li
67
- nz-menu-item
68
- *ngFor="let item of langs"
69
- [nzSelected]="item.code === curLangCode"
70
- (click)="change(item.code)"
71
- >
72
- <span *ngIf="!item.icon" role="img" [attr.aria-label]="item.text" class="pr-xs">{{ item.abbr }}</span>
73
- <img
74
- *ngIf="item.icon"
75
- style="margin-right:4px"
76
- width="50px"
77
- height="30px"
78
- [src]="'data:image/png;base64,' + item.icon"
79
- [alt]="item.abbr"
80
- class="pr-xs"
81
- />
82
- {{ item.text }}
83
- </li>
84
- </ul>
85
- </nz-dropdown-menu>
86
- `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "directive", type: i4.NzMenuItemDirective, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i5.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i5.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i6.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "pipe", type: i1.I18nPipe, name: "i18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
87
- __decorate([
88
- InputBoolean()
89
- ], YunzaiI18NComponent.prototype, "showLangText", void 0);
90
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImport: i0, type: YunzaiI18NComponent, decorators: [{
91
- type: Component,
92
- args: [{
93
- selector: 'yunzai-i18n',
94
- template: `
95
- <div *ngIf="showLangText" nz-dropdown [nzDropdownMenu]="langMenu" nzPlacement="bottomRight">
96
- <i nz-icon nzType="global"></i>
97
- {{ 'lang.nav' | i18n }}
98
- <i nz-icon nzType="down"></i>
99
- </div>
100
- <i
101
- *ngIf="!showLangText"
102
- nz-dropdown
103
- [nzDropdownMenu]="langMenu"
104
- nzPlacement="bottomRight"
105
- nz-icon
106
- nzType="global"
107
- ></i>
108
- <nz-dropdown-menu #langMenu="nzDropdownMenu">
109
- <ul nz-menu>
110
- <li
111
- nz-menu-item
112
- *ngFor="let item of langs"
113
- [nzSelected]="item.code === curLangCode"
114
- (click)="change(item.code)"
115
- >
116
- <span *ngIf="!item.icon" role="img" [attr.aria-label]="item.text" class="pr-xs">{{ item.abbr }}</span>
117
- <img
118
- *ngIf="item.icon"
119
- style="margin-right:4px"
120
- width="50px"
121
- height="30px"
122
- [src]="'data:image/png;base64,' + item.icon"
123
- [alt]="item.abbr"
124
- class="pr-xs"
125
- />
126
- {{ item.text }}
127
- </li>
128
- </ul>
129
- </nz-dropdown-menu>
130
- `,
131
- changeDetection: ChangeDetectionStrategy.OnPush
132
- }]
133
- }], ctorParameters: function () { return [{ type: i1.SettingsService }, { type: i7.YunzaiI18NService, decorators: [{
134
- type: Inject,
135
- args: [YUNZAI_I18N_TOKEN]
136
- }] }, { type: undefined, decorators: [{
137
- type: Inject,
138
- args: [DOCUMENT]
139
- }] }]; }, propDecorators: { showLangText: [{
140
- type: Input
141
- }] } });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXVuemFpLWkxOG4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYmlzL2xheW91dC93aWRnZXRzL3l1bnphaS1pMThuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQW1DLE1BQU0sY0FBYyxDQUFDO0FBQ2xGLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7OztBQTZDbkUsTUFBTSxPQUFPLG1CQUFtQjtJQVE5QixJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFDVSxRQUF5QixFQUNFLElBQXVCLEVBQ2hDLEdBQVE7UUFGMUIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDRSxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUNoQyxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBYjVCLGFBQVEsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMvQyx1Q0FBdUM7UUFDZCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUU3QyxVQUFLLEdBQXFCLEVBQUUsQ0FBQztRQVczQixJQUFJLENBQUMsSUFBSTthQUNOLFFBQVEsRUFBRTthQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBWTtRQUNqQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsa0ZBQWtGLENBQUM7UUFDdEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7O2dIQXhDVSxtQkFBbUIsaURBY3BCLGlCQUFpQixhQUNqQixRQUFRO29HQWZQLG1CQUFtQiw2RkF2Q3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ1Q7QUFPd0I7SUFBZixZQUFZLEVBQUU7eURBQXFCOzJGQUpsQyxtQkFBbUI7a0JBekMvQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7OzBCQWVJLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxRQUFROzRDQVhPLFlBQVk7c0JBQXBDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBZVU5aQUlfSTE4Tl9UT0tFTiwgU2V0dGluZ3NTZXJ2aWNlLCBZdW56YWlJMThOVHlwZSB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIElucHV0Qm9vbGVhbiB9IGZyb20gJ0B5ZWxvbi91dGlsL2RlY29yYXRvcic7XG5cbmltcG9ydCB7IFl1bnphaUkxOE5TZXJ2aWNlIH0gZnJvbSAnLi4veXVuemFpLWkxOG4uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l1bnphaS1pMThuJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICpuZ0lmPVwic2hvd0xhbmdUZXh0XCIgbnotZHJvcGRvd24gW256RHJvcGRvd25NZW51XT1cImxhbmdNZW51XCIgbnpQbGFjZW1lbnQ9XCJib3R0b21SaWdodFwiPlxuICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJnbG9iYWxcIj48L2k+XG4gICAgICB7eyAnbGFuZy5uYXYnIHwgaTE4biB9fVxuICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJkb3duXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxpXG4gICAgICAqbmdJZj1cIiFzaG93TGFuZ1RleHRcIlxuICAgICAgbnotZHJvcGRvd25cbiAgICAgIFtuekRyb3Bkb3duTWVudV09XCJsYW5nTWVudVwiXG4gICAgICBuelBsYWNlbWVudD1cImJvdHRvbVJpZ2h0XCJcbiAgICAgIG56LWljb25cbiAgICAgIG56VHlwZT1cImdsb2JhbFwiXG4gICAgPjwvaT5cbiAgICA8bnotZHJvcGRvd24tbWVudSAjbGFuZ01lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgPHVsIG56LW1lbnU+XG4gICAgICAgIDxsaVxuICAgICAgICAgIG56LW1lbnUtaXRlbVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxhbmdzXCJcbiAgICAgICAgICBbbnpTZWxlY3RlZF09XCJpdGVtLmNvZGUgPT09IGN1ckxhbmdDb2RlXCJcbiAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlKGl0ZW0uY29kZSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXRlbS5pY29uXCIgcm9sZT1cImltZ1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiaXRlbS50ZXh0XCIgY2xhc3M9XCJwci14c1wiPnt7IGl0ZW0uYWJiciB9fTwvc3Bhbj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDo0cHhcIlxuICAgICAgICAgICAgd2lkdGg9XCI1MHB4XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjMwcHhcIlxuICAgICAgICAgICAgW3NyY109XCInZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyBpdGVtLmljb25cIlxuICAgICAgICAgICAgW2FsdF09XCJpdGVtLmFiYnJcIlxuICAgICAgICAgICAgY2xhc3M9XCJwci14c1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICB7eyBpdGVtLnRleHQgfX1cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9uei1kcm9wZG93bi1tZW51PlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBZdW56YWlJMThOQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX3Nob3dMYW5nVGV4dDogQm9vbGVhbklucHV0O1xuICBwcml2YXRlIGRlc3Ryb3kkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAvKiogV2hldGhlciB0byBkaXNwbGF5IGxhbmd1YWdlIHRleHQgKi9cbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIHNob3dMYW5nVGV4dCA9IHRydWU7XG5cbiAgbGFuZ3M6IFl1bnphaUkxOE5UeXBlW10gPSBbXTtcblxuICBnZXQgY3VyTGFuZ0NvZGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5sYXlvdXQubGFuZztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2V0dGluZ3M6IFNldHRpbmdzU2VydmljZSxcbiAgICBASW5qZWN0KFlVTlpBSV9JMThOX1RPS0VOKSBwcml2YXRlIGkxOG46IFl1bnphaUkxOE5TZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnlcbiAgKSB7XG4gICAgdGhpcy5pMThuXG4gICAgICAuZ2V0TGFuZ3MoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShsYW5ncyA9PiB7XG4gICAgICAgIHRoaXMubGFuZ3MgPSBsYW5ncztcbiAgICAgIH0pO1xuICB9XG5cbiAgY2hhbmdlKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNwaW5FbCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNwaW5FbC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgYHBhZ2UtbG9hZGluZyBhbnQtc3BpbiBhbnQtc3Bpbi1sZyBhbnQtc3Bpbi1zcGlubmluZ2ApO1xuICAgIHNwaW5FbC5pbm5lckhUTUwgPSBgPHNwYW4gY2xhc3M9XCJhbnQtc3Bpbi1kb3QgYW50LXNwaW4tZG90LXNwaW5cIj48aT48L2k+PGk+PC9pPjxpPjwvaT48aT48L2k+PC9zcGFuPmA7XG4gICAgdGhpcy5kb2MuYm9keS5hcHBlbmRDaGlsZChzcGluRWwpO1xuXG4gICAgdGhpcy5pMThuLmxvYWRMYW5nRGF0YShsYW5nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMuaTE4bi51c2UobGFuZywgcmVzKTtcbiAgICAgIHRoaXMuc2V0dGluZ3Muc2V0TGF5b3V0KCdsYW5nJywgbGFuZyk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZG9jLmxvY2F0aW9uLnJlbG9hZCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19
1
+ import { __decorate } from "tslib";
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
4
+ import { Subject, takeUntil } from 'rxjs';
5
+ import { YUNZAI_I18N_TOKEN } from '@yelon/theme';
6
+ import { InputBoolean } from '@yelon/util/decorator';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@yelon/theme";
9
+ import * as i2 from "@angular/common";
10
+ import * as i3 from "ng-zorro-antd/core/transition-patch";
11
+ import * as i4 from "ng-zorro-antd/menu";
12
+ import * as i5 from "ng-zorro-antd/dropdown";
13
+ import * as i6 from "ng-zorro-antd/icon";
14
+ import * as i7 from "../yunzai-i18n.service";
15
+ export class YunzaiI18NComponent {
16
+ get curLangCode() {
17
+ return this.settings.layout.lang;
18
+ }
19
+ constructor(settings, i18n, doc) {
20
+ this.settings = settings;
21
+ this.i18n = i18n;
22
+ this.doc = doc;
23
+ this.destroy$ = new Subject();
24
+ /** Whether to display language text */
25
+ this.showLangText = true;
26
+ this.langs = [];
27
+ this.i18n
28
+ .getLangs()
29
+ .pipe(takeUntil(this.destroy$))
30
+ .subscribe(langs => {
31
+ this.langs = langs;
32
+ });
33
+ }
34
+ change(lang) {
35
+ const spinEl = this.doc.createElement('div');
36
+ spinEl.setAttribute('class', `page-loading ant-spin ant-spin-lg ant-spin-spinning`);
37
+ spinEl.innerHTML = `<span class="ant-spin-dot ant-spin-dot-spin"><i></i><i></i><i></i><i></i></span>`;
38
+ this.doc.body.appendChild(spinEl);
39
+ this.i18n.loadLangData(lang).subscribe(res => {
40
+ this.i18n.use(lang, res);
41
+ this.settings.setLayout('lang', lang);
42
+ setTimeout(() => this.doc.location.reload());
43
+ });
44
+ }
45
+ ngOnDestroy() {
46
+ this.destroy$.complete();
47
+ }
48
+ }
49
+ YunzaiI18NComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: YunzaiI18NComponent, deps: [{ token: i1.SettingsService }, { token: YUNZAI_I18N_TOKEN }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
50
+ YunzaiI18NComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: YunzaiI18NComponent, selector: "yunzai-i18n", inputs: { showLangText: "showLangText" }, ngImport: i0, template: `
51
+ <div *ngIf="showLangText" nz-dropdown [nzDropdownMenu]="langMenu" nzPlacement="bottomRight">
52
+ <i nz-icon nzType="global"></i>
53
+ {{ 'lang.nav' | i18n }}
54
+ <i nz-icon nzType="down"></i>
55
+ </div>
56
+ <i
57
+ *ngIf="!showLangText"
58
+ nz-dropdown
59
+ [nzDropdownMenu]="langMenu"
60
+ nzPlacement="bottomRight"
61
+ nz-icon
62
+ nzType="global"
63
+ ></i>
64
+ <nz-dropdown-menu data-event-id="_nav_lang" #langMenu="nzDropdownMenu">
65
+ <ul nz-menu>
66
+ <li
67
+ data-event-id="_nav_lang"
68
+ [attr.data-text]="item.text"
69
+ nz-menu-item
70
+ *ngFor="let item of langs"
71
+ [nzSelected]="item.code === curLangCode"
72
+ (click)="change(item.code)"
73
+ >
74
+ <span *ngIf="!item.icon" role="img" [attr.aria-label]="item.text" class="pr-xs">{{ item.abbr }}</span>
75
+ <img
76
+ *ngIf="item.icon"
77
+ style="margin-right:4px"
78
+ width="50px"
79
+ height="30px"
80
+ [src]="'data:image/png;base64,' + item.icon"
81
+ [alt]="item.abbr"
82
+ class="pr-xs"
83
+ />
84
+ {{ item.text }}
85
+ </li>
86
+ </ul>
87
+ </nz-dropdown-menu>
88
+ `, isInline: true, dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i4.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "directive", type: i4.NzMenuItemDirective, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i5.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i5.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i6.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "pipe", type: i1.I18nPipe, name: "i18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
89
+ __decorate([
90
+ InputBoolean()
91
+ ], YunzaiI18NComponent.prototype, "showLangText", void 0);
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: YunzaiI18NComponent, decorators: [{
93
+ type: Component,
94
+ args: [{
95
+ selector: 'yunzai-i18n',
96
+ template: `
97
+ <div *ngIf="showLangText" nz-dropdown [nzDropdownMenu]="langMenu" nzPlacement="bottomRight">
98
+ <i nz-icon nzType="global"></i>
99
+ {{ 'lang.nav' | i18n }}
100
+ <i nz-icon nzType="down"></i>
101
+ </div>
102
+ <i
103
+ *ngIf="!showLangText"
104
+ nz-dropdown
105
+ [nzDropdownMenu]="langMenu"
106
+ nzPlacement="bottomRight"
107
+ nz-icon
108
+ nzType="global"
109
+ ></i>
110
+ <nz-dropdown-menu data-event-id="_nav_lang" #langMenu="nzDropdownMenu">
111
+ <ul nz-menu>
112
+ <li
113
+ data-event-id="_nav_lang"
114
+ [attr.data-text]="item.text"
115
+ nz-menu-item
116
+ *ngFor="let item of langs"
117
+ [nzSelected]="item.code === curLangCode"
118
+ (click)="change(item.code)"
119
+ >
120
+ <span *ngIf="!item.icon" role="img" [attr.aria-label]="item.text" class="pr-xs">{{ item.abbr }}</span>
121
+ <img
122
+ *ngIf="item.icon"
123
+ style="margin-right:4px"
124
+ width="50px"
125
+ height="30px"
126
+ [src]="'data:image/png;base64,' + item.icon"
127
+ [alt]="item.abbr"
128
+ class="pr-xs"
129
+ />
130
+ {{ item.text }}
131
+ </li>
132
+ </ul>
133
+ </nz-dropdown-menu>
134
+ `,
135
+ changeDetection: ChangeDetectionStrategy.OnPush
136
+ }]
137
+ }], ctorParameters: function () { return [{ type: i1.SettingsService }, { type: i7.YunzaiI18NService, decorators: [{
138
+ type: Inject,
139
+ args: [YUNZAI_I18N_TOKEN]
140
+ }] }, { type: undefined, decorators: [{
141
+ type: Inject,
142
+ args: [DOCUMENT]
143
+ }] }]; }, propDecorators: { showLangText: [{
144
+ type: Input
145
+ }] } });
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXVuemFpLWkxOG4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYmlzL2xheW91dC93aWRnZXRzL3l1bnphaS1pMThuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQW1DLE1BQU0sY0FBYyxDQUFDO0FBQ2xGLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7OztBQStDbkUsTUFBTSxPQUFPLG1CQUFtQjtJQVE5QixJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsWUFDVSxRQUF5QixFQUNFLElBQXVCLEVBQ2hDLEdBQVE7UUFGMUIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDRSxTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUNoQyxRQUFHLEdBQUgsR0FBRyxDQUFLO1FBYjVCLGFBQVEsR0FBaUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMvQyx1Q0FBdUM7UUFDZCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUU3QyxVQUFLLEdBQXFCLEVBQUUsQ0FBQztRQVczQixJQUFJLENBQUMsSUFBSTthQUNOLFFBQVEsRUFBRTthQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzlCLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBWTtRQUNqQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsa0ZBQWtGLENBQUM7UUFDdEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7O2dIQXhDVSxtQkFBbUIsaURBY3BCLGlCQUFpQixhQUNqQixRQUFRO29HQWZQLG1CQUFtQiw2RkF6Q3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDVDtBQU93QjtJQUFmLFlBQVksRUFBRTt5REFBcUI7MkZBSmxDLG1CQUFtQjtrQkEzQy9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ1Q7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkFlSSxNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsUUFBUTs0Q0FYTyxZQUFZO3NCQUFwQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgWVVOWkFJX0kxOE5fVE9LRU4sIFNldHRpbmdzU2VydmljZSwgWXVuemFpSTE4TlR5cGUgfSBmcm9tICdAeWVsb24vdGhlbWUnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBJbnB1dEJvb2xlYW4gfSBmcm9tICdAeWVsb24vdXRpbC9kZWNvcmF0b3InO1xuXG5pbXBvcnQgeyBZdW56YWlJMThOU2VydmljZSB9IGZyb20gJy4uL3l1bnphaS1pMThuLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd5dW56YWktaTE4bicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cInNob3dMYW5nVGV4dFwiIG56LWRyb3Bkb3duIFtuekRyb3Bkb3duTWVudV09XCJsYW5nTWVudVwiIG56UGxhY2VtZW50PVwiYm90dG9tUmlnaHRcIj5cbiAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZ2xvYmFsXCI+PC9pPlxuICAgICAge3sgJ2xhbmcubmF2JyB8IGkxOG4gfX1cbiAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZG93blwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8aVxuICAgICAgKm5nSWY9XCIhc2hvd0xhbmdUZXh0XCJcbiAgICAgIG56LWRyb3Bkb3duXG4gICAgICBbbnpEcm9wZG93bk1lbnVdPVwibGFuZ01lbnVcIlxuICAgICAgbnpQbGFjZW1lbnQ9XCJib3R0b21SaWdodFwiXG4gICAgICBuei1pY29uXG4gICAgICBuelR5cGU9XCJnbG9iYWxcIlxuICAgID48L2k+XG4gICAgPG56LWRyb3Bkb3duLW1lbnUgZGF0YS1ldmVudC1pZD1cIl9uYXZfbGFuZ1wiICNsYW5nTWVudT1cIm56RHJvcGRvd25NZW51XCI+XG4gICAgICA8dWwgbnotbWVudT5cbiAgICAgICAgPGxpXG4gICAgICAgICAgZGF0YS1ldmVudC1pZD1cIl9uYXZfbGFuZ1wiXG4gICAgICAgICAgW2F0dHIuZGF0YS10ZXh0XT1cIml0ZW0udGV4dFwiXG4gICAgICAgICAgbnotbWVudS1pdGVtXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGFuZ3NcIlxuICAgICAgICAgIFtuelNlbGVjdGVkXT1cIml0ZW0uY29kZSA9PT0gY3VyTGFuZ0NvZGVcIlxuICAgICAgICAgIChjbGljayk9XCJjaGFuZ2UoaXRlbS5jb2RlKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpdGVtLmljb25cIiByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJpdGVtLnRleHRcIiBjbGFzcz1cInByLXhzXCI+e3sgaXRlbS5hYmJyIH19PC9zcGFuPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjRweFwiXG4gICAgICAgICAgICB3aWR0aD1cIjUwcHhcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiMzBweFwiXG4gICAgICAgICAgICBbc3JjXT1cIidkYXRhOmltYWdlL3BuZztiYXNlNjQsJyArIGl0ZW0uaWNvblwiXG4gICAgICAgICAgICBbYWx0XT1cIml0ZW0uYWJiclwiXG4gICAgICAgICAgICBjbGFzcz1cInByLXhzXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIHt7IGl0ZW0udGV4dCB9fVxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L256LWRyb3Bkb3duLW1lbnU+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFl1bnphaUkxOE5Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfc2hvd0xhbmdUZXh0OiBCb29sZWFuSW5wdXQ7XG4gIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XG4gIC8qKiBXaGV0aGVyIHRvIGRpc3BsYXkgbGFuZ3VhZ2UgdGV4dCAqL1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgc2hvd0xhbmdUZXh0ID0gdHJ1ZTtcblxuICBsYW5nczogWXVuemFpSTE4TlR5cGVbXSA9IFtdO1xuXG4gIGdldCBjdXJMYW5nQ29kZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmxheW91dC5sYW5nO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXR0aW5nczogU2V0dGluZ3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoWVVOWkFJX0kxOE5fVE9LRU4pIHByaXZhdGUgaTE4bjogWXVuemFpSTE4TlNlcnZpY2UsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueVxuICApIHtcbiAgICB0aGlzLmkxOG5cbiAgICAgIC5nZXRMYW5ncygpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGxhbmdzID0+IHtcbiAgICAgICAgdGhpcy5sYW5ncyA9IGxhbmdzO1xuICAgICAgfSk7XG4gIH1cblxuICBjaGFuZ2UobGFuZzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc3BpbkVsID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3BpbkVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBgcGFnZS1sb2FkaW5nIGFudC1zcGluIGFudC1zcGluLWxnIGFudC1zcGluLXNwaW5uaW5nYCk7XG4gICAgc3BpbkVsLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cImFudC1zcGluLWRvdCBhbnQtc3Bpbi1kb3Qtc3BpblwiPjxpPjwvaT48aT48L2k+PGk+PC9pPjxpPjwvaT48L3NwYW4+YDtcbiAgICB0aGlzLmRvYy5ib2R5LmFwcGVuZENoaWxkKHNwaW5FbCk7XG5cbiAgICB0aGlzLmkxOG4ubG9hZExhbmdEYXRhKGxhbmcpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgdGhpcy5pMThuLnVzZShsYW5nLCByZXMpO1xuICAgICAgdGhpcy5zZXR0aW5ncy5zZXRMYXlvdXQoJ2xhbmcnLCBsYW5nKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5kb2MubG9jYXRpb24ucmVsb2FkKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=