@kuzntsv/uikit 0.0.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 (100) hide show
  1. package/README.md +63 -0
  2. package/assets/_navbar-theme.scss +25 -0
  3. package/auth/auth.types.d.ts +1 -0
  4. package/auth/directives/disable-if-role.directive.d.ts +12 -0
  5. package/auth/directives/disable-if-unauthorized.directive.d.ts +13 -0
  6. package/auth/directives/hide-if-role-not.directive.d.ts +12 -0
  7. package/auth/directives/hide-if-unauthorized.directive.d.ts +13 -0
  8. package/auth/directives/index.d.ts +4 -0
  9. package/auth/index.d.ts +4 -0
  10. package/auth/login-form.component.d.ts +16 -0
  11. package/auth/login-page.component.d.ts +29 -0
  12. package/auth/models/user.d.ts +7 -0
  13. package/auth/permit-form.component.d.ts +18 -0
  14. package/auth/services/auth-guard.service.d.ts +2 -0
  15. package/auth/services/auth-role.service.d.ts +10 -0
  16. package/auth/services/auth-user.service.d.ts +35 -0
  17. package/auth/services/auth.service.d.ts +44 -0
  18. package/auth/services/index.d.ts +5 -0
  19. package/auth/services/role-guard.service.d.ts +2 -0
  20. package/base/base-classes/base-class.d.ts +3 -0
  21. package/base/base-classes/base-edit-class.d.ts +17 -0
  22. package/base/base-classes/base-edit-dialog-data.d.ts +9 -0
  23. package/base/base-classes/base-entity-action.d.ts +10 -0
  24. package/base/base-classes/base-filter-class.d.ts +7 -0
  25. package/base/base-classes/base-nav-bar-menu-class.d.ts +11 -0
  26. package/base/base-classes/base-page-class.d.ts +117 -0
  27. package/base/base-classes/base-service-class.d.ts +23 -0
  28. package/base/base-classes/index.d.ts +8 -0
  29. package/base/base-toolbar/base-toolbar.service.d.ts +7 -0
  30. package/base/base-toolbar/components/base-toolbar.component.d.ts +67 -0
  31. package/base/index.d.ts +2 -0
  32. package/base/interfaces/alert-service.interface.d.ts +44 -0
  33. package/base/interfaces/index.d.ts +1 -0
  34. package/core/animations/animations.service.d.ts +10 -0
  35. package/core/animations/index.d.ts +2 -0
  36. package/core/animations/route.animations.d.ts +6 -0
  37. package/core/index.d.ts +1 -0
  38. package/fesm2022/kuzntsv-uikit.mjs +2540 -0
  39. package/fesm2022/kuzntsv-uikit.mjs.map +1 -0
  40. package/guards/index.d.ts +1 -0
  41. package/guards/redirect-guard.d.ts +8 -0
  42. package/index.d.ts +5 -0
  43. package/loader/index.d.ts +2 -0
  44. package/loader/loader.service.d.ts +11 -0
  45. package/loader/progress-spinner.component.d.ts +9 -0
  46. package/models/deserializable.model.d.ts +3 -0
  47. package/models/environment.model.d.ts +12 -0
  48. package/models/index.d.ts +3 -0
  49. package/models/sec-user-view.model.d.ts +16 -0
  50. package/models/sec-user.model.d.ts +12 -0
  51. package/package.json +23 -0
  52. package/pipes/index.d.ts +3 -0
  53. package/pipes/safe.pipe.d.ts +10 -0
  54. package/pipes/time.pipe.d.ts +7 -0
  55. package/pipes/truncate.pipe.d.ts +7 -0
  56. package/public-api.d.ts +10 -0
  57. package/services/alert.service.d.ts +16 -0
  58. package/services/avatar.service.d.ts +11 -0
  59. package/services/export.service.d.ts +9 -0
  60. package/services/index.d.ts +4 -0
  61. package/services/local-storage-service.d.ts +10 -0
  62. package/services/log.service.d.ts +10 -0
  63. package/shared/chip-input-autocomplete/chip-input-autocomplete.component.d.ts +28 -0
  64. package/shared/chip-input-autocomplete/index.d.ts +2 -0
  65. package/shared/chip-input-autocomplete/models/chip-item.d.ts +4 -0
  66. package/shared/chip-input-autocomplete/models/index.d.ts +1 -0
  67. package/shared/date-range-filter/date-range-filter.component.d.ts +22 -0
  68. package/shared/date-range-filter/index.d.ts +2 -0
  69. package/shared/date-range-filter/models/date-formats.d.ts +11 -0
  70. package/shared/date-range-filter/models/date-range.d.ts +5 -0
  71. package/shared/date-range-filter/models/index.d.ts +2 -0
  72. package/shared/dialog/dialog.component.d.ts +11 -0
  73. package/shared/dialog/index.d.ts +2 -0
  74. package/shared/dialog/models/dialog-action.d.ts +6 -0
  75. package/shared/dialog/models/dialog-data.d.ts +7 -0
  76. package/shared/dialog/models/index.d.ts +2 -0
  77. package/shared/index.d.ts +9 -0
  78. package/shared/logo/imz-logo.component.d.ts +5 -0
  79. package/shared/logo/index.d.ts +1 -0
  80. package/shared/navbar/index.d.ts +1 -0
  81. package/shared/navbar/navbar.d.ts +24 -0
  82. package/shared/not-found/index.d.ts +1 -0
  83. package/shared/not-found/not-found.component.d.ts +6 -0
  84. package/shared/select-autocomplete-with-virtual-scroll/index.d.ts +1 -0
  85. package/shared/select-autocomplete-with-virtual-scroll/models/index.d.ts +1 -0
  86. package/shared/select-autocomplete-with-virtual-scroll/models/select-item.d.ts +4 -0
  87. package/shared/select-autocomplete-with-virtual-scroll/select-autocomplete-with-virtual-scroll.component.d.ts +27 -0
  88. package/shared/select-with-group/index.d.ts +2 -0
  89. package/shared/select-with-group/models/index.d.ts +2 -0
  90. package/shared/select-with-group/models/select-group.d.ts +5 -0
  91. package/shared/select-with-group/models/select-item.d.ts +4 -0
  92. package/shared/select-with-group/select-with-group.component.d.ts +21 -0
  93. package/shared/table/index.d.ts +3 -0
  94. package/shared/table/models/column-options.interface.d.ts +26 -0
  95. package/shared/table/models/context-menu-options.interface.d.ts +22 -0
  96. package/shared/table/models/index.d.ts +2 -0
  97. package/shared/table/table.component.d.ts +75 -0
  98. package/shared/table/table.state.d.ts +11 -0
  99. package/types/index.d.ts +1 -0
  100. package/types/types.d.ts +6 -0
@@ -0,0 +1,2540 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, HostListener, Output, ViewChild, Component, Input, Injectable, ChangeDetectionStrategy, Directive, inject, Inject, Pipe } from '@angular/core';
3
+ import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card';
4
+ import * as i1 from '@angular/forms';
5
+ import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
6
+ import { MatButton, MatIconButton, MatAnchor } from '@angular/material/button';
7
+ import { MatFormField, MatLabel, MatError, MatSuffix, MatHint } from '@angular/material/form-field';
8
+ import { MatIcon } from '@angular/material/icon';
9
+ import { MatInput } from '@angular/material/input';
10
+ import * as i1$2 from '@angular/common/http';
11
+ import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http';
12
+ import * as i2 from '@angular/router';
13
+ import { DefaultUrlSerializer, Router, RouterLink } from '@angular/router';
14
+ import { BehaviorSubject, Subject, Subscription, forkJoin, Observable, startWith } from 'rxjs';
15
+ import * as i1$1 from '@angular/material/snack-bar';
16
+ import { ComponentPortal } from '@angular/cdk/portal';
17
+ import { MatProgressSpinner } from '@angular/material/progress-spinner';
18
+ import * as i1$3 from '@angular/cdk/overlay';
19
+ import { map, debounceTime, distinctUntilChanged, startWith as startWith$1 } from 'rxjs/operators';
20
+ import { MatToolbar } from '@angular/material/toolbar';
21
+ import { MatTooltip } from '@angular/material/tooltip';
22
+ import { MatMenu, MatMenuTrigger, MatMenuItem, MatMenuContent } from '@angular/material/menu';
23
+ import { MatDivider } from '@angular/material/divider';
24
+ import * as i1$4 from '@angular/material/dialog';
25
+ import { MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose, MatDialogConfig } from '@angular/material/dialog';
26
+ import { query, sequence, style, animate, stagger, trigger, transition } from '@angular/animations';
27
+ import * as i1$5 from '@angular/platform-browser';
28
+ import * as XLSX from 'xlsx';
29
+ import { ENTER, COMMA } from '@angular/cdk/keycodes';
30
+ import { AsyncPipe } from '@angular/common';
31
+ import * as i2$1 from '@angular/material/autocomplete';
32
+ import { MatAutocompleteModule, MatOption } from '@angular/material/autocomplete';
33
+ import * as i4 from '@angular/material/chips';
34
+ import { MatChipsModule } from '@angular/material/chips';
35
+ import * as i3 from '@angular/material/core';
36
+ import { MAT_DATE_LOCALE, MAT_DATE_FORMATS, MatOption as MatOption$1, MatOptgroup } from '@angular/material/core';
37
+ import { MatDateRangeInput, MatStartDate, MatEndDate, MatDatepickerToggle, MatDateRangePicker } from '@angular/material/datepicker';
38
+ import 'moment/locale/ru';
39
+ import moment from 'moment';
40
+ import * as i4$1 from '@angular/cdk/scrolling';
41
+ import { ScrollingModule } from '@angular/cdk/scrolling';
42
+ import { MatSelect, MatFormField as MatFormField$1, MatLabel as MatLabel$1 } from '@angular/material/select';
43
+ import { SelectionModel } from '@angular/cdk/collections';
44
+ import { MatCheckbox } from '@angular/material/checkbox';
45
+ import { MatPaginator } from '@angular/material/paginator';
46
+ import { MatSort, MatSortHeader } from '@angular/material/sort';
47
+ import { MatTableDataSource, MatTable, MatColumnDef, MatHeaderCellDef, MatHeaderCell, MatCellDef, MatCell, MatNoDataRow, MatHeaderRowDef, MatHeaderRow, MatRowDef, MatRow } from '@angular/material/table';
48
+
49
+ class PermitFormComponent {
50
+ hidy;
51
+ submitted = new EventEmitter();
52
+ mouseEvent = MouseEvent;
53
+ constructor() {
54
+ }
55
+ mouseHandling() {
56
+ this.hidy?.nativeElement.focus();
57
+ }
58
+ ngOnInit() {
59
+ // Обнуляем значение Input
60
+ if (this.hidy) {
61
+ this.hidy.nativeElement.value = null;
62
+ this.hidy.nativeElement.focus();
63
+ }
64
+ }
65
+ /**
66
+ * Поле ввода
67
+ *
68
+ * @param событие нажатия на клавишу
69
+ */
70
+ onKeydown(event) {
71
+ if (event.key === 'Enter') {
72
+ const permit = this.hidy?.nativeElement.value;
73
+ if (permit) {
74
+ this.submitted.emit(permit);
75
+ }
76
+ }
77
+ }
78
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: PermitFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
79
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: PermitFormComponent, isStandalone: true, selector: "lib-permit-form", outputs: { submitted: "submitted" }, host: { listeners: { "document:mouseup": "mouseHandling($event)" } }, viewQueries: [{ propertyName: "hidy", first: true, predicate: ["hidy"], descendants: true }], ngImport: i0, template: `
80
+ <mat-card appearance="outlined">
81
+ <mat-card-header>
82
+ <mat-card-title>
83
+ Приложите пропуск
84
+ </mat-card-title>
85
+ </mat-card-header>
86
+ <mat-card-content>
87
+ <div class="permit"></div>
88
+ </mat-card-content>
89
+ </mat-card>
90
+ <input #hidy class="hidy" type="text" (keydown)="onKeydown($event)"/>
91
+ `, isInline: true, styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-title,mat-card-content{display:flex;justify-content:center}mat-card-content{font-size:16px}div.permit{border:none;width:300px;background-size:300px;height:180px}div.permit button div{margin-bottom:200px;color:#000;font-size:34px}input.hidy{opacity:0;position:absolute;left:-200px;top:-200px}\n"], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }] });
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: PermitFormComponent, decorators: [{
94
+ type: Component,
95
+ args: [{ selector: 'lib-permit-form', template: `
96
+ <mat-card appearance="outlined">
97
+ <mat-card-header>
98
+ <mat-card-title>
99
+ Приложите пропуск
100
+ </mat-card-title>
101
+ </mat-card-header>
102
+ <mat-card-content>
103
+ <div class="permit"></div>
104
+ </mat-card-content>
105
+ </mat-card>
106
+ <input #hidy class="hidy" type="text" (keydown)="onKeydown($event)"/>
107
+ `, imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent], styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-title,mat-card-content{display:flex;justify-content:center}mat-card-content{font-size:16px}div.permit{border:none;width:300px;background-size:300px;height:180px}div.permit button div{margin-bottom:200px;color:#000;font-size:34px}input.hidy{opacity:0;position:absolute;left:-200px;top:-200px}\n"] }]
108
+ }], ctorParameters: () => [], propDecorators: { hidy: [{
109
+ type: ViewChild,
110
+ args: ['hidy']
111
+ }], submitted: [{
112
+ type: Output
113
+ }], mouseHandling: [{
114
+ type: HostListener,
115
+ args: ['document:mouseup', ['$event']]
116
+ }] } });
117
+
118
+ class LoginFormComponent {
119
+ errorMessage = '';
120
+ submitted = new EventEmitter();
121
+ hide = true;
122
+ form = new FormGroup({
123
+ username: new FormControl('', [Validators.required]),
124
+ password: new FormControl('', [Validators.required]),
125
+ });
126
+ isDisabled = false;
127
+ constructor() { }
128
+ set pending(isPending) {
129
+ this.isDisabled = isPending;
130
+ if (isPending) {
131
+ this.form.disable();
132
+ }
133
+ else {
134
+ this.form.enable();
135
+ }
136
+ }
137
+ submit() {
138
+ if (this.form.valid) {
139
+ this.submitted.emit(this.form.value);
140
+ }
141
+ }
142
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
143
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: LoginFormComponent, isStandalone: true, selector: "lib-login-form", inputs: { errorMessage: "errorMessage", pending: "pending" }, outputs: { submitted: "submitted" }, ngImport: i0, template: "<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F</mat-label>\r\n <input type=\"text\" pattern=\"[A-Za-z]{1,}.[A-Za-z]{1,}.[A-Za-z]*\"\r\n matInput\r\n autocomplete=\"on\"\r\n name=\"login-form-username\"\r\n placeholder=\"\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\"\r\n formControlName=\"username\">\r\n @if (form.controls['username'].hasError('pattern')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 (\u041F\u0440\u0438\u043C\u0435\u0440: a.p.petrov)\r\n </mat-error>\r\n }\r\n @if (form.controls['username'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u041F\u0430\u0440\u043E\u043B\u044C</mat-label>\r\n <input [type]=\"hide ? 'password' : 'text'\" matInput placeholder=\"\u041F\u0430\u0440\u043E\u043B\u044C\" formControlName=\"password\">\r\n <mat-icon class=\"watcher\" matSuffix (mousedown)=\"hide=false\" (mouseup)=\"hide=true\"\r\n >{{ hide ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n @if (form.controls['password'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n @if (errorMessage) {\r\n <p class=\"loginError\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n <p class=\"loginButtons\">\r\n <button type=\"submit\" mat-button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\">\u0412\u043E\u0439\u0442\u0438</button>\r\n </p>\r\n\r\n </form>\r\n </mat-card-content>\r\n </mat-card>\r\n", styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-header{justify-content:center}mat-card-content{font-size:16px}.loginError{padding:16px;width:300px;color:#fff;background-color:red}.loginButtons{display:flex;flex-direction:row;justify-content:flex-end}.watcher{cursor:default}\n"], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
144
+ }
145
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginFormComponent, decorators: [{
146
+ type: Component,
147
+ args: [{ selector: 'lib-login-form', imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent, FormsModule, ReactiveFormsModule, MatFormField, MatLabel, MatInput, MatError, MatIcon, MatSuffix, MatButton], template: "<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F</mat-label>\r\n <input type=\"text\" pattern=\"[A-Za-z]{1,}.[A-Za-z]{1,}.[A-Za-z]*\"\r\n matInput\r\n autocomplete=\"on\"\r\n name=\"login-form-username\"\r\n placeholder=\"\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\"\r\n formControlName=\"username\">\r\n @if (form.controls['username'].hasError('pattern')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 (\u041F\u0440\u0438\u043C\u0435\u0440: a.p.petrov)\r\n </mat-error>\r\n }\r\n @if (form.controls['username'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u041F\u0430\u0440\u043E\u043B\u044C</mat-label>\r\n <input [type]=\"hide ? 'password' : 'text'\" matInput placeholder=\"\u041F\u0430\u0440\u043E\u043B\u044C\" formControlName=\"password\">\r\n <mat-icon class=\"watcher\" matSuffix (mousedown)=\"hide=false\" (mouseup)=\"hide=true\"\r\n >{{ hide ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n @if (form.controls['password'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n @if (errorMessage) {\r\n <p class=\"loginError\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n <p class=\"loginButtons\">\r\n <button type=\"submit\" mat-button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\">\u0412\u043E\u0439\u0442\u0438</button>\r\n </p>\r\n\r\n </form>\r\n </mat-card-content>\r\n </mat-card>\r\n", styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-header{justify-content:center}mat-card-content{font-size:16px}.loginError{padding:16px;width:300px;color:#fff;background-color:red}.loginButtons{display:flex;flex-direction:row;justify-content:flex-end}.watcher{cursor:default}\n"] }]
148
+ }], ctorParameters: () => [], propDecorators: { errorMessage: [{
149
+ type: Input
150
+ }], submitted: [{
151
+ type: Output
152
+ }], pending: [{
153
+ type: Input
154
+ }] } });
155
+
156
+ class Environment {
157
+ }
158
+
159
+ class LogService {
160
+ env;
161
+ logPrefix = '';
162
+ constructor(env) {
163
+ this.env = env;
164
+ }
165
+ log(...args) {
166
+ if (!this.env.production) {
167
+ // Prepend log prefix log string
168
+ args.unshift(this.logPrefix + ' ');
169
+ // Pass along arguments to console.log
170
+ console.log(args.join(' '));
171
+ }
172
+ }
173
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LogService, deps: [{ token: Environment }], target: i0.ɵɵFactoryTarget.Injectable });
174
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LogService, providedIn: 'root' });
175
+ }
176
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LogService, decorators: [{
177
+ type: Injectable,
178
+ args: [{
179
+ providedIn: 'root'
180
+ }]
181
+ }], ctorParameters: () => [{ type: Environment }] });
182
+
183
+ // Сервис для вывода сообщений(ошибки, успеха)
184
+ class AlertService {
185
+ _snackBar;
186
+ // eslint-disable-next-line no-magic-numbers
187
+ duration = 5000;
188
+ constructor(_snackBar) {
189
+ this._snackBar = _snackBar;
190
+ }
191
+ openSnackBar(message, action, duration = this.duration) {
192
+ this._snackBar.open(message, action, {
193
+ duration,
194
+ panelClass: ['red-snackbar'],
195
+ });
196
+ }
197
+ success(message, duration = this.duration) {
198
+ this.openSnackBar(message, 'Закрыть', duration);
199
+ }
200
+ info(message, duration = this.duration) {
201
+ this.openSnackBar(message, 'Закрыть', duration);
202
+ }
203
+ helper(message, duration = this.duration) {
204
+ this.openSnackBar(message, 'Закрыть', duration);
205
+ }
206
+ warning(message, duration = this.duration) {
207
+ this.openSnackBar(message, 'Закрыть', duration);
208
+ }
209
+ error(message, duration = this.duration) {
210
+ this.openSnackBar(message, 'Закрыть', duration);
211
+ }
212
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AlertService, deps: [{ token: i1$1.MatSnackBar }], target: i0.ɵɵFactoryTarget.Injectable });
213
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AlertService, providedIn: 'root' });
214
+ }
215
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AlertService, decorators: [{
216
+ type: Injectable,
217
+ args: [{
218
+ providedIn: 'root'
219
+ }]
220
+ }], ctorParameters: () => [{ type: i1$1.MatSnackBar }] });
221
+
222
+ /**
223
+ * Сущность пользователя из API
224
+ */
225
+ class User {
226
+ id = 0;
227
+ username = '';
228
+ firstName = '';
229
+ lastName = '';
230
+ prof = '';
231
+ depart = 0;
232
+ area = '';
233
+ tabnum = '';
234
+ mail = '';
235
+ phone = '';
236
+ roles = '';
237
+ rolesArray = [];
238
+ roleList = [];
239
+ idHuman = '';
240
+ token = '';
241
+ // Время действия токена
242
+ expires_in = 0;
243
+ }
244
+ /**
245
+ * Сервис для работы с объектом в local Storage
246
+ */
247
+ class UserService {
248
+ user;
249
+ constructor() {
250
+ if (localStorage.getItem('sed_currentUser')) {
251
+ this.user = JSON.parse(localStorage.getItem('sed_currentUser') || '');
252
+ }
253
+ else {
254
+ this.user = new User();
255
+ }
256
+ }
257
+ get dept() {
258
+ return this.user?.depart;
259
+ }
260
+ /** Получить данные о пользователе */
261
+ get userData() {
262
+ return this.user;
263
+ }
264
+ /** Изменить данные пользователя в localStorage */
265
+ set userData(user) {
266
+ localStorage.setItem('sed_currentUser', JSON.stringify(user));
267
+ this.user = JSON.parse(localStorage.getItem('sed_currentUser') || '');
268
+ }
269
+ /** Удаляет данные о пользователе из localStorage. */
270
+ removeUser() {
271
+ localStorage.removeItem('sed_currentUser');
272
+ }
273
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: UserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
274
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: UserService, providedIn: 'root' });
275
+ }
276
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: UserService, decorators: [{
277
+ type: Injectable,
278
+ args: [{
279
+ providedIn: 'root'
280
+ }]
281
+ }], ctorParameters: () => [] });
282
+
283
+ // Сервис авторизации
284
+ class AuthService {
285
+ http;
286
+ router;
287
+ console;
288
+ alertService;
289
+ user;
290
+ // Указываем какой сервер использовать
291
+ baseRoute = 'mainApi/';
292
+ // Хранит доступные пользователю действия
293
+ permissions = ['VIEW'];
294
+ defaultRoles = [];
295
+ // Хранит роли пользователя
296
+ roles$;
297
+ loggedIn$;
298
+ // Роль для скрытия элементов.
299
+ hideRole = 'HIDE';
300
+ // Объект, хранящий статус авторизации
301
+ defaultHeader = {
302
+ headers: new HttpHeaders().set('content-type', 'application/x-www-form-urlencoded')
303
+ };
304
+ idHuman;
305
+ constructor(http, router, console, alertService, user) {
306
+ this.http = http;
307
+ this.router = router;
308
+ this.console = console;
309
+ this.alertService = alertService;
310
+ this.user = user;
311
+ this.console.logPrefix = 'Auth Service';
312
+ this.idHuman = localStorage.getItem('id_human');
313
+ if (this.user?.userData?.roleList) {
314
+ this.roles$ = new BehaviorSubject(this.user?.userData?.roleList);
315
+ }
316
+ else {
317
+ this.roles$ = new BehaviorSubject(this.defaultRoles);
318
+ }
319
+ this.loggedIn$ = new BehaviorSubject((!!this.user.userData && !!this.user.userData.token));
320
+ }
321
+ /** Проверка разрешений */
322
+ hasPermission(authPermission) {
323
+ return !!(this.permissions &&
324
+ this.permissions.find(permission => permission === authPermission));
325
+ }
326
+ /** Проверка ролей */
327
+ hasRole(roles, checkRole) {
328
+ if (roles) {
329
+ return !!roles.find(role => (role === checkRole || role === 'ADMIN'));
330
+ }
331
+ else {
332
+ return false;
333
+ }
334
+ }
335
+ /** Проверка массива ролей */
336
+ hasRoles(roles, checkRoles) {
337
+ if (roles) {
338
+ for (const checkRole of checkRoles) {
339
+ if (roles.find(role => (role === checkRole || role === 'ADMIN'))) {
340
+ return true;
341
+ }
342
+ }
343
+ }
344
+ return false;
345
+ }
346
+ /** Элемент скрывается, если у пользователя нет ни одной роли из перереданных в "roles"
347
+ или в списке "roles" есть роль "hideRole". */
348
+ isHideElement(roles, checkRoles) {
349
+ if (!roles)
350
+ return false;
351
+ if (roles.indexOf(this.hideRole) !== -1)
352
+ return true;
353
+ for (const role of roles) {
354
+ if (role && (role.length !== 0) && this.hasRole(checkRoles, role)) {
355
+ return false;
356
+ }
357
+ }
358
+ return true;
359
+ }
360
+ // /** Сменить роль без side эффекта */
361
+ // public changeRole(role: string) {
362
+ // this.roles$.next([role]);
363
+ // }
364
+ // /** Сменить роли без side эффекта */
365
+ // public changeRoles(roles: string[]) {
366
+ // this.roles$.next(roles);
367
+ // }
368
+ /** Запрос авторизации */
369
+ login(username, password, idCas, returnUrl = '', onErrorFn) {
370
+ const passwordEncoded = encodeURIComponent(password);
371
+ let body = `username=${username}&password=${passwordEncoded}`;
372
+ if (idCas) {
373
+ body += `&idcas=${idCas}`;
374
+ }
375
+ if (this.idHuman) {
376
+ body += `&idhuman=${this.idHuman}`;
377
+ }
378
+ this.http.post(this.baseRoute + 'jwt', body, this.defaultHeader)
379
+ .subscribe({
380
+ next: data => {
381
+ this.successLoginAction(data, returnUrl);
382
+ this.alertService.success('Успешная авторизация');
383
+ },
384
+ error: (error) => {
385
+ this.console.log(error);
386
+ this.alertService.error('Ошибка при авторизации: ' + error, 0);
387
+ if (onErrorFn) {
388
+ onErrorFn();
389
+ }
390
+ }
391
+ });
392
+ }
393
+ /** Aвторизация по пропуску */
394
+ loginByPermit(permit, idCas, returnUrl = '') {
395
+ let body = `permit=${permit}`;
396
+ if (idCas) {
397
+ body += `&idcas=${idCas}`;
398
+ }
399
+ if (this.idHuman) {
400
+ body += `&idhuman=${this.idHuman}`;
401
+ }
402
+ return this.http.post(this.baseRoute + 'jwt', body, this.defaultHeader)
403
+ .subscribe({
404
+ next: (data) => {
405
+ this.successLoginAction(data, returnUrl);
406
+ this.alertService.success('Успешная авторизация');
407
+ },
408
+ error: (error) => {
409
+ this.console.log(error);
410
+ this.alertService.error('Ошибка при авторизации: ' + error, 0);
411
+ }
412
+ });
413
+ }
414
+ /** Разлогиниться */
415
+ logout(returnUrl = '') {
416
+ // Убирает(удаляет) пользователя из локального хранилища когда он разлогинивается
417
+ this.user.removeUser();
418
+ // localStorage.removeItem('sed_currentUser');
419
+ // Отправляем подписчикам события что человек вышел
420
+ this.loggedIn$.next(false);
421
+ // Переход на страницу авторизации
422
+ if (returnUrl) {
423
+ // указываем целевой маршрут в параметре
424
+ this.router.navigate(['/login'], { queryParams: { returnUrl } }).then();
425
+ }
426
+ else {
427
+ this.router.navigate(['/login']).then();
428
+ }
429
+ }
430
+ // Получить роли пользователя
431
+ getRoles() {
432
+ return this.http.get(this.baseRoute + 'jwt/webroles');
433
+ }
434
+ // /** Инициализация ролей */
435
+ // private initRole() {
436
+ // if (this.hasRole(this.roles$.getValue(), this.defaultRole)) {
437
+ // this.roleService.getRoles().subscribe({
438
+ // next: (data: string[]) => {
439
+ // this.roles$.next(data['Roles']);
440
+ // },
441
+ // error: (error: any) => {
442
+ // this.console.log(error);
443
+ // this.alert.error('Ошибка при получении списка ролей пользователя: ' + error);
444
+ // }
445
+ // });
446
+ // }
447
+ // }
448
+ /** При успешной авторизации */
449
+ successLoginAction(user, returnUrl = '') {
450
+ this.user.userData = user;
451
+ this.loggedIn$.next(true);
452
+ // init roles
453
+ this.roles$.next(this.user.userData.roleList);
454
+ if (returnUrl) {
455
+ const decodeUrl = decodeURIComponent(returnUrl);
456
+ // указан целевой маршрут
457
+ if (decodeUrl.includes('?')) {
458
+ // есть параметры строки запроса
459
+ const serializer = new DefaultUrlSerializer();
460
+ // параметры строки запроса
461
+ const params = serializer.parse(decodeUrl).queryParams;
462
+ //console.log('successLoginAction params = ', params);
463
+ // выделение маршрута
464
+ const url = decodeUrl.slice(0, decodeUrl.indexOf('?'));
465
+ this.router.navigate([url], { queryParams: params });
466
+ }
467
+ else {
468
+ this.router.navigate([decodeUrl]);
469
+ }
470
+ }
471
+ else {
472
+ // не указан целевой маршрут, переход на главную
473
+ this.router.navigate(['']);
474
+ }
475
+ }
476
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthService, deps: [{ token: i1$2.HttpClient }, { token: i2.Router }, { token: LogService }, { token: AlertService }, { token: UserService }], target: i0.ɵɵFactoryTarget.Injectable });
477
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthService, providedIn: 'root' });
478
+ }
479
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthService, decorators: [{
480
+ type: Injectable,
481
+ args: [{
482
+ providedIn: 'root'
483
+ }]
484
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i2.Router }, { type: LogService }, { type: AlertService }, { type: UserService }] });
485
+
486
+ class ProgressSpinnerComponent {
487
+ cdRef;
488
+ constructor(cdRef) {
489
+ this.cdRef = cdRef;
490
+ }
491
+ ngAfterViewInit() {
492
+ this.cdRef.detectChanges();
493
+ }
494
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ProgressSpinnerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
495
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: ProgressSpinnerComponent, isStandalone: true, selector: "lib-loader", ngImport: i0, template: `
496
+ <div class="loading-indicator" mat-dialog-content>
497
+ <mat-progress-spinner mode="indeterminate">
498
+ </mat-progress-spinner>
499
+ </div>
500
+ `, isInline: true, styles: [".loading-indicator{position:fixed;z-index:999;height:2em;width:2em;overflow:initial;margin:auto;inset:0}.loading-indicator:before{content:\"\";display:block;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0000004d}\n"], dependencies: [{ kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
501
+ }
502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ProgressSpinnerComponent, decorators: [{
503
+ type: Component,
504
+ args: [{ selector: 'lib-loader', template: `
505
+ <div class="loading-indicator" mat-dialog-content>
506
+ <mat-progress-spinner mode="indeterminate">
507
+ </mat-progress-spinner>
508
+ </div>
509
+ `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatProgressSpinner], styles: [".loading-indicator{position:fixed;z-index:999;height:2em;width:2em;overflow:initial;margin:auto;inset:0}.loading-indicator:before{content:\"\";display:block;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0000004d}\n"] }]
510
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
511
+
512
+ class LoaderService {
513
+ overlay;
514
+ overlayRef = null;
515
+ constructor(overlay) {
516
+ this.overlay = overlay;
517
+ }
518
+ show() {
519
+ if (!this.overlayRef) {
520
+ this.overlayRef = this.overlay.create();
521
+ }
522
+ const spinnerOverlayPortal = new ComponentPortal(ProgressSpinnerComponent);
523
+ // Иправление ошибки Expression has changed after it was checked
524
+ setTimeout(() => {
525
+ if (!this.overlayRef?.hasAttached()) {
526
+ this.overlayRef?.attach(spinnerOverlayPortal);
527
+ }
528
+ });
529
+ }
530
+ hide() {
531
+ if (this.overlayRef) {
532
+ this.overlayRef.detach();
533
+ }
534
+ }
535
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoaderService, deps: [{ token: i1$3.Overlay }], target: i0.ɵɵFactoryTarget.Injectable });
536
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoaderService, providedIn: 'root' });
537
+ }
538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoaderService, decorators: [{
539
+ type: Injectable,
540
+ args: [{
541
+ providedIn: 'root'
542
+ }]
543
+ }], ctorParameters: () => [{ type: i1$3.Overlay }] });
544
+
545
+ class LoginPageComponent {
546
+ authService;
547
+ route;
548
+ loaderService;
549
+ pending = false;
550
+ error = '';
551
+ isKiosk = false;
552
+ /** Идентификатор АС */
553
+ idCas = 0;
554
+ /** Подписка на Идентификатор АС */
555
+ sub;
556
+ /** Url страницы, с которой был переход (после входа вернет на неё) */
557
+ returnUrl = '';
558
+ constructor(authService, route, loaderService) {
559
+ this.authService = authService;
560
+ this.route = route;
561
+ this.loaderService = loaderService;
562
+ this.sub = this.route.data.subscribe(data => {
563
+ this.idCas = data['idCas'];
564
+ });
565
+ }
566
+ ngOnInit() {
567
+ if (localStorage.getItem('id_human') || localStorage.getItem('kiosk-keyboard-layout')) {
568
+ // this.isKiosk = true;
569
+ }
570
+ this.route.queryParams.subscribe(params => {
571
+ this.returnUrl = params['returnUrl'];
572
+ //console.log('constructor this.returnUrl = ', this.returnUrl);
573
+ //this.returnUrl = this.returnUrl.slice(this.returnUrl.lastIndexOf('returnUrl=') + 'returnUrl='.length);
574
+ //console.log('constructor NEW this.returnUrl = ', this.returnUrl);
575
+ });
576
+ }
577
+ ngOnDestroy() {
578
+ this.sub.unsubscribe();
579
+ }
580
+ onSubmitError() {
581
+ return () => {
582
+ this.pending = false;
583
+ this.loaderService.hide();
584
+ };
585
+ }
586
+ onSubmit($event) {
587
+ this.loaderService.show();
588
+ this.pending = true;
589
+ this.authService.login($event.username, $event.password, this.idCas, this.returnUrl, this.onSubmitError());
590
+ }
591
+ onSubmitPermit($event) {
592
+ const permit = $event;
593
+ this.authService.loginByPermit(permit, this.idCas, this.returnUrl);
594
+ }
595
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginPageComponent, deps: [{ token: AuthService }, { token: i2.ActivatedRoute }, { token: LoaderService }], target: i0.ɵɵFactoryTarget.Component });
596
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: LoginPageComponent, isStandalone: true, selector: "lib-login-page", ngImport: i0, template: `
597
+ @if (!isKiosk) {
598
+ <lib-login-form
599
+ (submitted)="onSubmit($event)"
600
+ [pending]="pending"
601
+ [errorMessage]="error">
602
+ </lib-login-form>
603
+ }
604
+ @if (isKiosk) {
605
+ <lib-permit-form
606
+ (submitted)="onSubmitPermit($event)"
607
+ >
608
+ </lib-permit-form>
609
+ }
610
+ `, isInline: true, dependencies: [{ kind: "component", type: LoginFormComponent, selector: "lib-login-form", inputs: ["errorMessage", "pending"], outputs: ["submitted"] }, { kind: "component", type: PermitFormComponent, selector: "lib-permit-form", outputs: ["submitted"] }] });
611
+ }
612
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginPageComponent, decorators: [{
613
+ type: Component,
614
+ args: [{ selector: 'lib-login-page', template: `
615
+ @if (!isKiosk) {
616
+ <lib-login-form
617
+ (submitted)="onSubmit($event)"
618
+ [pending]="pending"
619
+ [errorMessage]="error">
620
+ </lib-login-form>
621
+ }
622
+ @if (isKiosk) {
623
+ <lib-permit-form
624
+ (submitted)="onSubmitPermit($event)"
625
+ >
626
+ </lib-permit-form>
627
+ }
628
+ `, imports: [LoginFormComponent, PermitFormComponent] }]
629
+ }], ctorParameters: () => [{ type: AuthService }, { type: i2.ActivatedRoute }, { type: LoaderService }] });
630
+
631
+ class DisableIfUnauthorizedDirective {
632
+ el;
633
+ authservice;
634
+ permission;
635
+ constructor(el, authservice) {
636
+ this.el = el;
637
+ this.authservice = authservice;
638
+ }
639
+ ngOnInit() {
640
+ if (this.permission && !this.authservice.hasPermission(this.permission)) {
641
+ this.el.nativeElement.disabled = true;
642
+ }
643
+ }
644
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfUnauthorizedDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
645
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: DisableIfUnauthorizedDirective, isStandalone: true, selector: "[libDisableIfUnauthorized]", inputs: { permission: ["libDisableIfUnauthorized", "permission"] }, ngImport: i0 });
646
+ }
647
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfUnauthorizedDirective, decorators: [{
648
+ type: Directive,
649
+ args: [{
650
+ selector: '[libDisableIfUnauthorized]',
651
+ standalone: true
652
+ }]
653
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { permission: [{
654
+ type: Input,
655
+ args: ['libDisableIfUnauthorized']
656
+ }] } });
657
+
658
+ class HideIfUnauthorizedDirective {
659
+ el;
660
+ authService;
661
+ permission;
662
+ constructor(el, authService) {
663
+ this.el = el;
664
+ this.authService = authService;
665
+ }
666
+ ngOnInit() {
667
+ if (this.permission && !this.authService.hasPermission(this.permission)) {
668
+ this.el.nativeElement.style.display = 'none';
669
+ }
670
+ }
671
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfUnauthorizedDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
672
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: HideIfUnauthorizedDirective, isStandalone: true, selector: "[libHideIfUnauthorized]", inputs: { permission: ["libHideIfUnauthorized", "permission"] }, ngImport: i0 });
673
+ }
674
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfUnauthorizedDirective, decorators: [{
675
+ type: Directive,
676
+ args: [{
677
+ selector: '[libHideIfUnauthorized]',
678
+ standalone: true
679
+ }]
680
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { permission: [{
681
+ type: Input,
682
+ args: ['libHideIfUnauthorized']
683
+ }] } });
684
+
685
+ class DisableIfRoleDirective {
686
+ el;
687
+ authService;
688
+ role = '';
689
+ constructor(el, authService) {
690
+ this.el = el;
691
+ this.authService = authService;
692
+ }
693
+ ngOnInit() {
694
+ this.authService.roles$.subscribe((userRoles) => {
695
+ if (this.role) {
696
+ if (!this.authService.hasRole(userRoles, this.role)) {
697
+ this.el.nativeElement.disabled = true;
698
+ }
699
+ else {
700
+ this.el.nativeElement.disabled = false;
701
+ }
702
+ }
703
+ });
704
+ }
705
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfRoleDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
706
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: DisableIfRoleDirective, isStandalone: true, selector: "[libDisableIfRole]", inputs: { role: ["libDisableIfRole", "role"] }, ngImport: i0 });
707
+ }
708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfRoleDirective, decorators: [{
709
+ type: Directive,
710
+ args: [{
711
+ selector: '[libDisableIfRole]',
712
+ standalone: true
713
+ }]
714
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { role: [{
715
+ type: Input,
716
+ args: ['libDisableIfRole']
717
+ }] } });
718
+
719
+ class HideIfRoleNotDirective {
720
+ el;
721
+ authService;
722
+ roles = [];
723
+ constructor(el, authService) {
724
+ this.el = el;
725
+ this.authService = authService;
726
+ }
727
+ // Элемент скрывается, если у пользователя нет ни одной роли из перереданных в "roles"
728
+ // или в списке "roles" есть роль "hideRole".
729
+ ngOnInit() {
730
+ if (this.roles) {
731
+ this.authService.roles$.subscribe((userRoles) => {
732
+ const isHide = this.authService.isHideElement(this.roles, userRoles);
733
+ if (isHide) {
734
+ this.el.nativeElement.style.display = 'none';
735
+ }
736
+ else {
737
+ this.el.nativeElement.style.display = 'inherit';
738
+ }
739
+ });
740
+ }
741
+ }
742
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfRoleNotDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
743
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: HideIfRoleNotDirective, isStandalone: true, selector: "[libHideIfRoleNot]", inputs: { roles: ["libHideIfRoleNot", "roles"] }, ngImport: i0 });
744
+ }
745
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfRoleNotDirective, decorators: [{
746
+ type: Directive,
747
+ args: [{
748
+ selector: '[libHideIfRoleNot]',
749
+ standalone: true
750
+ }]
751
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { roles: [{
752
+ type: Input,
753
+ args: ['libHideIfRoleNot']
754
+ }] } });
755
+
756
+ class AuthGuardService {
757
+ auth;
758
+ router;
759
+ constructor(auth, router) {
760
+ this.auth = auth;
761
+ this.router = router;
762
+ }
763
+ canActivate(route, state) {
764
+ const isLogin = this.auth.loggedIn$.value;
765
+ if (!isLogin) {
766
+ console.log('state.url =', state.url);
767
+ // Если не зарегистрирован вернуть в форму авторизации
768
+ this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
769
+ }
770
+ return isLogin;
771
+ }
772
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthGuardService, deps: [{ token: AuthService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
773
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthGuardService, providedIn: 'root' });
774
+ }
775
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthGuardService, decorators: [{
776
+ type: Injectable,
777
+ args: [{
778
+ providedIn: 'root'
779
+ }]
780
+ }], ctorParameters: () => [{ type: AuthService }, { type: i2.Router }] });
781
+ const authGuard = (route, state) => inject(AuthGuardService).canActivate(route, state);
782
+
783
+ class RoleGuardService {
784
+ router;
785
+ authService;
786
+ roles = [];
787
+ constructor(router, authService) {
788
+ this.router = router;
789
+ this.authService = authService;
790
+ }
791
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
792
+ canActivate(route, state) {
793
+ this.roles = route.data['roles'];
794
+ return this.authService.roles$.pipe(map((userRoles) => this.authService.hasRoles(userRoles, this.roles)));
795
+ }
796
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleGuardService, deps: [{ token: i2.Router }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
797
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleGuardService, providedIn: 'root' });
798
+ }
799
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleGuardService, decorators: [{
800
+ type: Injectable,
801
+ args: [{
802
+ providedIn: 'root'
803
+ }]
804
+ }], ctorParameters: () => [{ type: i2.Router }, { type: AuthService }] });
805
+ const roleGuard = (route, state) => inject(RoleGuardService).canActivate(route, state);
806
+
807
+ // Вычисление разрешений на модули по ролям
808
+ class RoleService {
809
+ http;
810
+ // Указываем какой сервер использовать
811
+ baseRoute = 'mainApi/';
812
+ constructor(http) {
813
+ this.http = http;
814
+ }
815
+ // Получить роли пользователя
816
+ getRoles() {
817
+ return this.http.get(this.baseRoute + 'jwt/webroles');
818
+ }
819
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleService, deps: [{ token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
820
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleService, providedIn: 'root' });
821
+ }
822
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleService, decorators: [{
823
+ type: Injectable,
824
+ args: [{
825
+ providedIn: 'root'
826
+ }]
827
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }] });
828
+
829
+ class BaseToolbarService {
830
+ baseRoute = 'BaseToolbar';
831
+ constructor() { }
832
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
833
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarService, providedIn: 'root' });
834
+ }
835
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarService, decorators: [{
836
+ type: Injectable,
837
+ args: [{
838
+ providedIn: 'root'
839
+ }]
840
+ }], ctorParameters: () => [] });
841
+
842
+ class BaseToolbarComponent {
843
+ rolesNewBtn = [];
844
+ rolesEditBtn = [];
845
+ rolesRemoveBtn = [];
846
+ rolesCopyBtn = [];
847
+ rolesExcelBtn = [];
848
+ rolesCsvBtn = [];
849
+ rolesPdfBtn = [];
850
+ rolesPrintBtn = [];
851
+ rolesRefreshBtn = [];
852
+ rolesClearBtn = [];
853
+ newBtnDisabled = false;
854
+ editBtnDisabled = false;
855
+ removeBtnDisabled = false;
856
+ copyBtnDisabled = false;
857
+ excelBtnDisabled = false;
858
+ csvBtnDisabled = false;
859
+ pdfBtnDisabled = false;
860
+ printBtnDisabled = false;
861
+ refreshBtnDisabled = false;
862
+ clearBtnDisabled = false;
863
+ newBtnTooltip = 'Добавить';
864
+ editBtnTooltip = 'Изменить';
865
+ removeBtnTooltip = 'Удалить';
866
+ copyBtnTooltip = 'Скопировать';
867
+ excelBtnTooltip = 'Экспортировать в Excel';
868
+ csvBtnTooltip = 'Экспортировать в Csv';
869
+ pdfBtnTooltip = 'Экспортировать в Pdf';
870
+ printBtnTooltip = 'Печатать';
871
+ refreshBtnTooltip = 'Обновить данные';
872
+ clearBtnTooltip = 'Очистить фильтр';
873
+ /** Список элементов контекстного меню. */
874
+ newBtnOpt = [];
875
+ clickedNewBtn = new EventEmitter();
876
+ clickedEditBtn = new EventEmitter();
877
+ clickedRemoveBtn = new EventEmitter();
878
+ clickedCopyBtn = new EventEmitter();
879
+ clickedExcelBtn = new EventEmitter();
880
+ clickedCsvBtn = new EventEmitter();
881
+ clickedPdfBtn = new EventEmitter();
882
+ clickedPrintBtn = new EventEmitter();
883
+ clickedRefreshBtn = new EventEmitter();
884
+ clickedClearBtn = new EventEmitter();
885
+ // DI
886
+ authService = inject(AuthService);
887
+ userRoles = [];
888
+ subscription;
889
+ constructor() {
890
+ // получить права пользователя
891
+ this.subscription = this.authService.roles$.subscribe((userRoles) => {
892
+ this.userRoles = userRoles;
893
+ });
894
+ }
895
+ ngOnDestroy() {
896
+ if (this.subscription)
897
+ this.subscription.unsubscribe();
898
+ }
899
+ isShow(roles) {
900
+ return !this.authService.isHideElement(roles, this.userRoles);
901
+ }
902
+ onNewClick() {
903
+ this.clickedNewBtn.emit();
904
+ }
905
+ onEditClick() {
906
+ this.clickedEditBtn.emit();
907
+ }
908
+ onRemoveClick() {
909
+ this.clickedRemoveBtn.emit();
910
+ }
911
+ onCopyClick() {
912
+ this.clickedCopyBtn.emit();
913
+ }
914
+ onExcelClick() {
915
+ this.clickedExcelBtn.emit();
916
+ }
917
+ onCsvClick() {
918
+ this.clickedCsvBtn.emit();
919
+ }
920
+ onPdfClick() {
921
+ this.clickedPdfBtn.emit();
922
+ }
923
+ onPrintClick() {
924
+ this.clickedPrintBtn.emit();
925
+ }
926
+ onRefreshGridClick() {
927
+ this.clickedRefreshBtn.emit();
928
+ }
929
+ onClearClick() {
930
+ this.clickedClearBtn.emit();
931
+ }
932
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
933
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseToolbarComponent, isStandalone: true, selector: "lib-base-toolbar", inputs: { rolesNewBtn: "rolesNewBtn", rolesEditBtn: "rolesEditBtn", rolesRemoveBtn: "rolesRemoveBtn", rolesCopyBtn: "rolesCopyBtn", rolesExcelBtn: "rolesExcelBtn", rolesCsvBtn: "rolesCsvBtn", rolesPdfBtn: "rolesPdfBtn", rolesPrintBtn: "rolesPrintBtn", rolesRefreshBtn: "rolesRefreshBtn", rolesClearBtn: "rolesClearBtn", newBtnDisabled: "newBtnDisabled", editBtnDisabled: "editBtnDisabled", removeBtnDisabled: "removeBtnDisabled", copyBtnDisabled: "copyBtnDisabled", excelBtnDisabled: "excelBtnDisabled", csvBtnDisabled: "csvBtnDisabled", pdfBtnDisabled: "pdfBtnDisabled", printBtnDisabled: "printBtnDisabled", refreshBtnDisabled: "refreshBtnDisabled", clearBtnDisabled: "clearBtnDisabled", newBtnTooltip: "newBtnTooltip", editBtnTooltip: "editBtnTooltip", removeBtnTooltip: "removeBtnTooltip", copyBtnTooltip: "copyBtnTooltip", excelBtnTooltip: "excelBtnTooltip", csvBtnTooltip: "csvBtnTooltip", pdfBtnTooltip: "pdfBtnTooltip", printBtnTooltip: "printBtnTooltip", refreshBtnTooltip: "refreshBtnTooltip", clearBtnTooltip: "clearBtnTooltip", newBtnOpt: "newBtnOpt" }, outputs: { clickedNewBtn: "clickedNewBtn", clickedEditBtn: "clickedEditBtn", clickedRemoveBtn: "clickedRemoveBtn", clickedCopyBtn: "clickedCopyBtn", clickedExcelBtn: "clickedExcelBtn", clickedCsvBtn: "clickedCsvBtn", clickedPdfBtn: "clickedPdfBtn", clickedPrintBtn: "clickedPrintBtn", clickedRefreshBtn: "clickedRefreshBtn", clickedClearBtn: "clickedClearBtn" }, providers: [
934
+ BaseToolbarService
935
+ ], ngImport: i0, template: "<mat-toolbar>\r\n @if (isShow(rolesNewBtn)) {\r\n @if (newBtnOpt && newBtnOpt.length > 0) {\r\n <button [disabled]=\"newBtnDisabled\" [matMenuTriggerFor]=\"menuNewBtn\"\r\n mat-icon-button [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <mat-menu #menuNewBtn=\"matMenu\">\r\n\r\n @for (menuItem of newBtnOpt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn('') : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn('') : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n\r\n </mat-menu>\r\n } \r\n @else {\r\n <button [disabled]=\"newBtnDisabled\" (click)=\"onNewClick()\"\r\n mat-icon-button routerLink=\"new\" routerLinkActive=\"active\" [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if (isShow(rolesEditBtn)) {\r\n <button [disabled]=\"editBtnDisabled\" (click)=\"onEditClick()\"\r\n mat-icon-button routerLink=\"edit\" color=\"primary\" routerLinkActive=\"active\" [matTooltip]=\"editBtnTooltip\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRemoveBtn)) {\r\n <button [disabled]=\"removeBtnDisabled\" (click)=\"onRemoveClick()\"\r\n mat-icon-button routerLink=\"delete\" color=\"warn\" routerLinkActive=\"active\" [matTooltip]=\"removeBtnTooltip\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCopyBtn)) {\r\n <button [disabled]=\"copyBtnDisabled\" (click)=\"onCopyClick()\"\r\n mat-icon-button routerLink=\"delete\" routerLinkActive=\"active\" [matTooltip]=\"copyBtnTooltip\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesExcelBtn)) {\r\n <button [disabled]=\"excelBtnDisabled\" (click)=\"onExcelClick()\"\r\n mat-icon-button routerLink=\"excel\" routerLinkActive=\"active\" [matTooltip]=\"excelBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">explicit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCsvBtn)) {\r\n <button [disabled]=\"csvBtnDisabled\" (click)=\"onCsvClick()\"\r\n mat-icon-button routerLink=\"csv\" routerLinkActive=\"active\" [matTooltip]=\"csvBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">download</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPdfBtn)) {\r\n <button [disabled]=\"pdfBtnDisabled\" (click)=\"onPdfClick()\"\r\n mat-icon-button routerLink=\"pdf\" routerLinkActive=\"active\" [matTooltip]=\"pdfBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">picture_as_pdf</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPrintBtn)) {\r\n <button [disabled]=\"printBtnDisabled\" (click)=\"onPrintClick()\"\r\n mat-icon-button routerLink=\"print\" routerLinkActive=\"active\" [matTooltip]=\"printBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">print_outline</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRefreshBtn)) {\r\n <button [disabled]=\"refreshBtnDisabled\" (click)=\"onRefreshGridClick()\"\r\n mat-icon-button routerLink=\"refresh\" routerLinkActive=\"active\" [matTooltip]=\"refreshBtnTooltip\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesClearBtn)) {\r\n <button [disabled]=\"clearBtnDisabled\" (click)=\"onClearClick()\"\r\n mat-icon-button routerLink=\"clear\" routerLinkActive=\"active\" [matTooltip]=\"clearBtnTooltip\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n }\r\n</mat-toolbar>\r\n", styles: [""], dependencies: [{ kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }] });
936
+ }
937
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarComponent, decorators: [{
938
+ type: Component,
939
+ args: [{ selector: 'lib-base-toolbar', imports: [MatToolbar, MatIconButton, MatTooltip, MatIcon, MatMenu, MatDivider, MatMenuTrigger, MatMenuItem], providers: [
940
+ BaseToolbarService
941
+ ], template: "<mat-toolbar>\r\n @if (isShow(rolesNewBtn)) {\r\n @if (newBtnOpt && newBtnOpt.length > 0) {\r\n <button [disabled]=\"newBtnDisabled\" [matMenuTriggerFor]=\"menuNewBtn\"\r\n mat-icon-button [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <mat-menu #menuNewBtn=\"matMenu\">\r\n\r\n @for (menuItem of newBtnOpt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn('') : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn('') : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n\r\n </mat-menu>\r\n } \r\n @else {\r\n <button [disabled]=\"newBtnDisabled\" (click)=\"onNewClick()\"\r\n mat-icon-button routerLink=\"new\" routerLinkActive=\"active\" [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if (isShow(rolesEditBtn)) {\r\n <button [disabled]=\"editBtnDisabled\" (click)=\"onEditClick()\"\r\n mat-icon-button routerLink=\"edit\" color=\"primary\" routerLinkActive=\"active\" [matTooltip]=\"editBtnTooltip\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRemoveBtn)) {\r\n <button [disabled]=\"removeBtnDisabled\" (click)=\"onRemoveClick()\"\r\n mat-icon-button routerLink=\"delete\" color=\"warn\" routerLinkActive=\"active\" [matTooltip]=\"removeBtnTooltip\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCopyBtn)) {\r\n <button [disabled]=\"copyBtnDisabled\" (click)=\"onCopyClick()\"\r\n mat-icon-button routerLink=\"delete\" routerLinkActive=\"active\" [matTooltip]=\"copyBtnTooltip\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesExcelBtn)) {\r\n <button [disabled]=\"excelBtnDisabled\" (click)=\"onExcelClick()\"\r\n mat-icon-button routerLink=\"excel\" routerLinkActive=\"active\" [matTooltip]=\"excelBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">explicit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCsvBtn)) {\r\n <button [disabled]=\"csvBtnDisabled\" (click)=\"onCsvClick()\"\r\n mat-icon-button routerLink=\"csv\" routerLinkActive=\"active\" [matTooltip]=\"csvBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">download</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPdfBtn)) {\r\n <button [disabled]=\"pdfBtnDisabled\" (click)=\"onPdfClick()\"\r\n mat-icon-button routerLink=\"pdf\" routerLinkActive=\"active\" [matTooltip]=\"pdfBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">picture_as_pdf</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPrintBtn)) {\r\n <button [disabled]=\"printBtnDisabled\" (click)=\"onPrintClick()\"\r\n mat-icon-button routerLink=\"print\" routerLinkActive=\"active\" [matTooltip]=\"printBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">print_outline</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRefreshBtn)) {\r\n <button [disabled]=\"refreshBtnDisabled\" (click)=\"onRefreshGridClick()\"\r\n mat-icon-button routerLink=\"refresh\" routerLinkActive=\"active\" [matTooltip]=\"refreshBtnTooltip\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesClearBtn)) {\r\n <button [disabled]=\"clearBtnDisabled\" (click)=\"onClearClick()\"\r\n mat-icon-button routerLink=\"clear\" routerLinkActive=\"active\" [matTooltip]=\"clearBtnTooltip\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n }\r\n</mat-toolbar>\r\n" }]
942
+ }], ctorParameters: () => [], propDecorators: { rolesNewBtn: [{
943
+ type: Input
944
+ }], rolesEditBtn: [{
945
+ type: Input
946
+ }], rolesRemoveBtn: [{
947
+ type: Input
948
+ }], rolesCopyBtn: [{
949
+ type: Input
950
+ }], rolesExcelBtn: [{
951
+ type: Input
952
+ }], rolesCsvBtn: [{
953
+ type: Input
954
+ }], rolesPdfBtn: [{
955
+ type: Input
956
+ }], rolesPrintBtn: [{
957
+ type: Input
958
+ }], rolesRefreshBtn: [{
959
+ type: Input
960
+ }], rolesClearBtn: [{
961
+ type: Input
962
+ }], newBtnDisabled: [{
963
+ type: Input
964
+ }], editBtnDisabled: [{
965
+ type: Input
966
+ }], removeBtnDisabled: [{
967
+ type: Input
968
+ }], copyBtnDisabled: [{
969
+ type: Input
970
+ }], excelBtnDisabled: [{
971
+ type: Input
972
+ }], csvBtnDisabled: [{
973
+ type: Input
974
+ }], pdfBtnDisabled: [{
975
+ type: Input
976
+ }], printBtnDisabled: [{
977
+ type: Input
978
+ }], refreshBtnDisabled: [{
979
+ type: Input
980
+ }], clearBtnDisabled: [{
981
+ type: Input
982
+ }], newBtnTooltip: [{
983
+ type: Input
984
+ }], editBtnTooltip: [{
985
+ type: Input
986
+ }], removeBtnTooltip: [{
987
+ type: Input
988
+ }], copyBtnTooltip: [{
989
+ type: Input
990
+ }], excelBtnTooltip: [{
991
+ type: Input
992
+ }], csvBtnTooltip: [{
993
+ type: Input
994
+ }], pdfBtnTooltip: [{
995
+ type: Input
996
+ }], printBtnTooltip: [{
997
+ type: Input
998
+ }], refreshBtnTooltip: [{
999
+ type: Input
1000
+ }], clearBtnTooltip: [{
1001
+ type: Input
1002
+ }], newBtnOpt: [{
1003
+ type: Input
1004
+ }], clickedNewBtn: [{
1005
+ type: Output
1006
+ }], clickedEditBtn: [{
1007
+ type: Output
1008
+ }], clickedRemoveBtn: [{
1009
+ type: Output
1010
+ }], clickedCopyBtn: [{
1011
+ type: Output
1012
+ }], clickedExcelBtn: [{
1013
+ type: Output
1014
+ }], clickedCsvBtn: [{
1015
+ type: Output
1016
+ }], clickedPdfBtn: [{
1017
+ type: Output
1018
+ }], clickedPrintBtn: [{
1019
+ type: Output
1020
+ }], clickedRefreshBtn: [{
1021
+ type: Output
1022
+ }], clickedClearBtn: [{
1023
+ type: Output
1024
+ }] } });
1025
+
1026
+ var Action;
1027
+ (function (Action) {
1028
+ Action["Add"] = "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435";
1029
+ Action["Edit"] = "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435";
1030
+ })(Action || (Action = {}));
1031
+
1032
+ class BaseEditClass {
1033
+ title = '';
1034
+ dialogData;
1035
+ form;
1036
+ dialogRef;
1037
+ constructor() {
1038
+ }
1039
+ onNoClick(event) {
1040
+ this.dialogRef?.close(null);
1041
+ event.preventDefault(); // иначе сработает onSubmit
1042
+ }
1043
+ onSubmit() {
1044
+ if (this.form) {
1045
+ if (this.form.valid) {
1046
+ if (this.dialogData)
1047
+ Object.keys(this.form.controls).forEach(controlName => this.dialogData.entity[controlName] = this.form?.controls[controlName].value);
1048
+ this.dialogRef?.close(this.dialogData);
1049
+ }
1050
+ else {
1051
+ Object.keys(this.form.controls).forEach(controlName => this.form?.controls[controlName].markAsTouched());
1052
+ }
1053
+ }
1054
+ }
1055
+ formActionIsAdd() {
1056
+ return this.dialogData?.action === Action.Add;
1057
+ }
1058
+ formActionIsEdit() {
1059
+ return this.dialogData?.action === Action.Edit;
1060
+ }
1061
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseEditClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1062
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BaseEditClass, isStandalone: true, ngImport: i0 });
1063
+ }
1064
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseEditClass, decorators: [{
1065
+ type: Directive
1066
+ }], ctorParameters: () => [] });
1067
+
1068
+ var EntityAction;
1069
+ (function (EntityAction) {
1070
+ EntityAction["Init"] = "\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F";
1071
+ EntityAction["Add"] = "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435";
1072
+ EntityAction["Edit"] = "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435";
1073
+ EntityAction["Delete"] = "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435";
1074
+ })(EntityAction || (EntityAction = {}));
1075
+
1076
+ class BaseFilterClass {
1077
+ // eslint-disable-next-line no-magic-numbers
1078
+ defaultDebounceTime = 500;
1079
+ constructor() {
1080
+ }
1081
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseFilterClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1082
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BaseFilterClass, isStandalone: true, ngImport: i0 });
1083
+ }
1084
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseFilterClass, decorators: [{
1085
+ type: Directive
1086
+ }], ctorParameters: () => [] });
1087
+
1088
+ class BaseNavBarMenuClass {
1089
+ // DI
1090
+ router = inject(Router);
1091
+ constructor() {
1092
+ }
1093
+ /** Нажата средняя кнопка (открыть ссылку в новой вкладке). */
1094
+ onMiddleClick(event, baseUrl, menu) {
1095
+ // 1 - Auxiliary button pressed (usually the middle button)
1096
+ if (event.button === 1) {
1097
+ // event.preventDefault();
1098
+ menu.closeMenu();
1099
+ const urlTree = this.router.serializeUrl(this.router.createUrlTree([baseUrl]));
1100
+ window.open(urlTree, '_blank');
1101
+ }
1102
+ }
1103
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseNavBarMenuClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1104
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BaseNavBarMenuClass, isStandalone: true, ngImport: i0 });
1105
+ }
1106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseNavBarMenuClass, decorators: [{
1107
+ type: Directive
1108
+ }], ctorParameters: () => [] });
1109
+
1110
+ class AnimationsService {
1111
+ static routeAnimationType = 'ALL';
1112
+ constructor() {
1113
+ AnimationsService.routeAnimationType = 'ALL';
1114
+ }
1115
+ static isRouteAnimationsType(type) {
1116
+ // console.log('isRouteAnimationsType ', AnimationsService.routeAnimationType, type, AnimationsService.routeAnimationType === type);
1117
+ return AnimationsService.routeAnimationType === type;
1118
+ }
1119
+ updateRouteAnimationType(pageAnimations, elementsAnimations) {
1120
+ AnimationsService.routeAnimationType =
1121
+ pageAnimations && elementsAnimations
1122
+ ? 'ALL'
1123
+ : pageAnimations
1124
+ ? 'PAGE'
1125
+ : elementsAnimations
1126
+ ? 'ELEMENTS'
1127
+ : 'NONE';
1128
+ }
1129
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AnimationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1130
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AnimationsService, providedIn: 'root' });
1131
+ }
1132
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AnimationsService, decorators: [{
1133
+ type: Injectable,
1134
+ args: [{
1135
+ providedIn: 'root'
1136
+ }]
1137
+ }], ctorParameters: () => [] });
1138
+
1139
+ const ROUTE_ANIMATIONS_ELEMENTS = 'route-animations-elements';
1140
+ const STEPS_ALL = [
1141
+ // PAGE
1142
+ query(':enter > *', style({ opacity: 0, position: 'fixed' }), {
1143
+ optional: true
1144
+ }),
1145
+ // ELEMENTS
1146
+ query(':enter .' + ROUTE_ANIMATIONS_ELEMENTS, style({ opacity: 0 }), {
1147
+ optional: true
1148
+ }),
1149
+ // PAGE
1150
+ sequence([
1151
+ query(':leave > *', [
1152
+ style({ transform: 'translateY(0%)', opacity: 1 }),
1153
+ animate('0.2s ease-in-out', style({ transform: 'translateY(-3%)', opacity: 0 })),
1154
+ style({ position: 'fixed' })
1155
+ ], { optional: true }),
1156
+ query(':enter > *', [
1157
+ style({
1158
+ transform: 'translateY(-3%)',
1159
+ opacity: 0,
1160
+ position: 'static'
1161
+ }),
1162
+ animate('0.5s ease-in-out', style({ transform: 'translateY(0%)', opacity: 1 }))
1163
+ ], { optional: true })
1164
+ ]),
1165
+ // ELEMENTS
1166
+ query(':enter .' + ROUTE_ANIMATIONS_ELEMENTS,
1167
+ // eslint-disable-next-line no-magic-numbers
1168
+ stagger(75, [
1169
+ style({ transform: 'translateY(10%)', opacity: 0 }),
1170
+ animate('0.5s ease-in-out', style({ transform: 'translateY(0%)', opacity: 1 }))
1171
+ ]), { optional: true })
1172
+ ];
1173
+ const STEPS_NONE = [];
1174
+ const STEPS_PAGE = [STEPS_ALL[0], STEPS_ALL[2]];
1175
+ const STEPS_ELEMENTS = [STEPS_ALL[1], STEPS_ALL[3]];
1176
+ const isRouteAnimationsAll = () => AnimationsService.isRouteAnimationsType('ALL');
1177
+ const isRouteAnimationsNone = () => AnimationsService.isRouteAnimationsType('NONE');
1178
+ const isRouteAnimationsPage = () => AnimationsService.isRouteAnimationsType('PAGE');
1179
+ const isRouteAnimationsElements = () => AnimationsService.isRouteAnimationsType('ELEMENTS');
1180
+ const routeAnimations = trigger('routeAnimations', [
1181
+ transition(isRouteAnimationsAll, STEPS_ALL),
1182
+ transition(isRouteAnimationsNone, STEPS_NONE),
1183
+ transition(isRouteAnimationsPage, STEPS_PAGE),
1184
+ transition(isRouteAnimationsElements, STEPS_ELEMENTS)
1185
+ ]);
1186
+
1187
+ class LocalStorageService {
1188
+ constructor() { }
1189
+ saveData(key, value) {
1190
+ localStorage.setItem(key, value);
1191
+ }
1192
+ getData(key) {
1193
+ return localStorage.getItem(key);
1194
+ }
1195
+ removeData(key) {
1196
+ localStorage.removeItem(key);
1197
+ }
1198
+ clearData() {
1199
+ localStorage.clear();
1200
+ }
1201
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LocalStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1202
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LocalStorageService, providedIn: 'root' });
1203
+ }
1204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LocalStorageService, decorators: [{
1205
+ type: Injectable,
1206
+ args: [{
1207
+ providedIn: 'root'
1208
+ }]
1209
+ }], ctorParameters: () => [] });
1210
+
1211
+ class DialogComponent {
1212
+ dialogRef;
1213
+ data;
1214
+ constructor(dialogRef, data) {
1215
+ this.dialogRef = dialogRef;
1216
+ this.data = data;
1217
+ if (!data.title) {
1218
+ data.title = 'Подтверждение';
1219
+ }
1220
+ if (!data.btnNoTitle) {
1221
+ data.btnNoTitle = 'Нет';
1222
+ }
1223
+ if (!data.btnYesTitle) {
1224
+ data.btnYesTitle = 'Да';
1225
+ }
1226
+ }
1227
+ onNoClick() {
1228
+ this.dialogRef.close();
1229
+ }
1230
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DialogComponent, deps: [{ token: i1$4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
1231
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: DialogComponent, isStandalone: true, selector: "lib-dialog", ngImport: i0, template: "<h1 mat-dialog-title>{{ data.title }}</h1>\n<div mat-dialog-content>\n <div style=\"white-space: pre-line\">{{ data.message }}</div>\n</div>\n<div mat-dialog-actions align=\"end\">\n <button mat-raised-button (click)=\"onNoClick()\" cdkFocusInitial>{{ data.btnNoTitle }}</button>\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"data.id\">{{ data.btnYesTitle }}</button>\n</div>\n\n", styles: [""], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
1232
+ }
1233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DialogComponent, decorators: [{
1234
+ type: Component,
1235
+ args: [{ selector: 'lib-dialog', imports: [MatDialogTitle, MatDialogContent, MatDialogActions, MatButton, MatDialogClose], template: "<h1 mat-dialog-title>{{ data.title }}</h1>\n<div mat-dialog-content>\n <div style=\"white-space: pre-line\">{{ data.message }}</div>\n</div>\n<div mat-dialog-actions align=\"end\">\n <button mat-raised-button (click)=\"onNoClick()\" cdkFocusInitial>{{ data.btnNoTitle }}</button>\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"data.id\">{{ data.btnYesTitle }}</button>\n</div>\n\n" }]
1236
+ }], ctorParameters: () => [{ type: i1$4.MatDialogRef }, { type: undefined, decorators: [{
1237
+ type: Inject,
1238
+ args: [MAT_DIALOG_DATA]
1239
+ }] }] });
1240
+
1241
+ class BasePageClass {
1242
+ routeAnimationsElements = ROUTE_ANIMATIONS_ELEMENTS;
1243
+ /** Данные для табличного компонента. */
1244
+ data$ = new BehaviorSubject([]);
1245
+ /** Количество записей по фильтру. */
1246
+ length$ = new BehaviorSubject(0);
1247
+ entityService;
1248
+ entityType;
1249
+ entityEditComponent;
1250
+ extraData;
1251
+ // eslint-disable-next-line no-magic-numbers
1252
+ defaultPageIndex = 0;
1253
+ // eslint-disable-next-line no-magic-numbers
1254
+ defaultPageSize = 10;
1255
+ dialog;
1256
+ dialogEditWidth = 'auto';
1257
+ dialogRemoveWidth = '400px';
1258
+ alertService;
1259
+ routeAddress = '';
1260
+ /** Сообщение при удалении записе(й). */
1261
+ removalMessage = '';
1262
+ /** Заголовок страницы. */
1263
+ pageTitle = '';
1264
+ /**
1265
+ * Создание записи: вызывается перед окрытием диалога.
1266
+ */
1267
+ beforeOpenDialogOnNewEvent;
1268
+ /**
1269
+ * Редактирование записи: вызывается перед окрытием диалога.
1270
+ */
1271
+ beforeOpenDialogOnEditEvent;
1272
+ /**
1273
+ * Создание записи: вызывается перед сохранением объекта.
1274
+ */
1275
+ beforeSaveOnNewEvent;
1276
+ /**
1277
+ * Редактирование записи: вызывается перед сохранением объекта.
1278
+ */
1279
+ beforeSaveOnEditEvent;
1280
+ /**
1281
+ * Создание записи: вызывается после сохранения объекта.
1282
+ */
1283
+ afterSaveOnNewEvent;
1284
+ /**
1285
+ * Редактирование записи: вызывается после сохранения объекта.
1286
+ */
1287
+ afterSaveOnEditEvent;
1288
+ editorRoles = [];
1289
+ executeRoles = [];
1290
+ /** Список ролей, для которых скрыть элемент. */
1291
+ hideRoles = ['HIDE'];
1292
+ /** Загрузка данных. */
1293
+ loadData$ = new Subject();
1294
+ /** Загрузка количества записей. */
1295
+ loadLength$ = new Subject();
1296
+ /** Очистка фильтра. */
1297
+ clearFilter$ = new Subject();
1298
+ /** Разрешен выбор нескольких строк. */
1299
+ allowMultiSelect = false;
1300
+ /** Выбранные строки в таблице. */
1301
+ selected = [];
1302
+ /** Состояние сортировки, пагинации. */
1303
+ tableState;
1304
+ /** Доступность кнопки "Изменить". */
1305
+ editBtnDisabled = true;
1306
+ /** Доступность кнопки "Удалить". */
1307
+ removeBtnDisabled = true;
1308
+ /** Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью. */
1309
+ dblClickedEventEnable = true;
1310
+ // Список элементов контекстного меню.
1311
+ opt = [];
1312
+ // DI
1313
+ router = inject(Router);
1314
+ localStorage = inject(LocalStorageService);
1315
+ subscription = new Subscription();
1316
+ constructor() {
1317
+ this.tableState = {
1318
+ sortActive: this.localStorage.getData(this.constructor.name + 'SortActive') || '',
1319
+ sortDirection: (this.localStorage.getData(this.constructor.name + 'SortDirection') || ''),
1320
+ pageIndex: Number(this.localStorage.getData(this.constructor.name + 'PageIndex')) || this.defaultPageIndex,
1321
+ pageSize: Number(this.localStorage.getData(this.constructor.name + 'PageSize')) || this.defaultPageSize
1322
+ };
1323
+ }
1324
+ ngOnDestroy() {
1325
+ if (this.subscription)
1326
+ this.subscription.unsubscribe();
1327
+ }
1328
+ onPageChange(pageState) {
1329
+ this.localStorage.saveData(this.constructor.name + 'PageIndex', pageState.pageIndex.toString());
1330
+ this.localStorage.saveData(this.constructor.name + 'PageSize', pageState.pageSize.toString());
1331
+ this.loadData$.next(null);
1332
+ this.loadLength$.next(null);
1333
+ }
1334
+ onSortChange(sortState) {
1335
+ this.localStorage.saveData(this.constructor.name + 'SortActive', sortState.sortActive);
1336
+ this.localStorage.saveData(this.constructor.name + 'SortDirection', sortState.sortDirection);
1337
+ this.loadData$.next(null);
1338
+ this.loadLength$.next(null);
1339
+ }
1340
+ entityFactory(type) {
1341
+ return new type();
1342
+ }
1343
+ /** Cобытие изменение выбранных записей. */
1344
+ onSelectionChange(selected) {
1345
+ this.selected = selected;
1346
+ this.editBtnDisabledUpdate(this.selected);
1347
+ this.removeBtnDisabledUpdate(this.selected);
1348
+ }
1349
+ /** Обновление доступности кнопки "Изменить" - вызывается при изменении выбранных записей. */
1350
+ editBtnDisabledUpdate(selected) {
1351
+ this.editBtnDisabled = !(selected && selected.length === 1);
1352
+ }
1353
+ /** Обновление доступности кнопки "Удалить" - вызывается при изменении выбранных записей. */
1354
+ removeBtnDisabledUpdate(selected) {
1355
+ this.removeBtnDisabled = !(selected && selected.length > 0);
1356
+ }
1357
+ /** Cобытие двойной клик. */
1358
+ onRowDoubleClicked() {
1359
+ this.editEvent();
1360
+ }
1361
+ /** Cобытие создание. */
1362
+ newEvent() {
1363
+ if (this.entityEditComponent) {
1364
+ const data = { action: Action.Add, entity: new this.entityType(null) };
1365
+ // Назначить значения полей объекта перед окрытием диалога.
1366
+ if (this.beforeOpenDialogOnNewEvent) {
1367
+ this.beforeOpenDialogOnNewEvent(data.entity, data.extraData);
1368
+ }
1369
+ // Открытие окна
1370
+ const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);
1371
+ // Обработка закрытия окна
1372
+ const subs = dialogRef.afterClosed().subscribe((result) => {
1373
+ // Проверка результата
1374
+ if (result && result.entity && (Object.keys(result.entity).length !== 0)) {
1375
+ // Дополнительные действия перед сохранением объекта.
1376
+ if (this.beforeSaveOnNewEvent)
1377
+ this.beforeSaveOnNewEvent(result.entity, result.extraData);
1378
+ const subs = this.entityService.newObject(result.entity)
1379
+ .subscribe({
1380
+ next: (obj) => {
1381
+ // Дополнительные действия после сохранения объекта.
1382
+ if (this.afterSaveOnNewEvent) {
1383
+ const callback = () => {
1384
+ this.refreshEvent();
1385
+ this.alertService?.success('Запись добавлена.');
1386
+ };
1387
+ this.afterSaveOnNewEvent(callback.bind(this), obj, result.extraData);
1388
+ }
1389
+ else {
1390
+ this.refreshEvent();
1391
+ this.alertService?.success('Запись добавлена.');
1392
+ }
1393
+ },
1394
+ error: (error) => {
1395
+ console.log('error', error);
1396
+ this.alertService?.error('Произошла ошибка при добавлении записи: ' + error, 0);
1397
+ }
1398
+ });
1399
+ this.subscription?.add(subs);
1400
+ }
1401
+ });
1402
+ this.subscription?.add(subs);
1403
+ // Закрытие окна по нажатию Escape
1404
+ const subs2 = dialogRef.keydownEvents().subscribe((event) => {
1405
+ if (event.key === 'Escape') {
1406
+ dialogRef.close(null);
1407
+ }
1408
+ });
1409
+ this.subscription?.add(subs2);
1410
+ }
1411
+ else {
1412
+ this.alertService?.warning('Действие не доступно.');
1413
+ }
1414
+ }
1415
+ /** Cобытие редактирование. */
1416
+ editEvent() {
1417
+ if (this.selected && this.selected.length === 1) {
1418
+ if (this.entityEditComponent) {
1419
+ const data = { action: Action.Edit, entity: this.selected[0] };
1420
+ // Назначить значения полей объекта перед окрытием диалога.
1421
+ if (this.beforeOpenDialogOnEditEvent) {
1422
+ this.beforeOpenDialogOnEditEvent(data.entity, data.extraData);
1423
+ }
1424
+ // Открытие окна
1425
+ const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);
1426
+ // Обработка закрытия окна
1427
+ const subs = dialogRef.afterClosed().subscribe((result) => {
1428
+ // Проверка результата
1429
+ if (result && result.entity && (Object.keys(result.entity).length !== 0)) {
1430
+ // Дополнительные действия перед сохранением объекта.
1431
+ if (this.beforeSaveOnEditEvent)
1432
+ this.beforeSaveOnEditEvent(result.entity, result.extraData);
1433
+ const subs = this.entityService.editObject(result.entity)
1434
+ .subscribe({
1435
+ next: () => {
1436
+ // Дополнительные действия после сохранения объекта.
1437
+ if (this.afterSaveOnEditEvent) {
1438
+ const callback = () => {
1439
+ this.refreshEvent();
1440
+ this.alertService?.success('Запись изменена.');
1441
+ };
1442
+ this.afterSaveOnEditEvent(callback.bind(this), result.entity, result.extraData);
1443
+ }
1444
+ else {
1445
+ this.refreshEvent();
1446
+ this.alertService?.success('Запись изменена.');
1447
+ }
1448
+ },
1449
+ error: (error) => {
1450
+ console.log('error', error);
1451
+ this.alertService?.error('Произошла ошибка при изменении записи: ' + error, 0);
1452
+ }
1453
+ });
1454
+ this.subscription?.add(subs);
1455
+ }
1456
+ });
1457
+ this.subscription?.add(subs);
1458
+ // Закрытие окна по нажатию Escape
1459
+ const subs2 = dialogRef.keydownEvents().subscribe((event) => {
1460
+ if (event.key === 'Escape') {
1461
+ dialogRef.close(null);
1462
+ }
1463
+ });
1464
+ this.subscription?.add(subs2);
1465
+ }
1466
+ else {
1467
+ this.alertService?.warning('Действие не доступно.');
1468
+ }
1469
+ }
1470
+ }
1471
+ /** Cобытие удаление. */
1472
+ removeEvent() {
1473
+ // если вырбана запись(и)
1474
+ if (this.selected && this.selected.length > 0) {
1475
+ const dialogRef = this.openDialogRemoveConfirm(this.removalMessage);
1476
+ if (dialogRef) {
1477
+ const subs = dialogRef.afterClosed().subscribe((result) => {
1478
+ // при подтверждении возвращается 'delete'
1479
+ if (result === 'delete') {
1480
+ const sourcesObject = {};
1481
+ this.selected.forEach((item, index) => sourcesObject['obj' + index] = this.entityService.deleteObject(item));
1482
+ // ждем, когда выполнятся все запросы
1483
+ const subs = forkJoin(sourcesObject)
1484
+ .subscribe({
1485
+ next: () => {
1486
+ this.refreshEvent();
1487
+ this.alertService?.success('Выбранные записи удалены.');
1488
+ },
1489
+ error: (error) => {
1490
+ console.log('error', error);
1491
+ this.alertService?.error('Произошла ошибка при удалении записи: ' + error, 0);
1492
+ }
1493
+ });
1494
+ this.subscription?.add(subs);
1495
+ }
1496
+ });
1497
+ this.subscription?.add(subs);
1498
+ // Закрытие окна по нажатию Escape
1499
+ const subs2 = dialogRef.keydownEvents().subscribe((event) => {
1500
+ if (event.key === 'Escape') {
1501
+ dialogRef.close(null);
1502
+ }
1503
+ });
1504
+ this.subscription?.add(subs2);
1505
+ }
1506
+ }
1507
+ }
1508
+ /** Событие обновления данных. */
1509
+ refreshEvent() {
1510
+ this.loadData$.next(null);
1511
+ this.loadLength$.next(null);
1512
+ }
1513
+ /** Cобытие очистки фильтра. */
1514
+ clearEvent() {
1515
+ this.clearFilter$.next(null);
1516
+ }
1517
+ /** Изменение сообщения об удалении. */
1518
+ onRemovalMessageChange(message) {
1519
+ this.removalMessage = message;
1520
+ }
1521
+ /** Изменение заголовка страницы. */
1522
+ onPageTitleChange(title) {
1523
+ this.pageTitle = title;
1524
+ }
1525
+ openDialog(entityComponent, data, dialog) {
1526
+ // create dialog config
1527
+ const dialogConfig = new MatDialogConfig();
1528
+ dialogConfig.disableClose = true;
1529
+ dialogConfig.autoFocus = true;
1530
+ dialogConfig.width = this.dialogEditWidth;
1531
+ dialogConfig.data = data;
1532
+ dialogConfig.panelClass = this.entityType.name + '-edit-dialog';
1533
+ // return dialog
1534
+ return dialog.open(entityComponent, dialogConfig);
1535
+ }
1536
+ openDialogRemoveConfirm(removalMessage) {
1537
+ let message = 'Вы хотите удалить ';
1538
+ message += removalMessage ?
1539
+ removalMessage :
1540
+ this.allowMultiSelect ? `выбранные записи (${this.selected.length})?` : 'выбранную запись?';
1541
+ return this.dialog?.open(DialogComponent, {
1542
+ width: this.dialogRemoveWidth,
1543
+ data: {
1544
+ id: 'delete',
1545
+ title: 'Подтверждение',
1546
+ message: message,
1547
+ btnNoTitle: 'Отмена',
1548
+ btnYesTitle: 'Удалить'
1549
+ }
1550
+ });
1551
+ }
1552
+ // contextMenu: Документы потока (в новой вкладке).
1553
+ onMiddleButton(baseUrl, queryParamName, queryParamValue) {
1554
+ return ($event, item, contextMenu) => {
1555
+ // Нажата средняя кнопка (в новой вкладке).
1556
+ // 1 - Auxiliary button pressed (usually the middle button)
1557
+ if ($event.button === 1) {
1558
+ //$event.preventDefault();
1559
+ contextMenu.closeMenu();
1560
+ // Converts the route into a string that can be used
1561
+ // with the window.open() function
1562
+ const url = this.router.serializeUrl(queryParamName && queryParamValue ?
1563
+ this.router.createUrlTree([baseUrl], { queryParams: { [queryParamName]: item[queryParamValue] } })
1564
+ : this.router.createUrlTree([baseUrl]));
1565
+ window.open(url, '_blank');
1566
+ }
1567
+ };
1568
+ }
1569
+ dateToString(date) {
1570
+ return date ? (new Date(date)).toLocaleString('ru-RU', { timeZone: 'Europe/Samara' }) : null; // MSK+01
1571
+ }
1572
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BasePageClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1573
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BasePageClass, isStandalone: true, ngImport: i0 });
1574
+ }
1575
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BasePageClass, decorators: [{
1576
+ type: Directive
1577
+ }], ctorParameters: () => [] });
1578
+
1579
+ class BaseServiceClass {
1580
+ baseRoute = '';
1581
+ entityType;
1582
+ countRoute = 'count';
1583
+ basePageRoute = 'page';
1584
+ basePageSizeRoute = 'pageSize';
1585
+ http = inject(HttpClient);
1586
+ constructor() { }
1587
+ getObjects() {
1588
+ return this.http.get(this.baseRoute)
1589
+ .pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));
1590
+ }
1591
+ getObject(id) {
1592
+ return this.http.get(this.baseRoute + id)
1593
+ .pipe(map(data => new this.entityType(data).deserialize(data)));
1594
+ }
1595
+ getCount() {
1596
+ return this.http.get(this.baseRoute + this.countRoute);
1597
+ }
1598
+ getObjectsByPaging(pageIndex, pageSize, sortColumn, direction) {
1599
+ const params = this.getParams(pageIndex, pageSize, sortColumn, direction);
1600
+ return this.http.get(this.baseRoute, { params })
1601
+ .pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));
1602
+ }
1603
+ newObject(entity) {
1604
+ return this.http.post(this.baseRoute, entity);
1605
+ }
1606
+ editObject(entity) {
1607
+ return this.http.put(this.baseRoute + entity.id, entity);
1608
+ }
1609
+ deleteObject(entity) {
1610
+ return this.http.delete(this.baseRoute + entity.id);
1611
+ }
1612
+ getParams(pageIndex, pageSize, sortColumn, direction) {
1613
+ let params = new HttpParams();
1614
+ if (pageIndex)
1615
+ params = params.append('page', pageIndex);
1616
+ if (pageSize)
1617
+ params = params.append('limit', pageSize);
1618
+ if (sortColumn)
1619
+ params = params.append('column', sortColumn);
1620
+ if (direction)
1621
+ params = params.append('direction', direction);
1622
+ return params;
1623
+ }
1624
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseServiceClass, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1625
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseServiceClass, providedIn: 'root' });
1626
+ }
1627
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseServiceClass, decorators: [{
1628
+ type: Injectable,
1629
+ args: [{
1630
+ providedIn: 'root'
1631
+ }]
1632
+ }], ctorParameters: () => [] });
1633
+
1634
+ class RedirectGuard {
1635
+ constructor() { }
1636
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1637
+ canActivate(route, state) {
1638
+ console.log(route.data['externalUrl']);
1639
+ window.location.href = route.data['externalUrl'];
1640
+ return true;
1641
+ }
1642
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RedirectGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1643
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RedirectGuard, providedIn: 'root' });
1644
+ }
1645
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RedirectGuard, decorators: [{
1646
+ type: Injectable,
1647
+ args: [{
1648
+ providedIn: 'root'
1649
+ }]
1650
+ }], ctorParameters: () => [] });
1651
+
1652
+ class SecUser {
1653
+ id = 0;
1654
+ login = '';
1655
+ fio = '';
1656
+ dept = 0;
1657
+ tabnum = 0;
1658
+ userView;
1659
+ constructor(init) {
1660
+ if (init) {
1661
+ Object.assign(this, init);
1662
+ }
1663
+ else {
1664
+ this.id = 0;
1665
+ this.login = '';
1666
+ this.dept = 0;
1667
+ this.tabnum = 0;
1668
+ this.fio = '';
1669
+ }
1670
+ }
1671
+ deserialize(input) {
1672
+ Object.assign(this, input);
1673
+ return this;
1674
+ }
1675
+ }
1676
+
1677
+ class SafePipe {
1678
+ sanitizer;
1679
+ constructor(sanitizer) {
1680
+ this.sanitizer = sanitizer;
1681
+ }
1682
+ transform(url) {
1683
+ return this.sanitizer.bypassSecurityTrustResourceUrl(url);
1684
+ }
1685
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: SafePipe, deps: [{ token: i1$5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
1686
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: SafePipe, isStandalone: true, name: "safe" });
1687
+ }
1688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: SafePipe, decorators: [{
1689
+ type: Pipe,
1690
+ args: [{
1691
+ name: 'safe'
1692
+ }]
1693
+ }], ctorParameters: () => [{ type: i1$5.DomSanitizer }] });
1694
+
1695
+ class TimePipe {
1696
+ transform(value) {
1697
+ // const hour = Math.abs(value) >= 60 ? Math.round(value / 60) + 'ч.' : '';
1698
+ // const minute = ' ' + Math.abs(value % 60) + 'м.';
1699
+ // return value === 0 ? '0' : hour + ' ' + minute;
1700
+ const hour = Math.abs(value) >= 60 ? Math.floor(Math.abs(value) / 60).toString().padStart(2, '0') : '00';
1701
+ const minute = Math.abs(value % 60).toString().padStart(2, '0');
1702
+ const time = hour + ':' + minute;
1703
+ return value < 0 ? '-' + time : time;
1704
+ }
1705
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TimePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1706
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: TimePipe, isStandalone: true, name: "time" });
1707
+ }
1708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TimePipe, decorators: [{
1709
+ type: Pipe,
1710
+ args: [{
1711
+ name: 'time'
1712
+ }]
1713
+ }] });
1714
+
1715
+ class TruncatePipe {
1716
+ // Usage:
1717
+ // {{ str | truncate:[20] }} // or
1718
+ // {{ str | truncate:[20, '...'] }} // or|
1719
+ transform(value, args) {
1720
+ const limit = args.length > 0 ? parseInt(args[0], 10) : 20;
1721
+ const trail = args.length > 1 ? args[1] : '...';
1722
+ return value.length > limit ? value.substring(0, limit) + trail : value;
1723
+ }
1724
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1725
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: TruncatePipe, isStandalone: true, name: "truncate" });
1726
+ }
1727
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TruncatePipe, decorators: [{
1728
+ type: Pipe,
1729
+ args: [{
1730
+ name: 'truncate'
1731
+ }]
1732
+ }] });
1733
+
1734
+ class AvatarService {
1735
+ http;
1736
+ baseRoute = 'common/human/';
1737
+ constructor(http) {
1738
+ this.http = http;
1739
+ }
1740
+ getAvatarById(idHuman) {
1741
+ return this.http.get(this.baseRoute + idHuman + '/avatar', { responseType: 'arraybuffer' });
1742
+ }
1743
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AvatarService, deps: [{ token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
1744
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AvatarService, providedIn: 'root' });
1745
+ }
1746
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AvatarService, decorators: [{
1747
+ type: Injectable,
1748
+ args: [{
1749
+ providedIn: 'root'
1750
+ }]
1751
+ }], ctorParameters: () => [{ type: i1$2.HttpClient }] });
1752
+
1753
+ class ExportService {
1754
+ constructor() {
1755
+ }
1756
+ // Экспорт в CSV
1757
+ exportCSV(data, filename = 'data', arrHeader, newHeaders) {
1758
+ const csvData = this.convertToCSV(data, arrHeader, newHeaders);
1759
+ console.log(csvData);
1760
+ const blob = new Blob(['\ufeff' + csvData], { type: 'text/csv;charset=utf-8;' });
1761
+ const dwldLink = document.createElement('a');
1762
+ const url = URL.createObjectURL(blob);
1763
+ const isSafariBrowser = navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1;
1764
+ if (isSafariBrowser) { //if Safari open in new window to save file with random filename.
1765
+ dwldLink.setAttribute('target', '_blank');
1766
+ }
1767
+ dwldLink.setAttribute('href', url);
1768
+ dwldLink.setAttribute('download', filename + '.csv');
1769
+ dwldLink.style.visibility = 'hidden';
1770
+ document.body.appendChild(dwldLink);
1771
+ dwldLink.click();
1772
+ document.body.removeChild(dwldLink);
1773
+ }
1774
+ convertToCSV(objArray, headerList, newHeaders) {
1775
+ const array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
1776
+ let str = '';
1777
+ let row = 'S.No,';
1778
+ for (const index in newHeaders) {
1779
+ if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {
1780
+ row += newHeaders[index] + ',';
1781
+ }
1782
+ }
1783
+ row = row.slice(0, -1);
1784
+ str += row + '\r\n';
1785
+ for (let i = 0; i < array.length; i++) {
1786
+ let line = (i + 1) + '';
1787
+ for (const index in headerList) {
1788
+ if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {
1789
+ const head = headerList[index];
1790
+ line += ',' + array[i][head];
1791
+ }
1792
+ }
1793
+ str += line + '\r\n';
1794
+ }
1795
+ return str;
1796
+ }
1797
+ // Экспорт в Excel
1798
+ exportExcel(data, heading, sheetName = 'sheet1', filename = 'data') {
1799
+ const wb = XLSX.utils.book_new();
1800
+ const ws = XLSX.utils.json_to_sheet([]);
1801
+ XLSX.utils.sheet_add_aoa(ws, heading);
1802
+ XLSX.utils.sheet_add_json(ws, data, { origin: 'A2', skipHeader: true });
1803
+ XLSX.utils.book_append_sheet(wb, ws, sheetName);
1804
+ XLSX.writeFile(wb, filename + '.xlsx');
1805
+ }
1806
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1807
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ExportService, providedIn: 'root' });
1808
+ }
1809
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ExportService, decorators: [{
1810
+ type: Injectable,
1811
+ args: [{
1812
+ providedIn: 'root'
1813
+ }]
1814
+ }], ctorParameters: () => [] });
1815
+
1816
+ class BaseMatChipComponent {
1817
+ // Все элементы
1818
+ items$ = new BehaviorSubject([]);
1819
+ // Выбранные элементы, ключи (ChipItem.value)
1820
+ selectedItems$ = new Observable();
1821
+ // Заголовок
1822
+ title = '';
1823
+ // Событие изменения выбранных элементов
1824
+ selectedItemsChange = new EventEmitter();
1825
+ input;
1826
+ separatorKeysCodes = [ENTER, COMMA];
1827
+ inputCtrl = new FormControl();
1828
+ filteredItems$;
1829
+ selectedItems = [];
1830
+ // Все элементы
1831
+ items = [];
1832
+ subscription;
1833
+ constructor() {
1834
+ }
1835
+ ngOnInit() {
1836
+ this.subscription = this.items$.subscribe(data => {
1837
+ // console.log('ITEMS$ data', data);
1838
+ this.items = data;
1839
+ if (this.items.length > 0) {
1840
+ this.filteredItems$ = this.inputCtrl.valueChanges.pipe(startWith(null), map(item => (item ? this._filter(item) : this.items.slice())));
1841
+ const subs = this.selectedItems$.subscribe(items => {
1842
+ // console.log('ITEMS', items);
1843
+ if (items)
1844
+ this.selectedItems = this.items.filter(s => items.includes(s.value));
1845
+ });
1846
+ this.subscription?.add(subs);
1847
+ }
1848
+ });
1849
+ }
1850
+ ngOnDestroy() {
1851
+ if (this.subscription)
1852
+ this.subscription.unsubscribe();
1853
+ }
1854
+ remove(value) {
1855
+ this.selectedItems = [...this.selectedItems];
1856
+ const index = this.selectedItems.map(i => i.value).indexOf(value);
1857
+ if (index >= 0) {
1858
+ this.selectedItems.splice(index, 1);
1859
+ this.selectedItemsChange.emit(this.selectedItems.map(i => i.value));
1860
+ }
1861
+ }
1862
+ selected(event) {
1863
+ this.selectedItems = [...this.selectedItems];
1864
+ const item = this.items.find(s => s.value == event.option.value);
1865
+ if (item) {
1866
+ this.selectedItems.push(item);
1867
+ }
1868
+ this.selectedItemsChange.emit(this.selectedItems.map(i => i.value));
1869
+ if (this.input)
1870
+ this.input.nativeElement.value = '';
1871
+ this.inputCtrl.setValue(null);
1872
+ }
1873
+ _filter(value) {
1874
+ const filterValue = value.toLowerCase();
1875
+ return this.items.filter(item => item.viewValue.toLowerCase().includes(filterValue));
1876
+ }
1877
+ onCloseClick($event) {
1878
+ $event.stopPropagation();
1879
+ this.selectedItemsChange.emit([]);
1880
+ }
1881
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseMatChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1882
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseMatChipComponent, isStandalone: true, selector: "lib-chip-input-autocomplete", inputs: { items$: "items$", selectedItems$: "selectedItems$", title: "title" }, outputs: { selectedItemsChange: "selectedItemsChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<mat-form-field class=\"chip-list\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-chip-grid #chipList aria-label=\"'\u0412\u044B\u0431\u043E\u0440 '+title\">\r\n @for (item of selectedItems; track item) {\r\n <mat-chip-row color=\"primary\"\r\n (removed)=\"remove(item.value)\">\r\n {{ item.viewValue }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input\r\n #input\r\n [placeholder]=\"'\u0412\u0432\u0435\u0434\u0438\u0442\u0435 '+title+'...'\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n >\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n @for (item of filteredItems$ | async; track item) {\r\n <mat-option [value]=\"item.value\"\r\n [disabled]=\"(selectedItems$ | async)?.includes(item.value)\">\r\n {{ item.viewValue }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n @if (selectedItems.length>0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onCloseClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".chip-list{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i4.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i4.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }] });
1883
+ }
1884
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseMatChipComponent, decorators: [{
1885
+ type: Component,
1886
+ args: [{ selector: 'lib-chip-input-autocomplete', imports: [MatFormField, AsyncPipe, FormsModule, ReactiveFormsModule, MatAutocompleteModule, MatIcon, MatOption, MatChipsModule, MatLabel], template: "<mat-form-field class=\"chip-list\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-chip-grid #chipList aria-label=\"'\u0412\u044B\u0431\u043E\u0440 '+title\">\r\n @for (item of selectedItems; track item) {\r\n <mat-chip-row color=\"primary\"\r\n (removed)=\"remove(item.value)\">\r\n {{ item.viewValue }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input\r\n #input\r\n [placeholder]=\"'\u0412\u0432\u0435\u0434\u0438\u0442\u0435 '+title+'...'\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n >\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n @for (item of filteredItems$ | async; track item) {\r\n <mat-option [value]=\"item.value\"\r\n [disabled]=\"(selectedItems$ | async)?.includes(item.value)\">\r\n {{ item.viewValue }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n @if (selectedItems.length>0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onCloseClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".chip-list{width:100%}\n"] }]
1887
+ }], ctorParameters: () => [], propDecorators: { items$: [{
1888
+ type: Input
1889
+ }], selectedItems$: [{
1890
+ type: Input
1891
+ }], title: [{
1892
+ type: Input
1893
+ }], selectedItemsChange: [{
1894
+ type: Output
1895
+ }], input: [{
1896
+ type: ViewChild,
1897
+ args: ['input']
1898
+ }] } });
1899
+
1900
+ function dateFormat(date) {
1901
+ if (date)
1902
+ return moment(date).format("YYYY-MM-DD");
1903
+ else
1904
+ return '';
1905
+ }
1906
+
1907
+ // See the Moment.js docs for the meaning of these formats:
1908
+ // https://momentjs.com/docs/#/displaying/format/
1909
+ const MY_FORMATS = {
1910
+ parse: {
1911
+ dateInput: 'DD.MM.YYYY',
1912
+ },
1913
+ display: {
1914
+ dateInput: 'DD.MM.YYYY',
1915
+ monthYearLabel: 'MMM YYYY',
1916
+ dateA11yLabel: 'LL',
1917
+ monthYearA11yLabel: 'MMMM YYYY',
1918
+ },
1919
+ };
1920
+
1921
+ class DateRangeFilterComponent {
1922
+ label = '';
1923
+ dateRange$ = new BehaviorSubject({ begin: '', end: '' });
1924
+ // eslint-disable-next-line no-magic-numbers
1925
+ minDate = new Date(2020, 0, 1);
1926
+ clearFilter$ = new Subject();
1927
+ required = false;
1928
+ dateRangeChange = new EventEmitter();
1929
+ form;
1930
+ subscription;
1931
+ constructor() {
1932
+ this.form = new FormGroup({
1933
+ begin: new FormControl(),
1934
+ end: new FormControl(),
1935
+ });
1936
+ }
1937
+ ngOnInit() {
1938
+ this.subscription = this.dateRange$.subscribe((value) => {
1939
+ console.log(value);
1940
+ if (this.form) {
1941
+ this.form.controls['begin'].setValue(value.begin ? new Date(value.begin) : null);
1942
+ this.form.controls['end'].setValue(value.end ? new Date(value.begin) : null);
1943
+ }
1944
+ this.dateRangeChange.emit(this.rangeToDateDateRange(this.form.value));
1945
+ });
1946
+ if (this.required) {
1947
+ this.form.controls['begin'].addValidators(Validators.required);
1948
+ this.form.controls['end'].addValidators(Validators.required);
1949
+ }
1950
+ // подписка на изменение периода
1951
+ this.form.valueChanges
1952
+ .pipe(
1953
+ // eslint-disable-next-line no-magic-numbers
1954
+ debounceTime(500), distinctUntilChanged())
1955
+ .subscribe({
1956
+ next: range => {
1957
+ if (this.required) {
1958
+ if (range.begin && range.end) {
1959
+ this.dateRangeChange.emit(this.rangeToDateDateRange(range));
1960
+ }
1961
+ }
1962
+ else {
1963
+ this.dateRangeChange.emit(this.rangeToDateDateRange(range));
1964
+ }
1965
+ }
1966
+ });
1967
+ const subs = this.clearFilter$.subscribe(() => {
1968
+ this.form.reset();
1969
+ });
1970
+ this.subscription?.add(subs);
1971
+ }
1972
+ ngOnDestroy() {
1973
+ if (this.subscription)
1974
+ this.subscription.unsubscribe();
1975
+ }
1976
+ rangeToDateDateRange(range) {
1977
+ return {
1978
+ begin: range.begin ? dateFormat(range.begin) : '',
1979
+ end: range.end ? dateFormat(range.end) : ''
1980
+ };
1981
+ }
1982
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateRangeFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1983
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: DateRangeFilterComponent, isStandalone: true, selector: "lib-date-range-filter", inputs: { label: "label", dateRange$: "dateRange$", minDate: "minDate", clearFilter$: "clearFilter$", required: "required" }, outputs: { dateRangeChange: "dateRangeChange" }, providers: [
1984
+ { provide: MAT_DATE_LOCALE, useValue: 'ru' },
1985
+ { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
1986
+ ], ngImport: i0, template: "<mat-form-field appearance=\"fill\">\n <mat-label>{{label}}</mat-label>\n <mat-date-range-input\n [rangePicker]=\"picker\"\n [formGroup]=\"form\"\n [min]=\"minDate\">\n <input matStartDate formControlName=\"begin\" placeholder=\"\u0414\u0430\u0442\u0430 \u043D\u0430\u0447\u0430\u043B\u0430\">\n <input matEndDate formControlName=\"end\" placeholder=\"\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\">\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n <mat-error>\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0435\u0440\u0438\u043E\u0434</mat-error>\n</mat-form-field>\n\n", styles: ["mat-form-field{margin-right:16px}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }] });
1987
+ }
1988
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateRangeFilterComponent, decorators: [{
1989
+ type: Component,
1990
+ args: [{ selector: 'lib-date-range-filter', imports: [MatFormField, MatLabel, MatDateRangeInput, FormsModule, ReactiveFormsModule, MatStartDate, MatEndDate,
1991
+ MatDatepickerToggle, MatSuffix, MatDateRangePicker, MatError], providers: [
1992
+ { provide: MAT_DATE_LOCALE, useValue: 'ru' },
1993
+ { provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
1994
+ ], template: "<mat-form-field appearance=\"fill\">\n <mat-label>{{label}}</mat-label>\n <mat-date-range-input\n [rangePicker]=\"picker\"\n [formGroup]=\"form\"\n [min]=\"minDate\">\n <input matStartDate formControlName=\"begin\" placeholder=\"\u0414\u0430\u0442\u0430 \u043D\u0430\u0447\u0430\u043B\u0430\">\n <input matEndDate formControlName=\"end\" placeholder=\"\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\">\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n <mat-error>\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0435\u0440\u0438\u043E\u0434</mat-error>\n</mat-form-field>\n\n", styles: ["mat-form-field{margin-right:16px}\n"] }]
1995
+ }], ctorParameters: () => [], propDecorators: { label: [{
1996
+ type: Input
1997
+ }], dateRange$: [{
1998
+ type: Input
1999
+ }], minDate: [{
2000
+ type: Input
2001
+ }], clearFilter$: [{
2002
+ type: Input
2003
+ }], required: [{
2004
+ type: Input
2005
+ }], dateRangeChange: [{
2006
+ type: Output
2007
+ }] } });
2008
+
2009
+ var DialogAction;
2010
+ (function (DialogAction) {
2011
+ DialogAction["Add"] = "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C";
2012
+ DialogAction["Edit"] = "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C";
2013
+ DialogAction["Delete"] = "\u0423\u0434\u0430\u043B\u0438\u0442\u044C";
2014
+ DialogAction["None"] = "";
2015
+ })(DialogAction || (DialogAction = {}));
2016
+
2017
+ /* eslint-disable max-len */
2018
+ class ImzLogoComponent {
2019
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ImzLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2020
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: ImzLogoComponent, isStandalone: true, selector: "lib-imz-logo", ngImport: i0, template: `
2021
+ <svg id="logo_mechan" viewBox="0 0 116 32" width="100%" height="100%" fill="white">
2022
+ <path d="M53.080 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.41v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.005 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.003 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006zM47.53 19.26c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-5.5l-2 5.5c-0.014 0.044-0.038 0.081-0.070 0.11l-0 0c-0.036 0.032-0.080 0.056-0.128 0.069l-0.002 0.001h-1.080c-0.028-0.027-0.049-0.060-0.060-0.098l-0-0.002-1.94-5.5v5.5c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-6c-0.001-0.012-0.002-0.027-0.002-0.042 0-0.142 0.054-0.271 0.142-0.369l-0 0c0.091-0.087 0.215-0.141 0.352-0.141 0.010 0 0.020 0 0.030 0.001l-0.001-0h0.9c0.062-0.007 0.133-0.012 0.205-0.012s0.143 0.004 0.214 0.012l-0.009-0.001c0.114 0.024 0.215 0.069 0.303 0.132l-0.003-0.002c0.086 0.064 0.156 0.144 0.208 0.236l0.002 0.004c0.059 0.106 0.11 0.229 0.147 0.358l0.003 0.012 1.46 4 1.51-4c0.043-0.143 0.094-0.265 0.156-0.382l-0.006 0.012c0.051-0.093 0.115-0.172 0.189-0.239l0.001-0.001c0.070-0.059 0.154-0.104 0.246-0.129l0.004-0.001c0.051-0.007 0.11-0.011 0.17-0.011s0.119 0.004 0.177 0.012l-0.007-0.001h0.87c0.036-0.007 0.078-0.010 0.12-0.010s0.084 0.004 0.124 0.011l-0.004-0.001c0.068 0.022 0.125 0.060 0.17 0.11l0 0c0.044 0.047 0.078 0.104 0.099 0.167l0.001 0.003c0.006 0.035 0.009 0.074 0.009 0.115s-0.003 0.080-0.010 0.119l0.001-0.004zM90.39 0.27c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.069-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.045 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.080l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.026 0.003 0.056 0.004 0.087 0.004 0.109 0 0.213-0.020 0.309-0.056l-0.006 0.002c0.077-0.035 0.143-0.079 0.201-0.131l-0.001 0.001c0.076-0.050 0.137-0.118 0.179-0.197l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.031 0.035 0.053 0.080 0.060 0.129l0 0.001zM91.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.31 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.39-3.5 0.1-0.090c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM84.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.21 0.27-0.15 0.22-2.3 3.46-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM77.63 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.7c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.1c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.39c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.188-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.513l0.008-0.027 0.49-1.34c-0.003-0.018-0.004-0.039-0.004-0.060s0.001-0.042 0.004-0.062l-0 0.002c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.167l-0.011 0.003c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.226 0.18 0.318 0.288l0.002 0.002c0.102 0.123 0.195 0.26 0.273 0.407l0.007 0.013c0.091 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.083 0.071 0.183 0.097 0.287l0.003 0.013c0.019 0.037 0.036 0.080 0.049 0.125l0.001 0.005zM71.63 7.83c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002c-0.023 0.042-0.050 0.078-0.080 0.11l0-0c-0.064 0.057-0.136 0.107-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.353 0.127-0.76 0.2-1.185 0.2-0.005 0-0.011 0-0.016-0h0.001c-0.017 0-0.038 0.001-0.058 0.001-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.301-0.304-0.535-0.675-0.674-1.090l-0.006-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.020-0.001-0.044-0.001-0.068 0-0.519 0.084-1.019 0.24-1.485l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.333-0.122 0.717-0.193 1.117-0.193 0.050 0 0.1 0.001 0.15 0.003l-0.007-0c0.081-0.008 0.175-0.012 0.27-0.012s0.189 0.004 0.282 0.013l-0.012-0.001c0.184 0.031 0.345 0.072 0.501 0.126l-0.021-0.006c0.155 0.050 0.287 0.108 0.412 0.176l-0.012-0.006c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.071 0.273-0.111 0.587-0.111 0.911 0 0.031 0 0.063 0.001 0.094l-0-0.005c-0 0.014-0 0.031-0 0.048 0 0.338 0.044 0.667 0.126 0.979l-0.006-0.027c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.417l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.31-0.19c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.070 0.17 0.070 0.27 0.070 0.4zM64.41 6.83c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.15-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.96h1c0.012 0 0.025 0 0.039 0 0.157 0 0.309-0.022 0.453-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.025-0.080 0.039-0.173 0.039-0.269 0-0.046-0.003-0.092-0.010-0.136l0.001 0.005zM64 4c0.013-0.060 0.020-0.129 0.020-0.2s-0.007-0.14-0.021-0.207l0.001 0.006c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.141-0.038-0.302-0.060-0.469-0.060-0.014 0-0.029 0-0.043 0.001l0.002-0h-0.69v1.76h0.71c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.113-0.044 0.21-0.109 0.29-0.19l0-0c0.101-0.076 0.182-0.173 0.238-0.285l0.002-0.005c0.008-0.048 0.012-0.104 0.012-0.16s-0.004-0.112-0.013-0.166l0.001 0.006zM65.78 6.85c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.177 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.93c-0.001-0.013-0.002-0.029-0.002-0.044 0-0.111 0.043-0.211 0.113-0.286l-0 0c0.073-0.062 0.168-0.1 0.272-0.1 0.006 0 0.012 0 0.018 0l-0.001-0h1.71c0.017-0 0.038-0 0.058-0 0.352 0 0.694 0.040 1.022 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.184 0.222-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.036 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.121 0.136 0.219 0.295 0.286 0.469l0.004 0.011c0.070 0.182 0.11 0.393 0.11 0.613 0 0.006-0 0.012-0 0.018v-0.001zM59.65 8.31c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.86c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.026 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.43v1.7h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.027 0.1 0.048 0.22 0.059 0.342l0.001 0.008zM54.57 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.16c-0.048-0.015-0.089-0.043-0.12-0.080l-0-0c-0.029-0.034-0.053-0.074-0.069-0.117l-0.001-0.003-0.48-1.53c-0.063-0.208-0.137-0.387-0.228-0.556l0.008 0.016c-0.073-0.135-0.163-0.251-0.269-0.349l-0.001-0.001c-0.097-0.1-0.218-0.176-0.354-0.218l-0.006-0.002c-0.124-0.038-0.266-0.060-0.413-0.060-0.002 0-0.005 0-0.008 0h-0.27v2.72c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.070c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001v-2.71h-0.27c-0.044-0.005-0.095-0.008-0.147-0.008-0.14 0-0.275 0.021-0.403 0.061l0.010-0.003c-0.132 0.043-0.246 0.112-0.34 0.2l0-0c-0.1 0.099-0.183 0.215-0.247 0.342l-0.003 0.008c-0.073 0.145-0.141 0.318-0.194 0.496l-0.006 0.024-0.48 1.53c-0.017 0.046-0.041 0.086-0.070 0.121l0-0.001c-0.030 0.038-0.071 0.066-0.118 0.080l-0.002 0h-1.15c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001s0 0 0-0.060c-0.001-0.014-0.002-0.029-0.002-0.045s0.001-0.031 0.002-0.047l-0 0.002v-0.12l0.060-0.16 0.47-1.35c0.085-0.255 0.173-0.466 0.274-0.67l-0.014 0.030c0.083-0.164 0.176-0.305 0.283-0.434l-0.003 0.004c0.092-0.112 0.197-0.207 0.315-0.287l0.005-0.003c0.112-0.075 0.241-0.142 0.376-0.195l0.014-0.005c-0.13-0.041-0.242-0.096-0.345-0.163l0.005 0.003c-0.112-0.073-0.208-0.159-0.288-0.258l-0.002-0.002c-0.096-0.119-0.182-0.254-0.254-0.397l-0.006-0.013c-0.058-0.148-0.116-0.335-0.163-0.526l-0.007-0.034-0.4-1.21c-0.028-0.070-0.056-0.157-0.077-0.246l-0.003-0.014c-0.003-0.024-0.004-0.052-0.004-0.080s0.001-0.056 0.004-0.083l-0 0.003c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001c0.028-0.031 0.066-0.053 0.109-0.060l0.001-0h1.12c0.045 0.015 0.083 0.043 0.11 0.079l0 0.001c0.025 0.034 0.046 0.074 0.059 0.117l0.001 0.003 0.43 1.43c0.056 0.194 0.121 0.36 0.198 0.518l-0.008-0.019c0.062 0.128 0.143 0.237 0.239 0.33l0.001 0c0.086 0.080 0.189 0.142 0.304 0.178l0.006 0.002c0.121 0.038 0.261 0.060 0.406 0.060 0.005 0 0.010-0 0.015-0h0.269v-2.54c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001c0.025-0.032 0.059-0.056 0.099-0.070l0.001-0h1.070c0.044 0.012 0.082 0.036 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.27c0.006 0 0.013 0 0.021 0 0.139 0 0.273-0.022 0.398-0.063l-0.009 0.003c0.125-0.041 0.232-0.106 0.32-0.19l-0 0c0.096-0.094 0.176-0.203 0.237-0.323l0.003-0.007c0.072-0.139 0.137-0.302 0.185-0.471l0.005-0.019 0.43-1.42c0.020-0.046 0.047-0.086 0.080-0.12l-0 0c0.027-0.037 0.065-0.065 0.108-0.080l0.002-0h1.1c0.044 0.008 0.081 0.030 0.11 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0 0.070 0 0.15-0.080 0.26l-0.4 1.19c-0.075 0.227-0.153 0.415-0.242 0.597l0.012-0.027c-0.073 0.152-0.156 0.284-0.253 0.404l0.003-0.004c-0.084 0.103-0.18 0.192-0.285 0.267l-0.005 0.003c-0.101 0.069-0.216 0.129-0.338 0.176l-0.012 0.004c0.15 0.065 0.278 0.135 0.399 0.216l-0.009-0.006c0.122 0.087 0.227 0.186 0.318 0.297l0.002 0.003c0.101 0.128 0.191 0.272 0.264 0.426l0.006 0.014c0.081 0.165 0.169 0.377 0.246 0.593l0.014 0.047 0.46 1.35 0.060 0.16v0.21c0.031 0.015 0.057 0.032 0.081 0.051l-0.001-0.001zM45.19 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.32 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM43.73 28.25c0 0.014 0.001 0.031 0.001 0.048 0 0.309-0.070 0.603-0.196 0.864l0.005-0.012c-0.132 0.263-0.318 0.481-0.545 0.646l-0.005 0.003c-0.245 0.179-0.532 0.317-0.843 0.396l-0.017 0.004c-0.316 0.083-0.68 0.13-1.054 0.13-0.016 0-0.032-0-0.048-0l0.002 0c-0.091 0.008-0.198 0.012-0.305 0.012s-0.214-0.004-0.319-0.013l0.014 0.001c-0.189-0.032-0.354-0.073-0.514-0.127l0.023 0.007-0.33-0.21-0.18-0.11c-0.031-0.025-0.058-0.055-0.079-0.089l-0.001-0.001c-0.003-0.020-0.005-0.042-0.005-0.065s0.002-0.045 0.006-0.067l-0 0.002c-0.002-0.033-0.003-0.071-0.003-0.11s0.001-0.077 0.004-0.115l-0 0.005c0-0.090 0-0.19 0-0.32-0.010-0.045-0.016-0.097-0.016-0.15s0.006-0.105 0.016-0.155l-0.001 0.005c0.020-0.047 0.066-0.080 0.12-0.080v0c0.067 0.006 0.129 0.028 0.182 0.061l-0.002-0.001 0.29 0.15c0.12 0.055 0.263 0.107 0.411 0.146l0.019 0.004c0.168 0.045 0.361 0.070 0.56 0.070 0.011 0 0.021-0 0.031-0l-0.002 0c0.003 0 0.007 0 0.010 0 0.178 0 0.35-0.026 0.513-0.073l-0.013 0.003c0.149-0.040 0.279-0.106 0.393-0.192l-0.003 0.002c0.104-0.080 0.188-0.18 0.248-0.295l0.002-0.005c0.057-0.11 0.090-0.24 0.090-0.378 0-0.004-0-0.008-0-0.012v0.001c0-0.005 0-0.010 0-0.016 0-0.146-0.029-0.285-0.083-0.411l0.003 0.007c-0.056-0.13-0.141-0.237-0.248-0.319l-0.002-0.001c-0.125-0.090-0.272-0.159-0.431-0.198l-0.009-0.002c-0.177-0.045-0.38-0.070-0.589-0.070-0.014 0-0.029 0-0.043 0l0.002-0h-0.92c-0.036-0.016-0.064-0.044-0.080-0.079l-0-0.001c-0.005-0.024-0.008-0.052-0.008-0.080s0.003-0.056 0.008-0.083l-0 0.003c0-0.070 0-0.16 0-0.27-0.002-0.037-0.003-0.081-0.003-0.125s0.001-0.088 0.003-0.131l-0 0.006c-0.004-0.023-0.006-0.049-0.006-0.075s0.002-0.052 0.007-0.078l-0 0.003c0.015-0.034 0.039-0.061 0.069-0.080l0.001-0h0.84c0.012 0 0.027 0 0.042 0 0.187 0 0.369-0.022 0.544-0.064l-0.016 0.003c0.156-0.038 0.294-0.104 0.413-0.192l-0.003 0.002c0.105-0.079 0.189-0.18 0.248-0.295l0.002-0.005c0.057-0.114 0.090-0.248 0.090-0.39 0-0.003-0-0.007-0-0.010v0.001c0-0.004 0-0.008 0-0.013 0-0.118-0.022-0.23-0.062-0.333l0.002 0.006c-0.042-0.104-0.107-0.192-0.189-0.259l-0.001-0.001c-0.090-0.075-0.197-0.133-0.314-0.168l-0.006-0.002c-0.128-0.038-0.275-0.060-0.427-0.060-0.012 0-0.023 0-0.035 0l0.002-0c-0.005-0-0.012-0-0.018-0-0.196 0-0.386 0.026-0.568 0.074l0.015-0.003c-0.171 0.044-0.314 0.091-0.453 0.148l0.023-0.008-0.31 0.15c-0.054 0.035-0.118 0.060-0.188 0.070l-0.002 0h-0.060c-0.002-0.011-0.004-0.023-0.004-0.035s0.001-0.024 0.004-0.036l-0 0.001c-0.003-0.023-0.005-0.049-0.005-0.075s0.002-0.052 0.005-0.078l-0 0.003c0-0.060 0-0.14 0-0.25s0-0.13 0-0.19c-0.002-0.024-0.003-0.052-0.003-0.080s0.001-0.056 0.003-0.084l-0 0.004c-0.002-0.020-0.003-0.042-0.003-0.065s0.001-0.046 0.004-0.068l-0 0.003c0.022-0.042 0.048-0.079 0.080-0.11v0c0.064-0.049 0.136-0.092 0.213-0.127l0.007-0.003c0.118-0.056 0.257-0.107 0.402-0.146l0.018-0.004c0.15-0.046 0.336-0.088 0.526-0.117l0.024-0.003c0.097-0.008 0.211-0.012 0.325-0.012s0.228 0.004 0.34 0.013l-0.015-0.001c0.023-0.001 0.051-0.001 0.079-0.001 0.31 0 0.61 0.040 0.896 0.116l-0.024-0.006c0.26 0.068 0.488 0.182 0.684 0.333l-0.004-0.003c0.176 0.139 0.316 0.317 0.407 0.521l0.003 0.009c0.089 0.206 0.14 0.445 0.14 0.696 0 0.008-0 0.017-0 0.025v-0.001c0 0.005 0 0.010 0 0.015 0 0.205-0.033 0.403-0.094 0.588l0.004-0.013c-0.115 0.346-0.345 0.628-0.643 0.806l-0.007 0.004c-0.144 0.089-0.311 0.158-0.489 0.198l-0.011 0.002c0.215 0.022 0.412 0.083 0.589 0.174l-0.009-0.004c0.341 0.181 0.602 0.474 0.736 0.829l0.004 0.011c0.070 0.175 0.11 0.377 0.11 0.589 0 0 0 0.001 0 0.001v-0zM115.19 11.010c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.070-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.046 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.079l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.006 0 0.012 0 0.019 0 0.104 0 0.205-0.018 0.297-0.052l-0.006 0.002c0.092-0.031 0.172-0.075 0.242-0.131l-0.002 0.001c0.063-0.051 0.114-0.114 0.149-0.187l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.058 0.003 0.11 0.025 0.15 0.060l-0-0zM115.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM108.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM102.43 19.41c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.71c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.080c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.46c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.54h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.189-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.514l0.008-0.027 0.45-1.35c0.015-0.046 0.035-0.086 0.061-0.121l-0.001 0.001c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.166l-0.011 0.004c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.227 0.18 0.318 0.288l0.002 0.002c0.106 0.123 0.202 0.261 0.284 0.407l0.007 0.013c0.090 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.084 0.071 0.183 0.097 0.287l0.003 0.013c0.010 0.038 0.017 0.082 0.020 0.128l0 0.002zM96.43 18.57c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002-0.080 0.11c-0.064 0.057-0.136 0.106-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.15 0.054-0.331 0.102-0.518 0.137l-0.022 0.003c-0.198 0.038-0.427 0.060-0.66 0.060h-0c-0.017 0-0.038 0-0.058 0-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.266-0.295-0.471-0.649-0.595-1.040l-0.005-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.023-0.001-0.050-0.001-0.077 0-0.519 0.084-1.019 0.24-1.486l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.368-0.152 0.794-0.24 1.242-0.24 0.010 0 0.020 0 0.030 0h-0.002c0.359 0.005 0.702 0.067 1.023 0.177l-0.023-0.007c0.149 0.025 0.28 0.060 0.407 0.105l-0.017-0.005c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.075 0.3-0.118 0.645-0.118 1s0.043 0.7 0.124 1.029l-0.006-0.029c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.416l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.27-0.16c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.080 0.11 0.080 0.21 0.080 0.34zM90.71 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.43c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.42v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.022 0.103 0.036 0.224 0.040 0.347l0 0.003zM85.2 19.36c0.005 0.013 0.008 0.029 0.008 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.070l-0.002 0h-1.070c-0.047-0.013-0.088-0.038-0.12-0.070v0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.36h-1.080c-0.007 0-0.016 0-0.025 0-0.345 0-0.682-0.036-1.006-0.106l0.031 0.006c-0.301-0.062-0.567-0.184-0.795-0.354l0.005 0.004c-0.225-0.175-0.4-0.405-0.506-0.669l-0.004-0.011c-0.115-0.298-0.181-0.642-0.181-1.002 0-0.031 0.001-0.062 0.001-0.092l-0 0.004v-1.83c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.028-0.033 0.066-0.058 0.108-0.070l0.002-0h1.070c0.047 0.013 0.088 0.038 0.12 0.070v0c0.006 0.013 0.009 0.029 0.009 0.045s-0.003 0.032-0.009 0.046l0-0.001v1.8c-0 0.005-0 0.010-0 0.015 0 0.187 0.026 0.367 0.073 0.539l-0.003-0.014c0.041 0.15 0.117 0.278 0.22 0.38l0 0c0.109 0.106 0.243 0.185 0.393 0.228l0.007 0.002c0.173 0.051 0.372 0.080 0.577 0.080 0.015 0 0.030-0 0.045-0l-0.002 0h0.91v-3c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.032-0.032 0.073-0.057 0.118-0.070l0.002-0h1.070c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001zM79.070 19.36c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.17c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.57c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM72.070 19.36c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.090c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-2.75h-2.6v2.73c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.080c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-6.34c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.013 0.081 0.037 0.11 0.070l0 0c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001v2.49h2.54v-2.49c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.090c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001zM62.7 14.050v0l-0.94 2.88h1.9zM65.8 19.050c0.031 0.084 0.059 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.023-0.031-0.040-0.068-0.050-0.108l-0-0.002-0.46-1.41h-2.57l-0.43 1.31c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.74c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0.001h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.031 0.046 0.055 0.099 0.069 0.157l0.001 0.003zM59.15 19.050c0.045 0.082 0.086 0.178 0.117 0.278l0.003 0.012c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.063 0.044-0.142 0.070-0.226 0.070-0.001 0-0.003 0-0.004-0h-1.070c-0.048-0.012-0.089-0.036-0.12-0.070l-0-0c-0.024-0.029-0.045-0.062-0.059-0.098l-0.001-0.002-1.29-2.5-1.26 2.44c-0.020 0.038-0.043 0.071-0.070 0.1l0-0c-0.031 0.034-0.072 0.058-0.118 0.070l-0.002 0h-1.030c-0 0-0 0-0 0-0.076 0-0.146-0.026-0.2-0.070l0.001 0c-0.014-0.024-0.023-0.054-0.023-0.085s0.008-0.061 0.023-0.086l-0 0.001c0.037-0.111 0.081-0.207 0.134-0.297l-0.004 0.007 1.62-3-1.57-2.71c-0.044-0.083-0.088-0.182-0.125-0.284l-0.005-0.016c-0.017-0.024-0.026-0.053-0.026-0.085s0.010-0.061 0.027-0.085l-0 0.001c0.061-0.043 0.138-0.069 0.22-0.070h1.14c0.048 0.010 0.090 0.035 0.12 0.070l0 0 0.070 0.1 1.19 2.24 1.15-2.24 0.070-0.1c0.028-0.034 0.066-0.058 0.109-0.070l0.001-0h0.99c0.002-0 0.004-0 0.007-0 0.077 0 0.148 0.026 0.204 0.071l-0.001-0.001c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.036 0.117-0.077 0.216-0.125 0.311l0.005-0.011-1.47 2.72zM68.37 24.6h-1.57q-0.090 0.79-0.19 1.39c-0.060 0.4-0.12 0.75-0.18 1.060s-0.12 0.56-0.19 0.78c-0.064 0.233-0.129 0.422-0.203 0.607l0.013-0.037c-0.064 0.16-0.131 0.295-0.208 0.424l0.008-0.014c-0.076 0.119-0.149 0.221-0.226 0.318l0.006-0.008h2.74zM70.57 31.84c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.023 0.028-0.053 0.049-0.089 0.060l-0.001 0h-0.95c-0.040-0.011-0.074-0.032-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-1.63h-4.5v1.59c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.026 0.028-0.060 0.049-0.099 0.060l-0.001 0h-1.020c-0.040-0.009-0.075-0.030-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.43c-0.002-0.014-0.004-0.029-0.004-0.046 0-0.067 0.024-0.128 0.064-0.175l-0 0c0.046-0.044 0.109-0.071 0.178-0.071 0.008 0 0.015 0 0.023 0.001l-0.001-0h0.31c0.080-0.12 0.16-0.24 0.24-0.37 0.076-0.126 0.15-0.274 0.212-0.429l0.008-0.021c0.070-0.17 0.14-0.38 0.21-0.62s0.13-0.53 0.2-0.87 0.13-0.75 0.2-1.23 0.14-1 0.21-1.66c0.010-0.128 0.053-0.244 0.121-0.342l-0.001 0.002c0.062-0.068 0.152-0.111 0.251-0.111 0.007 0 0.013 0 0.020 0.001l-0.001-0h3.46c0.007-0 0.014-0.001 0.022-0.001 0.105 0 0.199 0.042 0.268 0.111v0c0.069 0.079 0.111 0.183 0.111 0.296 0 0.012-0 0.024-0.001 0.035l0-0.002v5.2h0.57c0.006-0.001 0.013-0.001 0.020-0.001 0.071 0 0.135 0.031 0.179 0.081l0 0c0.038 0.055 0.060 0.123 0.060 0.196 0 0.005-0 0.010-0 0.014l0-0.001zM61.97 26.84c0.001-0.026 0.001-0.058 0.001-0.089 0-0.322-0.029-0.637-0.086-0.943l0.005 0.032c-0.047-0.282-0.145-0.535-0.285-0.759l0.005 0.009c-0.132-0.204-0.311-0.367-0.522-0.476l-0.008-0.004c-0.228-0.108-0.495-0.171-0.776-0.171-0.019 0-0.038 0-0.056 0.001l0.003-0c-0.017-0.001-0.037-0.001-0.057-0.001-0.286 0-0.556 0.071-0.792 0.195l0.009-0.004c-0.225 0.126-0.409 0.298-0.546 0.504l-0.004 0.006c-0.136 0.212-0.237 0.461-0.288 0.727l-0.002 0.013c-0.057 0.27-0.090 0.581-0.090 0.9v0c-0 0.021-0 0.046-0 0.071 0 0.328 0.029 0.65 0.085 0.962l-0.005-0.033c0.049 0.286 0.147 0.542 0.285 0.77l-0.005-0.010c0.13 0.206 0.309 0.37 0.523 0.477l0.008 0.003c0.226 0.102 0.49 0.161 0.768 0.161 0.025 0 0.050-0 0.075-0.001l-0.004 0c0.017 0.001 0.037 0.001 0.057 0.001 0.286 0 0.556-0.071 0.792-0.195l-0.009 0.004c0.226-0.124 0.411-0.296 0.546-0.504l0.004-0.006c0.136-0.215 0.237-0.467 0.288-0.737l0.002-0.013c0.063-0.27 0.102-0.583 0.11-0.904l0-0.006zM63.41 26.77c0 0.019 0 0.042 0 0.065 0 0.512-0.077 1.006-0.22 1.471l0.009-0.035c-0.131 0.437-0.344 0.815-0.623 1.133l0.003-0.003c-0.27 0.305-0.604 0.546-0.982 0.703l-0.018 0.007c-0.394 0.153-0.851 0.241-1.328 0.241-0.029 0-0.058-0-0.086-0.001l0.004 0c-0.020 0-0.043 0.001-0.067 0.001-0.466 0-0.914-0.077-1.333-0.219l0.029 0.009c-0.395-0.129-0.731-0.346-0.999-0.629l-0.001-0.001c-0.267-0.296-0.47-0.655-0.585-1.051l-0.005-0.019c-0.127-0.439-0.201-0.943-0.201-1.464 0-0.030 0-0.060 0.001-0.091l-0 0.005c-0-0.017-0-0.037-0-0.057 0-0.504 0.077-0.99 0.22-1.447l-0.009 0.034c0.133-0.43 0.346-0.8 0.623-1.113l-0.003 0.003c0.271-0.301 0.605-0.539 0.982-0.694l0.018-0.006c0.4-0.159 0.864-0.25 1.349-0.25 0.021 0 0.043 0 0.064 0.001l-0.003-0c0.026-0.001 0.056-0.001 0.086-0.001 0.455 0 0.893 0.073 1.303 0.209l-0.029-0.008c0.395 0.129 0.731 0.346 0.999 0.629l0.001 0.001c0.27 0.296 0.477 0.654 0.595 1.051l0.005 0.019c0.14 0.446 0.22 0.959 0.22 1.49v0zM54.77 28.25c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.151-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.93h1c0.011 0 0.024 0 0.038 0 0.157 0 0.31-0.022 0.454-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.051-0.116 0.081-0.251 0.081-0.393 0-0.013-0-0.026-0.001-0.038l0 0.002zM54.42 25.35c0-0.008 0-0.018 0-0.028 0-0.123-0.022-0.24-0.063-0.349l0.002 0.007c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.14-0.038-0.302-0.060-0.468-0.060-0.015 0-0.030 0-0.044 0.001l0.002-0h-0.69v1.75h0.76c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.124-0.034 0.231-0.093 0.321-0.171l-0.001 0.001c0.074-0.081 0.132-0.177 0.168-0.284l0.002-0.006c0.038-0.105 0.060-0.227 0.060-0.354 0-0.009-0-0.018-0-0.027l0 0.001zM56.2 28.2c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.178 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.92c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h1.69c0.003 0 0.006 0 0.010 0 0.351 0 0.693 0.040 1.020 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.183 0.223-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.035 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.117 0.136 0.212 0.295 0.276 0.469l0.004 0.011c0.094 0.183 0.158 0.397 0.179 0.623l0.001 0.007zM47.2 24.75v0l-0.94 2.88h1.9zM50.3 29.75c0.031 0.083 0.058 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.017-0.036-0.026-0.078-0.026-0.123 0-0.035 0.006-0.068 0.017-0.099l-0.001 0.002-0.44-1.36h-2.56l-0.46 1.36c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.75c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.034 0.046 0.062 0.099 0.079 0.156l0.001 0.004zM7.38 3.41h-5.38v20.23c0.125 2.259 1.937 4.057 4.19 4.16l0.010 0h2.59c0.033-0.001 0.072-0.002 0.111-0.002 1.247 0 2.36 0.57 3.094 1.465l0.006 0.007c0.724-0.902 1.827-1.474 3.063-1.474 0.115 0 0.229 0.005 0.342 0.015l-0.015-0.001h2.41c2.245-0.090 4.049-1.857 4.199-4.077l0.001-0.013v-20.31h-5.37l-2.070-2.070h9.5v22.3c-0.134 3.386-2.859 6.094-6.24 6.2l-0.010 0h-3.38c-1.241 0.024-2.259 0.949-2.428 2.147l-0.002 0.013c-0.178-1.198-1.182-2.113-2.406-2.15l-0.004-0h-3.5c-3.383-0.22-6.048-2.997-6.090-6.406l-0-0.004v-22.1h9.49zM12 0l-3.44 3.4v2.6l2.62-2.55v11.26l-2.6 2.52v2.54l2.6-2.53v1.34l-2.6 2.55v2.54l2.59-2.53v1.27l-2.6 2.54v2.52l3.43-3.36 3.43 3.38v-2.54l-2.59-2.52v-1.31l2.59 2.54v-2.56l-2.6-2.52v-1.36l2.59 2.53v-2.52l-2.6-2.5v-11.3l2.62 2.52v-2.54z"></path>
2023
+ </svg>
2024
+ `, isInline: true });
2025
+ }
2026
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ImzLogoComponent, decorators: [{
2027
+ type: Component,
2028
+ args: [{
2029
+ selector: 'lib-imz-logo',
2030
+ template: `
2031
+ <svg id="logo_mechan" viewBox="0 0 116 32" width="100%" height="100%" fill="white">
2032
+ <path d="M53.080 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.41v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.005 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.003 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006zM47.53 19.26c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-5.5l-2 5.5c-0.014 0.044-0.038 0.081-0.070 0.11l-0 0c-0.036 0.032-0.080 0.056-0.128 0.069l-0.002 0.001h-1.080c-0.028-0.027-0.049-0.060-0.060-0.098l-0-0.002-1.94-5.5v5.5c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-6c-0.001-0.012-0.002-0.027-0.002-0.042 0-0.142 0.054-0.271 0.142-0.369l-0 0c0.091-0.087 0.215-0.141 0.352-0.141 0.010 0 0.020 0 0.030 0.001l-0.001-0h0.9c0.062-0.007 0.133-0.012 0.205-0.012s0.143 0.004 0.214 0.012l-0.009-0.001c0.114 0.024 0.215 0.069 0.303 0.132l-0.003-0.002c0.086 0.064 0.156 0.144 0.208 0.236l0.002 0.004c0.059 0.106 0.11 0.229 0.147 0.358l0.003 0.012 1.46 4 1.51-4c0.043-0.143 0.094-0.265 0.156-0.382l-0.006 0.012c0.051-0.093 0.115-0.172 0.189-0.239l0.001-0.001c0.070-0.059 0.154-0.104 0.246-0.129l0.004-0.001c0.051-0.007 0.11-0.011 0.17-0.011s0.119 0.004 0.177 0.012l-0.007-0.001h0.87c0.036-0.007 0.078-0.010 0.12-0.010s0.084 0.004 0.124 0.011l-0.004-0.001c0.068 0.022 0.125 0.060 0.17 0.11l0 0c0.044 0.047 0.078 0.104 0.099 0.167l0.001 0.003c0.006 0.035 0.009 0.074 0.009 0.115s-0.003 0.080-0.010 0.119l0.001-0.004zM90.39 0.27c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.069-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.045 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.080l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.026 0.003 0.056 0.004 0.087 0.004 0.109 0 0.213-0.020 0.309-0.056l-0.006 0.002c0.077-0.035 0.143-0.079 0.201-0.131l-0.001 0.001c0.076-0.050 0.137-0.118 0.179-0.197l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.031 0.035 0.053 0.080 0.060 0.129l0 0.001zM91.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.31 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.39-3.5 0.1-0.090c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM84.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.21 0.27-0.15 0.22-2.3 3.46-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM77.63 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.7c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.1c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.39c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.188-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.513l0.008-0.027 0.49-1.34c-0.003-0.018-0.004-0.039-0.004-0.060s0.001-0.042 0.004-0.062l-0 0.002c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.167l-0.011 0.003c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.226 0.18 0.318 0.288l0.002 0.002c0.102 0.123 0.195 0.26 0.273 0.407l0.007 0.013c0.091 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.083 0.071 0.183 0.097 0.287l0.003 0.013c0.019 0.037 0.036 0.080 0.049 0.125l0.001 0.005zM71.63 7.83c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002c-0.023 0.042-0.050 0.078-0.080 0.11l0-0c-0.064 0.057-0.136 0.107-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.353 0.127-0.76 0.2-1.185 0.2-0.005 0-0.011 0-0.016-0h0.001c-0.017 0-0.038 0.001-0.058 0.001-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.301-0.304-0.535-0.675-0.674-1.090l-0.006-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.020-0.001-0.044-0.001-0.068 0-0.519 0.084-1.019 0.24-1.485l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.333-0.122 0.717-0.193 1.117-0.193 0.050 0 0.1 0.001 0.15 0.003l-0.007-0c0.081-0.008 0.175-0.012 0.27-0.012s0.189 0.004 0.282 0.013l-0.012-0.001c0.184 0.031 0.345 0.072 0.501 0.126l-0.021-0.006c0.155 0.050 0.287 0.108 0.412 0.176l-0.012-0.006c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.071 0.273-0.111 0.587-0.111 0.911 0 0.031 0 0.063 0.001 0.094l-0-0.005c-0 0.014-0 0.031-0 0.048 0 0.338 0.044 0.667 0.126 0.979l-0.006-0.027c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.417l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.31-0.19c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.070 0.17 0.070 0.27 0.070 0.4zM64.41 6.83c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.15-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.96h1c0.012 0 0.025 0 0.039 0 0.157 0 0.309-0.022 0.453-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.025-0.080 0.039-0.173 0.039-0.269 0-0.046-0.003-0.092-0.010-0.136l0.001 0.005zM64 4c0.013-0.060 0.020-0.129 0.020-0.2s-0.007-0.14-0.021-0.207l0.001 0.006c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.141-0.038-0.302-0.060-0.469-0.060-0.014 0-0.029 0-0.043 0.001l0.002-0h-0.69v1.76h0.71c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.113-0.044 0.21-0.109 0.29-0.19l0-0c0.101-0.076 0.182-0.173 0.238-0.285l0.002-0.005c0.008-0.048 0.012-0.104 0.012-0.16s-0.004-0.112-0.013-0.166l0.001 0.006zM65.78 6.85c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.177 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.93c-0.001-0.013-0.002-0.029-0.002-0.044 0-0.111 0.043-0.211 0.113-0.286l-0 0c0.073-0.062 0.168-0.1 0.272-0.1 0.006 0 0.012 0 0.018 0l-0.001-0h1.71c0.017-0 0.038-0 0.058-0 0.352 0 0.694 0.040 1.022 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.184 0.222-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.036 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.121 0.136 0.219 0.295 0.286 0.469l0.004 0.011c0.070 0.182 0.11 0.393 0.11 0.613 0 0.006-0 0.012-0 0.018v-0.001zM59.65 8.31c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.86c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.026 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.43v1.7h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.027 0.1 0.048 0.22 0.059 0.342l0.001 0.008zM54.57 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.16c-0.048-0.015-0.089-0.043-0.12-0.080l-0-0c-0.029-0.034-0.053-0.074-0.069-0.117l-0.001-0.003-0.48-1.53c-0.063-0.208-0.137-0.387-0.228-0.556l0.008 0.016c-0.073-0.135-0.163-0.251-0.269-0.349l-0.001-0.001c-0.097-0.1-0.218-0.176-0.354-0.218l-0.006-0.002c-0.124-0.038-0.266-0.060-0.413-0.060-0.002 0-0.005 0-0.008 0h-0.27v2.72c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.070c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001v-2.71h-0.27c-0.044-0.005-0.095-0.008-0.147-0.008-0.14 0-0.275 0.021-0.403 0.061l0.010-0.003c-0.132 0.043-0.246 0.112-0.34 0.2l0-0c-0.1 0.099-0.183 0.215-0.247 0.342l-0.003 0.008c-0.073 0.145-0.141 0.318-0.194 0.496l-0.006 0.024-0.48 1.53c-0.017 0.046-0.041 0.086-0.070 0.121l0-0.001c-0.030 0.038-0.071 0.066-0.118 0.080l-0.002 0h-1.15c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001s0 0 0-0.060c-0.001-0.014-0.002-0.029-0.002-0.045s0.001-0.031 0.002-0.047l-0 0.002v-0.12l0.060-0.16 0.47-1.35c0.085-0.255 0.173-0.466 0.274-0.67l-0.014 0.030c0.083-0.164 0.176-0.305 0.283-0.434l-0.003 0.004c0.092-0.112 0.197-0.207 0.315-0.287l0.005-0.003c0.112-0.075 0.241-0.142 0.376-0.195l0.014-0.005c-0.13-0.041-0.242-0.096-0.345-0.163l0.005 0.003c-0.112-0.073-0.208-0.159-0.288-0.258l-0.002-0.002c-0.096-0.119-0.182-0.254-0.254-0.397l-0.006-0.013c-0.058-0.148-0.116-0.335-0.163-0.526l-0.007-0.034-0.4-1.21c-0.028-0.070-0.056-0.157-0.077-0.246l-0.003-0.014c-0.003-0.024-0.004-0.052-0.004-0.080s0.001-0.056 0.004-0.083l-0 0.003c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001c0.028-0.031 0.066-0.053 0.109-0.060l0.001-0h1.12c0.045 0.015 0.083 0.043 0.11 0.079l0 0.001c0.025 0.034 0.046 0.074 0.059 0.117l0.001 0.003 0.43 1.43c0.056 0.194 0.121 0.36 0.198 0.518l-0.008-0.019c0.062 0.128 0.143 0.237 0.239 0.33l0.001 0c0.086 0.080 0.189 0.142 0.304 0.178l0.006 0.002c0.121 0.038 0.261 0.060 0.406 0.060 0.005 0 0.010-0 0.015-0h0.269v-2.54c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001c0.025-0.032 0.059-0.056 0.099-0.070l0.001-0h1.070c0.044 0.012 0.082 0.036 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.27c0.006 0 0.013 0 0.021 0 0.139 0 0.273-0.022 0.398-0.063l-0.009 0.003c0.125-0.041 0.232-0.106 0.32-0.19l-0 0c0.096-0.094 0.176-0.203 0.237-0.323l0.003-0.007c0.072-0.139 0.137-0.302 0.185-0.471l0.005-0.019 0.43-1.42c0.020-0.046 0.047-0.086 0.080-0.12l-0 0c0.027-0.037 0.065-0.065 0.108-0.080l0.002-0h1.1c0.044 0.008 0.081 0.030 0.11 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0 0.070 0 0.15-0.080 0.26l-0.4 1.19c-0.075 0.227-0.153 0.415-0.242 0.597l0.012-0.027c-0.073 0.152-0.156 0.284-0.253 0.404l0.003-0.004c-0.084 0.103-0.18 0.192-0.285 0.267l-0.005 0.003c-0.101 0.069-0.216 0.129-0.338 0.176l-0.012 0.004c0.15 0.065 0.278 0.135 0.399 0.216l-0.009-0.006c0.122 0.087 0.227 0.186 0.318 0.297l0.002 0.003c0.101 0.128 0.191 0.272 0.264 0.426l0.006 0.014c0.081 0.165 0.169 0.377 0.246 0.593l0.014 0.047 0.46 1.35 0.060 0.16v0.21c0.031 0.015 0.057 0.032 0.081 0.051l-0.001-0.001zM45.19 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.32 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM43.73 28.25c0 0.014 0.001 0.031 0.001 0.048 0 0.309-0.070 0.603-0.196 0.864l0.005-0.012c-0.132 0.263-0.318 0.481-0.545 0.646l-0.005 0.003c-0.245 0.179-0.532 0.317-0.843 0.396l-0.017 0.004c-0.316 0.083-0.68 0.13-1.054 0.13-0.016 0-0.032-0-0.048-0l0.002 0c-0.091 0.008-0.198 0.012-0.305 0.012s-0.214-0.004-0.319-0.013l0.014 0.001c-0.189-0.032-0.354-0.073-0.514-0.127l0.023 0.007-0.33-0.21-0.18-0.11c-0.031-0.025-0.058-0.055-0.079-0.089l-0.001-0.001c-0.003-0.020-0.005-0.042-0.005-0.065s0.002-0.045 0.006-0.067l-0 0.002c-0.002-0.033-0.003-0.071-0.003-0.11s0.001-0.077 0.004-0.115l-0 0.005c0-0.090 0-0.19 0-0.32-0.010-0.045-0.016-0.097-0.016-0.15s0.006-0.105 0.016-0.155l-0.001 0.005c0.020-0.047 0.066-0.080 0.12-0.080v0c0.067 0.006 0.129 0.028 0.182 0.061l-0.002-0.001 0.29 0.15c0.12 0.055 0.263 0.107 0.411 0.146l0.019 0.004c0.168 0.045 0.361 0.070 0.56 0.070 0.011 0 0.021-0 0.031-0l-0.002 0c0.003 0 0.007 0 0.010 0 0.178 0 0.35-0.026 0.513-0.073l-0.013 0.003c0.149-0.040 0.279-0.106 0.393-0.192l-0.003 0.002c0.104-0.080 0.188-0.18 0.248-0.295l0.002-0.005c0.057-0.11 0.090-0.24 0.090-0.378 0-0.004-0-0.008-0-0.012v0.001c0-0.005 0-0.010 0-0.016 0-0.146-0.029-0.285-0.083-0.411l0.003 0.007c-0.056-0.13-0.141-0.237-0.248-0.319l-0.002-0.001c-0.125-0.090-0.272-0.159-0.431-0.198l-0.009-0.002c-0.177-0.045-0.38-0.070-0.589-0.070-0.014 0-0.029 0-0.043 0l0.002-0h-0.92c-0.036-0.016-0.064-0.044-0.080-0.079l-0-0.001c-0.005-0.024-0.008-0.052-0.008-0.080s0.003-0.056 0.008-0.083l-0 0.003c0-0.070 0-0.16 0-0.27-0.002-0.037-0.003-0.081-0.003-0.125s0.001-0.088 0.003-0.131l-0 0.006c-0.004-0.023-0.006-0.049-0.006-0.075s0.002-0.052 0.007-0.078l-0 0.003c0.015-0.034 0.039-0.061 0.069-0.080l0.001-0h0.84c0.012 0 0.027 0 0.042 0 0.187 0 0.369-0.022 0.544-0.064l-0.016 0.003c0.156-0.038 0.294-0.104 0.413-0.192l-0.003 0.002c0.105-0.079 0.189-0.18 0.248-0.295l0.002-0.005c0.057-0.114 0.090-0.248 0.090-0.39 0-0.003-0-0.007-0-0.010v0.001c0-0.004 0-0.008 0-0.013 0-0.118-0.022-0.23-0.062-0.333l0.002 0.006c-0.042-0.104-0.107-0.192-0.189-0.259l-0.001-0.001c-0.090-0.075-0.197-0.133-0.314-0.168l-0.006-0.002c-0.128-0.038-0.275-0.060-0.427-0.060-0.012 0-0.023 0-0.035 0l0.002-0c-0.005-0-0.012-0-0.018-0-0.196 0-0.386 0.026-0.568 0.074l0.015-0.003c-0.171 0.044-0.314 0.091-0.453 0.148l0.023-0.008-0.31 0.15c-0.054 0.035-0.118 0.060-0.188 0.070l-0.002 0h-0.060c-0.002-0.011-0.004-0.023-0.004-0.035s0.001-0.024 0.004-0.036l-0 0.001c-0.003-0.023-0.005-0.049-0.005-0.075s0.002-0.052 0.005-0.078l-0 0.003c0-0.060 0-0.14 0-0.25s0-0.13 0-0.19c-0.002-0.024-0.003-0.052-0.003-0.080s0.001-0.056 0.003-0.084l-0 0.004c-0.002-0.020-0.003-0.042-0.003-0.065s0.001-0.046 0.004-0.068l-0 0.003c0.022-0.042 0.048-0.079 0.080-0.11v0c0.064-0.049 0.136-0.092 0.213-0.127l0.007-0.003c0.118-0.056 0.257-0.107 0.402-0.146l0.018-0.004c0.15-0.046 0.336-0.088 0.526-0.117l0.024-0.003c0.097-0.008 0.211-0.012 0.325-0.012s0.228 0.004 0.34 0.013l-0.015-0.001c0.023-0.001 0.051-0.001 0.079-0.001 0.31 0 0.61 0.040 0.896 0.116l-0.024-0.006c0.26 0.068 0.488 0.182 0.684 0.333l-0.004-0.003c0.176 0.139 0.316 0.317 0.407 0.521l0.003 0.009c0.089 0.206 0.14 0.445 0.14 0.696 0 0.008-0 0.017-0 0.025v-0.001c0 0.005 0 0.010 0 0.015 0 0.205-0.033 0.403-0.094 0.588l0.004-0.013c-0.115 0.346-0.345 0.628-0.643 0.806l-0.007 0.004c-0.144 0.089-0.311 0.158-0.489 0.198l-0.011 0.002c0.215 0.022 0.412 0.083 0.589 0.174l-0.009-0.004c0.341 0.181 0.602 0.474 0.736 0.829l0.004 0.011c0.070 0.175 0.11 0.377 0.11 0.589 0 0 0 0.001 0 0.001v-0zM115.19 11.010c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.070-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.046 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.079l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.006 0 0.012 0 0.019 0 0.104 0 0.205-0.018 0.297-0.052l-0.006 0.002c0.092-0.031 0.172-0.075 0.242-0.131l-0.002 0.001c0.063-0.051 0.114-0.114 0.149-0.187l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.058 0.003 0.11 0.025 0.15 0.060l-0-0zM115.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM108.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM102.43 19.41c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.71c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.080c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.46c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.54h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.189-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.514l0.008-0.027 0.45-1.35c0.015-0.046 0.035-0.086 0.061-0.121l-0.001 0.001c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.166l-0.011 0.004c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.227 0.18 0.318 0.288l0.002 0.002c0.106 0.123 0.202 0.261 0.284 0.407l0.007 0.013c0.090 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.084 0.071 0.183 0.097 0.287l0.003 0.013c0.010 0.038 0.017 0.082 0.020 0.128l0 0.002zM96.43 18.57c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002-0.080 0.11c-0.064 0.057-0.136 0.106-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.15 0.054-0.331 0.102-0.518 0.137l-0.022 0.003c-0.198 0.038-0.427 0.060-0.66 0.060h-0c-0.017 0-0.038 0-0.058 0-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.266-0.295-0.471-0.649-0.595-1.040l-0.005-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.023-0.001-0.050-0.001-0.077 0-0.519 0.084-1.019 0.24-1.486l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.368-0.152 0.794-0.24 1.242-0.24 0.010 0 0.020 0 0.030 0h-0.002c0.359 0.005 0.702 0.067 1.023 0.177l-0.023-0.007c0.149 0.025 0.28 0.060 0.407 0.105l-0.017-0.005c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.075 0.3-0.118 0.645-0.118 1s0.043 0.7 0.124 1.029l-0.006-0.029c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.416l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.27-0.16c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.080 0.11 0.080 0.21 0.080 0.34zM90.71 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.43c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.42v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.022 0.103 0.036 0.224 0.040 0.347l0 0.003zM85.2 19.36c0.005 0.013 0.008 0.029 0.008 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.070l-0.002 0h-1.070c-0.047-0.013-0.088-0.038-0.12-0.070v0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.36h-1.080c-0.007 0-0.016 0-0.025 0-0.345 0-0.682-0.036-1.006-0.106l0.031 0.006c-0.301-0.062-0.567-0.184-0.795-0.354l0.005 0.004c-0.225-0.175-0.4-0.405-0.506-0.669l-0.004-0.011c-0.115-0.298-0.181-0.642-0.181-1.002 0-0.031 0.001-0.062 0.001-0.092l-0 0.004v-1.83c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.028-0.033 0.066-0.058 0.108-0.070l0.002-0h1.070c0.047 0.013 0.088 0.038 0.12 0.070v0c0.006 0.013 0.009 0.029 0.009 0.045s-0.003 0.032-0.009 0.046l0-0.001v1.8c-0 0.005-0 0.010-0 0.015 0 0.187 0.026 0.367 0.073 0.539l-0.003-0.014c0.041 0.15 0.117 0.278 0.22 0.38l0 0c0.109 0.106 0.243 0.185 0.393 0.228l0.007 0.002c0.173 0.051 0.372 0.080 0.577 0.080 0.015 0 0.030-0 0.045-0l-0.002 0h0.91v-3c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.032-0.032 0.073-0.057 0.118-0.070l0.002-0h1.070c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001zM79.070 19.36c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.17c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.57c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM72.070 19.36c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.090c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-2.75h-2.6v2.73c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.080c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-6.34c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.013 0.081 0.037 0.11 0.070l0 0c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001v2.49h2.54v-2.49c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.090c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001zM62.7 14.050v0l-0.94 2.88h1.9zM65.8 19.050c0.031 0.084 0.059 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.023-0.031-0.040-0.068-0.050-0.108l-0-0.002-0.46-1.41h-2.57l-0.43 1.31c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.74c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0.001h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.031 0.046 0.055 0.099 0.069 0.157l0.001 0.003zM59.15 19.050c0.045 0.082 0.086 0.178 0.117 0.278l0.003 0.012c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.063 0.044-0.142 0.070-0.226 0.070-0.001 0-0.003 0-0.004-0h-1.070c-0.048-0.012-0.089-0.036-0.12-0.070l-0-0c-0.024-0.029-0.045-0.062-0.059-0.098l-0.001-0.002-1.29-2.5-1.26 2.44c-0.020 0.038-0.043 0.071-0.070 0.1l0-0c-0.031 0.034-0.072 0.058-0.118 0.070l-0.002 0h-1.030c-0 0-0 0-0 0-0.076 0-0.146-0.026-0.2-0.070l0.001 0c-0.014-0.024-0.023-0.054-0.023-0.085s0.008-0.061 0.023-0.086l-0 0.001c0.037-0.111 0.081-0.207 0.134-0.297l-0.004 0.007 1.62-3-1.57-2.71c-0.044-0.083-0.088-0.182-0.125-0.284l-0.005-0.016c-0.017-0.024-0.026-0.053-0.026-0.085s0.010-0.061 0.027-0.085l-0 0.001c0.061-0.043 0.138-0.069 0.22-0.070h1.14c0.048 0.010 0.090 0.035 0.12 0.070l0 0 0.070 0.1 1.19 2.24 1.15-2.24 0.070-0.1c0.028-0.034 0.066-0.058 0.109-0.070l0.001-0h0.99c0.002-0 0.004-0 0.007-0 0.077 0 0.148 0.026 0.204 0.071l-0.001-0.001c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.036 0.117-0.077 0.216-0.125 0.311l0.005-0.011-1.47 2.72zM68.37 24.6h-1.57q-0.090 0.79-0.19 1.39c-0.060 0.4-0.12 0.75-0.18 1.060s-0.12 0.56-0.19 0.78c-0.064 0.233-0.129 0.422-0.203 0.607l0.013-0.037c-0.064 0.16-0.131 0.295-0.208 0.424l0.008-0.014c-0.076 0.119-0.149 0.221-0.226 0.318l0.006-0.008h2.74zM70.57 31.84c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.023 0.028-0.053 0.049-0.089 0.060l-0.001 0h-0.95c-0.040-0.011-0.074-0.032-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-1.63h-4.5v1.59c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.026 0.028-0.060 0.049-0.099 0.060l-0.001 0h-1.020c-0.040-0.009-0.075-0.030-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.43c-0.002-0.014-0.004-0.029-0.004-0.046 0-0.067 0.024-0.128 0.064-0.175l-0 0c0.046-0.044 0.109-0.071 0.178-0.071 0.008 0 0.015 0 0.023 0.001l-0.001-0h0.31c0.080-0.12 0.16-0.24 0.24-0.37 0.076-0.126 0.15-0.274 0.212-0.429l0.008-0.021c0.070-0.17 0.14-0.38 0.21-0.62s0.13-0.53 0.2-0.87 0.13-0.75 0.2-1.23 0.14-1 0.21-1.66c0.010-0.128 0.053-0.244 0.121-0.342l-0.001 0.002c0.062-0.068 0.152-0.111 0.251-0.111 0.007 0 0.013 0 0.020 0.001l-0.001-0h3.46c0.007-0 0.014-0.001 0.022-0.001 0.105 0 0.199 0.042 0.268 0.111v0c0.069 0.079 0.111 0.183 0.111 0.296 0 0.012-0 0.024-0.001 0.035l0-0.002v5.2h0.57c0.006-0.001 0.013-0.001 0.020-0.001 0.071 0 0.135 0.031 0.179 0.081l0 0c0.038 0.055 0.060 0.123 0.060 0.196 0 0.005-0 0.010-0 0.014l0-0.001zM61.97 26.84c0.001-0.026 0.001-0.058 0.001-0.089 0-0.322-0.029-0.637-0.086-0.943l0.005 0.032c-0.047-0.282-0.145-0.535-0.285-0.759l0.005 0.009c-0.132-0.204-0.311-0.367-0.522-0.476l-0.008-0.004c-0.228-0.108-0.495-0.171-0.776-0.171-0.019 0-0.038 0-0.056 0.001l0.003-0c-0.017-0.001-0.037-0.001-0.057-0.001-0.286 0-0.556 0.071-0.792 0.195l0.009-0.004c-0.225 0.126-0.409 0.298-0.546 0.504l-0.004 0.006c-0.136 0.212-0.237 0.461-0.288 0.727l-0.002 0.013c-0.057 0.27-0.090 0.581-0.090 0.9v0c-0 0.021-0 0.046-0 0.071 0 0.328 0.029 0.65 0.085 0.962l-0.005-0.033c0.049 0.286 0.147 0.542 0.285 0.77l-0.005-0.010c0.13 0.206 0.309 0.37 0.523 0.477l0.008 0.003c0.226 0.102 0.49 0.161 0.768 0.161 0.025 0 0.050-0 0.075-0.001l-0.004 0c0.017 0.001 0.037 0.001 0.057 0.001 0.286 0 0.556-0.071 0.792-0.195l-0.009 0.004c0.226-0.124 0.411-0.296 0.546-0.504l0.004-0.006c0.136-0.215 0.237-0.467 0.288-0.737l0.002-0.013c0.063-0.27 0.102-0.583 0.11-0.904l0-0.006zM63.41 26.77c0 0.019 0 0.042 0 0.065 0 0.512-0.077 1.006-0.22 1.471l0.009-0.035c-0.131 0.437-0.344 0.815-0.623 1.133l0.003-0.003c-0.27 0.305-0.604 0.546-0.982 0.703l-0.018 0.007c-0.394 0.153-0.851 0.241-1.328 0.241-0.029 0-0.058-0-0.086-0.001l0.004 0c-0.020 0-0.043 0.001-0.067 0.001-0.466 0-0.914-0.077-1.333-0.219l0.029 0.009c-0.395-0.129-0.731-0.346-0.999-0.629l-0.001-0.001c-0.267-0.296-0.47-0.655-0.585-1.051l-0.005-0.019c-0.127-0.439-0.201-0.943-0.201-1.464 0-0.030 0-0.060 0.001-0.091l-0 0.005c-0-0.017-0-0.037-0-0.057 0-0.504 0.077-0.99 0.22-1.447l-0.009 0.034c0.133-0.43 0.346-0.8 0.623-1.113l-0.003 0.003c0.271-0.301 0.605-0.539 0.982-0.694l0.018-0.006c0.4-0.159 0.864-0.25 1.349-0.25 0.021 0 0.043 0 0.064 0.001l-0.003-0c0.026-0.001 0.056-0.001 0.086-0.001 0.455 0 0.893 0.073 1.303 0.209l-0.029-0.008c0.395 0.129 0.731 0.346 0.999 0.629l0.001 0.001c0.27 0.296 0.477 0.654 0.595 1.051l0.005 0.019c0.14 0.446 0.22 0.959 0.22 1.49v0zM54.77 28.25c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.151-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.93h1c0.011 0 0.024 0 0.038 0 0.157 0 0.31-0.022 0.454-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.051-0.116 0.081-0.251 0.081-0.393 0-0.013-0-0.026-0.001-0.038l0 0.002zM54.42 25.35c0-0.008 0-0.018 0-0.028 0-0.123-0.022-0.24-0.063-0.349l0.002 0.007c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.14-0.038-0.302-0.060-0.468-0.060-0.015 0-0.030 0-0.044 0.001l0.002-0h-0.69v1.75h0.76c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.124-0.034 0.231-0.093 0.321-0.171l-0.001 0.001c0.074-0.081 0.132-0.177 0.168-0.284l0.002-0.006c0.038-0.105 0.060-0.227 0.060-0.354 0-0.009-0-0.018-0-0.027l0 0.001zM56.2 28.2c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.178 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.92c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h1.69c0.003 0 0.006 0 0.010 0 0.351 0 0.693 0.040 1.020 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.183 0.223-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.035 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.117 0.136 0.212 0.295 0.276 0.469l0.004 0.011c0.094 0.183 0.158 0.397 0.179 0.623l0.001 0.007zM47.2 24.75v0l-0.94 2.88h1.9zM50.3 29.75c0.031 0.083 0.058 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.017-0.036-0.026-0.078-0.026-0.123 0-0.035 0.006-0.068 0.017-0.099l-0.001 0.002-0.44-1.36h-2.56l-0.46 1.36c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.75c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.034 0.046 0.062 0.099 0.079 0.156l0.001 0.004zM7.38 3.41h-5.38v20.23c0.125 2.259 1.937 4.057 4.19 4.16l0.010 0h2.59c0.033-0.001 0.072-0.002 0.111-0.002 1.247 0 2.36 0.57 3.094 1.465l0.006 0.007c0.724-0.902 1.827-1.474 3.063-1.474 0.115 0 0.229 0.005 0.342 0.015l-0.015-0.001h2.41c2.245-0.090 4.049-1.857 4.199-4.077l0.001-0.013v-20.31h-5.37l-2.070-2.070h9.5v22.3c-0.134 3.386-2.859 6.094-6.24 6.2l-0.010 0h-3.38c-1.241 0.024-2.259 0.949-2.428 2.147l-0.002 0.013c-0.178-1.198-1.182-2.113-2.406-2.15l-0.004-0h-3.5c-3.383-0.22-6.048-2.997-6.090-6.406l-0-0.004v-22.1h9.49zM12 0l-3.44 3.4v2.6l2.62-2.55v11.26l-2.6 2.52v2.54l2.6-2.53v1.34l-2.6 2.55v2.54l2.59-2.53v1.27l-2.6 2.54v2.52l3.43-3.36 3.43 3.38v-2.54l-2.59-2.52v-1.31l2.59 2.54v-2.56l-2.6-2.52v-1.36l2.59 2.53v-2.52l-2.6-2.5v-11.3l2.62 2.52v-2.54z"></path>
2033
+ </svg>
2034
+ `,
2035
+ standalone: true
2036
+ }]
2037
+ }] });
2038
+
2039
+ class NavBarComponent {
2040
+ authService;
2041
+ avatarService;
2042
+ dialog;
2043
+ router;
2044
+ loggedIn$;
2045
+ roles$;
2046
+ fioUser = '';
2047
+ photoURL = '';
2048
+ subscription;
2049
+ constructor(authService, userService, avatarService, dialog, router) {
2050
+ this.authService = authService;
2051
+ this.avatarService = avatarService;
2052
+ this.dialog = dialog;
2053
+ this.router = router;
2054
+ this.loggedIn$ = this.authService.loggedIn$;
2055
+ this.roles$ = this.authService.roles$;
2056
+ this.fioUser = '';
2057
+ this.subscription = this.loggedIn$.subscribe({
2058
+ next: (value) => {
2059
+ if (value) {
2060
+ if (userService.userData) {
2061
+ if (userService.userData.lastName && userService.userData.firstName) {
2062
+ this.fioUser = userService.userData.lastName + ' ' + userService.userData.firstName;
2063
+ }
2064
+ if (userService.userData.idHuman) {
2065
+ // Аватар сотрудника.
2066
+ const subs = this.avatarService.getAvatarById(Number(userService.userData.idHuman))
2067
+ .subscribe((image) => {
2068
+ if (image) {
2069
+ const blob = new Blob([image], { "type": "image/jpeg" });
2070
+ this.photoURL = URL.createObjectURL(blob);
2071
+ }
2072
+ });
2073
+ this.subscription?.add(subs);
2074
+ }
2075
+ }
2076
+ }
2077
+ }
2078
+ });
2079
+ }
2080
+ ngOnDestroy() {
2081
+ if (this.subscription)
2082
+ this.subscription.unsubscribe();
2083
+ }
2084
+ logout() {
2085
+ this.authService.logout(this.router.url);
2086
+ }
2087
+ openDialog() {
2088
+ const dialogRef = this.dialog.open(DialogComponent, {
2089
+ width: '400px',
2090
+ data: {
2091
+ id: 'logout',
2092
+ title: 'Подтверждение',
2093
+ message: 'Вы хотите выйти?',
2094
+ btnNoTitle: 'Отмена',
2095
+ btnYesTitle: 'Выйти'
2096
+ }
2097
+ });
2098
+ const subs = dialogRef.afterClosed().subscribe((id) => {
2099
+ if (id) {
2100
+ this.logout();
2101
+ }
2102
+ });
2103
+ this.subscription?.add(subs);
2104
+ }
2105
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NavBarComponent, deps: [{ token: AuthService }, { token: UserService }, { token: AvatarService }, { token: i1$4.MatDialog }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
2106
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: NavBarComponent, isStandalone: true, selector: "lib-navbar", ngImport: i0, template: "@if (loggedIn$ | async) {\r\n <nav class=\"lib-navbar-header\">\r\n <a class=\"logo-mechan\" routerLink=\"/\">\r\n <lib-imz-logo></lib-imz-logo>\r\n </a>\r\n\r\n <ng-content></ng-content>\r\n\r\n <div class=\"flex-spacer\"></div>\r\n\r\n @if ((loggedIn$ | async) === false || !photoURL) {\r\n <mat-icon [matTooltip]=\"(roles$ | async)?.join(',')||''\">account_circle</mat-icon>\r\n }\r\n @if ((loggedIn$ | async) && photoURL) {\r\n <img\r\n class=\"user-photo\"\r\n [src]=\"photoURL | safe\"\r\n loading=\"lazy\"\r\n [alt]=\"fioUser\"\r\n [matTooltip]=\"(roles$ | async)?.join(',')||''\">\r\n }\r\n\r\n <span class = \"user-name\" [matTooltip]=\"(roles$ | async)?.join(',') || ''\">\r\n {{ fioUser }}\r\n </span>\r\n\r\n <a mat-button class=\"pm-button\" (click)=\"openDialog()\">\u0412\u044B\u0439\u0442\u0438 <mat-icon>logout</mat-icon></a>\r\n </nav>\r\n}", styles: [".lib-navbar-header{display:flex;flex-wrap:wrap;align-items:center;padding:8px 16px}.logo-mechan{height:38px;width:140px}.flex-spacer{flex-grow:1}.user-name{margin-left:8px;line-height:1rem;white-space:normal}.user-photo{border-radius:50%;width:32px;height:32px;margin-right:10px}.mat-mdc-button{color:#fff!important;padding-left:16px!important;padding-right:16px!important}.mdc-button{letter-spacing:normal}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ImzLogoComponent, selector: "lib-imz-logo" }, { kind: "pipe", type: SafePipe, name: "safe" }] });
2107
+ }
2108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NavBarComponent, decorators: [{
2109
+ type: Component,
2110
+ args: [{ selector: 'lib-navbar', imports: [RouterLink, MatAnchor, MatMenuTrigger, MatMenu, MatMenuItem, MatDivider, MatIcon, MatTooltip,
2111
+ AsyncPipe, ImzLogoComponent, SafePipe], template: "@if (loggedIn$ | async) {\r\n <nav class=\"lib-navbar-header\">\r\n <a class=\"logo-mechan\" routerLink=\"/\">\r\n <lib-imz-logo></lib-imz-logo>\r\n </a>\r\n\r\n <ng-content></ng-content>\r\n\r\n <div class=\"flex-spacer\"></div>\r\n\r\n @if ((loggedIn$ | async) === false || !photoURL) {\r\n <mat-icon [matTooltip]=\"(roles$ | async)?.join(',')||''\">account_circle</mat-icon>\r\n }\r\n @if ((loggedIn$ | async) && photoURL) {\r\n <img\r\n class=\"user-photo\"\r\n [src]=\"photoURL | safe\"\r\n loading=\"lazy\"\r\n [alt]=\"fioUser\"\r\n [matTooltip]=\"(roles$ | async)?.join(',')||''\">\r\n }\r\n\r\n <span class = \"user-name\" [matTooltip]=\"(roles$ | async)?.join(',') || ''\">\r\n {{ fioUser }}\r\n </span>\r\n\r\n <a mat-button class=\"pm-button\" (click)=\"openDialog()\">\u0412\u044B\u0439\u0442\u0438 <mat-icon>logout</mat-icon></a>\r\n </nav>\r\n}", styles: [".lib-navbar-header{display:flex;flex-wrap:wrap;align-items:center;padding:8px 16px}.logo-mechan{height:38px;width:140px}.flex-spacer{flex-grow:1}.user-name{margin-left:8px;line-height:1rem;white-space:normal}.user-photo{border-radius:50%;width:32px;height:32px;margin-right:10px}.mat-mdc-button{color:#fff!important;padding-left:16px!important;padding-right:16px!important}.mdc-button{letter-spacing:normal}\n"] }]
2112
+ }], ctorParameters: () => [{ type: AuthService }, { type: UserService }, { type: AvatarService }, { type: i1$4.MatDialog }, { type: i2.Router }] });
2113
+
2114
+ class NotFoundComponent {
2115
+ constructor() {
2116
+ }
2117
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NotFoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2118
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: NotFoundComponent, isStandalone: true, selector: "lib-not-found", ngImport: i0, template: "<div class=\"center\">\r\n <h3 class=\"mat-display-1\">\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430</h3>\r\n</div>\r\n", styles: [".center{display:flex;justify-content:center;margin:3rem}\n"] });
2119
+ }
2120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NotFoundComponent, decorators: [{
2121
+ type: Component,
2122
+ args: [{ selector: 'lib-not-found', standalone: true, template: "<div class=\"center\">\r\n <h3 class=\"mat-display-1\">\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430</h3>\r\n</div>\r\n", styles: [".center{display:flex;justify-content:center;margin:3rem}\n"] }]
2123
+ }], ctorParameters: () => [] });
2124
+
2125
+ class BaseSelectAutocompleteWithVirtualScrollComponent {
2126
+ // https://stackblitz.com/edit/autocomplete-with-virtual-scroll-dc9u2g
2127
+ // Все элементы
2128
+ items$ = new BehaviorSubject([]);
2129
+ // Выбранный элемент
2130
+ selectedItem$ = new BehaviorSubject(undefined);
2131
+ // Заголовок
2132
+ title = '';
2133
+ // Видимость
2134
+ isVisible = true;
2135
+ // Обязательность
2136
+ isRequired = false;
2137
+ // Доступность
2138
+ isDisabled = false;
2139
+ // Доступность
2140
+ width = '200';
2141
+ // Событие изменения выбранного элемента
2142
+ selectedItemChange = new EventEmitter();
2143
+ height = '200px';
2144
+ // input элемент
2145
+ inputCtrl = new FormControl();
2146
+ // отфильтрованные (отображаемые) элементы
2147
+ filteredItems$ = new BehaviorSubject([]);
2148
+ subscription;
2149
+ constructor() {
2150
+ }
2151
+ ngOnInit() {
2152
+ //console.log('isVisible = ', this.isVisible);
2153
+ //console.log('isDisabled = ', this.isDisabled);
2154
+ this.subscription = this.items$.subscribe(data => {
2155
+ console.log('ITEMS$ data', data);
2156
+ console.log('onLoad: this.selectedItem$.value =', this.selectedItem$.value);
2157
+ this.filteredItems$.next(data);
2158
+ if (this.selectedItem$.value)
2159
+ this.inputCtrl.setValue(this.selectedItem$.value);
2160
+ // if (this.items.length > 0) {
2161
+ // this.filteredItems$ = this.inputCtrl.valueChanges.pipe(
2162
+ // startWith(null),
2163
+ // map(item => (item ? this._filter(item) : this.items.slice())),
2164
+ // );
2165
+ const subs = this.selectedItem$.subscribe(item => {
2166
+ console.log('ITEM =', item);
2167
+ this.inputCtrl.setValue(item);
2168
+ // if (item)
2169
+ // this.selectedItems = this.items.filter(s => items.includes(s.value));
2170
+ });
2171
+ this.subscription?.add(subs);
2172
+ });
2173
+ // Listen for changes to the input
2174
+ const subs = this.inputCtrl.valueChanges
2175
+ .pipe(startWith$1(''),
2176
+ // eslint-disable-next-line no-magic-numbers
2177
+ debounceTime(500), distinctUntilChanged(),
2178
+ // Note: If the option value is bound to object, after selecting the option
2179
+ // Note: the value will change from string to {}. We want to perform search
2180
+ // Note: only when the type is string (no match)
2181
+ //filter(q => typeof q === 'string'),
2182
+ //tap((v) => console.log('v=', v)),
2183
+ map((value) => {
2184
+ // Filter the options
2185
+ if (typeof value === 'undefined') {
2186
+ this.filteredItems$.next(this.items$.value);
2187
+ }
2188
+ else {
2189
+ if (typeof value !== 'object') {
2190
+ console.log('v1=', value);
2191
+ this.filteredItems$.next(this.items$.value.filter(option => option.viewValue
2192
+ .toLowerCase()
2193
+ .includes(value.toLowerCase())));
2194
+ }
2195
+ else {
2196
+ // typeof value === 'object'
2197
+ console.log('v2=', value);
2198
+ if (value) {
2199
+ // this.predmet = value;
2200
+ this.filteredItems$.next(this.items$.value.filter((option) => (option.viewValue)
2201
+ .toLowerCase()
2202
+ .includes(value.viewValue.toLowerCase())));
2203
+ }
2204
+ else {
2205
+ this.filteredItems$.next(this.items$.value);
2206
+ }
2207
+ }
2208
+ }
2209
+ // Recompute how big the viewport should be.
2210
+ // eslint-disable-next-line no-magic-numbers
2211
+ if (this.filteredItems$.value.length < 4) {
2212
+ // eslint-disable-next-line no-magic-numbers
2213
+ this.height = this.filteredItems$.value.length * 50 + 'px';
2214
+ }
2215
+ else {
2216
+ this.height = '200px';
2217
+ }
2218
+ console.log('update filteredItems$.value=', this.filteredItems$.value);
2219
+ }))
2220
+ .subscribe();
2221
+ this.subscription?.add(subs);
2222
+ if (this.isDisabled) {
2223
+ this.inputCtrl.disable();
2224
+ }
2225
+ else {
2226
+ this.inputCtrl.enable();
2227
+ }
2228
+ }
2229
+ ngOnDestroy() {
2230
+ if (this.subscription)
2231
+ this.subscription.unsubscribe();
2232
+ }
2233
+ onSelectedItemChange(item) {
2234
+ console.log("onSelectedItemChange, item=", item);
2235
+ // this.selectedItem$.next(item);
2236
+ this.selectedItemChange.emit(item);
2237
+ }
2238
+ onClearClick($event) {
2239
+ $event.stopPropagation();
2240
+ this.inputCtrl.setValue("");
2241
+ }
2242
+ displayWithFn(lookup) {
2243
+ return lookup
2244
+ ? lookup.viewValue
2245
+ : null;
2246
+ }
2247
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectAutocompleteWithVirtualScrollComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2248
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseSelectAutocompleteWithVirtualScrollComponent, isStandalone: true, selector: "lib-select-autocomplete-with-virtual-scroll", inputs: { items$: "items$", selectedItem$: "selectedItem$", title: "title", isVisible: "isVisible", isRequired: "isRequired", isDisabled: "isDisabled", width: "width" }, outputs: { selectedItemChange: "selectedItemChange" }, ngImport: i0, template: "@if (isVisible) {\r\n <mat-form-field [style.width.px]=\"width\">\r\n <mat-label>{{title}}</mat-label>\r\n <input type=\"text\"\r\n [placeholder]=title\r\n aria-label=\"Number\"\r\n matInput\r\n (ngModelChange)=\"onSelectedItemChange($event)\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [required]=\"isRequired ? 'required' : ''\"\r\n >\r\n @if (!isDisabled && selectedItem$.value) {\r\n <button mat-button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayWithFn\" showPanel=\"true\">\r\n <cdk-virtual-scroll-viewport class=\"autocomplete-test-viewport\" [style.height]=\"height\" itemSize=\"25\">\r\n <mat-option *cdkVirtualFor=\"let option of filteredItems$\" [value]=\"option\" class=\"autocomplete-item\">\r\n {{option.viewValue}}\r\n </mat-option>\r\n </cdk-virtual-scroll-viewport>\r\n </mat-autocomplete>\r\n @if (inputCtrl.invalid) {\r\n <mat-error>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 {{title}}</mat-error>\r\n }\r\n @if (!inputCtrl.value) {\r\n <mat-hint>\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0432\u0432\u043E\u0434\u0438\u0442\u044C ...</mat-hint>\r\n }\r\n </mat-form-field>\r\n}", styles: ["mat-form-field{margin-right:12px}.autocomplete-item{height:50px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i4$1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4$1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }] });
2249
+ }
2250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectAutocompleteWithVirtualScrollComponent, decorators: [{
2251
+ type: Component,
2252
+ args: [{ selector: 'lib-select-autocomplete-with-virtual-scroll', imports: [FormsModule, ReactiveFormsModule, MatAutocompleteModule, MatHint, MatError, MatOption, MatIcon,
2253
+ MatFormField, ScrollingModule, MatInput, MatLabel], template: "@if (isVisible) {\r\n <mat-form-field [style.width.px]=\"width\">\r\n <mat-label>{{title}}</mat-label>\r\n <input type=\"text\"\r\n [placeholder]=title\r\n aria-label=\"Number\"\r\n matInput\r\n (ngModelChange)=\"onSelectedItemChange($event)\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [required]=\"isRequired ? 'required' : ''\"\r\n >\r\n @if (!isDisabled && selectedItem$.value) {\r\n <button mat-button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayWithFn\" showPanel=\"true\">\r\n <cdk-virtual-scroll-viewport class=\"autocomplete-test-viewport\" [style.height]=\"height\" itemSize=\"25\">\r\n <mat-option *cdkVirtualFor=\"let option of filteredItems$\" [value]=\"option\" class=\"autocomplete-item\">\r\n {{option.viewValue}}\r\n </mat-option>\r\n </cdk-virtual-scroll-viewport>\r\n </mat-autocomplete>\r\n @if (inputCtrl.invalid) {\r\n <mat-error>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 {{title}}</mat-error>\r\n }\r\n @if (!inputCtrl.value) {\r\n <mat-hint>\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0432\u0432\u043E\u0434\u0438\u0442\u044C ...</mat-hint>\r\n }\r\n </mat-form-field>\r\n}", styles: ["mat-form-field{margin-right:12px}.autocomplete-item{height:50px}\n"] }]
2254
+ }], ctorParameters: () => [], propDecorators: { items$: [{
2255
+ type: Input
2256
+ }], selectedItem$: [{
2257
+ type: Input
2258
+ }], title: [{
2259
+ type: Input
2260
+ }], isVisible: [{
2261
+ type: Input
2262
+ }], isRequired: [{
2263
+ type: Input
2264
+ }], isDisabled: [{
2265
+ type: Input
2266
+ }], width: [{
2267
+ type: Input
2268
+ }], selectedItemChange: [{
2269
+ type: Output
2270
+ }] } });
2271
+
2272
+ class BaseSelectWithGroupComponent {
2273
+ // Все группы
2274
+ groups$ = new BehaviorSubject([]);
2275
+ // Выбранные элементы, ключи (BaseSelectItem.value)
2276
+ selectedItems$ = new Observable();
2277
+ // Заголовок
2278
+ title = '';
2279
+ // Событие изменения выбранных элементов
2280
+ selectedItemsChange = new EventEmitter();
2281
+ separatorKeysCodes = [ENTER, COMMA];
2282
+ control = new FormControl([]);
2283
+ subscription;
2284
+ constructor() {
2285
+ }
2286
+ ngOnInit() {
2287
+ this.groups$.subscribe(data => {
2288
+ if (data.length > 0) {
2289
+ this.subscription = this.selectedItems$.subscribe(items => {
2290
+ this.control.setValue(items.map(i => Number(i)));
2291
+ });
2292
+ }
2293
+ });
2294
+ }
2295
+ ngOnDestroy() {
2296
+ if (this.subscription)
2297
+ this.subscription.unsubscribe();
2298
+ }
2299
+ selectionChange($event) {
2300
+ this.selectedItemsChange.emit($event.value.map((i) => i.toString()));
2301
+ }
2302
+ onClick($event) {
2303
+ $event.stopPropagation();
2304
+ // this.control.setValue('');
2305
+ this.selectedItemsChange.emit([]);
2306
+ }
2307
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectWithGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2308
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseSelectWithGroupComponent, isStandalone: true, selector: "lib-select-with-group", inputs: { groups$: "groups$", selectedItems$: "selectedItems$", title: "title" }, outputs: { selectedItemsChange: "selectedItemsChange" }, ngImport: i0, template: "<mat-form-field class=\"select-with-group\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-select [formControl]=\"control\" (selectionChange)=\"selectionChange($event)\" multiple>\r\n @for (group of (groups$ | async); track group) {\r\n <mat-optgroup [label]=\"group.name\">\r\n @for (item of group.items; track item) {\r\n <mat-option [value]=\"item.value\" >\r\n {{item.viewValue}}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n\r\n </mat-select>\r\n @if (control.value && control.value!.length > 0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".select-with-group{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatOption$1, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatFormField$1, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel$1, selector: "mat-label" }, { kind: "pipe", type: AsyncPipe, name: "async" }] });
2309
+ }
2310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectWithGroupComponent, decorators: [{
2311
+ type: Component,
2312
+ args: [{ selector: 'lib-select-with-group', imports: [FormsModule, ReactiveFormsModule, MatIcon, MatOption$1, MatOptgroup, MatSelect, MatFormField$1, MatLabel$1,
2313
+ AsyncPipe], template: "<mat-form-field class=\"select-with-group\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-select [formControl]=\"control\" (selectionChange)=\"selectionChange($event)\" multiple>\r\n @for (group of (groups$ | async); track group) {\r\n <mat-optgroup [label]=\"group.name\">\r\n @for (item of group.items; track item) {\r\n <mat-option [value]=\"item.value\" >\r\n {{item.viewValue}}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n\r\n </mat-select>\r\n @if (control.value && control.value!.length > 0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".select-with-group{width:100%}\n"] }]
2314
+ }], ctorParameters: () => [], propDecorators: { groups$: [{
2315
+ type: Input
2316
+ }], selectedItems$: [{
2317
+ type: Input
2318
+ }], title: [{
2319
+ type: Input
2320
+ }], selectedItemsChange: [{
2321
+ type: Output
2322
+ }] } });
2323
+
2324
+ class TableComponent {
2325
+ /** Отображаемые данные. */
2326
+ data$ = new BehaviorSubject([]);
2327
+ /** Настройки колонок. */
2328
+ columnOptions = [];
2329
+ /** Количество записе. */
2330
+ length$ = new BehaviorSubject(0);
2331
+ /** Состояние сортировки, пагинации. */
2332
+ tableState = {};
2333
+ /** Разрешен выбор нескольких строк. */
2334
+ allowMultiSelect = false;
2335
+ /** Ссылка на страницу в приложении */
2336
+ rowRouterLinkField = '';
2337
+ /** Список элементов контекстного меню. */
2338
+ opt = [];
2339
+ /** Роли которым разрешено отправлять событие rowDoubleClicked при двойном щелчке мышью. */
2340
+ rolesDblClickedEvent = [];
2341
+ /** */
2342
+ pageStateChange = new EventEmitter();
2343
+ /** */
2344
+ sortStateChange = new EventEmitter();
2345
+ /** */
2346
+ selectionChange = new EventEmitter();
2347
+ /** */
2348
+ rowDoubleClicked = new EventEmitter();
2349
+ sort;
2350
+ paginator;
2351
+ contextMenu;
2352
+ /** Выбранная строка, для которого будет показываться меню при нажатии правой кнопки мыши. */
2353
+ itemForMenu;
2354
+ /** Позиция в которой отображается контекстное меню. */
2355
+ contextMenuPosition = { x: '0px', y: '0px' };
2356
+ // eslint-disable-next-line no-magic-numbers
2357
+ defaultPageIndex = 0;
2358
+ // eslint-disable-next-line no-magic-numbers
2359
+ defaultPageSize = 10;
2360
+ /** Источник данных для отображения. */
2361
+ dataSource = new MatTableDataSource();
2362
+ /** Выбранные записи. */
2363
+ selection = new SelectionModel();
2364
+ /** Список отображаемых колонок (формируется из @columnOptions). */
2365
+ displayedColumns;
2366
+ // DI
2367
+ authService = inject(AuthService);
2368
+ // Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью.
2369
+ dblClickedEventEnable = true;
2370
+ subscription;
2371
+ constructor() {
2372
+ // получить права пользователя
2373
+ this.subscription = this.authService.roles$.subscribe((userRoles) => {
2374
+ this.dblClickedEventEnable = !this.authService.isHideElement(this.rolesDblClickedEvent, userRoles);
2375
+ });
2376
+ }
2377
+ ngOnInit() {
2378
+ this.displayedColumns = ['select'].concat(this.columnOptions?.filter(c => !c.hide).map((item) => item.name) || []);
2379
+ const subs = this.data$.subscribe(data => {
2380
+ this.dataSource.data = data;
2381
+ // сохранить выделенные строки, если они все еще есть в данных
2382
+ const selected = this.selection.selected;
2383
+ this.selection.clear();
2384
+ data.filter(v => selected.map(s => JSON.stringify(s)).includes(JSON.stringify(v))).map(d => {
2385
+ this.selection.select(d);
2386
+ });
2387
+ });
2388
+ this.subscription?.add(subs);
2389
+ // пересоздаем, т.к. параметр allowMultiSelect появляется только сейчас
2390
+ this.selection = new SelectionModel(this.allowMultiSelect);
2391
+ }
2392
+ ngOnDestroy() {
2393
+ if (this.subscription)
2394
+ this.subscription.unsubscribe();
2395
+ }
2396
+ ngAfterViewInit() {
2397
+ // подписи элементов управления пагинатора (MatPaginatorIntl)
2398
+ if (this.paginator) {
2399
+ this.paginator._intl.itemsPerPageLabel = 'Записей на странице';
2400
+ this.paginator._intl.firstPageLabel = 'Первая страница';
2401
+ this.paginator._intl.previousPageLabel = 'Предыдущая страница';
2402
+ this.paginator._intl.nextPageLabel = 'Следующая страница';
2403
+ this.paginator._intl.lastPageLabel = 'Последняя страница';
2404
+ // изменение пагинации
2405
+ const subs = this.paginator.page.subscribe(page => {
2406
+ this.tableState.pageSize = page.pageSize;
2407
+ this.tableState.pageIndex = page.pageIndex;
2408
+ this.pageStateChange.emit({
2409
+ pageIndex: page.pageIndex,
2410
+ pageSize: page.pageSize
2411
+ });
2412
+ });
2413
+ this.subscription?.add(subs);
2414
+ }
2415
+ // изменение сортировки
2416
+ if (this.sort) {
2417
+ const subs = this.sort.sortChange
2418
+ .subscribe(sort => {
2419
+ this.tableState.sortActive = sort.active;
2420
+ this.tableState.sortDirection = sort.direction;
2421
+ this.sortStateChange.emit({
2422
+ sortActive: sort.active,
2423
+ sortDirection: sort.direction
2424
+ });
2425
+ });
2426
+ this.subscription?.add(subs);
2427
+ }
2428
+ // изменение выбранных записей
2429
+ if (this.selection) {
2430
+ const subs = this.selection.changed.subscribe(change => {
2431
+ this.selectionChange.emit(change.source.selected);
2432
+ });
2433
+ this.subscription?.add(subs);
2434
+ }
2435
+ }
2436
+ /** Whether the number of selected elements matches the total number of rows. */
2437
+ isAllSelected() {
2438
+ const numSelected = this.selection.selected.length;
2439
+ const numRows = this.dataSource.data.length;
2440
+ return numSelected === numRows;
2441
+ }
2442
+ /** Selects all rows if they are not all selected; otherwise clear selection. */
2443
+ masterToggle() {
2444
+ console.log(this.selection.isMultipleSelection());
2445
+ if (this.isAllSelected()) {
2446
+ this.selection.clear();
2447
+ }
2448
+ else {
2449
+ this.dataSource.data.forEach(row => this.selection.select(row));
2450
+ }
2451
+ }
2452
+ /** При щелчке по строке. */
2453
+ onRowClicked(row) {
2454
+ // выделение строки при щелчке по строке
2455
+ if (this.selection.isSelected(row)) {
2456
+ this.selection.deselect(row);
2457
+ }
2458
+ else {
2459
+ this.selection.select(row);
2460
+ }
2461
+ }
2462
+ /** При двойном щелчке по строке. */
2463
+ onRowDblClicked(row) {
2464
+ // выделение строки при двойном щелчке по строке
2465
+ this.selection.clear();
2466
+ this.selection.select(row);
2467
+ if (this.dblClickedEventEnable)
2468
+ this.rowDoubleClicked.emit(row);
2469
+ }
2470
+ /** При вызове контекстного меню. */
2471
+ onContextMenu(event, itemForMenu) {
2472
+ if (this.opt && this.opt.length === 0) {
2473
+ // если нет пунктов меню, то не показываем меню
2474
+ return;
2475
+ }
2476
+ event.preventDefault();
2477
+ this.itemForMenu = itemForMenu;
2478
+ this.contextMenuPosition.x = event.clientX + 'px';
2479
+ this.contextMenuPosition.y = event.clientY + 'px';
2480
+ // как это (menuData) использовать в шаблоне не понятно, поэтому использую this.itemForMenu
2481
+ // https://www.concretepage.com/angular-material/passing-data-to-mat-menu-angular-material
2482
+ if (this.contextMenu) {
2483
+ this.contextMenu.menuData = { itemForMenu };
2484
+ this.contextMenu.menu?.focusFirstItem('mouse');
2485
+ this.contextMenu.openMenu();
2486
+ }
2487
+ }
2488
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2489
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: TableComponent, isStandalone: true, selector: "lib-table", inputs: { data$: "data$", columnOptions: "columnOptions", length$: "length$", tableState: "tableState", allowMultiSelect: "allowMultiSelect", rowRouterLinkField: "rowRouterLinkField", opt: "opt", rolesDblClickedEvent: "rolesDblClickedEvent" }, outputs: { pageStateChange: "pageStateChange", sortStateChange: "sortStateChange", selectionChange: "selectionChange", rowDoubleClicked: "rowDoubleClicked" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "contextMenu", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"component-container\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\"\r\n matSort\r\n [matSortActive]=\"tableState.sortActive || ''\"\r\n [matSortDirection]=\"tableState.sortDirection\"\r\n matSortDisableClear>\r\n\r\n <!-- \u0412\u044B\u0431\u043E\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (allowMultiSelect) {\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <!-- <td mat-footer-cell *matFooterCellDef></td>-->\r\n </ng-container>\r\n\r\n @for (item of columnOptions; track item) {\r\n <ng-container matColumnDef={{item.name}}>\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"item.titleSortDisable\">{{item.title}}</th>\r\n @if (!item.format) {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'pre-wrap') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" class=\"pre-wrap\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'link') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [href]=\"element[item.name]\" target=\"_blank\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'linkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [href]=\"element[item.name]\" target=\"_blank\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'routerLink') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [routerLink]=\"[element[item.name]]\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'routerLinkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [routerLink]=\"[element[item.name]]\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'checkbox') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <mat-checkbox [checked]=\"element[item.name] === 1\" [disabled]=\"true\"></mat-checkbox>\r\n </td>\r\n }\r\n <!-- <td mat-footer-cell *matFooterCellDef>-->\r\n <!-- </td>-->\r\n </ng-container>\r\n }\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" colspan=\"9999\">\r\n \u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\r\n </td>\r\n </tr>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row;\r\n columns: displayedColumns;\" (click)=\"onRowClicked(row)\" (dblclick)=\"onRowDblClicked(row)\" class=\"element-row\"\r\n [class.selected-row]=\"selection.isSelected(row)\">\r\n <!-- [class.fact-done-row]=\"row.quantFact >= row.quantPlan\"-->\r\n </tr>\r\n <!-- <tr mat-footer-row *matFooterRowDef=\"displayedColumns\"></tr>-->\r\n </table>\r\n <div style=\"visibility: hidden; position: fixed\"\r\n [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\"\r\n [matMenuTriggerFor]=\"contextMenu\" #menuTrigger=\"matMenuTrigger\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\">\r\n <ng-template matMenuContent let-id=\"id\">\r\n @for (menuItem of opt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn(itemForMenu) : ''\"\r\n (mousedown)=\"menuItem.onClickMiddleFn ? menuItem.onClickMiddleFn($event, itemForMenu, menuTrigger) : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn(itemForMenu) : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n @if (menuItem.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{menuItem.symbol}}</span>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n</div>\r\n\r\n\r\n<mat-paginator [length]=\"length$.value\"\r\n [pageIndex]=\"tableState.pageIndex || defaultPageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\r\n [pageSize]=\"tableState.pageSize || defaultPageSize\"\r\n showFirstLastButtons\r\n itemsPerPageLabel=\"\"\r\n></mat-paginator>\r\n</div>\r\n", styles: [".component-container{display:flex;flex-direction:column;height:100%}.table-container{display:flex;flex-direction:column;justify-content:space-between;flex:auto;margin:0 20px;overflow:auto;height:400px}.center{position:absolute;inset:0 0 56px;background:#00000026;z-index:1;display:flex;align-items:center;justify-content:center}.mat-column-select{overflow:initial}tr.mat-footer-row{font-weight:700;height:56px}.mat-table{overflow-x:scroll}.mat-cell,.mat-header-cell{word-wrap:initial;display:table-cell;padding:0 10px;line-break:unset;white-space:nowrap;overflow:hidden;vertical-align:middle}.mat-row,.mat-header-row{display:table-row}tr.element-row:not(.selected-row):hover{background:#f5f5f5}tr.element-row:not(.selected-row):active{background:#efefef}.selected-row{background-color:#eee}.fact-done-row{background-color:#eefdec}a,a:visited,a:hover,a:active{color:inherit}.pre-wrap{white-space:pre-wrap}\n"], dependencies: [{ kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] });
2490
+ }
2491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TableComponent, decorators: [{
2492
+ type: Component,
2493
+ args: [{ selector: 'lib-table', imports: [MatTable, MatSort, MatColumnDef, MatHeaderCellDef, MatHeaderCell, MatCheckbox, MatCellDef, MatCell,
2494
+ MatSortHeader, MatIcon, RouterLink, MatNoDataRow, MatHeaderRowDef, MatHeaderRow, MatRowDef, MatRow,
2495
+ MatMenuTrigger, MatMenu, MatMenuContent, MatDivider, MatMenuItem, MatPaginator], template: "<div class=\"component-container\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\"\r\n matSort\r\n [matSortActive]=\"tableState.sortActive || ''\"\r\n [matSortDirection]=\"tableState.sortDirection\"\r\n matSortDisableClear>\r\n\r\n <!-- \u0412\u044B\u0431\u043E\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (allowMultiSelect) {\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <!-- <td mat-footer-cell *matFooterCellDef></td>-->\r\n </ng-container>\r\n\r\n @for (item of columnOptions; track item) {\r\n <ng-container matColumnDef={{item.name}}>\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"item.titleSortDisable\">{{item.title}}</th>\r\n @if (!item.format) {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'pre-wrap') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" class=\"pre-wrap\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'link') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [href]=\"element[item.name]\" target=\"_blank\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'linkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [href]=\"element[item.name]\" target=\"_blank\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'routerLink') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [routerLink]=\"[element[item.name]]\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'routerLinkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [routerLink]=\"[element[item.name]]\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'checkbox') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <mat-checkbox [checked]=\"element[item.name] === 1\" [disabled]=\"true\"></mat-checkbox>\r\n </td>\r\n }\r\n <!-- <td mat-footer-cell *matFooterCellDef>-->\r\n <!-- </td>-->\r\n </ng-container>\r\n }\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" colspan=\"9999\">\r\n \u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\r\n </td>\r\n </tr>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row;\r\n columns: displayedColumns;\" (click)=\"onRowClicked(row)\" (dblclick)=\"onRowDblClicked(row)\" class=\"element-row\"\r\n [class.selected-row]=\"selection.isSelected(row)\">\r\n <!-- [class.fact-done-row]=\"row.quantFact >= row.quantPlan\"-->\r\n </tr>\r\n <!-- <tr mat-footer-row *matFooterRowDef=\"displayedColumns\"></tr>-->\r\n </table>\r\n <div style=\"visibility: hidden; position: fixed\"\r\n [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\"\r\n [matMenuTriggerFor]=\"contextMenu\" #menuTrigger=\"matMenuTrigger\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\">\r\n <ng-template matMenuContent let-id=\"id\">\r\n @for (menuItem of opt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn(itemForMenu) : ''\"\r\n (mousedown)=\"menuItem.onClickMiddleFn ? menuItem.onClickMiddleFn($event, itemForMenu, menuTrigger) : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn(itemForMenu) : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n @if (menuItem.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{menuItem.symbol}}</span>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n</div>\r\n\r\n\r\n<mat-paginator [length]=\"length$.value\"\r\n [pageIndex]=\"tableState.pageIndex || defaultPageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\r\n [pageSize]=\"tableState.pageSize || defaultPageSize\"\r\n showFirstLastButtons\r\n itemsPerPageLabel=\"\"\r\n></mat-paginator>\r\n</div>\r\n", styles: [".component-container{display:flex;flex-direction:column;height:100%}.table-container{display:flex;flex-direction:column;justify-content:space-between;flex:auto;margin:0 20px;overflow:auto;height:400px}.center{position:absolute;inset:0 0 56px;background:#00000026;z-index:1;display:flex;align-items:center;justify-content:center}.mat-column-select{overflow:initial}tr.mat-footer-row{font-weight:700;height:56px}.mat-table{overflow-x:scroll}.mat-cell,.mat-header-cell{word-wrap:initial;display:table-cell;padding:0 10px;line-break:unset;white-space:nowrap;overflow:hidden;vertical-align:middle}.mat-row,.mat-header-row{display:table-row}tr.element-row:not(.selected-row):hover{background:#f5f5f5}tr.element-row:not(.selected-row):active{background:#efefef}.selected-row{background-color:#eee}.fact-done-row{background-color:#eefdec}a,a:visited,a:hover,a:active{color:inherit}.pre-wrap{white-space:pre-wrap}\n"] }]
2496
+ }], ctorParameters: () => [], propDecorators: { data$: [{
2497
+ type: Input
2498
+ }], columnOptions: [{
2499
+ type: Input
2500
+ }], length$: [{
2501
+ type: Input
2502
+ }], tableState: [{
2503
+ type: Input
2504
+ }], allowMultiSelect: [{
2505
+ type: Input
2506
+ }], rowRouterLinkField: [{
2507
+ type: Input
2508
+ }], opt: [{
2509
+ type: Input
2510
+ }], rolesDblClickedEvent: [{
2511
+ type: Input
2512
+ }], pageStateChange: [{
2513
+ type: Output
2514
+ }], sortStateChange: [{
2515
+ type: Output
2516
+ }], selectionChange: [{
2517
+ type: Output
2518
+ }], rowDoubleClicked: [{
2519
+ type: Output
2520
+ }], sort: [{
2521
+ type: ViewChild,
2522
+ args: [MatSort]
2523
+ }], paginator: [{
2524
+ type: ViewChild,
2525
+ args: [MatPaginator]
2526
+ }], contextMenu: [{
2527
+ type: ViewChild,
2528
+ args: [MatMenuTrigger]
2529
+ }] } });
2530
+
2531
+ /*
2532
+ * Public API Surface of uikit
2533
+ */
2534
+
2535
+ /**
2536
+ * Generated bundle index. Do not edit.
2537
+ */
2538
+
2539
+ export { Action, AlertService, AnimationsService, AuthService, AvatarService, BaseEditClass, BaseFilterClass, BaseMatChipComponent, BaseNavBarMenuClass, BasePageClass, BaseSelectAutocompleteWithVirtualScrollComponent, BaseSelectWithGroupComponent, BaseServiceClass, BaseToolbarComponent, DateRangeFilterComponent, DialogAction, DialogComponent, DisableIfRoleDirective, DisableIfUnauthorizedDirective, EntityAction, Environment, ExportService, HideIfRoleNotDirective, HideIfUnauthorizedDirective, ImzLogoComponent, LoaderService, LocalStorageService, LoginPageComponent, MY_FORMATS, NavBarComponent, NotFoundComponent, ProgressSpinnerComponent, ROUTE_ANIMATIONS_ELEMENTS, RedirectGuard, RoleService, SafePipe, SecUser, TableComponent, TimePipe, TruncatePipe, User, UserService, authGuard, dateFormat, isRouteAnimationsAll, isRouteAnimationsElements, isRouteAnimationsNone, isRouteAnimationsPage, roleGuard, routeAnimations };
2540
+ //# sourceMappingURL=kuzntsv-uikit.mjs.map