@libs-ui/components-inputs-password 0.2.356-9 → 0.2.357-0

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.
package/README.md CHANGED
@@ -1,147 +1,422 @@
1
- # Password Input Component
1
+ # @libs-ui/components-inputs-password
2
2
 
3
- `@libs-ui/components-inputs-password` một component nhập liệu mật khẩu chuyên dụng, cung cấp các tính năng bảo mật như ẩn/hiện mật khẩu, kiểm tra độ mạnh của mật khẩu (validation rules) và tự động tạo mật khẩu ngẫu nhiên.
3
+ > Component nhập liệu mật khẩu với tính năng ẩn/hiện, kiểm tra quy tắc bảo mật và tự động tạo mật khẩu ngẫu nhiên.
4
4
 
5
- ## Tính năng nổi bật
5
+ ## Giới thiệu
6
6
 
7
- - 👁️ **Ẩn/Hiện mật khẩu**: Cho phép người dùng chuyển đổi chế độ xem mật khẩu dễ dàng.
8
- - ✅ **Validation phức tạp**: Kiểm tra các quy tắc như độ dài tối thiểu/tối đa, sự xuất hiện của chữ hoa, chữ thường, số và ký tự đặc biệt.
9
- - 🎲 **Tạo mật khẩu ngẫu nhiên**: Hỗ trợ generate mật khẩu dựa trên cấu hình bảo mật được thiết lập.
10
- - 🛠️ **Tích hợp Validation**: Sử dụng `LibsUiComponentsInputsValidComponent` để hiển thị lỗi và quản lý trạng thái hợp lệ.
11
- - 🎨 **Tùy biến cao**: Cho phép tùy chỉnh icon, placeholder, label và các thuộc tính CSS.
7
+ `@libs-ui/components-inputs-password` component chuyên dụng để nhận input mật khẩu trong Angular. Component cung cấp tính năng chuyển đổi ẩn/hiện mật khẩu, hiển thị trực quan trạng thái đáp ứng từng quy tắc bảo mật (độ dài, ký tự hoa, thường, số, ký tự đặc biệt), và hỗ trợ tự động sinh mật khẩu ngẫu nhiên thỏa mãn cấu hình đã định.
12
8
 
13
- ## Cài đặt
9
+ ## Tính năng
10
+
11
+ - ✅ Ẩn/hiện mật khẩu với icon mắt chuyển đổi động
12
+ - ✅ Kiểm tra quy tắc bảo mật: độ dài tối thiểu/tối đa, chữ hoa, chữ thường, chữ số, ký tự đặc biệt
13
+ - ✅ Hiển thị trực quan từng quy tắc đã thỏa mãn hay chưa (màu xanh/xám)
14
+ - ✅ Hỗ trợ 2 chế độ kiểm tra: `key: 'all'` (phải đáp ứng toàn bộ) hoặc theo số lượng quy tắc tối thiểu
15
+ - ✅ Tự động sinh mật khẩu ngẫu nhiên theo cấu hình bảo mật
16
+ - ✅ Tích hợp với `LibsUiComponentsInputsValidComponent` — hỗ trợ required, minLength, pattern validation
17
+ - ✅ Hỗ trợ chế độ readonly, label, placeholder, icon tùy chỉnh
18
+ - ✅ Ngăn tự động điền mật khẩu của trình duyệt (autocomplete)
19
+ - ✅ Cung cấp `FunctionsControl` getter để parent gọi `checkIsValid()` qua ViewChild
20
+
21
+ ## Khi nào sử dụng
14
22
 
15
- Sử dụng npm hoặc yarn để cài đặt:
23
+ - Form đăng nhập, đăng tài khoản cần trường nhập mật khẩu tiêu chuẩn
24
+ - Trang đổi mật khẩu cần hiển thị checklist quy tắc bảo mật trực quan
25
+ - Form tạo tài khoản có nút sinh mật khẩu ngẫu nhiên cho admin
26
+ - Bất kỳ trường nhập liệu nào cần giao diện ẩn/hiện mật khẩu nhất quán trong toàn ứng dụng
27
+
28
+ ## Cài đặt
16
29
 
17
30
  ```bash
18
31
  npm install @libs-ui/components-inputs-password
19
32
  ```
20
33
 
21
- ## Cách sử dụng
22
-
23
- ### Import Module
34
+ ## Import
24
35
 
25
36
  ```typescript
26
37
  import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
38
+ import { IConfig, IContentWhenHiddenOrShowPassword } from '@libs-ui/components-inputs-password';
27
39
 
28
40
  @Component({
29
41
  standalone: true,
30
42
  imports: [LibsUiComponentsInputsPasswordComponent],
31
- // ...
32
43
  })
33
44
  export class YourComponent {}
34
45
  ```
35
46
 
36
- ### Ví dụ bản (Input mật khẩu thông thường)
47
+ ## Ví dụ sử dụng
48
+
49
+ ### 1. Input mật khẩu cơ bản (đăng nhập)
50
+
51
+ ```typescript
52
+ // login.component.ts
53
+ import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
54
+ import { signal } from '@angular/core';
55
+
56
+ @Component({
57
+ standalone: true,
58
+ imports: [LibsUiComponentsInputsPasswordComponent],
59
+ templateUrl: './login.component.html',
60
+ })
61
+ export class LoginComponent {
62
+ protected loginData = signal<Record<string, string>>({ password: '' });
63
+ }
64
+ ```
37
65
 
38
66
  ```html
67
+ <!-- login.component.html -->
39
68
  <libs_ui-components-inputs-password
40
69
  [fieldNameBind]="'password'"
41
70
  [(item)]="loginData"
42
71
  [isPassword]="true"
43
- [placeholder]="'Nhập mật khẩu của bạn'"></libs_ui-components-inputs-password>
72
+ [placeholder]="'Nhập mật khẩu của bạn'">
73
+ </libs_ui-components-inputs-password>
44
74
  ```
45
75
 
46
- ### dụ nâng cao (Kiểm tra độ mạnh mật khẩu)
76
+ ### 2. Input mật khẩu bảo mật mạnh (đăng / đổi mật khẩu)
77
+
78
+ ```typescript
79
+ // register.component.ts
80
+ import { LibsUiComponentsInputsPasswordComponent, IConfig } from '@libs-ui/components-inputs-password';
81
+ import { signal } from '@angular/core';
82
+
83
+ @Component({
84
+ standalone: true,
85
+ imports: [LibsUiComponentsInputsPasswordComponent],
86
+ templateUrl: './register.component.html',
87
+ })
88
+ export class RegisterComponent {
89
+ protected accountData = signal<Record<string, string>>({ newPassword: '' });
90
+
91
+ readonly secureConfig: IConfig = {
92
+ length_min: 8,
93
+ length_max: 16,
94
+ uppercase: 1,
95
+ lowercase: 1,
96
+ number: 1,
97
+ symbol: 1,
98
+ key: 'all', // phải thỏa mãn toàn bộ quy tắc
99
+ value: '4',
100
+ };
101
+ }
102
+ ```
47
103
 
48
104
  ```html
105
+ <!-- register.component.html -->
49
106
  <libs_ui-components-inputs-password
50
107
  [fieldNameBind]="'newPassword'"
51
108
  [(item)]="accountData"
52
109
  [isPassword]="true"
53
- [config]="passwordSecurityConfig"
54
- [placeholder]="'Tạo mật khẩu mạnh'"></libs_ui-components-inputs-password>
110
+ [config]="secureConfig"
111
+ [placeholder]="'Tối thiểu 8 ký tự, đủ hoa, thường, số, ký tự đặc biệt'">
112
+ </libs_ui-components-inputs-password>
55
113
  ```
56
114
 
115
+ ### 3. Input mật khẩu ở chế độ chỉ đọc (xem thông tin)
116
+
57
117
  ```typescript
58
- passwordSecurityConfig = {
59
- length_min: 8,
118
+ // profile.component.ts
119
+ import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
120
+ import { signal } from '@angular/core';
121
+
122
+ @Component({
123
+ standalone: true,
124
+ imports: [LibsUiComponentsInputsPasswordComponent],
125
+ templateUrl: './profile.component.html',
126
+ })
127
+ export class ProfileComponent {
128
+ protected profileData = signal<Record<string, string>>({ pass: 'secret123' });
129
+ }
130
+ ```
131
+
132
+ ```html
133
+ <!-- profile.component.html -->
134
+ <libs_ui-components-inputs-password
135
+ [fieldNameBind]="'pass'"
136
+ [(item)]="profileData"
137
+ [readonly]="true"
138
+ [labelConfig]="{ labelLeft: 'Mật khẩu hiện tại' }">
139
+ </libs_ui-components-inputs-password>
140
+ ```
141
+
142
+ ### 4. Kiểm tra hợp lệ từ component cha qua ViewChild
143
+
144
+ ```typescript
145
+ // parent.component.ts
146
+ import { LibsUiComponentsInputsPasswordComponent, IConfig } from '@libs-ui/components-inputs-password';
147
+ import { IInputValidFunctionControlEvent } from '@libs-ui/components-inputs-valid';
148
+ import { signal, viewChild } from '@angular/core';
149
+
150
+ @Component({
151
+ standalone: true,
152
+ imports: [LibsUiComponentsInputsPasswordComponent],
153
+ templateUrl: './parent.component.html',
154
+ })
155
+ export class ParentComponent {
156
+ protected formData = signal<Record<string, string>>({ password: '' });
157
+ private passwordRef = viewChild<LibsUiComponentsInputsPasswordComponent>('passwordRef');
158
+
159
+ protected handlerFunctionsControl(event: IInputValidFunctionControlEvent): void {
160
+ event.stopPropagation();
161
+ // Lưu lại để gọi checkIsValid khi submit
162
+ }
163
+
164
+ protected async handlerSubmit(): Promise<void> {
165
+ const isValid = await this.passwordRef()?.FunctionsControl?.checkIsValid();
166
+ if (!isValid) return;
167
+ // Xử lý submit...
168
+ }
169
+ }
170
+ ```
171
+
172
+ ```html
173
+ <!-- parent.component.html -->
174
+ <libs_ui-components-inputs-password
175
+ #passwordRef
176
+ [fieldNameBind]="'password'"
177
+ [(item)]="formData"
178
+ [isPassword]="true"
179
+ [placeholder]="'Nhập mật khẩu'"
180
+ (outFunctionsControl)="handlerFunctionsControl($event)">
181
+ </libs_ui-components-inputs-password>
182
+
183
+ <button (click)="handlerSubmit()">Xác nhận</button>
184
+ ```
185
+
186
+ ### 5. Cấu hình tùy chọn số quy tắc tối thiểu (không cần thỏa mãn toàn bộ)
187
+
188
+ ```typescript
189
+ // Chỉ cần thỏa mãn ít nhất 2 trong 4 loại ký tự
190
+ readonly flexConfig: IConfig = {
191
+ length_min: 6,
60
192
  length_max: 20,
61
- uppercase: 1, // Ít nhất 1 chữ hoa
62
- number: 1, // Ít nhất 1 chữ số
63
- symbol: 1, // Ít nhất 1 ký tự đặc biệt
64
- key: 'all', // Yêu cầu thỏa mãn tất cả quy tắc
193
+ uppercase: 1,
194
+ lowercase: 1,
195
+ number: 1,
196
+ symbol: 1,
197
+ key: '', // không phải 'all' → dùng value để đếm
198
+ value: '2', // đủ 2 loại ký tự là được
65
199
  };
66
200
  ```
67
201
 
68
- ## API Reference
69
-
70
- ### Inputs
71
-
72
- | Thuộc tính | Kiểu dữ liệu | Mặc định | Mô tả |
73
- | :------------------------------------------ | :--------------------------------- | :----------------------------------------- | :-------------------------------------------------------- |
74
- | `classIncludeInput` | `string` | `undefined` | Class bao ngoài input. |
75
- | `config` | `IConfig` | `defaultConfig()` | Cấu hình các quy tắc bảo mật (độ dài, ký tự đặc biệt...). |
76
- | `configUnitRight` | `IInputValidUnitConfig` | `undefined` | Cấu hình hiển thị đơn vị bên phải. |
77
- | `contentPopoverOverlayIconShowOrHiddenPass` | `IContentWhenHiddenOrShowPassword` | `defaultContentWhenHiddenOrShowPassword()` | Nội dung tooltip khi hover vào icon ẩn/hiện password. |
78
- | `defaultHeight` | `number` | `undefined` | Chiều cao mặc định của input. |
79
- | `fieldNameBind` | `string` | **(Required)** | Tên trường dữ liệu trong object `item` để bind giá trị. |
80
- | `iconLeftClass` | `string` | `undefined` | Class cho icon bên trái. |
81
- | `iconRightClass` | `string` | `undefined` | Class cho icon bên phải. |
82
- | `ignoreWidthInput100` | `boolean` | `undefined` | Không set width 100% cho input. |
83
- | `isPassword` | `boolean` | `false` | Nếu `true`, hiển thị icon ẩn/hiện mật khẩu. |
84
- | `item` | `Record<string, any>` | **(Model)** `{}` | Object chứa dữ liệu nhập liệu. |
85
- | `keySelectedUnitRight` | `unknown` | `undefined` | Key của đơn vị được chọn mặc định bên phải. |
86
- | `labelConfig` | `ILabel` | `undefined` | Cấu hình label cho input. |
87
- | `maxLength` | `number` | `20` | Giới hạn độ dài tối đa của chuỗi nhập vào. |
88
- | `placeholder` | `string` | `undefined` | Văn bản gợi ý trong ô input. |
89
- | `popoverContentIconRight` | `string` | `undefined` | Nội dung popover khi hover/click icon phải. |
90
- | `readonly` | `boolean` | `false` | Chế độ chỉ đọc. |
91
- | `resetAutoCompletePassword` | `boolean` | `undefined` | Tắt tính năng tự động điền mật khẩu của trình duyệt. |
92
- | `unitsRight` | `Array<Record<string, unknown>>` | `undefined` | Danh sách các đơn vị hiển thị bên phải. |
93
- | `validMinLength` | `IValidLength` | `defaultValidMinLength()` | Cấu hình thông báo khi không đủ độ dài tối thiểu. |
94
- | `validPattern` | `Array<IValidPattern>` | `undefined` | Danh sách pattern validation tùy chỉnh. |
95
- | `validRequired` | `IValidRequired` | `defaultValidRequired()` | Cấu hình thông báo khi trường bị bỏ trống. |
96
- | `zIndexPopoverOverlay` | `number` | `undefined` | Z-index của popover overlay. |
97
-
98
- ### Outputs
99
-
100
- | Sự kiện | Kiểu dữ liệu | tả |
101
- | :-------------------- | :-------------------------------- | :-------------------------------------------------------- |
102
- | Sự kiện | Kiểu dữ liệu | tả |
103
- | :-------------------- | :-------------------------------- | :-------------------------------------------------------- |
104
- | `outClickIconRight` | `void` | Phát ra khi click vào icon bên phải (thường icon mắt). |
105
- | `outFunctionsControl` | `IInputValidFunctionControlEvent` | Cung cấp phương thức điều khiển (`checkIsValid`). |
106
- | `outGeneratePassword` | `string` | Phát ra khi một mật khẩu ngẫu nhiên được tạo tự động. |
107
- | `outValueChange` | `string \| number` | Phát ra khi giá trị mật khẩu thay đổi. |
202
+ ```html
203
+ <libs_ui-components-inputs-password
204
+ [fieldNameBind]="'password'"
205
+ [(item)]="formData"
206
+ [isPassword]="true"
207
+ [config]="flexConfig"
208
+ [placeholder]="'Ít nhất 2 trong 4 loại tự'">
209
+ </libs_ui-components-inputs-password>
210
+ ```
211
+
212
+ ## @Input()
213
+
214
+ | Input | Type | Default | tả | dụ |
215
+ |---|---|---|---|---|
216
+ | `fieldNameBind` | `string` | **(Bắt buộc)** | Tên key trong object `item` dùng để bind giá trị | `[fieldNameBind]="'password'"` |
217
+ | `item` | `Record<string, any>` | **(Bắt buộc, model)** | Object chứa dữ liệu nhập liệu, dùng two-way binding | `[(item)]="loginData"` |
218
+ | `isPassword` | `boolean` | `false` | Nếu `true`, hiển thị icon mắt để ẩn/hiện mật khẩu và mặc định type là `password` | `[isPassword]="true"` |
219
+ | `config` | `IConfig` | `defaultConfig()` | Cấu hình quy tắc bảo mật: độ dài, số lượng từng loại ký tự, chế độ kiểm tra | `[config]="secureConfig"` |
220
+ | `classIncludeInput` | `string` | `undefined` | Class CSS bổ sung cho wrapper bao ngoài input | `[classIncludeInput]="'mt-4'"` |
221
+ | `configUnitRight` | `IInputValidUnitConfig` | `undefined` | Cấu hình hiển thị đơn vị bên phải input | `[configUnitRight]="unitConfig"` |
222
+ | `contentPopoverOverlayIconShowOrHiddenPass` | `IContentWhenHiddenOrShowPassword` | `defaultContentWhenHiddenOrShowPassword()` | Nội dung tooltip hiển thị khi hover icon ẩn/hiện mật khẩu | `[contentPopoverOverlayIconShowOrHiddenPass]="{ show: 'Hiện', hidden: 'Ẩn' }"` |
223
+ | `defaultHeight` | `number` | `undefined` | Chiều cao mặc định (px) của input | `[defaultHeight]="40"` |
224
+ | `iconLeftClass` | `string` | `undefined` (model) | Class icon hiển thị bên trái input | `[(iconLeftClass)]="leftIcon"` |
225
+ | `iconRightClass` | `string` | Auto khi `isPassword=true` (model) | Class icon hiển thị bên phải input. Tự động set icon mắt khi `isPassword=true` | `[(iconRightClass)]="rightIcon"` |
226
+ | `ignoreWidthInput100` | `boolean` | `undefined` | Khi `true`, input không chiếm 100% chiều rộng | `[ignoreWidthInput100]="true"` |
227
+ | `keySelectedUnitRight` | `unknown` | `undefined` | Key của đơn vị mặc định được chọn bên phải | `[keySelectedUnitRight]="'vnd'"` |
228
+ | `labelConfig` | `ILabel` | `undefined` | Cấu hình label hiển thị trên hoặc bên trái input | `[labelConfig]="{ labelLeft: 'Mật khẩu' }"` |
229
+ | `maxLength` | `number` | `20` | Giới hạn số tự tối đa người dùng có thể nhập | `[maxLength]="32"` |
230
+ | `placeholder` | `string` | `undefined` | Văn bản gợi ý hiển thị khi input rỗng | `[placeholder]="'Nhập mật khẩu'"` |
231
+ | `popoverContentIconRight` | `string` | `undefined` | Nội dung tooltip hiển thị khi hover/click icon bên phải | `[popoverContentIconRight]="'Tạo mật khẩu'"` |
232
+ | `readonly` | `boolean` | `undefined` | Khi `true`, input chỉ hiển thị, không cho phép chỉnh sửa | `[readonly]="true"` |
233
+ | `resetAutoCompletePassword` | `boolean` | `undefined` | Khi `true`, vô hiệu hóa tính năng tự động điền mật khẩu của trình duyệt | `[resetAutoCompletePassword]="true"` |
234
+ | `typeInput` | `TYPE_INPUT` | `undefined` (model) | Kiểu input (`'text'` hoặc `'password'`), tự chuyển đổi khi click icon mắt | `[(typeInput)]="inputType"` |
235
+ | `unitsRight` | `Array<Record<string, unknown>>` | `undefined` | Danh sách các tùy chọn đơn vị hiển thị ở bên phải input | `[unitsRight]="currencyList"` |
236
+ | `validMinLength` | `IValidLength` | `defaultValidMinLength()` | Cấu hình thông báo lỗi khi mật khẩu chưa đủ độ dài tối thiểu | `[validMinLength]="{ length: 8, message: 'i18n_min_8' }"` |
237
+ | `validPattern` | `Array<IValidPattern>` | `undefined` | Danh sách các pattern regex validation tùy chỉnh bổ sung | `[validPattern]="customPatterns"` |
238
+ | `validRequired` | `IValidRequired` | `defaultValidRequired()` | Cấu hình validation khi trường bị để trống | `[validRequired]="{ isRequired: true, message: 'i18n_required' }"` |
239
+ | `zIndexPopoverOverlay` | `number` | `undefined` | Z-index của lớp overlay popover (dùng khi bị che bởi modal/dialog) | `[zIndexPopoverOverlay]="1050"` |
240
+
241
+ ## @Output()
242
+
243
+ | Output | Type | Mô tả | Handler TS | Binding HTML |
244
+ |---|---|---|---|---|
245
+ | `(outClickIconRight)` | `void` | Phát ra khi người dùng click vào icon bên phải | `handlerClickIconRight(): void { event.stopPropagation(); }` | `(outClickIconRight)="handlerClickIconRight()"` |
246
+ | `(outFunctionsControl)` | `IInputValidFunctionControlEvent` | Cung cấp đối tượng điều khiển gồm `checkIsValid()` để validate từ bên ngoài | `handlerFunctionsControl(e: IInputValidFunctionControlEvent): void { e.stopPropagation(); this.controlRef = e; }` | `(outFunctionsControl)="handlerFunctionsControl($event)"` |
247
+ | `(outGeneratePassword)` | `string` | Phát ra mật khẩu ngẫu nhiên vừa được sinh ra | `handlerGeneratePassword(pass: string): void { event.stopPropagation(); console.log(pass); }` | `(outGeneratePassword)="handlerGeneratePassword($event)"` |
248
+ | `(outValueChange)` | `string \| number` | Phát ra giá trị mật khẩu mỗi khi người dùng nhập liệu | `handlerValueChange(value: string \| number): void { event.stopPropagation(); }` | `(outValueChange)="handlerValueChange($event)"` |
108
249
 
109
250
  ## Types & Interfaces
110
251
 
111
252
  ```typescript
112
- export interface IConfig {
113
- length_max: number;
114
- length_min: number;
115
- uppercase: number;
116
- lowercase: number;
117
- symbol: number;
118
- number: number;
119
- key: string; // 'all' hoặc các giá trị khác để xác định mức độ ưu tiên
120
- value: string; // Số lượng quy tắc cần thỏa mãn nếu key không phải 'all'
253
+ import { IConfig, IContentWhenHiddenOrShowPassword } from '@libs-ui/components-inputs-password';
254
+ ```
255
+
256
+ ### IConfig
257
+
258
+ Cấu hình quy tắc bảo mật mật khẩu:
259
+
260
+ ```typescript
261
+ interface IConfig {
262
+ length_min: number; // Độ dài tối thiểu (default: 4)
263
+ length_max: number; // Độ dài tối đa (default: 20)
264
+ uppercase: number; // Số chữ hoa tối thiểu (0 = không yêu cầu)
265
+ lowercase: number; // Số chữ thường tối thiểu (0 = không yêu cầu)
266
+ number: number; // Số chữ số tối thiểu (0 = không yêu cầu)
267
+ symbol: number; // Số ký tự đặc biệt tối thiểu (0 = không yêu cầu)
268
+ key: string; // 'all' = phải thỏa mãn tất cả loại, '' = dùng value
269
+ value: string; // Số lượng loại ký tự cần thỏa mãn (khi key !== 'all')
121
270
  }
271
+ ```
122
272
 
123
- export interface IValidStatus {
124
- upper?: boolean;
125
- number?: boolean;
126
- lower?: boolean;
127
- symbol?: boolean;
128
- length_max?: boolean;
129
- length_min?: boolean;
273
+ **Giá trị mặc định (`defaultConfig()`):**
274
+
275
+ ```typescript
276
+ {
277
+ length_max: 20,
278
+ length_min: 4,
279
+ uppercase: 0,
280
+ lowercase: 0,
281
+ symbol: 0,
282
+ key: '',
283
+ number: 0,
284
+ value: '0',
130
285
  }
286
+ ```
287
+
288
+ **Ví dụ cấu hình phổ biến:**
289
+
290
+ ```typescript
291
+ // Mật khẩu mạnh — bắt buộc đủ 4 loại ký tự
292
+ const strongConfig: IConfig = {
293
+ length_min: 8,
294
+ length_max: 20,
295
+ uppercase: 1,
296
+ lowercase: 1,
297
+ number: 1,
298
+ symbol: 1,
299
+ key: 'all',
300
+ value: '4',
301
+ };
131
302
 
132
- export interface IContentWhenHiddenOrShowPassword {
133
- show: string;
134
- hidden: string;
303
+ // Mật khẩu trung bình — chỉ cần 2 trong 4 loại
304
+ const mediumConfig: IConfig = {
305
+ length_min: 6,
306
+ length_max: 20,
307
+ uppercase: 1,
308
+ lowercase: 1,
309
+ number: 1,
310
+ symbol: 1,
311
+ key: '',
312
+ value: '2',
313
+ };
314
+
315
+ // Chỉ kiểm tra độ dài, không giới hạn ký tự
316
+ const lengthOnlyConfig: IConfig = {
317
+ length_min: 8,
318
+ length_max: 32,
319
+ uppercase: 0,
320
+ lowercase: 0,
321
+ number: 0,
322
+ symbol: 0,
323
+ key: '',
324
+ value: '0',
325
+ };
326
+ ```
327
+
328
+ ### IContentWhenHiddenOrShowPassword
329
+
330
+ Nội dung tooltip cho icon ẩn/hiện mật khẩu:
331
+
332
+ ```typescript
333
+ interface IContentWhenHiddenOrShowPassword {
334
+ show: string; // Tooltip khi mật khẩu đang bị ẩn (icon mắt mở)
335
+ hidden: string; // Tooltip khi mật khẩu đang hiện (icon mắt gạch)
135
336
  }
337
+
338
+ // Giá trị mặc định (dùng i18n key):
339
+ const defaultContent: IContentWhenHiddenOrShowPassword = {
340
+ show: 'i18n_show',
341
+ hidden: 'i18n_hidden',
342
+ };
136
343
  ```
137
344
 
138
- ## Tech Stack
345
+ ### IValidStatus (internal)
139
346
 
140
- - **Framework**: Angular 18+
141
- - **I18n**: `@ngx-translate/core`
142
- - **Validation**: `@libs-ui/components-inputs-valid`
143
- - **Styling**: Vanilla SCSS + Tailwind CSS class support
347
+ Trạng thái kiểm tra từng quy tắc bảo mật — dùng nội bộ để render checklist:
144
348
 
145
- ## License
349
+ ```typescript
350
+ interface IValidStatus {
351
+ upper?: boolean; // Đủ chữ hoa
352
+ number?: boolean; // Đủ chữ số
353
+ lower?: boolean; // Đủ chữ thường
354
+ symbol?: boolean; // Đủ ký tự đặc biệt
355
+ numberOfChar?: boolean; // Đủ số loại ký tự
356
+ length_max?: boolean; // Không vượt quá độ dài tối đa
357
+ length_min?: boolean; // Đạt độ dài tối thiểu
358
+ }
359
+ ```
360
+
361
+ ## FunctionsControl (Getter API)
362
+
363
+ Component expose getter `FunctionsControl` để component cha có thể gọi `checkIsValid()` qua ViewChild:
364
+
365
+ ```typescript
366
+ // Định nghĩa trong component:
367
+ get FunctionsControl(): IInputValidFunctionControlEvent | undefined
368
+
369
+ // Trong IInputValidFunctionControlEvent:
370
+ interface IInputValidFunctionControlEvent {
371
+ checkIsValid: () => Promise<boolean>;
372
+ }
373
+ ```
374
+
375
+ **Ví dụ sử dụng từ component cha:**
376
+
377
+ ```typescript
378
+ // parent.component.ts
379
+ import { LibsUiComponentsInputsPasswordComponent } from '@libs-ui/components-inputs-password';
380
+ import { viewChild } from '@angular/core';
381
+
382
+ export class ParentComponent {
383
+ private passwordRef = viewChild<LibsUiComponentsInputsPasswordComponent>('passwordRef');
384
+
385
+ protected async handlerSubmit(): Promise<void> {
386
+ const isValid = await this.passwordRef()?.FunctionsControl?.checkIsValid();
387
+ if (!isValid) return;
388
+ // Tiến hành submit...
389
+ }
390
+ }
391
+ ```
392
+
393
+ ```html
394
+ <libs_ui-components-inputs-password
395
+ #passwordRef
396
+ [fieldNameBind]="'password'"
397
+ [(item)]="formData"
398
+ [isPassword]="true">
399
+ </libs_ui-components-inputs-password>
400
+ ```
401
+
402
+ ## Lưu ý quan trọng
403
+
404
+ ⚠️ **fieldNameBind phải khớp với key trong item**: Nếu `fieldNameBind="'password'"` thì object `item` phải có key `password`. Sai tên key sẽ khiến validation và generate password không hoạt động.
405
+
406
+ ⚠️ **isPassword mặc định là false**: Nếu không truyền `[isPassword]="true"`, icon mắt sẽ không hiển thị và input sẽ render dưới dạng text thông thường thay vì password.
407
+
408
+ ⚠️ **config.key = 'all' yêu cầu thỏa mãn toàn bộ**: Khi `key: 'all'`, tất cả các loại ký tự có số lượng > 0 đều phải đáp ứng. Nếu chỉ cần thỏa mãn một phần, đặt `key: ''` và dùng `value` để chỉ định số lượng tối thiểu.
409
+
410
+ ⚠️ **validRequired mặc định isRequired = true**: Component mặc định kiểm tra trường bắt buộc. Nếu trường không bắt buộc, truyền `[validRequired]="{ isRequired: false, message: '' }"`.
411
+
412
+ ⚠️ **Generate password dựa trên config**: Chức năng tự sinh mật khẩu chỉ hoạt động đúng khi label config có nút "Generate" (`outClickButtonLabel`) được kích hoạt từ `LibsUiComponentsInputsValidComponent`. Mật khẩu sinh ra sẽ tự điền vào `item[fieldNameBind]`.
413
+
414
+ ⚠️ **Ký tự đặc biệt được hỗ trợ**: Bộ ký tự đặc biệt mặc định gồm: `~\`!@#$%^&*()_=+}{";:.,?|/<>-`. Không hỗ trợ tùy chỉnh bộ ký tự này.
415
+
416
+ ## Demo
417
+
418
+ ```bash
419
+ npx nx serve core-ui
420
+ ```
146
421
 
147
- MIT
422
+ Truy cập: http://localhost:4500/components/inputs/password
@@ -179,10 +179,10 @@ export class LibsUiComponentsInputsPasswordComponent {
179
179
  }
180
180
  }
181
181
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
182
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsPasswordComponent, isStandalone: true, selector: "libs_ui-components-inputs-password", inputs: { typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isPassword: { classPropertyName: "isPassword", publicName: "isPassword", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, iconLeftClass: { classPropertyName: "iconLeftClass", publicName: "iconLeftClass", isSignal: true, isRequired: false, transformFunction: null }, iconRightClass: { classPropertyName: "iconRightClass", publicName: "iconRightClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconRight: { classPropertyName: "popoverContentIconRight", publicName: "popoverContentIconRight", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopoverOverlay: { classPropertyName: "zIndexPopoverOverlay", publicName: "zIndexPopoverOverlay", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, contentPopoverOverlayIconShowOrHiddenPass: { classPropertyName: "contentPopoverOverlayIconShowOrHiddenPass", publicName: "contentPopoverOverlayIconShowOrHiddenPass", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeInput: "typeInputChange", iconLeftClass: "iconLeftClassChange", iconRightClass: "iconRightClassChange", item: "itemChange", outGeneratePassword: "outGeneratePassword", outClickIconRight: "outClickIconRight", outValueChange: "outValueChange", outFunctionsControl: "outFunctionsControl" }, ngImport: i0, template: "<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
182
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsPasswordComponent, isStandalone: true, selector: "libs_ui-components-inputs-password", inputs: { typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isPassword: { classPropertyName: "isPassword", publicName: "isPassword", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, iconLeftClass: { classPropertyName: "iconLeftClass", publicName: "iconLeftClass", isSignal: true, isRequired: false, transformFunction: null }, iconRightClass: { classPropertyName: "iconRightClass", publicName: "iconRightClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconRight: { classPropertyName: "popoverContentIconRight", publicName: "popoverContentIconRight", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopoverOverlay: { classPropertyName: "zIndexPopoverOverlay", publicName: "zIndexPopoverOverlay", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, contentPopoverOverlayIconShowOrHiddenPass: { classPropertyName: "contentPopoverOverlayIconShowOrHiddenPass", publicName: "contentPopoverOverlayIconShowOrHiddenPass", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeInput: "typeInputChange", iconLeftClass: "iconLeftClassChange", iconRightClass: "iconRightClassChange", item: "itemChange", outGeneratePassword: "outGeneratePassword", outClickIconRight: "outClickIconRight", outValueChange: "outValueChange", outFunctionsControl: "outFunctionsControl" }, ngImport: i0, template: "<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
183
183
  }
184
184
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsPasswordComponent, decorators: [{
185
185
  type: Component,
186
186
  args: [{ selector: 'libs_ui-components-inputs-password', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsValidComponent], template: "<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n" }]
187
187
  }] });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLXBhc3N3b3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvcGFzc3dvcmQvc3JjL2lucHV0cy1wYXNzd29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3Bhc3N3b3JkL3NyYy9pbnB1dHMtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUF1RyxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTdMLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxzQ0FBc0MsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQVdwSyxNQUFNLE9BQU8sdUNBQXVDO0lBQ2xELG1CQUFtQjtJQUNULFdBQVcsR0FBRyxNQUFNLENBQWUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUQsZUFBZSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUUzQyxTQUFTLEdBQUcsTUFBTSxDQUFhLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDL0MseUJBQXlCLEdBQUcsTUFBTSxDQUE4QyxTQUFTLENBQUMsQ0FBQztJQUVuRyxnQkFBZ0I7SUFDUCxTQUFTLEdBQUcsS0FBSyxFQUFjLENBQUM7SUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBK0IsYUFB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LENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQzt3R0E1TFUsdUNBQXVDOzRGQUF2Qyx1Q0FBdUMseTRIQ2pCcEQsc3VLQTRHQSwyQ0Q3RlksZUFBZSw0RkFBRSxvQ0FBb0M7OzRGQUVwRCx1Q0FBdUM7a0JBUm5ELFNBQVM7K0JBRUUsb0NBQW9DLGNBRWxDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgSUlucHV0VmFsaWRVbml0Q29uZmlnLCBJVmFsaWRMZW5ndGgsIElWYWxpZFBhdHRlcm4sIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBJTGFiZWwgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IHNldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUNoYXJhY3RlciwgSUNvbmZpZywgSUNvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQsIElWYWxpZFN0YXR1cyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYXNzd29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZywgZGVmYXVsdENvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQsIGRlZmF1bHRWYWxpZE1pbkxlbmd0aCwgZGVmYXVsdFZhbGlkUmVxdWlyZWQsIGdldENoYXJhY3RlciwgZ2V0VmFsaWRTdGF0dXMgfSBmcm9tICcuL3V0aWxzL3Bhc3N3b3JkJztcbmltcG9ydCB7IFRZUEVfSU5QVVQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtcGFzc3dvcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXRzLXBhc3N3b3JkLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNQYXNzd29yZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIHZhbGlkU3RhdHVzID0gc2lnbmFsPElWYWxpZFN0YXR1cz4oZ2V0VmFsaWRTdGF0dXMoZmFsc2UpKTtcbiAgcHJvdGVjdGVkIHZhbGlkQ2hhcmFjdGVycyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSBjaGFyYWN0ZXIgPSBzaWduYWw8SUNoYXJhY3Rlcj4oZ2V0Q2hhcmFjdGVyKCkpO1xuICBwcml2YXRlIGlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8SUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IHR5cGVJbnB1dCA9IG1vZGVsPFRZUEVfSU5QVVQ+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PElDb25maWcsIElDb25maWcgfCB1bmRlZmluZWQ+KGRlZmF1bHRDb25maWcoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZGVmYXVsdENvbmZpZygpIH0pO1xuICByZWFkb25seSBpc1Bhc3N3b3JkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWNvbkxlZnRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWNvblJpZ2h0Q2xhc3MgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHBvcG92ZXJDb250ZW50SWNvblJpZ2h0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB6SW5kZXhQb3BvdmVyT3ZlcmxheSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IG1vZGVsLnJlcXVpcmVkPFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgcmVhZG9ubHkgZmllbGROYW1lQmluZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdW5pdHNSaWdodCA9IGlucHV0PEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVW5pdFJpZ2h0ID0gaW5wdXQ8SUlucHV0VmFsaWRVbml0Q29uZmlnPigpO1xuICByZWFkb25seSBrZXlTZWxlY3RlZFVuaXRSaWdodCA9IGlucHV0PHVua25vd24+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUlucHV0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVXaWR0aElucHV0MTAwID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY29udGVudFBvcG92ZXJPdmVybGF5SWNvblNob3dPckhpZGRlblBhc3MgPSBpbnB1dDxJQ29udGVudFdoZW5IaWRkZW5PclNob3dQYXNzd29yZCwgSUNvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQgfCB1bmRlZmluZWQ+KGRlZmF1bHRDb250ZW50V2hlbkhpZGRlbk9yU2hvd1Bhc3N3b3JkKCksIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZGVmYXVsdENvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQoKSxcbiAgfSk7XG4gIHJlYWRvbmx5IG1heExlbmd0aCA9IGlucHV0PG51bWJlcj4oMjApO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPihkZWZhdWx0VmFsaWRSZXF1aXJlZCgpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBkZWZhdWx0VmFsaWRSZXF1aXJlZCgpIH0pO1xuICByZWFkb25seSB2YWxpZE1pbkxlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aCwgSVZhbGlkTGVuZ3RoIHwgdW5kZWZpbmVkPihkZWZhdWx0VmFsaWRNaW5MZW5ndGgoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZGVmYXVsdFZhbGlkTWluTGVuZ3RoKCkgfSk7XG4gIHJlYWRvbmx5IHZhbGlkUGF0dGVybiA9IGlucHV0PEFycmF5PElWYWxpZFBhdHRlcm4+PigpO1xuICByZWFkb25seSBkZWZhdWx0SGVpZ2h0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSByZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRHZW5lcmF0ZVBhc3N3b3JkID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tJY29uUmlnaHQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0VmFsdWVDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNQYXNzd29yZCgpKSB7XG4gICAgICB0aGlzLmljb25SaWdodENsYXNzLnNldCgnbGlicy11aS1pY29uLWV5ZS1zb2xpZCBob3Zlcjp0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXSB0ZXh0LVsxNnB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVsjNmE3MzgzXScpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcml2YXRlIGFzeW5jIHNldFZhbGlkU3RhdHVzKHN0YXR1czogYm9vbGVhbikge1xuICAgIHRoaXMudmFsaWRDaGFyYWN0ZXJzLnNldChzdGF0dXMpO1xuICAgIHRoaXMudmFsaWRTdGF0dXMuc2V0KGdldFZhbGlkU3RhdHVzKHN0YXR1cykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7IC4uLmV2ZW50LCBjaGVja0lzVmFsaWQ6IGFzeW5jICgpID0+IChhd2FpdCBldmVudC5jaGVja0lzVmFsaWQoKSkgJiYgKGF3YWl0IHRoaXMuY2hlY2tWYWxpZCgpKSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIHRoaXMub3V0VmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tWYWxpZCgpIHtcbiAgICBjb25zdCBwYXNzd29yZCA9IHRoaXMuaXRlbSgpW3RoaXMuZmllbGROYW1lQmluZCgpXSBhcyBzdHJpbmc7XG4gICAgdGhpcy5zZXRWYWxpZFN0YXR1cyhmYWxzZSk7XG4gICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID4gdGhpcy5jb25maWcoKS5sZW5ndGhfbWF4KSB7XG4gICAgICB0aGlzLnZhbGlkU3RhdHVzKCkubGVuZ3RoX21heCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52YWxpZFN0YXR1cygpLmxlbmd0aF9tYXggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobGVuZ3RoID49IHRoaXMuY29uZmlnKCkubGVuZ3RoX21pbikge1xuICAgICAgdGhpcy52YWxpZFN0YXR1cygpLmxlbmd0aF9taW4gPSB0cnVlO1xuICAgIH1cbiAgICBsZXQgc3ltYm9sID0gMCxcbiAgICAgIG51bWJlciA9IDAsXG4gICAgICB1cHBlciA9IDAsXG4gICAgICBsb3dlciA9IDAsXG4gICAgICB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyKCkubnVtYmVyQ2hhcmFjdGVyLmluY2x1ZGVzKHBhc3N3b3JkLmNoYXJBdChpKSkpIHtcbiAgICAgICAgbnVtYmVyKys7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGFyYWN0ZXIoKS51cHBlckNoYXJhY3Rlci5pbmNsdWRlcyhwYXNzd29yZC5jaGFyQXQoaSkpKSB7XG4gICAgICAgIHVwcGVyKys7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGFyYWN0ZXIoKS5sb3dlckNoYXJhY3Rlci5pbmNsdWRlcyhwYXNzd29yZC5jaGFyQXQoaSkpKSB7XG4gICAgICAgIGxvd2VyKys7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGFyYWN0ZXIoKS5zcGVjaWFsQ2hhcmFjdGVyLmluY2x1ZGVzKHBhc3N3b3JkLmNoYXJBdChpKSkpIHtcbiAgICAgICAgc3ltYm9sKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudW1iZXIgPj0gdGhpcy5jb25maWcoKS5udW1iZXIgfHwgIXRoaXMuY29uZmlnKCkubnVtYmVyKSB7XG4gICAgICB0aGlzLnZhbGlkU3RhdHVzKCkubnVtYmVyID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZygpLm51bWJlcikge1xuICAgICAgICB0b3RhbCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodXBwZXIgPj0gdGhpcy5jb25maWcoKS51cHBlcmNhc2UgfHwgIXRoaXMuY29uZmlnKCkudXBwZXJjYXNlKSB7XG4gICAgICB0aGlzLnZhbGlkU3RhdHVzKCkudXBwZXIgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKCkudXBwZXJjYXNlKSB7XG4gICAgICAgIHRvdGFsKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsb3dlciA+PSB0aGlzLmNvbmZpZygpLmxvd2VyY2FzZSB8fCAhdGhpcy5jb25maWcoKS5sb3dlcmNhc2UpIHtcbiAgICAgIHRoaXMudmFsaWRTdGF0dXMoKS5sb3dlciA9IHRydWU7XG4gICAgICBpZiAodGhpcy5jb25maWcoKS5sb3dlcmNhc2UpIHtcbiAgICAgICAgdG90YWwrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN5bWJvbCA+PSB0aGlzLmNvbmZpZygpLnN5bWJvbCB8fCAhdGhpcy5jb25maWcoKS5zeW1ib2wpIHtcbiAgICAgIHRoaXMudmFsaWRTdGF0dXMoKS5zeW1ib2wgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKCkuc3ltYm9sKSB7XG4gICAgICAgIHRvdGFsKys7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5jb25maWcoKS5rZXkpIHtcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGlmICh0aGlzLnZhbGlkU3RhdHVzKCkuc3ltYm9sICYmIHRoaXMudmFsaWRTdGF0dXMoKS5sb3dlciAmJiB0aGlzLnZhbGlkU3RhdHVzKCkudXBwZXIgJiYgdGhpcy52YWxpZFN0YXR1cygpLm51bWJlcikge1xuICAgICAgICAgIHRoaXMudmFsaWRDaGFyYWN0ZXJzLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0b3RhbCA+PSArdGhpcy5jb25maWcoKS52YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsaWRDaGFyYWN0ZXJzLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZhbGlkQ2hhcmFjdGVycygpIHx8ICF0aGlzLnZhbGlkU3RhdHVzKCkubGVuZ3RoX21pbiB8fCAhdGhpcy52YWxpZFN0YXR1cygpLmxlbmd0aF9tYXgpIHtcbiAgICAgIHRoaXMudmFsaWRTdGF0dXMudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkU3RhdHVzLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlIH0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVDbGlja0ljb25SaWdodCgpIHtcbiAgICB0aGlzLm91dENsaWNrSWNvblJpZ2h0LmVtaXQoKTtcbiAgICBpZiAodGhpcy5pc1Bhc3N3b3JkKCkpIHtcbiAgICAgIHRoaXMudHlwZUlucHV0LnVwZGF0ZSgodmFsdWUpID0+ICh2YWx1ZSA9PT0gJ3Bhc3N3b3JkJyA/ICd0ZXh0JyA6ICdwYXNzd29yZCcpKTtcbiAgICAgIGlmICh0aGlzLnR5cGVJbnB1dCgpICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgIHRoaXMuaWNvblJpZ2h0Q2xhc3Muc2V0KCdsaWJzLXVpLWljb24tZXllLXNsYXNoLXNvbGlkIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIHRleHQtWzE2cHhdIGN1cnNvci1wb2ludGVyIHRleHQtWyM2YTczODNdJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaWNvblJpZ2h0Q2xhc3Muc2V0KCdsaWJzLXVpLWljb24tZXllLXNvbGlkIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIHRleHQtWzE2cHhdIGN1cnNvci1wb2ludGVyIHRleHQtWyM2YTczODNdJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJHZW5lcmF0ZVBhc3N3b3JkKCkge1xuICAgIGNvbnN0IHdvcmRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgaWYgKHRoaXMuY29uZmlnKCkubnVtYmVyKSB7XG4gICAgICB0aGlzLnJhbmRvbUluZGV4KHRoaXMuY29uZmlnKCkubnVtYmVyLCB0aGlzLmNoYXJhY3RlcigpLm51bWJlckNoYXJhY3Rlciwgd29yZHMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcoKS51cHBlcmNhc2UpIHtcbiAgICAgIHRoaXMucmFuZG9tSW5kZXgodGhpcy5jb25maWcoKS51cHBlcmNhc2UsIHRoaXMuY2hhcmFjdGVyKCkudXBwZXJDaGFyYWN0ZXIsIHdvcmRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnKCkubG93ZXJjYXNlKSB7XG4gICAgICB0aGlzLnJhbmRvbUluZGV4KHRoaXMuY29uZmlnKCkubG93ZXJjYXNlLCB0aGlzLmNoYXJhY3RlcigpLmxvd2VyQ2hhcmFjdGVyLCB3b3Jkcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZygpLnN5bWJvbCkge1xuICAgICAgdGhpcy5yYW5kb21JbmRleCh0aGlzLmNvbmZpZygpLnN5bWJvbCwgdGhpcy5jaGFyYWN0ZXIoKS5zcGVjaWFsQ2hhcmFjdGVyLCB3b3Jkcyk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9ICt0aGlzLmNvbmZpZygpLmxlbmd0aF9taW4gKyBNYXRoLmZsb29yKCgrdGhpcy5jb25maWcoKS5sZW5ndGhfbWF4IC0gK3RoaXMuY29uZmlnKCkubGVuZ3RoX21pbikgLyAyKSAtIHdvcmRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yYW5kb21JbmRleChsZW5ndGgsIHRoaXMuY2hhcmFjdGVyKCkubG93ZXJDaGFyYWN0ZXIsIHdvcmRzKTtcbiAgICB9XG4gICAgc2V0KHRoaXMuaXRlbSwgdGhpcy5maWVsZE5hbWVCaW5kKCksIHdvcmRzLmpvaW4oJycpKTtcbiAgICB0aGlzLmlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2woKT8uY2hlY2tJc1ZhbGlkKCk7XG4gICAgdGhpcy5vdXRHZW5lcmF0ZVBhc3N3b3JkLmVtaXQod29yZHMuam9pbignJykpO1xuICAgIHRoaXMuc2V0VmFsaWRTdGF0dXModHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmFuZG9tSW5kZXgobnVtYmVyOiBudW1iZXIsIGNoYXJhY3Rlcjogc3RyaW5nLCB3b3JkczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bWJlcjsgaSsrKSB7XG4gICAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3Rlci5sZW5ndGgpO1xuICAgICAgd29yZHMucHVzaChjaGFyYWN0ZXJbcmFuZG9tSW5kZXhdKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gIFsoaXRlbSldPVwiaXRlbVwiXG4gIFtsYWJlbENvbmZpZ109XCJsYWJlbENvbmZpZygpXCJcbiAgW2ZpZWxkTmFtZUJpbmRdPVwiZmllbGROYW1lQmluZCgpXCJcbiAgW3ZhbGlkUmVxdWlyZWRdPVwidmFsaWRSZXF1aXJlZCgpXCJcbiAgW3ZhbGlkTWluTGVuZ3RoXT1cInZhbGlkTWluTGVuZ3RoKClcIlxuICBbdmFsaWRQYXR0ZXJuXT1cInZhbGlkUGF0dGVybigpXCJcbiAgW2RhdGFUeXBlXT1cIidzdHJpbmcnXCJcbiAgW3R5cGVJbnB1dF09XCJ0eXBlSW5wdXQoKVwiXG4gIFtpY29uUmlnaHRDbGFzc109XCJpY29uUmlnaHRDbGFzcygpXCJcbiAgW2ljb25MZWZ0Q2xhc3NdPVwiaWNvbkxlZnRDbGFzcygpXCJcbiAgW3BvcG92ZXJDb250ZW50SWNvblJpZ2h0XT1cInBvcG92ZXJDb250ZW50SWNvblJpZ2h0KClcIlxuICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aCgpXCJcbiAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICBbZGVmYXVsdEhlaWdodF09XCJkZWZhdWx0SGVpZ2h0KClcIlxuICBbY2xhc3NJbmNsdWRlSW5wdXRdPVwiY2xhc3NJbmNsdWRlSW5wdXQoKVwiXG4gIFtpZ25vcmVXaWR0aElucHV0MTAwXT1cImlnbm9yZVdpZHRoSW5wdXQxMDAoKVwiXG4gIFtwb3BvdmVyQ29udGVudEljb25SaWdodF09XCJ0eXBlSW5wdXQoKSA9PT0gJ3Bhc3N3b3JkJyA/IGNvbnRlbnRQb3BvdmVyT3ZlcmxheUljb25TaG93T3JIaWRkZW5QYXNzKCkuc2hvdyA6IGNvbnRlbnRQb3BvdmVyT3ZlcmxheUljb25TaG93T3JIaWRkZW5QYXNzKCkuaGlkZGVuXCJcbiAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKClcIlxuICBbdW5pdHNSaWdodF09XCJ1bml0c1JpZ2h0KClcIlxuICBbY29uZmlnVW5pdFJpZ2h0XT1cImNvbmZpZ1VuaXRSaWdodCgpXCJcbiAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cImtleVNlbGVjdGVkVW5pdFJpZ2h0KClcIlxuICBbekluZGV4UG9wb3ZlckNvbnRlbnRdPVwiekluZGV4UG9wb3Zlck92ZXJsYXkoKVwiXG4gIFtyZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkXT1cInJlc2V0QXV0b0NvbXBsZXRlUGFzc3dvcmQoKVwiXG4gIChvdXRDbGlja0J1dHRvbkxhYmVsKT1cImhhbmRsZXJHZW5lcmF0ZVBhc3N3b3JkKClcIlxuICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gIChvdXRJY29uUmlnaHQpPVwiaGFuZGxlQ2xpY2tJY29uUmlnaHQoKVwiXG4gIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50KVwiIC8+XG48bmctY29udGVudCBzZWxlY3Q9XCIubGlicy11aS1pbnB1dHMtcGFzc3dvcmQtY29udGVudC1jdXN0b21cIj48L25nLWNvbnRlbnQ+XG48ZGl2IGNsYXNzPVwibXQtWzhweF1cIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgIFtjbGFzcy50ZXh0LVsjMDBiYzYyXV09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkubGVuZ3RoX21pblwiXG4gICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIj5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJ0ZXh0LVsxMnB4XVwiXG4gICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtc29saWRdPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIlxuICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZV09XCIhcmVhZG9ubHkoKSAmJiAhdmFsaWRTdGF0dXMoKS5sZW5ndGhfbWluXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg3ciBwbC1bOHB4XVwiPnt7ICdpMThuX21pbmltdW1fbGVuZ3RoX251bWJlcicgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS5sZW5ndGhfbWluIH0gfX08L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJwdC1bNHB4XSBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgW2NsYXNzLnRleHQtWyMwMGJjNjJdXT1cInJlYWRvbmx5KCkgfHwgdmFsaWRTdGF0dXMoKS5sZW5ndGhfbWF4XCJcbiAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiPlxuICAgIDxpXG4gICAgICBjbGFzcz1cInRleHQtWzEycHhdXCJcbiAgICAgIFtjbGFzcy50ZXh0LVsjMDBiYzYyXV09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiXG4gICAgICBbY2xhc3MubGlicy11aS1pY29uLWNoZWNrLWNpcmNsZS1zb2xpZF09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiXG4gICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiXG4gICAgICBbY2xhc3MubGlicy11aS1pY29uLWNoZWNrLWNpcmNsZS1vdXRsaW5lXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLmxlbmd0aF9tYXhcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDdyIHBsLVs4cHhdXCI+e3sgJ2kxOG5fbWF4aW11bV9sZW5ndGhfbnVtYmVyJyB8IHRyYW5zbGF0ZTogeyBudW1iZXI6IGNvbmZpZygpLmxlbmd0aF9tYXggfSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gIEBpZiAoY29uZmlnKCkudXBwZXJjYXNlIHx8IGNvbmZpZygpLmxvd2VyY2FzZSB8fCBjb25maWcoKS5udW1iZXIgfHwgY29uZmlnKCkuc3ltYm9sKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJtdC1bNHB4XVwiXG4gICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkQ2hhcmFjdGVycygpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cInRleHQtWzEycHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtc29saWRdPVwicmVhZG9ubHkoKSB8fCB2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZV09XCIhcmVhZG9ubHkoKSAmJiAhdmFsaWRDaGFyYWN0ZXJzKClcIj48L2k+XG4gICAgICAgIEBpZiAoY29uZmlnKCkua2V5ID09PSAnYWxsJykge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg3ciBwbC1bOHB4XVwiPnt7ICdpMThuX2NvbnRhaW5zX2FsbF90eXBlc19vZl9jaGFyYWN0ZXJzX2JlbG93JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNvbmZpZygpLmtleSAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcGwtWzhweF1cIj57eyAnaTE4bl9jb250YWluc19udW1iZXJfdHlwZXNfb2ZfY2hhcmFjdGVyc19iZWxvdycgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS52YWx1ZSB9IH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAoY29uZmlnKCkudXBwZXJjYXNlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcHQtWzRweF0gcGwtWzI0cHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLnVwcGVyXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkudXBwZXJcIj5cbiAgICAgICAgICB7eyAnaTE4bl91cHBlcmNhc2VfbWluaW11bScgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS51cHBlcmNhc2UgfSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkubG93ZXJjYXNlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcHQtWzRweF0gcGwtWzI0cHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLmxvd2VyXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkubG93ZXJcIj5cbiAgICAgICAgICB7eyAnaTE4bl9sb3dlcmNhc2VfbWluaW11bScgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS5sb3dlcmNhc2UgfSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkubnVtYmVyKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcHQtWzRweF0gcGwtWzI0cHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLm51bWJlclwiXG4gICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLm51bWJlclwiPlxuICAgICAgICAgIHt7ICdpMThuX251bWJlcl9taW5pbXVtJyB8IHRyYW5zbGF0ZTogeyBudW1iZXI6IGNvbmZpZygpLm51bWJlciB9IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5zeW1ib2wpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg3ciBwdC1bNHB4XSBwbC1bMjRweF1cIlxuICAgICAgICAgIFtjbGFzcy50ZXh0LVsjMDBiYzYyXV09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkuc3ltYm9sXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkuc3ltYm9sXCI+XG4gICAgICAgICAge3sgJ2kxOG5fc3ltYm9sX21pbmltdW0nIHwgdHJhbnNsYXRlOiB7IG51bWJlcjogY29uZmlnKCkuc3ltYm9sIH0gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLXBhc3N3b3JkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvcGFzc3dvcmQvc3JjL2lucHV0cy1wYXNzd29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3Bhc3N3b3JkL3NyYy9pbnB1dHMtcGFzc3dvcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUF1RyxvQ0FBb0MsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTdMLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxzQ0FBc0MsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQVdwSyxNQUFNLE9BQU8sdUNBQXVDO0lBQ2xELG1CQUFtQjtJQUNULFdBQVcsR0FBRyxNQUFNLENBQWUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUQsZUFBZSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUVsQyxTQUFTLEdBQUcsTUFBTSxDQUFhLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDL0MseUJBQXlCLEdBQUcsTUFBTSxDQUE4QyxTQUFTLENBQUMsQ0FBQztJQUU1RyxnQkFBZ0I7SUFDUCxTQUFTLEdBQUcsS0FBSyxFQUFjLENBQUM7SUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBK0IsYUFB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LENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQzt3R0E1TFUsdUNBQXVDOzRGQUF2Qyx1Q0FBdUMseTRIQ2pCcEQsc3VLQTRHQSwyQ0Q3RlksZUFBZSw0RkFBRSxvQ0FBb0M7OzRGQUVwRCx1Q0FBdUM7a0JBUm5ELFNBQVM7K0JBRUUsb0NBQW9DLGNBRWxDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgSUlucHV0VmFsaWRVbml0Q29uZmlnLCBJVmFsaWRMZW5ndGgsIElWYWxpZFBhdHRlcm4sIElWYWxpZFJlcXVpcmVkLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy12YWxpZCc7XG5pbXBvcnQgeyBJTGFiZWwgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IHNldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUNoYXJhY3RlciwgSUNvbmZpZywgSUNvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQsIElWYWxpZFN0YXR1cyB9IGZyb20gJy4vaW50ZXJmYWNlcy9wYXNzd29yZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVmYXVsdENvbmZpZywgZGVmYXVsdENvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQsIGRlZmF1bHRWYWxpZE1pbkxlbmd0aCwgZGVmYXVsdFZhbGlkUmVxdWlyZWQsIGdldENoYXJhY3RlciwgZ2V0VmFsaWRTdGF0dXMgfSBmcm9tICcuL3V0aWxzL3Bhc3N3b3JkJztcbmltcG9ydCB7IFRZUEVfSU5QVVQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1pbnB1dCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtcGFzc3dvcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXRzLXBhc3N3b3JkLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNQYXNzd29yZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIHZhbGlkU3RhdHVzID0gc2lnbmFsPElWYWxpZFN0YXR1cz4oZ2V0VmFsaWRTdGF0dXMoZmFsc2UpKTtcbiAgcHJvdGVjdGVkIHZhbGlkQ2hhcmFjdGVycyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFyYWN0ZXIgPSBzaWduYWw8SUNoYXJhY3Rlcj4oZ2V0Q2hhcmFjdGVyKCkpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8SUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IHR5cGVJbnB1dCA9IG1vZGVsPFRZUEVfSU5QVVQ+KCk7XG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0PElDb25maWcsIElDb25maWcgfCB1bmRlZmluZWQ+KGRlZmF1bHRDb25maWcoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZGVmYXVsdENvbmZpZygpIH0pO1xuICByZWFkb25seSBpc1Bhc3N3b3JkID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQ29uZmlnID0gaW5wdXQ8SUxhYmVsPigpO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWNvbkxlZnRDbGFzcyA9IG1vZGVsPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaWNvblJpZ2h0Q2xhc3MgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHBvcG92ZXJDb250ZW50SWNvblJpZ2h0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB6SW5kZXhQb3BvdmVyT3ZlcmxheSA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgaXRlbSA9IG1vZGVsLnJlcXVpcmVkPFJlY29yZDxzdHJpbmcsIGFueT4+KHt9KTtcbiAgcmVhZG9ubHkgZmllbGROYW1lQmluZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdW5pdHNSaWdodCA9IGlucHV0PEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4oKTtcbiAgcmVhZG9ubHkgY29uZmlnVW5pdFJpZ2h0ID0gaW5wdXQ8SUlucHV0VmFsaWRVbml0Q29uZmlnPigpO1xuICByZWFkb25seSBrZXlTZWxlY3RlZFVuaXRSaWdodCA9IGlucHV0PHVua25vd24+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUlucHV0ID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBpZ25vcmVXaWR0aElucHV0MTAwID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgY29udGVudFBvcG92ZXJPdmVybGF5SWNvblNob3dPckhpZGRlblBhc3MgPSBpbnB1dDxJQ29udGVudFdoZW5IaWRkZW5PclNob3dQYXNzd29yZCwgSUNvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQgfCB1bmRlZmluZWQ+KGRlZmF1bHRDb250ZW50V2hlbkhpZGRlbk9yU2hvd1Bhc3N3b3JkKCksIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZGVmYXVsdENvbnRlbnRXaGVuSGlkZGVuT3JTaG93UGFzc3dvcmQoKSxcbiAgfSk7XG4gIHJlYWRvbmx5IG1heExlbmd0aCA9IGlucHV0PG51bWJlcj4oMjApO1xuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQsIElWYWxpZFJlcXVpcmVkIHwgdW5kZWZpbmVkPihkZWZhdWx0VmFsaWRSZXF1aXJlZCgpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyBkZWZhdWx0VmFsaWRSZXF1aXJlZCgpIH0pO1xuICByZWFkb25seSB2YWxpZE1pbkxlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aCwgSVZhbGlkTGVuZ3RoIHwgdW5kZWZpbmVkPihkZWZhdWx0VmFsaWRNaW5MZW5ndGgoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZGVmYXVsdFZhbGlkTWluTGVuZ3RoKCkgfSk7XG4gIHJlYWRvbmx5IHZhbGlkUGF0dGVybiA9IGlucHV0PEFycmF5PElWYWxpZFBhdHRlcm4+PigpO1xuICByZWFkb25seSBkZWZhdWx0SGVpZ2h0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSByZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRHZW5lcmF0ZVBhc3N3b3JkID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0Q2xpY2tJY29uUmlnaHQgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0VmFsdWVDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNQYXNzd29yZCgpKSB7XG4gICAgICB0aGlzLmljb25SaWdodENsYXNzLnNldCgnbGlicy11aS1pY29uLWV5ZS1zb2xpZCBob3Zlcjp0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWRlZmF1bHQpXSB0ZXh0LVsxNnB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVsjNmE3MzgzXScpO1xuICAgIH1cbiAgfVxuXG4gIC8qIEZVTkNUSU9OUyAqL1xuICBwcml2YXRlIGFzeW5jIHNldFZhbGlkU3RhdHVzKHN0YXR1czogYm9vbGVhbikge1xuICAgIHRoaXMudmFsaWRDaGFyYWN0ZXJzLnNldChzdGF0dXMpO1xuICAgIHRoaXMudmFsaWRTdGF0dXMuc2V0KGdldFZhbGlkU3RhdHVzKHN0YXR1cykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2wuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7IC4uLmV2ZW50LCBjaGVja0lzVmFsaWQ6IGFzeW5jICgpID0+IChhd2FpdCBldmVudC5jaGVja0lzVmFsaWQoKSkgJiYgKGF3YWl0IHRoaXMuY2hlY2tWYWxpZCgpKSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlVmFsdWVDaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICAgIHRoaXMuY2hlY2tWYWxpZCgpO1xuICAgIHRoaXMub3V0VmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tWYWxpZCgpIHtcbiAgICBjb25zdCBwYXNzd29yZCA9IHRoaXMuaXRlbSgpW3RoaXMuZmllbGROYW1lQmluZCgpXSBhcyBzdHJpbmc7XG4gICAgdGhpcy5zZXRWYWxpZFN0YXR1cyhmYWxzZSk7XG4gICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IHBhc3N3b3JkLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID4gdGhpcy5jb25maWcoKS5sZW5ndGhfbWF4KSB7XG4gICAgICB0aGlzLnZhbGlkU3RhdHVzKCkubGVuZ3RoX21heCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52YWxpZFN0YXR1cygpLmxlbmd0aF9tYXggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobGVuZ3RoID49IHRoaXMuY29uZmlnKCkubGVuZ3RoX21pbikge1xuICAgICAgdGhpcy52YWxpZFN0YXR1cygpLmxlbmd0aF9taW4gPSB0cnVlO1xuICAgIH1cbiAgICBsZXQgc3ltYm9sID0gMCxcbiAgICAgIG51bWJlciA9IDAsXG4gICAgICB1cHBlciA9IDAsXG4gICAgICBsb3dlciA9IDAsXG4gICAgICB0b3RhbCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuY2hhcmFjdGVyKCkubnVtYmVyQ2hhcmFjdGVyLmluY2x1ZGVzKHBhc3N3b3JkLmNoYXJBdChpKSkpIHtcbiAgICAgICAgbnVtYmVyKys7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGFyYWN0ZXIoKS51cHBlckNoYXJhY3Rlci5pbmNsdWRlcyhwYXNzd29yZC5jaGFyQXQoaSkpKSB7XG4gICAgICAgIHVwcGVyKys7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGFyYWN0ZXIoKS5sb3dlckNoYXJhY3Rlci5pbmNsdWRlcyhwYXNzd29yZC5jaGFyQXQoaSkpKSB7XG4gICAgICAgIGxvd2VyKys7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jaGFyYWN0ZXIoKS5zcGVjaWFsQ2hhcmFjdGVyLmluY2x1ZGVzKHBhc3N3b3JkLmNoYXJBdChpKSkpIHtcbiAgICAgICAgc3ltYm9sKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChudW1iZXIgPj0gdGhpcy5jb25maWcoKS5udW1iZXIgfHwgIXRoaXMuY29uZmlnKCkubnVtYmVyKSB7XG4gICAgICB0aGlzLnZhbGlkU3RhdHVzKCkubnVtYmVyID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZygpLm51bWJlcikge1xuICAgICAgICB0b3RhbCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodXBwZXIgPj0gdGhpcy5jb25maWcoKS51cHBlcmNhc2UgfHwgIXRoaXMuY29uZmlnKCkudXBwZXJjYXNlKSB7XG4gICAgICB0aGlzLnZhbGlkU3RhdHVzKCkudXBwZXIgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKCkudXBwZXJjYXNlKSB7XG4gICAgICAgIHRvdGFsKys7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChsb3dlciA+PSB0aGlzLmNvbmZpZygpLmxvd2VyY2FzZSB8fCAhdGhpcy5jb25maWcoKS5sb3dlcmNhc2UpIHtcbiAgICAgIHRoaXMudmFsaWRTdGF0dXMoKS5sb3dlciA9IHRydWU7XG4gICAgICBpZiAodGhpcy5jb25maWcoKS5sb3dlcmNhc2UpIHtcbiAgICAgICAgdG90YWwrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN5bWJvbCA+PSB0aGlzLmNvbmZpZygpLnN5bWJvbCB8fCAhdGhpcy5jb25maWcoKS5zeW1ib2wpIHtcbiAgICAgIHRoaXMudmFsaWRTdGF0dXMoKS5zeW1ib2wgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuY29uZmlnKCkuc3ltYm9sKSB7XG4gICAgICAgIHRvdGFsKys7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGhpcy5jb25maWcoKS5rZXkpIHtcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIGlmICh0aGlzLnZhbGlkU3RhdHVzKCkuc3ltYm9sICYmIHRoaXMudmFsaWRTdGF0dXMoKS5sb3dlciAmJiB0aGlzLnZhbGlkU3RhdHVzKCkudXBwZXIgJiYgdGhpcy52YWxpZFN0YXR1cygpLm51bWJlcikge1xuICAgICAgICAgIHRoaXMudmFsaWRDaGFyYWN0ZXJzLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh0b3RhbCA+PSArdGhpcy5jb25maWcoKS52YWx1ZSkge1xuICAgICAgICAgIHRoaXMudmFsaWRDaGFyYWN0ZXJzLnNldCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZhbGlkQ2hhcmFjdGVycygpIHx8ICF0aGlzLnZhbGlkU3RhdHVzKCkubGVuZ3RoX21pbiB8fCAhdGhpcy52YWxpZFN0YXR1cygpLmxlbmd0aF9tYXgpIHtcbiAgICAgIHRoaXMudmFsaWRTdGF0dXMudXBkYXRlKCh2YWx1ZSkgPT4gKHsgLi4udmFsdWUgfSkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkU3RhdHVzLnVwZGF0ZSgodmFsdWUpID0+ICh7IC4uLnZhbHVlIH0pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVDbGlja0ljb25SaWdodCgpIHtcbiAgICB0aGlzLm91dENsaWNrSWNvblJpZ2h0LmVtaXQoKTtcbiAgICBpZiAodGhpcy5pc1Bhc3N3b3JkKCkpIHtcbiAgICAgIHRoaXMudHlwZUlucHV0LnVwZGF0ZSgodmFsdWUpID0+ICh2YWx1ZSA9PT0gJ3Bhc3N3b3JkJyA/ICd0ZXh0JyA6ICdwYXNzd29yZCcpKTtcbiAgICAgIGlmICh0aGlzLnR5cGVJbnB1dCgpICE9PSAncGFzc3dvcmQnKSB7XG4gICAgICAgIHRoaXMuaWNvblJpZ2h0Q2xhc3Muc2V0KCdsaWJzLXVpLWljb24tZXllLXNsYXNoLXNvbGlkIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIHRleHQtWzE2cHhdIGN1cnNvci1wb2ludGVyIHRleHQtWyM2YTczODNdJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaWNvblJpZ2h0Q2xhc3Muc2V0KCdsaWJzLXVpLWljb24tZXllLXNvbGlkIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldIHRleHQtWzE2cHhdIGN1cnNvci1wb2ludGVyIHRleHQtWyM2YTczODNdJyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJHZW5lcmF0ZVBhc3N3b3JkKCkge1xuICAgIGNvbnN0IHdvcmRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgaWYgKHRoaXMuY29uZmlnKCkubnVtYmVyKSB7XG4gICAgICB0aGlzLnJhbmRvbUluZGV4KHRoaXMuY29uZmlnKCkubnVtYmVyLCB0aGlzLmNoYXJhY3RlcigpLm51bWJlckNoYXJhY3Rlciwgd29yZHMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcoKS51cHBlcmNhc2UpIHtcbiAgICAgIHRoaXMucmFuZG9tSW5kZXgodGhpcy5jb25maWcoKS51cHBlcmNhc2UsIHRoaXMuY2hhcmFjdGVyKCkudXBwZXJDaGFyYWN0ZXIsIHdvcmRzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnKCkubG93ZXJjYXNlKSB7XG4gICAgICB0aGlzLnJhbmRvbUluZGV4KHRoaXMuY29uZmlnKCkubG93ZXJjYXNlLCB0aGlzLmNoYXJhY3RlcigpLmxvd2VyQ2hhcmFjdGVyLCB3b3Jkcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZygpLnN5bWJvbCkge1xuICAgICAgdGhpcy5yYW5kb21JbmRleCh0aGlzLmNvbmZpZygpLnN5bWJvbCwgdGhpcy5jaGFyYWN0ZXIoKS5zcGVjaWFsQ2hhcmFjdGVyLCB3b3Jkcyk7XG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9ICt0aGlzLmNvbmZpZygpLmxlbmd0aF9taW4gKyBNYXRoLmZsb29yKCgrdGhpcy5jb25maWcoKS5sZW5ndGhfbWF4IC0gK3RoaXMuY29uZmlnKCkubGVuZ3RoX21pbikgLyAyKSAtIHdvcmRzLmxlbmd0aDtcbiAgICBpZiAobGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yYW5kb21JbmRleChsZW5ndGgsIHRoaXMuY2hhcmFjdGVyKCkubG93ZXJDaGFyYWN0ZXIsIHdvcmRzKTtcbiAgICB9XG4gICAgc2V0KHRoaXMuaXRlbSwgdGhpcy5maWVsZE5hbWVCaW5kKCksIHdvcmRzLmpvaW4oJycpKTtcbiAgICB0aGlzLmlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2woKT8uY2hlY2tJc1ZhbGlkKCk7XG4gICAgdGhpcy5vdXRHZW5lcmF0ZVBhc3N3b3JkLmVtaXQod29yZHMuam9pbignJykpO1xuICAgIHRoaXMuc2V0VmFsaWRTdGF0dXModHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcmFuZG9tSW5kZXgobnVtYmVyOiBudW1iZXIsIGNoYXJhY3Rlcjogc3RyaW5nLCB3b3JkczogQXJyYXk8c3RyaW5nPikge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bWJlcjsgaSsrKSB7XG4gICAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3Rlci5sZW5ndGgpO1xuICAgICAgd29yZHMucHVzaChjaGFyYWN0ZXJbcmFuZG9tSW5kZXhdKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gIFsoaXRlbSldPVwiaXRlbVwiXG4gIFtsYWJlbENvbmZpZ109XCJsYWJlbENvbmZpZygpXCJcbiAgW2ZpZWxkTmFtZUJpbmRdPVwiZmllbGROYW1lQmluZCgpXCJcbiAgW3ZhbGlkUmVxdWlyZWRdPVwidmFsaWRSZXF1aXJlZCgpXCJcbiAgW3ZhbGlkTWluTGVuZ3RoXT1cInZhbGlkTWluTGVuZ3RoKClcIlxuICBbdmFsaWRQYXR0ZXJuXT1cInZhbGlkUGF0dGVybigpXCJcbiAgW2RhdGFUeXBlXT1cIidzdHJpbmcnXCJcbiAgW3R5cGVJbnB1dF09XCJ0eXBlSW5wdXQoKVwiXG4gIFtpY29uUmlnaHRDbGFzc109XCJpY29uUmlnaHRDbGFzcygpXCJcbiAgW2ljb25MZWZ0Q2xhc3NdPVwiaWNvbkxlZnRDbGFzcygpXCJcbiAgW3BvcG92ZXJDb250ZW50SWNvblJpZ2h0XT1cInBvcG92ZXJDb250ZW50SWNvblJpZ2h0KClcIlxuICBbbWF4TGVuZ3RoXT1cIm1heExlbmd0aCgpXCJcbiAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICBbZGVmYXVsdEhlaWdodF09XCJkZWZhdWx0SGVpZ2h0KClcIlxuICBbY2xhc3NJbmNsdWRlSW5wdXRdPVwiY2xhc3NJbmNsdWRlSW5wdXQoKVwiXG4gIFtpZ25vcmVXaWR0aElucHV0MTAwXT1cImlnbm9yZVdpZHRoSW5wdXQxMDAoKVwiXG4gIFtwb3BvdmVyQ29udGVudEljb25SaWdodF09XCJ0eXBlSW5wdXQoKSA9PT0gJ3Bhc3N3b3JkJyA/IGNvbnRlbnRQb3BvdmVyT3ZlcmxheUljb25TaG93T3JIaWRkZW5QYXNzKCkuc2hvdyA6IGNvbnRlbnRQb3BvdmVyT3ZlcmxheUljb25TaG93T3JIaWRkZW5QYXNzKCkuaGlkZGVuXCJcbiAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyKClcIlxuICBbdW5pdHNSaWdodF09XCJ1bml0c1JpZ2h0KClcIlxuICBbY29uZmlnVW5pdFJpZ2h0XT1cImNvbmZpZ1VuaXRSaWdodCgpXCJcbiAgW2tleVNlbGVjdGVkVW5pdFJpZ2h0XT1cImtleVNlbGVjdGVkVW5pdFJpZ2h0KClcIlxuICBbekluZGV4UG9wb3ZlckNvbnRlbnRdPVwiekluZGV4UG9wb3Zlck92ZXJsYXkoKVwiXG4gIFtyZXNldEF1dG9Db21wbGV0ZVBhc3N3b3JkXT1cInJlc2V0QXV0b0NvbXBsZXRlUGFzc3dvcmQoKVwiXG4gIChvdXRDbGlja0J1dHRvbkxhYmVsKT1cImhhbmRsZXJHZW5lcmF0ZVBhc3N3b3JkKClcIlxuICAob3V0VmFsdWVDaGFuZ2UpPVwiaGFuZGxlVmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gIChvdXRJY29uUmlnaHQpPVwiaGFuZGxlQ2xpY2tJY29uUmlnaHQoKVwiXG4gIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2woJGV2ZW50KVwiIC8+XG48bmctY29udGVudCBzZWxlY3Q9XCIubGlicy11aS1pbnB1dHMtcGFzc3dvcmQtY29udGVudC1jdXN0b21cIj48L25nLWNvbnRlbnQ+XG48ZGl2IGNsYXNzPVwibXQtWzhweF1cIj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgIFtjbGFzcy50ZXh0LVsjMDBiYzYyXV09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkubGVuZ3RoX21pblwiXG4gICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIj5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJ0ZXh0LVsxMnB4XVwiXG4gICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtc29saWRdPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIlxuICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLmxlbmd0aF9taW5cIlxuICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZV09XCIhcmVhZG9ubHkoKSAmJiAhdmFsaWRTdGF0dXMoKS5sZW5ndGhfbWluXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg3ciBwbC1bOHB4XVwiPnt7ICdpMThuX21pbmltdW1fbGVuZ3RoX251bWJlcicgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS5sZW5ndGhfbWluIH0gfX08L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJwdC1bNHB4XSBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgW2NsYXNzLnRleHQtWyMwMGJjNjJdXT1cInJlYWRvbmx5KCkgfHwgdmFsaWRTdGF0dXMoKS5sZW5ndGhfbWF4XCJcbiAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiPlxuICAgIDxpXG4gICAgICBjbGFzcz1cInRleHQtWzEycHhdXCJcbiAgICAgIFtjbGFzcy50ZXh0LVsjMDBiYzYyXV09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiXG4gICAgICBbY2xhc3MubGlicy11aS1pY29uLWNoZWNrLWNpcmNsZS1zb2xpZF09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiXG4gICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkubGVuZ3RoX21heFwiXG4gICAgICBbY2xhc3MubGlicy11aS1pY29uLWNoZWNrLWNpcmNsZS1vdXRsaW5lXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLmxlbmd0aF9tYXhcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDdyIHBsLVs4cHhdXCI+e3sgJ2kxOG5fbWF4aW11bV9sZW5ndGhfbnVtYmVyJyB8IHRyYW5zbGF0ZTogeyBudW1iZXI6IGNvbmZpZygpLmxlbmd0aF9tYXggfSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gIEBpZiAoY29uZmlnKCkudXBwZXJjYXNlIHx8IGNvbmZpZygpLmxvd2VyY2FzZSB8fCBjb25maWcoKS5udW1iZXIgfHwgY29uZmlnKCkuc3ltYm9sKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJtdC1bNHB4XVwiXG4gICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkQ2hhcmFjdGVycygpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGlcbiAgICAgICAgICBjbGFzcz1cInRleHQtWzEycHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtc29saWRdPVwicmVhZG9ubHkoKSB8fCB2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZENoYXJhY3RlcnMoKVwiXG4gICAgICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1jaGVjay1jaXJjbGUtb3V0bGluZV09XCIhcmVhZG9ubHkoKSAmJiAhdmFsaWRDaGFyYWN0ZXJzKClcIj48L2k+XG4gICAgICAgIEBpZiAoY29uZmlnKCkua2V5ID09PSAnYWxsJykge1xuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGlicy11aS1mb250LWg3ciBwbC1bOHB4XVwiPnt7ICdpMThuX2NvbnRhaW5zX2FsbF90eXBlc19vZl9jaGFyYWN0ZXJzX2JlbG93JyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKGNvbmZpZygpLmtleSAhPT0gJ2FsbCcpIHtcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcGwtWzhweF1cIj57eyAnaTE4bl9jb250YWluc19udW1iZXJfdHlwZXNfb2ZfY2hhcmFjdGVyc19iZWxvdycgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS52YWx1ZSB9IH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAoY29uZmlnKCkudXBwZXJjYXNlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcHQtWzRweF0gcGwtWzI0cHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLnVwcGVyXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkudXBwZXJcIj5cbiAgICAgICAgICB7eyAnaTE4bl91cHBlcmNhc2VfbWluaW11bScgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS51cHBlcmNhc2UgfSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkubG93ZXJjYXNlKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcHQtWzRweF0gcGwtWzI0cHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLmxvd2VyXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkubG93ZXJcIj5cbiAgICAgICAgICB7eyAnaTE4bl9sb3dlcmNhc2VfbWluaW11bScgfCB0cmFuc2xhdGU6IHsgbnVtYmVyOiBjb25maWcoKS5sb3dlcmNhc2UgfSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoY29uZmlnKCkubnVtYmVyKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpYnMtdWktZm9udC1oN3IgcHQtWzRweF0gcGwtWzI0cHhdXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzAwYmM2Ml1dPVwicmVhZG9ubHkoKSB8fCB2YWxpZFN0YXR1cygpLm51bWJlclwiXG4gICAgICAgICAgW2NsYXNzLnRleHQtWyM5Y2EyYWRdXT1cIiFyZWFkb25seSgpICYmICF2YWxpZFN0YXR1cygpLm51bWJlclwiPlxuICAgICAgICAgIHt7ICdpMThuX251bWJlcl9taW5pbXVtJyB8IHRyYW5zbGF0ZTogeyBudW1iZXI6IGNvbmZpZygpLm51bWJlciB9IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChjb25maWcoKS5zeW1ib2wpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibGlicy11aS1mb250LWg3ciBwdC1bNHB4XSBwbC1bMjRweF1cIlxuICAgICAgICAgIFtjbGFzcy50ZXh0LVsjMDBiYzYyXV09XCJyZWFkb25seSgpIHx8IHZhbGlkU3RhdHVzKCkuc3ltYm9sXCJcbiAgICAgICAgICBbY2xhc3MudGV4dC1bIzljYTJhZF1dPVwiIXJlYWRvbmx5KCkgJiYgIXZhbGlkU3RhdHVzKCkuc3ltYm9sXCI+XG4gICAgICAgICAge3sgJ2kxOG5fc3ltYm9sX21pbmltdW0nIHwgdHJhbnNsYXRlOiB7IG51bWJlcjogY29uZmlnKCkuc3ltYm9sIH0gfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, model, input, output, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { signal, model, input, output, Component, ChangeDetectionStrategy } from '@angular/core';
3
3
  import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
4
4
  import { set } from '@libs-ui/utils';
5
5
  import * as i1 from '@ngx-translate/core';
@@ -230,7 +230,7 @@ class LibsUiComponentsInputsPasswordComponent {
230
230
  }
231
231
  }
232
232
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
233
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsPasswordComponent, isStandalone: true, selector: "libs_ui-components-inputs-password", inputs: { typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isPassword: { classPropertyName: "isPassword", publicName: "isPassword", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, iconLeftClass: { classPropertyName: "iconLeftClass", publicName: "iconLeftClass", isSignal: true, isRequired: false, transformFunction: null }, iconRightClass: { classPropertyName: "iconRightClass", publicName: "iconRightClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconRight: { classPropertyName: "popoverContentIconRight", publicName: "popoverContentIconRight", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopoverOverlay: { classPropertyName: "zIndexPopoverOverlay", publicName: "zIndexPopoverOverlay", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, contentPopoverOverlayIconShowOrHiddenPass: { classPropertyName: "contentPopoverOverlayIconShowOrHiddenPass", publicName: "contentPopoverOverlayIconShowOrHiddenPass", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeInput: "typeInputChange", iconLeftClass: "iconLeftClassChange", iconRightClass: "iconRightClassChange", item: "itemChange", outGeneratePassword: "outGeneratePassword", outClickIconRight: "outClickIconRight", outValueChange: "outValueChange", outFunctionsControl: "outFunctionsControl" }, ngImport: i0, template: "<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
233
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsPasswordComponent, isStandalone: true, selector: "libs_ui-components-inputs-password", inputs: { typeInput: { classPropertyName: "typeInput", publicName: "typeInput", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, isPassword: { classPropertyName: "isPassword", publicName: "isPassword", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, labelConfig: { classPropertyName: "labelConfig", publicName: "labelConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, iconLeftClass: { classPropertyName: "iconLeftClass", publicName: "iconLeftClass", isSignal: true, isRequired: false, transformFunction: null }, iconRightClass: { classPropertyName: "iconRightClass", publicName: "iconRightClass", isSignal: true, isRequired: false, transformFunction: null }, popoverContentIconRight: { classPropertyName: "popoverContentIconRight", publicName: "popoverContentIconRight", isSignal: true, isRequired: false, transformFunction: null }, zIndexPopoverOverlay: { classPropertyName: "zIndexPopoverOverlay", publicName: "zIndexPopoverOverlay", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, fieldNameBind: { classPropertyName: "fieldNameBind", publicName: "fieldNameBind", isSignal: true, isRequired: true, transformFunction: null }, unitsRight: { classPropertyName: "unitsRight", publicName: "unitsRight", isSignal: true, isRequired: false, transformFunction: null }, configUnitRight: { classPropertyName: "configUnitRight", publicName: "configUnitRight", isSignal: true, isRequired: false, transformFunction: null }, keySelectedUnitRight: { classPropertyName: "keySelectedUnitRight", publicName: "keySelectedUnitRight", isSignal: true, isRequired: false, transformFunction: null }, classIncludeInput: { classPropertyName: "classIncludeInput", publicName: "classIncludeInput", isSignal: true, isRequired: false, transformFunction: null }, ignoreWidthInput100: { classPropertyName: "ignoreWidthInput100", publicName: "ignoreWidthInput100", isSignal: true, isRequired: false, transformFunction: null }, contentPopoverOverlayIconShowOrHiddenPass: { classPropertyName: "contentPopoverOverlayIconShowOrHiddenPass", publicName: "contentPopoverOverlayIconShowOrHiddenPass", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validPattern: { classPropertyName: "validPattern", publicName: "validPattern", isSignal: true, isRequired: false, transformFunction: null }, defaultHeight: { classPropertyName: "defaultHeight", publicName: "defaultHeight", isSignal: true, isRequired: false, transformFunction: null }, resetAutoCompletePassword: { classPropertyName: "resetAutoCompletePassword", publicName: "resetAutoCompletePassword", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typeInput: "typeInputChange", iconLeftClass: "iconLeftClassChange", iconRightClass: "iconRightClassChange", item: "itemChange", outGeneratePassword: "outGeneratePassword", outClickIconRight: "outClickIconRight", outValueChange: "outValueChange", outFunctionsControl: "outFunctionsControl" }, ngImport: i0, template: "<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "ignoreShowMessageError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
234
234
  }
235
235
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsPasswordComponent, decorators: [{
236
236
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-inputs-password.mjs","sources":["../../../../../../libs-ui/components/inputs/password/src/utils/password.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.html","../../../../../../libs-ui/components/inputs/password/src/libs-ui-components-inputs-password.ts"],"sourcesContent":["import { IValidLength, IValidRequired } from '@libs-ui/components-inputs-valid';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from '../interfaces/password.interface';\n\nexport const getValidStatus = (status: boolean): IValidStatus => {\n return {\n length_min: status,\n length_max: status,\n upper: status,\n lower: status,\n number: status,\n numberOfChar: status,\n symbol: status,\n };\n};\n\nexport const getCharacter = (): ICharacter => {\n return {\n numberCharacter: '0123456789',\n upperCharacter: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n lowerCharacter: 'abcdefghijklmnopqrstuvwxyz',\n specialCharacter: '~`!@#$%^&*()_=+}{\";:.,?|/<>-',\n };\n};\n\nexport const defaultConfig = (): IConfig => {\n return {\n length_max: 20,\n length_min: 4,\n uppercase: 0,\n lowercase: 0,\n symbol: 0,\n key: '',\n number: 0,\n value: '0',\n };\n};\n\nexport const defaultContentWhenHiddenOrShowPassword = (): IContentWhenHiddenOrShowPassword => {\n return {\n show: 'i18n_show',\n hidden: 'i18n_hidden',\n };\n};\n\nexport const defaultValidRequired = (): IValidRequired => {\n return {\n isRequired: true,\n message: 'i18n_password_is_required',\n };\n};\n\nexport const defaultValidMinLength = (): IValidLength => {\n return {\n length: 4,\n message: 'i18n_password_min_length',\n interpolateParams: { length: 4 },\n };\n};\n","import { ChangeDetectionStrategy, Component, input, model, OnInit, output, signal } from '@angular/core';\nimport { IInputValidFunctionControlEvent, IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { ILabel } from '@libs-ui/components-label';\nimport { set } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from './interfaces/password.interface';\nimport { defaultConfig, defaultContentWhenHiddenOrShowPassword, defaultValidMinLength, defaultValidRequired, getCharacter, getValidStatus } from './utils/password';\nimport { TYPE_INPUT } from '@libs-ui/components-inputs-input';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-password',\n templateUrl: './inputs-password.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsValidComponent],\n})\nexport class LibsUiComponentsInputsPasswordComponent implements OnInit {\n // #region PROPERTY\n protected validStatus = signal<IValidStatus>(getValidStatus(false));\n protected validCharacters = signal<boolean>(false);\n\n private character = signal<ICharacter>(getCharacter());\n private inputValidFunctionControl = signal<IInputValidFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly typeInput = model<TYPE_INPUT>();\n readonly config = input<IConfig, IConfig | undefined>(defaultConfig(), { transform: (value) => value ?? defaultConfig() });\n readonly isPassword = input<boolean>(false);\n readonly readonly = input<boolean>();\n readonly labelConfig = input<ILabel>();\n readonly placeholder = input<string>();\n readonly iconLeftClass = model<string>();\n readonly iconRightClass = model<string>();\n readonly popoverContentIconRight = input<string>();\n readonly zIndexPopoverOverlay = input<number>();\n readonly item = model.required<Record<string, any>>({});\n readonly fieldNameBind = input.required<string>();\n readonly unitsRight = input<Array<Record<string, unknown>>>();\n readonly configUnitRight = input<IInputValidUnitConfig>();\n readonly keySelectedUnitRight = input<unknown>();\n readonly classIncludeInput = input<string>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly contentPopoverOverlayIconShowOrHiddenPass = input<IContentWhenHiddenOrShowPassword, IContentWhenHiddenOrShowPassword | undefined>(defaultContentWhenHiddenOrShowPassword(), {\n transform: (value) => value ?? defaultContentWhenHiddenOrShowPassword(),\n });\n readonly maxLength = input<number>(20);\n readonly validRequired = input<IValidRequired, IValidRequired | undefined>(defaultValidRequired(), { transform: (value) => value ?? defaultValidRequired() });\n readonly validMinLength = input<IValidLength, IValidLength | undefined>(defaultValidMinLength(), { transform: (value) => value ?? defaultValidMinLength() });\n readonly validPattern = input<Array<IValidPattern>>();\n readonly defaultHeight = input<number>();\n readonly resetAutoCompletePassword = input<boolean>();\n\n // #region OUTPUT\n readonly outGeneratePassword = output<string>();\n readonly outClickIconRight = output<void>();\n readonly outValueChange = output<string | number>();\n readonly outFunctionsControl = output<IInputValidFunctionControlEvent>();\n\n ngOnInit() {\n if (this.isPassword()) {\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n /* FUNCTIONS */\n private async setValidStatus(status: boolean) {\n this.validCharacters.set(status);\n this.validStatus.set(getValidStatus(status));\n }\n\n protected async handlerFunctionControl(event: IInputValidFunctionControlEvent) {\n this.inputValidFunctionControl.set(event);\n this.outFunctionsControl.emit({ ...event, checkIsValid: async () => (await event.checkIsValid()) && (await this.checkValid()) });\n }\n\n public get FunctionsControl(): IInputValidFunctionControlEvent | undefined {\n return this.inputValidFunctionControl();\n }\n\n protected async handleValueChange(value: string | number) {\n this.checkValid();\n this.outValueChange.emit(value);\n }\n\n protected async checkValid() {\n const password = this.item()[this.fieldNameBind()] as string;\n this.setValidStatus(false);\n if (!password) {\n return true;\n }\n const length = password.length;\n if (length > this.config().length_max) {\n this.validStatus().length_max = false;\n }\n if (length > 0) {\n this.validStatus().length_max = true;\n }\n if (length >= this.config().length_min) {\n this.validStatus().length_min = true;\n }\n let symbol = 0,\n number = 0,\n upper = 0,\n lower = 0,\n total = 0;\n for (let i = 0; i < length; i++) {\n if (this.character().numberCharacter.includes(password.charAt(i))) {\n number++;\n }\n if (this.character().upperCharacter.includes(password.charAt(i))) {\n upper++;\n }\n if (this.character().lowerCharacter.includes(password.charAt(i))) {\n lower++;\n }\n if (this.character().specialCharacter.includes(password.charAt(i))) {\n symbol++;\n }\n }\n if (number >= this.config().number || !this.config().number) {\n this.validStatus().number = true;\n if (this.config().number) {\n total++;\n }\n }\n if (upper >= this.config().uppercase || !this.config().uppercase) {\n this.validStatus().upper = true;\n if (this.config().uppercase) {\n total++;\n }\n }\n if (lower >= this.config().lowercase || !this.config().lowercase) {\n this.validStatus().lower = true;\n if (this.config().lowercase) {\n total++;\n }\n }\n if (symbol >= this.config().symbol || !this.config().symbol) {\n this.validStatus().symbol = true;\n if (this.config().symbol) {\n total++;\n }\n }\n switch (this.config().key) {\n case 'all':\n if (this.validStatus().symbol && this.validStatus().lower && this.validStatus().upper && this.validStatus().number) {\n this.validCharacters.set(true);\n }\n break;\n default:\n if (total >= +this.config().value) {\n this.validCharacters.set(true);\n }\n break;\n }\n if (!this.validCharacters() || !this.validStatus().length_min || !this.validStatus().length_max) {\n this.validStatus.update((value) => ({ ...value }));\n return false;\n }\n this.validStatus.update((value) => ({ ...value }));\n return true;\n }\n\n protected async handleClickIconRight() {\n this.outClickIconRight.emit();\n if (this.isPassword()) {\n this.typeInput.update((value) => (value === 'password' ? 'text' : 'password'));\n if (this.typeInput() !== 'password') {\n this.iconRightClass.set('libs-ui-icon-eye-slash-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n return;\n }\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n protected async handlerGeneratePassword() {\n const words: Array<string> = [];\n if (this.config().number) {\n this.randomIndex(this.config().number, this.character().numberCharacter, words);\n }\n if (this.config().uppercase) {\n this.randomIndex(this.config().uppercase, this.character().upperCharacter, words);\n }\n if (this.config().lowercase) {\n this.randomIndex(this.config().lowercase, this.character().lowerCharacter, words);\n }\n if (this.config().symbol) {\n this.randomIndex(this.config().symbol, this.character().specialCharacter, words);\n }\n const length = +this.config().length_min + Math.floor((+this.config().length_max - +this.config().length_min) / 2) - words.length;\n if (length > 0) {\n this.randomIndex(length, this.character().lowerCharacter, words);\n }\n set(this.item, this.fieldNameBind(), words.join(''));\n this.inputValidFunctionControl()?.checkIsValid();\n this.outGeneratePassword.emit(words.join(''));\n this.setValidStatus(true);\n }\n\n protected async randomIndex(number: number, character: string, words: Array<string>) {\n for (let i = 1; i <= number; i++) {\n const randomIndex = Math.floor(Math.random() * character.length);\n words.push(character[randomIndex]);\n }\n }\n}\n","<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAGO,MAAM,cAAc,GAAG,CAAC,MAAe,KAAkB;IAC9D,OAAO;AACL,QAAA,UAAU,EAAE,MAAM;AAClB,QAAA,UAAU,EAAE,MAAM;AAClB,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,YAAY,EAAE,MAAM;AACpB,QAAA,MAAM,EAAE,MAAM;KACf;AACH,CAAC;AAEM,MAAM,YAAY,GAAG,MAAiB;IAC3C,OAAO;AACL,QAAA,eAAe,EAAE,YAAY;AAC7B,QAAA,cAAc,EAAE,4BAA4B;AAC5C,QAAA,cAAc,EAAE,4BAA4B;AAC5C,QAAA,gBAAgB,EAAE,8BAA8B;KACjD;AACH,CAAC;AAEM,MAAM,aAAa,GAAG,MAAc;IACzC,OAAO;AACL,QAAA,UAAU,EAAE,EAAE;AACd,QAAA,UAAU,EAAE,CAAC;AACb,QAAA,SAAS,EAAE,CAAC;AACZ,QAAA,SAAS,EAAE,CAAC;AACZ,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,GAAG,EAAE,EAAE;AACP,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,KAAK,EAAE,GAAG;KACX;AACH,CAAC;AAEM,MAAM,sCAAsC,GAAG,MAAuC;IAC3F,OAAO;AACL,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,MAAM,EAAE,aAAa;KACtB;AACH,CAAC;AAEM,MAAM,oBAAoB,GAAG,MAAqB;IACvD,OAAO;AACL,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,OAAO,EAAE,2BAA2B;KACrC;AACH,CAAC;AAEM,MAAM,qBAAqB,GAAG,MAAmB;IACtD,OAAO;AACL,QAAA,MAAM,EAAE,CAAC;AACT,QAAA,OAAO,EAAE,0BAA0B;AACnC,QAAA,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE;KACjC;AACH,CAAC;;MCxCY,uCAAuC,CAAA;;IAExC,WAAW,GAAG,MAAM,CAAe,cAAc,CAAC,KAAK,CAAC,CAAC;AACzD,IAAA,eAAe,GAAG,MAAM,CAAU,KAAK,CAAC;AAE1C,IAAA,SAAS,GAAG,MAAM,CAAa,YAAY,EAAE,CAAC;AAC9C,IAAA,yBAAyB,GAAG,MAAM,CAA8C,SAAS,CAAC;;IAGzF,SAAS,GAAG,KAAK,EAAc;IAC/B,MAAM,GAAG,KAAK,CAA+B,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,aAAa,EAAE,EAAE,CAAC;AACjH,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;IAClC,QAAQ,GAAG,KAAK,EAAW;IAC3B,WAAW,GAAG,KAAK,EAAU;IAC7B,WAAW,GAAG,KAAK,EAAU;IAC7B,aAAa,GAAG,KAAK,EAAU;IAC/B,cAAc,GAAG,KAAK,EAAU;IAChC,uBAAuB,GAAG,KAAK,EAAU;IACzC,oBAAoB,GAAG,KAAK,EAAU;AACtC,IAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAsB,EAAE,CAAC;AAC9C,IAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAU;IACxC,UAAU,GAAG,KAAK,EAAkC;IACpD,eAAe,GAAG,KAAK,EAAyB;IAChD,oBAAoB,GAAG,KAAK,EAAW;IACvC,iBAAiB,GAAG,KAAK,EAAU;IACnC,mBAAmB,GAAG,KAAK,EAAW;AACtC,IAAA,yCAAyC,GAAG,KAAK,CAAiF,sCAAsC,EAAE,EAAE;QACnL,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,sCAAsC,EAAE;AACxE,KAAA,CAAC;AACO,IAAA,SAAS,GAAG,KAAK,CAAS,EAAE,CAAC;IAC7B,aAAa,GAAG,KAAK,CAA6C,oBAAoB,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,oBAAoB,EAAE,EAAE,CAAC;IACpJ,cAAc,GAAG,KAAK,CAAyC,qBAAqB,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,qBAAqB,EAAE,EAAE,CAAC;IACnJ,YAAY,GAAG,KAAK,EAAwB;IAC5C,aAAa,GAAG,KAAK,EAAU;IAC/B,yBAAyB,GAAG,KAAK,EAAW;;IAG5C,mBAAmB,GAAG,MAAM,EAAU;IACtC,iBAAiB,GAAG,MAAM,EAAQ;IAClC,cAAc,GAAG,MAAM,EAAmB;IAC1C,mBAAmB,GAAG,MAAM,EAAmC;IAExE,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4GAA4G,CAAC;QACvI;IACF;;IAGQ,MAAM,cAAc,CAAC,MAAe,EAAA;AAC1C,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9C;IAEU,MAAM,sBAAsB,CAAC,KAAsC,EAAA;AAC3E,QAAA,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC;AACzC,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC,YAAY,EAAE,MAAM,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;IAClI;AAEA,IAAA,IAAW,gBAAgB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,yBAAyB,EAAE;IACzC;IAEU,MAAM,iBAAiB,CAAC,KAAsB,EAAA;QACtD,IAAI,CAAC,UAAU,EAAE;AACjB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;AAEU,IAAA,MAAM,UAAU,GAAA;AACxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAW;AAC5D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM;QAC9B,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE;AACrC,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,GAAG,KAAK;QACvC;AACA,QAAA,IAAI,MAAM,GAAG,CAAC,EAAE;AACd,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,GAAG,IAAI;QACtC;QACA,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,GAAG,IAAI;QACtC;AACA,QAAA,IAAI,MAAM,GAAG,CAAC,EACZ,MAAM,GAAG,CAAC,EACV,KAAK,GAAG,CAAC,EACT,KAAK,GAAG,CAAC,EACT,KAAK,GAAG,CAAC;AACX,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AACjE,gBAAA,MAAM,EAAE;YACV;AACA,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AAChE,gBAAA,KAAK,EAAE;YACT;AACA,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AAChE,gBAAA,KAAK,EAAE;YACT;AACA,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AAClE,gBAAA,MAAM,EAAE;YACV;QACF;AACA,QAAA,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AAC3D,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,IAAI;AAChC,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AACxB,gBAAA,KAAK,EAAE;YACT;QACF;AACA,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AAChE,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,IAAI;AAC/B,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AAC3B,gBAAA,KAAK,EAAE;YACT;QACF;AACA,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AAChE,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,IAAI;AAC/B,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AAC3B,gBAAA,KAAK,EAAE;YACT;QACF;AACA,QAAA,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AAC3D,YAAA,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,IAAI;AAChC,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AACxB,gBAAA,KAAK,EAAE;YACT;QACF;AACA,QAAA,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG;AACvB,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE;AAClH,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChC;gBACA;AACF,YAAA;gBACE,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;AACjC,oBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBAChC;gBACA;;QAEJ,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,EAAE;AAC/F,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAClD,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAClD,QAAA,OAAO,IAAI;IACb;AAEU,IAAA,MAAM,oBAAoB,GAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;AAC7B,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,KAAK,KAAK,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC,CAAC;AAC9E,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,UAAU,EAAE;AACnC,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,kHAAkH,CAAC;gBAC3I;YACF;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,4GAA4G,CAAC;QACvI;IACF;AAEU,IAAA,MAAM,uBAAuB,GAAA;QACrC,MAAM,KAAK,GAAkB,EAAE;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,eAAe,EAAE,KAAK,CAAC;QACjF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AAC3B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;QACnF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE;AAC3B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;QACnF;AACA,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,gBAAgB,EAAE,KAAK,CAAC;QAClF;AACA,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;AACjI,QAAA,IAAI,MAAM,GAAG,CAAC,EAAE;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC;QAClE;AACA,QAAA,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,yBAAyB,EAAE,EAAE,YAAY,EAAE;AAChD,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7C,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;IAC3B;AAEU,IAAA,MAAM,WAAW,CAAC,MAAc,EAAE,SAAiB,EAAE,KAAoB,EAAA;AACjF,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,EAAE;AAChC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC;YAChE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpC;IACF;wGA5LW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uCAAuC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oCAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yCAAA,EAAA,EAAA,iBAAA,EAAA,2CAAA,EAAA,UAAA,EAAA,2CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,yBAAA,EAAA,EAAA,iBAAA,EAAA,2BAAA,EAAA,UAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,sBAAA,EAAA,IAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjBpD,suKA4GA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7FY,eAAe,4FAAE,oCAAoC,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,aAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,WAAA,EAAA,yBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,2BAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,WAAA,EAAA,gCAAA,EAAA,cAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,0BAAA,EAAA,yBAAA,EAAA,gCAAA,EAAA,sBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,4BAAA,EAAA,cAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,8BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEpD,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBARnD,SAAS;+BAEE,oCAAoC,EAAA,UAAA,EAElC,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,eAAe,EAAE,oCAAoC,CAAC,EAAA,QAAA,EAAA,suKAAA,EAAA;;;AEflE;;AAEG;;;;"}
1
+ {"version":3,"file":"libs-ui-components-inputs-password.mjs","sources":["../../../../../../libs-ui/components/inputs/password/src/utils/password.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.ts","../../../../../../libs-ui/components/inputs/password/src/inputs-password.component.html","../../../../../../libs-ui/components/inputs/password/src/libs-ui-components-inputs-password.ts"],"sourcesContent":["import { IValidLength, IValidRequired } from '@libs-ui/components-inputs-valid';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from '../interfaces/password.interface';\n\nexport const getValidStatus = (status: boolean): IValidStatus => {\n return {\n length_min: status,\n length_max: status,\n upper: status,\n lower: status,\n number: status,\n numberOfChar: status,\n symbol: status,\n };\n};\n\nexport const getCharacter = (): ICharacter => {\n return {\n numberCharacter: '0123456789',\n upperCharacter: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n lowerCharacter: 'abcdefghijklmnopqrstuvwxyz',\n specialCharacter: '~`!@#$%^&*()_=+}{\";:.,?|/<>-',\n };\n};\n\nexport const defaultConfig = (): IConfig => {\n return {\n length_max: 20,\n length_min: 4,\n uppercase: 0,\n lowercase: 0,\n symbol: 0,\n key: '',\n number: 0,\n value: '0',\n };\n};\n\nexport const defaultContentWhenHiddenOrShowPassword = (): IContentWhenHiddenOrShowPassword => {\n return {\n show: 'i18n_show',\n hidden: 'i18n_hidden',\n };\n};\n\nexport const defaultValidRequired = (): IValidRequired => {\n return {\n isRequired: true,\n message: 'i18n_password_is_required',\n };\n};\n\nexport const defaultValidMinLength = (): IValidLength => {\n return {\n length: 4,\n message: 'i18n_password_min_length',\n interpolateParams: { length: 4 },\n };\n};\n","import { ChangeDetectionStrategy, Component, input, model, OnInit, output, signal } from '@angular/core';\nimport { IInputValidFunctionControlEvent, IInputValidUnitConfig, IValidLength, IValidPattern, IValidRequired, LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';\nimport { ILabel } from '@libs-ui/components-label';\nimport { set } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ICharacter, IConfig, IContentWhenHiddenOrShowPassword, IValidStatus } from './interfaces/password.interface';\nimport { defaultConfig, defaultContentWhenHiddenOrShowPassword, defaultValidMinLength, defaultValidRequired, getCharacter, getValidStatus } from './utils/password';\nimport { TYPE_INPUT } from '@libs-ui/components-inputs-input';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-password',\n templateUrl: './inputs-password.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TranslateModule, LibsUiComponentsInputsValidComponent],\n})\nexport class LibsUiComponentsInputsPasswordComponent implements OnInit {\n // #region PROPERTY\n protected validStatus = signal<IValidStatus>(getValidStatus(false));\n protected validCharacters = signal<boolean>(false);\n\n private readonly character = signal<ICharacter>(getCharacter());\n private readonly inputValidFunctionControl = signal<IInputValidFunctionControlEvent | undefined>(undefined);\n\n // #region INPUT\n readonly typeInput = model<TYPE_INPUT>();\n readonly config = input<IConfig, IConfig | undefined>(defaultConfig(), { transform: (value) => value ?? defaultConfig() });\n readonly isPassword = input<boolean>(false);\n readonly readonly = input<boolean>();\n readonly labelConfig = input<ILabel>();\n readonly placeholder = input<string>();\n readonly iconLeftClass = model<string>();\n readonly iconRightClass = model<string>();\n readonly popoverContentIconRight = input<string>();\n readonly zIndexPopoverOverlay = input<number>();\n readonly item = model.required<Record<string, any>>({});\n readonly fieldNameBind = input.required<string>();\n readonly unitsRight = input<Array<Record<string, unknown>>>();\n readonly configUnitRight = input<IInputValidUnitConfig>();\n readonly keySelectedUnitRight = input<unknown>();\n readonly classIncludeInput = input<string>();\n readonly ignoreWidthInput100 = input<boolean>();\n readonly contentPopoverOverlayIconShowOrHiddenPass = input<IContentWhenHiddenOrShowPassword, IContentWhenHiddenOrShowPassword | undefined>(defaultContentWhenHiddenOrShowPassword(), {\n transform: (value) => value ?? defaultContentWhenHiddenOrShowPassword(),\n });\n readonly maxLength = input<number>(20);\n readonly validRequired = input<IValidRequired, IValidRequired | undefined>(defaultValidRequired(), { transform: (value) => value ?? defaultValidRequired() });\n readonly validMinLength = input<IValidLength, IValidLength | undefined>(defaultValidMinLength(), { transform: (value) => value ?? defaultValidMinLength() });\n readonly validPattern = input<Array<IValidPattern>>();\n readonly defaultHeight = input<number>();\n readonly resetAutoCompletePassword = input<boolean>();\n\n // #region OUTPUT\n readonly outGeneratePassword = output<string>();\n readonly outClickIconRight = output<void>();\n readonly outValueChange = output<string | number>();\n readonly outFunctionsControl = output<IInputValidFunctionControlEvent>();\n\n ngOnInit() {\n if (this.isPassword()) {\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n /* FUNCTIONS */\n private async setValidStatus(status: boolean) {\n this.validCharacters.set(status);\n this.validStatus.set(getValidStatus(status));\n }\n\n protected async handlerFunctionControl(event: IInputValidFunctionControlEvent) {\n this.inputValidFunctionControl.set(event);\n this.outFunctionsControl.emit({ ...event, checkIsValid: async () => (await event.checkIsValid()) && (await this.checkValid()) });\n }\n\n public get FunctionsControl(): IInputValidFunctionControlEvent | undefined {\n return this.inputValidFunctionControl();\n }\n\n protected async handleValueChange(value: string | number) {\n this.checkValid();\n this.outValueChange.emit(value);\n }\n\n protected async checkValid() {\n const password = this.item()[this.fieldNameBind()] as string;\n this.setValidStatus(false);\n if (!password) {\n return true;\n }\n const length = password.length;\n if (length > this.config().length_max) {\n this.validStatus().length_max = false;\n }\n if (length > 0) {\n this.validStatus().length_max = true;\n }\n if (length >= this.config().length_min) {\n this.validStatus().length_min = true;\n }\n let symbol = 0,\n number = 0,\n upper = 0,\n lower = 0,\n total = 0;\n for (let i = 0; i < length; i++) {\n if (this.character().numberCharacter.includes(password.charAt(i))) {\n number++;\n }\n if (this.character().upperCharacter.includes(password.charAt(i))) {\n upper++;\n }\n if (this.character().lowerCharacter.includes(password.charAt(i))) {\n lower++;\n }\n if (this.character().specialCharacter.includes(password.charAt(i))) {\n symbol++;\n }\n }\n if (number >= this.config().number || !this.config().number) {\n this.validStatus().number = true;\n if (this.config().number) {\n total++;\n }\n }\n if (upper >= this.config().uppercase || !this.config().uppercase) {\n this.validStatus().upper = true;\n if (this.config().uppercase) {\n total++;\n }\n }\n if (lower >= this.config().lowercase || !this.config().lowercase) {\n this.validStatus().lower = true;\n if (this.config().lowercase) {\n total++;\n }\n }\n if (symbol >= this.config().symbol || !this.config().symbol) {\n this.validStatus().symbol = true;\n if (this.config().symbol) {\n total++;\n }\n }\n switch (this.config().key) {\n case 'all':\n if (this.validStatus().symbol && this.validStatus().lower && this.validStatus().upper && this.validStatus().number) {\n this.validCharacters.set(true);\n }\n break;\n default:\n if (total >= +this.config().value) {\n this.validCharacters.set(true);\n }\n break;\n }\n if (!this.validCharacters() || !this.validStatus().length_min || !this.validStatus().length_max) {\n this.validStatus.update((value) => ({ ...value }));\n return false;\n }\n this.validStatus.update((value) => ({ ...value }));\n return true;\n }\n\n protected async handleClickIconRight() {\n this.outClickIconRight.emit();\n if (this.isPassword()) {\n this.typeInput.update((value) => (value === 'password' ? 'text' : 'password'));\n if (this.typeInput() !== 'password') {\n this.iconRightClass.set('libs-ui-icon-eye-slash-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n return;\n }\n this.iconRightClass.set('libs-ui-icon-eye-solid hover:text-[var(--libs-ui-color-default)] text-[16px] cursor-pointer text-[#6a7383]');\n }\n }\n\n protected async handlerGeneratePassword() {\n const words: Array<string> = [];\n if (this.config().number) {\n this.randomIndex(this.config().number, this.character().numberCharacter, words);\n }\n if (this.config().uppercase) {\n this.randomIndex(this.config().uppercase, this.character().upperCharacter, words);\n }\n if (this.config().lowercase) {\n this.randomIndex(this.config().lowercase, this.character().lowerCharacter, words);\n }\n if (this.config().symbol) {\n this.randomIndex(this.config().symbol, this.character().specialCharacter, words);\n }\n const length = +this.config().length_min + Math.floor((+this.config().length_max - +this.config().length_min) / 2) - words.length;\n if (length > 0) {\n this.randomIndex(length, this.character().lowerCharacter, words);\n }\n set(this.item, this.fieldNameBind(), words.join(''));\n this.inputValidFunctionControl()?.checkIsValid();\n this.outGeneratePassword.emit(words.join(''));\n this.setValidStatus(true);\n }\n\n protected async randomIndex(number: number, character: string, words: Array<string>) {\n for (let i = 1; i <= number; i++) {\n const randomIndex = Math.floor(Math.random() * character.length);\n words.push(character[randomIndex]);\n }\n }\n}\n","<libs_ui-components-inputs-valid\n [(item)]=\"item\"\n [labelConfig]=\"labelConfig()\"\n [fieldNameBind]=\"fieldNameBind()\"\n [validRequired]=\"validRequired()\"\n [validMinLength]=\"validMinLength()\"\n [validPattern]=\"validPattern()\"\n [dataType]=\"'string'\"\n [typeInput]=\"typeInput()\"\n [iconRightClass]=\"iconRightClass()\"\n [iconLeftClass]=\"iconLeftClass()\"\n [popoverContentIconRight]=\"popoverContentIconRight()\"\n [maxLength]=\"maxLength()\"\n [readonly]=\"readonly()\"\n [defaultHeight]=\"defaultHeight()\"\n [classIncludeInput]=\"classIncludeInput()\"\n [ignoreWidthInput100]=\"ignoreWidthInput100()\"\n [popoverContentIconRight]=\"typeInput() === 'password' ? contentPopoverOverlayIconShowOrHiddenPass().show : contentPopoverOverlayIconShowOrHiddenPass().hidden\"\n [placeholder]=\"placeholder()\"\n [unitsRight]=\"unitsRight()\"\n [configUnitRight]=\"configUnitRight()\"\n [keySelectedUnitRight]=\"keySelectedUnitRight()\"\n [zIndexPopoverContent]=\"zIndexPopoverOverlay()\"\n [resetAutoCompletePassword]=\"resetAutoCompletePassword()\"\n (outClickButtonLabel)=\"handlerGeneratePassword()\"\n (outValueChange)=\"handleValueChange($event)\"\n (outIconRight)=\"handleClickIconRight()\"\n (outFunctionsControl)=\"handlerFunctionControl($event)\" />\n<ng-content select=\".libs-ui-inputs-password-content-custom\"></ng-content>\n<div class=\"mt-[8px]\">\n <div\n class=\"flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_min\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_min\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_min\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_min\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_minimum_length_number' | translate: { number: config().length_min } }}</span>\n </div>\n <div\n class=\"pt-[4px] flex items-center\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().length_max\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validStatus().length_max\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().length_max\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validStatus().length_max\"></i>\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_maximum_length_number' | translate: { number: config().length_max } }}</span>\n </div>\n @if (config().uppercase || config().lowercase || config().number || config().symbol) {\n <div\n class=\"mt-[4px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\">\n <div class=\"flex items-center\">\n <i\n class=\"text-[12px]\"\n [class.text-[#00bc62]]=\"readonly() || validCharacters()\"\n [class.libs-ui-icon-check-circle-solid]=\"readonly() || validCharacters()\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validCharacters()\"\n [class.libs-ui-icon-check-circle-outline]=\"!readonly() && !validCharacters()\"></i>\n @if (config().key === 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_all_types_of_characters_below' | translate }}</span>\n }\n @if (config().key !== 'all') {\n <span class=\"libs-ui-font-h7r pl-[8px]\">{{ 'i18n_contains_number_types_of_characters_below' | translate: { number: config().value } }}</span>\n }\n </div>\n @if (config().uppercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().upper\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().upper\">\n {{ 'i18n_uppercase_minimum' | translate: { number: config().uppercase } }}\n </div>\n }\n @if (config().lowercase) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().lower\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().lower\">\n {{ 'i18n_lowercase_minimum' | translate: { number: config().lowercase } }}\n </div>\n }\n @if (config().number) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().number\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().number\">\n {{ 'i18n_number_minimum' | translate: { number: config().number } }}\n </div>\n }\n @if (config().symbol) {\n <div\n class=\"libs-ui-font-h7r pt-[4px] pl-[24px]\"\n [class.text-[#00bc62]]=\"readonly() || validStatus().symbol\"\n [class.text-[#9ca2ad]]=\"!readonly() && !validStatus().symbol\">\n {{ 'i18n_symbol_minimum' | translate: { number: config().symbol } }}\n </div>\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@ import * as i0 from "@angular/core";
7
7
  export declare class LibsUiComponentsInputsPasswordComponent implements OnInit {
8
8
  protected validStatus: import("@angular/core").WritableSignal<IValidStatus>;
9
9
  protected validCharacters: import("@angular/core").WritableSignal<boolean>;
10
- private character;
11
- private inputValidFunctionControl;
10
+ private readonly character;
11
+ private readonly inputValidFunctionControl;
12
12
  readonly typeInput: import("@angular/core").ModelSignal<TYPE_INPUT | undefined>;
13
13
  readonly config: import("@angular/core").InputSignalWithTransform<IConfig, IConfig | undefined>;
14
14
  readonly isPassword: import("@angular/core").InputSignal<boolean>;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@libs-ui/components-inputs-password",
3
- "version": "0.2.356-9",
3
+ "version": "0.2.357-0",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
- "@libs-ui/components-inputs-valid": "0.2.356-9",
7
- "@libs-ui/components-label": "0.2.356-9",
8
- "@libs-ui/utils": "0.2.356-9",
6
+ "@libs-ui/components-inputs-valid": "0.2.357-0",
7
+ "@libs-ui/components-label": "0.2.357-0",
8
+ "@libs-ui/utils": "0.2.357-0",
9
9
  "@ngx-translate/core": "^15.0.0",
10
- "@libs-ui/components-inputs-input": "0.2.356-9"
10
+ "@libs-ui/components-inputs-input": "0.2.357-0"
11
11
  },
12
12
  "sideEffects": false,
13
13
  "module": "fesm2022/libs-ui-components-inputs-password.mjs",