@skyux/forms 11.0.0-alpha.0 → 11.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/documentation.json +4498 -4939
  2. package/esm2022/index.mjs +14 -11
  3. package/esm2022/lib/modules/character-counter/character-counter-indicator.component.mjs +3 -3
  4. package/esm2022/lib/modules/character-counter/character-counter-screen-reader.pipe.mjs +3 -3
  5. package/esm2022/lib/modules/character-counter/character-counter.directive.mjs +3 -3
  6. package/esm2022/lib/modules/character-counter/character-counter.module.mjs +4 -4
  7. package/esm2022/lib/modules/checkbox/checkbox-group.component.mjs +18 -15
  8. package/esm2022/lib/modules/checkbox/checkbox-label-text-label.component.mjs +4 -4
  9. package/esm2022/lib/modules/checkbox/checkbox-label.component.mjs +3 -3
  10. package/esm2022/lib/modules/checkbox/checkbox.component.mjs +27 -34
  11. package/esm2022/lib/modules/checkbox/checkbox.module.mjs +4 -4
  12. package/esm2022/lib/modules/field-group/field-group.component.mjs +9 -6
  13. package/esm2022/lib/modules/field-group/field-group.module.mjs +4 -4
  14. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-change.mjs +2 -0
  15. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-click.mjs +2 -0
  16. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-join-ids.pipe.mjs +22 -0
  17. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment-label.component.mjs +32 -0
  18. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.component.mjs +485 -0
  19. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.module.mjs +24 -0
  20. package/esm2022/lib/modules/file-attachment/file-attachment/file-attachment.service.mjs +103 -0
  21. package/esm2022/lib/modules/file-attachment/file-attachments.module.mjs +12 -75
  22. package/esm2022/lib/modules/file-attachment/file-drop/file-drop-change.mjs +2 -0
  23. package/esm2022/lib/modules/file-attachment/file-drop/file-drop.component.mjs +336 -0
  24. package/esm2022/lib/modules/file-attachment/file-drop/file-drop.module.mjs +18 -0
  25. package/esm2022/lib/modules/file-attachment/file-drop/file-item.component.mjs +163 -0
  26. package/esm2022/lib/modules/file-attachment/file-drop/file-link.mjs +2 -0
  27. package/esm2022/lib/modules/file-attachment/shared/file-item-error-type.mjs +2 -0
  28. package/esm2022/lib/modules/file-attachment/shared/file-item.mjs +2 -0
  29. package/esm2022/lib/modules/file-attachment/shared/file-item.service.mjs +71 -0
  30. package/esm2022/lib/modules/file-attachment/shared/file-size.pipe.mjs +61 -0
  31. package/esm2022/lib/modules/file-attachment/shared/file-validate-function.mjs +2 -0
  32. package/esm2022/lib/modules/form-error/form-error.component.mjs +3 -3
  33. package/esm2022/lib/modules/form-error/form-error.module.mjs +4 -4
  34. package/esm2022/lib/modules/form-error/form-errors.component.mjs +5 -5
  35. package/esm2022/lib/modules/form-error/form-errors.module.mjs +4 -4
  36. package/esm2022/lib/modules/input-box/input-box-adapter.service.mjs +3 -3
  37. package/esm2022/lib/modules/input-box/input-box-control.directive.mjs +3 -3
  38. package/esm2022/lib/modules/input-box/input-box-hint-text.pipe.mjs +3 -3
  39. package/esm2022/lib/modules/input-box/input-box-host.service.mjs +7 -4
  40. package/esm2022/lib/modules/input-box/input-box.component.mjs +22 -26
  41. package/esm2022/lib/modules/input-box/input-box.module.mjs +4 -4
  42. package/esm2022/lib/modules/radio/radio-group-id.service.mjs +3 -3
  43. package/esm2022/lib/modules/radio/radio-group.component.mjs +41 -48
  44. package/esm2022/lib/modules/radio/radio-label.component.mjs +3 -3
  45. package/esm2022/lib/modules/radio/radio.component.mjs +23 -30
  46. package/esm2022/lib/modules/radio/radio.module.mjs +4 -4
  47. package/esm2022/lib/modules/required-state/required-state.directive.mjs +3 -3
  48. package/esm2022/lib/modules/selection-box/selection-box-adapter.service.mjs +3 -3
  49. package/esm2022/lib/modules/selection-box/selection-box-description.component.mjs +3 -3
  50. package/esm2022/lib/modules/selection-box/selection-box-grid.component.mjs +4 -4
  51. package/esm2022/lib/modules/selection-box/selection-box-header.component.mjs +3 -3
  52. package/esm2022/lib/modules/selection-box/selection-box.component.mjs +3 -3
  53. package/esm2022/lib/modules/selection-box/selection-box.module.mjs +4 -4
  54. package/esm2022/lib/modules/shared/form-field-label-text-required.directive.mjs +37 -0
  55. package/esm2022/lib/modules/shared/form-field-label-text-required.service.mjs +9 -7
  56. package/esm2022/lib/modules/shared/sky-forms-resources.module.mjs +11 -13
  57. package/esm2022/lib/modules/toggle-switch/toggle-switch-label.component.mjs +3 -3
  58. package/esm2022/lib/modules/toggle-switch/toggle-switch.component.mjs +16 -23
  59. package/esm2022/lib/modules/toggle-switch/toggle-switch.module.mjs +4 -4
  60. package/esm2022/testing/checkbox/checkbox-harness.mjs +5 -4
  61. package/fesm2022/skyux-forms-testing.mjs +4 -3
  62. package/fesm2022/skyux-forms-testing.mjs.map +1 -1
  63. package/fesm2022/skyux-forms.mjs +506 -474
  64. package/fesm2022/skyux-forms.mjs.map +1 -1
  65. package/index.d.ts +21 -18
  66. package/lib/modules/checkbox/checkbox-group.component.d.ts +2 -2
  67. package/lib/modules/checkbox/checkbox.component.d.ts +6 -6
  68. package/lib/modules/file-attachment/{types → file-attachment}/file-attachment-change.d.ts +1 -1
  69. package/lib/modules/file-attachment/{types → file-attachment}/file-attachment-click.d.ts +1 -1
  70. package/lib/modules/file-attachment/file-attachment/file-attachment-join-ids.pipe.d.ts +11 -0
  71. package/lib/modules/file-attachment/{file-attachment-label.component.d.ts → file-attachment/file-attachment-label.component.d.ts} +7 -5
  72. package/lib/modules/file-attachment/{file-attachment.component.d.ts → file-attachment/file-attachment.component.d.ts} +24 -18
  73. package/lib/modules/file-attachment/file-attachment/file-attachment.module.d.ts +9 -0
  74. package/lib/modules/file-attachment/{file-attachment.service.d.ts → file-attachment/file-attachment.service.d.ts} +2 -2
  75. package/lib/modules/file-attachment/file-attachments.module.d.ts +6 -15
  76. package/lib/modules/file-attachment/{types → file-drop}/file-drop-change.d.ts +1 -1
  77. package/lib/modules/file-attachment/{file-drop.component.d.ts → file-drop/file-drop.component.d.ts} +12 -8
  78. package/lib/modules/file-attachment/file-drop/file-drop.module.d.ts +9 -0
  79. package/lib/modules/file-attachment/{file-item.component.d.ts → file-drop/file-item.component.d.ts} +3 -3
  80. package/lib/modules/file-attachment/{file-size.pipe.d.ts → shared/file-size.pipe.d.ts} +3 -4
  81. package/lib/modules/input-box/input-box-host.service.d.ts +1 -0
  82. package/lib/modules/input-box/input-box.component.d.ts +3 -3
  83. package/lib/modules/radio/radio-group.component.d.ts +11 -10
  84. package/lib/modules/radio/radio.component.d.ts +6 -6
  85. package/lib/modules/shared/form-field-label-text-required.directive.d.ts +14 -0
  86. package/lib/modules/shared/form-field-label-text-required.service.d.ts +2 -1
  87. package/lib/modules/toggle-switch/toggle-switch.component.d.ts +4 -5
  88. package/package.json +14 -14
  89. package/esm2022/lib/modules/file-attachment/file-attachment-label.component.mjs +0 -28
  90. package/esm2022/lib/modules/file-attachment/file-attachment.component.mjs +0 -478
  91. package/esm2022/lib/modules/file-attachment/file-attachment.service.mjs +0 -93
  92. package/esm2022/lib/modules/file-attachment/file-drop.component.mjs +0 -325
  93. package/esm2022/lib/modules/file-attachment/file-item-error-type.mjs +0 -2
  94. package/esm2022/lib/modules/file-attachment/file-item.component.mjs +0 -155
  95. package/esm2022/lib/modules/file-attachment/file-item.mjs +0 -2
  96. package/esm2022/lib/modules/file-attachment/file-item.service.mjs +0 -70
  97. package/esm2022/lib/modules/file-attachment/file-link.mjs +0 -2
  98. package/esm2022/lib/modules/file-attachment/file-size.pipe.mjs +0 -58
  99. package/esm2022/lib/modules/file-attachment/file-validate-function.mjs +0 -2
  100. package/esm2022/lib/modules/file-attachment/types/file-attachment-change.mjs +0 -2
  101. package/esm2022/lib/modules/file-attachment/types/file-attachment-click.mjs +0 -2
  102. package/esm2022/lib/modules/file-attachment/types/file-drop-change.mjs +0 -2
  103. /package/lib/modules/file-attachment/{file-link.d.ts → file-drop/file-link.d.ts} +0 -0
  104. /package/lib/modules/file-attachment/{file-item-error-type.d.ts → shared/file-item-error-type.d.ts} +0 -0
  105. /package/lib/modules/file-attachment/{file-item.d.ts → shared/file-item.d.ts} +0 -0
  106. /package/lib/modules/file-attachment/{file-item.service.d.ts → shared/file-item.service.d.ts} +0 -0
  107. /package/lib/modules/file-attachment/{file-validate-function.d.ts → shared/file-validate-function.d.ts} +0 -0
@@ -1,478 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Optional, Output, Self, ViewChild, booleanAttribute, inject, } from '@angular/core';
2
- import { SkyFormsUtility, SkyIdService, SkyLiveAnnouncerService, } from '@skyux/core';
3
- import { SkyLibResourcesService } from '@skyux/i18n';
4
- import { Subject } from 'rxjs';
5
- import { take, takeUntil } from 'rxjs/operators';
6
- import { SKY_FORM_ERRORS_ENABLED } from '../form-error/form-errors-enabled-token';
7
- import { SkyFormFieldLabelTextRequiredService } from '../shared/form-field-label-text-required.service';
8
- import { SkyFileAttachmentLabelComponent } from './file-attachment-label.component';
9
- import { SkyFileAttachmentService } from './file-attachment.service';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "./file-attachment.service";
12
- import * as i2 from "./file-item.service";
13
- import * as i3 from "@angular/forms";
14
- import * as i4 from "@skyux/theme";
15
- import * as i5 from "@angular/common";
16
- import * as i6 from "../form-error/form-error.component";
17
- import * as i7 from "../form-error/form-errors.component";
18
- import * as i8 from "@skyux/icon";
19
- import * as i9 from "@skyux/core";
20
- import * as i10 from "@skyux/help-inline";
21
- import * as i11 from "@skyux/i18n";
22
- let uniqueId = 0;
23
- const MAX_FILE_SIZE_DEFAULT = 500000;
24
- const MIN_FILE_SIZE_DEFAULT = 0;
25
- /**
26
- * Provides an element to attach a single local file.
27
- */
28
- export class SkyFileAttachmentComponent {
29
- /**
30
- * Whether to disable the input on template-driven forms. Don't use this input on reactive forms because they may overwrite the input or leave the control out of sync.
31
- * To set the disabled state on reactive forms, use the `FormControl` instead.
32
- * @default false
33
- */
34
- set disabled(value) {
35
- const newDisabledState = SkyFormsUtility.coerceBooleanProperty(value);
36
- if (this.#_disabled !== newDisabledState) {
37
- this.#_disabled = newDisabledState;
38
- }
39
- }
40
- get disabled() {
41
- return this.#_disabled;
42
- }
43
- /**
44
- * The maximum size in bytes for valid files.
45
- * @default 500000
46
- */
47
- set maxFileSize(value) {
48
- this.#_maxFileSize = value ?? MAX_FILE_SIZE_DEFAULT;
49
- }
50
- get maxFileSize() {
51
- return this.#_maxFileSize;
52
- }
53
- /**
54
- * The minimum size in bytes for valid files.
55
- * @default 0
56
- */
57
- set minFileSize(value) {
58
- this.#_minFileSize = value ?? MIN_FILE_SIZE_DEFAULT;
59
- }
60
- get minFileSize() {
61
- return this.#_minFileSize;
62
- }
63
- set value(value) {
64
- // The null check is needed to address a bug in Angular 4.
65
- // writeValue is being called twice, first time with a phantom null value
66
- // See: https://github.com/angular/angular/issues/14988
67
- const isNewValue = value !== this.value && value !== null;
68
- if (isNewValue) {
69
- if (value) {
70
- this.isImage = this.#fileItemService.isImage(value);
71
- }
72
- else {
73
- this.isImage = false;
74
- }
75
- this.#setFileName(value);
76
- this.#_value = value;
77
- this.#onChange(value);
78
- this.#updateFileAttachmentButton();
79
- }
80
- }
81
- get value() {
82
- return this.#_value;
83
- }
84
- #enterEventTarget;
85
- #fileAttachmentId;
86
- #ngUnsubscribe;
87
- #_disabled;
88
- #_maxFileSize;
89
- #_minFileSize;
90
- #_value;
91
- #changeDetector;
92
- #fileAttachmentService;
93
- #fileItemService;
94
- #themeSvc;
95
- #idSvc;
96
- #liveAnnouncerSvc;
97
- #resourcesSvc;
98
- #labelTextRequired;
99
- constructor(changeDetector, fileAttachmentService, fileItemService, ngControl, themeSvc) {
100
- /**
101
- * Whether to hide `labelText` from view.
102
- */
103
- this.labelHidden = false;
104
- /**
105
- * Whether the single file attachment is stacked on another form component. When specified,
106
- * the appropriate vertical spacing is automatically added to the single file attachment.
107
- */
108
- this.stacked = false;
109
- /**
110
- * Fires when users add or remove files.
111
- */
112
- this.fileChange = new EventEmitter();
113
- /**
114
- * Fires when users select the file name link. Make sure to bind the event.
115
- * If you do not, the file name link will be a dead link.
116
- */
117
- this.fileClick = new EventEmitter();
118
- this.acceptedOver = false;
119
- this.hasLabelComponent = false;
120
- this.rejectedOver = false;
121
- /**
122
- * Whether the input is required for form validation.
123
- * When you set this property to `true`, the component adds `aria-required` and `required`
124
- * attributes to the input element so that forms display an invalid state until the input element
125
- * is complete.
126
- * For more information about the `aria-required` attribute, see the [WAI-ARIA definition](https://www.w3.org/TR/wai-aria/#aria-required).
127
- */
128
- this.required = false;
129
- this.fileName = '';
130
- this.showFileAttachmentButton = true;
131
- this.truncatedFileName = '';
132
- this.isImage = false;
133
- this.#fileAttachmentId = uniqueId++;
134
- this.#ngUnsubscribe = new Subject();
135
- this.#_disabled = false;
136
- this.#_maxFileSize = MAX_FILE_SIZE_DEFAULT;
137
- this.#_minFileSize = MIN_FILE_SIZE_DEFAULT;
138
- this.#idSvc = inject(SkyIdService);
139
- this.#liveAnnouncerSvc = inject(SkyLiveAnnouncerService);
140
- this.#resourcesSvc = inject(SkyLibResourcesService);
141
- this.#labelTextRequired = inject(SkyFormFieldLabelTextRequiredService, {
142
- optional: true,
143
- });
144
- this.errorId = this.#idSvc.generateId();
145
- // istanbul ignore next
146
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
147
- this.#onChange = (_) => {
148
- return;
149
- };
150
- // istanbul ignore next
151
- // eslint-disable-next-line @typescript-eslint/no-empty-function
152
- this.#onTouched = () => {
153
- return;
154
- };
155
- this.#changeDetector = changeDetector;
156
- this.#fileAttachmentService = fileAttachmentService;
157
- this.#fileItemService = fileItemService;
158
- this.ngControl = ngControl;
159
- this.#themeSvc = themeSvc;
160
- this.labelElementId = `sky-file-attachment-label-${this.#fileAttachmentId}`;
161
- this.fileDropDescriptionElementId = `sky-file-attachment-drop-description-${this.#fileAttachmentId}`;
162
- if (this.ngControl) {
163
- this.ngControl.valueAccessor = this;
164
- }
165
- }
166
- ngOnInit() {
167
- if (this.#themeSvc) {
168
- this.#themeSvc.settingsChange
169
- .pipe(takeUntil(this.#ngUnsubscribe))
170
- .subscribe((themeSettings) => {
171
- this.currentThemeName = themeSettings.currentSettings.theme.name;
172
- this.#updateFileAttachmentButton();
173
- });
174
- }
175
- if (this.#labelTextRequired && !this.labelText) {
176
- this.display = 'none';
177
- }
178
- this.#labelTextRequired?.validateLabelText(this.labelText);
179
- }
180
- ngAfterViewInit() {
181
- // This is needed to address a bug in Angular 7.
182
- // When a control value is set initially, its value is not represented on the view.
183
- // See: https://github.com/angular/angular/issues/13792
184
- // Of note is the parent check which allows us to determine if the form is reactive.
185
- // Without this check there is a changed before checked error
186
- /* istanbul ignore else */
187
- if (this.ngControl) {
188
- setTimeout(() => {
189
- this.ngControl.control.setValue(this.value, {
190
- emitEvent: false,
191
- });
192
- this.#changeDetector.markForCheck();
193
- });
194
- this.required =
195
- this.required || SkyFormsUtility.hasRequiredValidation(this.ngControl);
196
- }
197
- }
198
- ngAfterContentInit() {
199
- if (this.labelComponents) {
200
- this.hasLabelComponent = this.labelComponents.length > 0;
201
- this.#changeDetector.detectChanges();
202
- // Handles updating classes when label changes
203
- this.labelComponents.changes
204
- .pipe(takeUntil(this.#ngUnsubscribe))
205
- .subscribe((newLabelComponents) => {
206
- this.hasLabelComponent = newLabelComponents.length > 0;
207
- this.#changeDetector.markForCheck();
208
- });
209
- }
210
- }
211
- onDropClicked() {
212
- this.#onTouched();
213
- /* istanbul ignore else */
214
- if (this.inputEl) {
215
- this.inputEl.nativeElement.click();
216
- }
217
- }
218
- fileChangeEvent(fileChangeEvent) {
219
- this.#handleFiles(fileChangeEvent.target?.files);
220
- }
221
- fileDragEnter(dragEnterEvent) {
222
- // Save this target to know when the drag event leaves
223
- this.#enterEventTarget = dragEnterEvent.target;
224
- dragEnterEvent.stopPropagation();
225
- dragEnterEvent.preventDefault();
226
- }
227
- fileDragOver(dragOverEvent) {
228
- const transfer = dragOverEvent.dataTransfer;
229
- dragOverEvent.stopPropagation();
230
- dragOverEvent.preventDefault();
231
- if (transfer) {
232
- if (transfer.items) {
233
- const files = Array.from(transfer.items);
234
- for (const file of files) {
235
- if (file.type &&
236
- this.#fileAttachmentService.fileTypeRejected(file.type, this.acceptedTypes)) {
237
- this.rejectedOver = true;
238
- this.acceptedOver = false;
239
- return;
240
- }
241
- }
242
- if (files.length > 0 && !this.acceptedOver) {
243
- this.rejectedOver = false;
244
- this.acceptedOver = true;
245
- }
246
- }
247
- else if (transfer.files) {
248
- // If the browser does not support DataTransfer.items,
249
- // defer file-type checking to drop handler.
250
- // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
251
- this.rejectedOver = false;
252
- this.acceptedOver = true;
253
- }
254
- }
255
- }
256
- fileDrop(dropEvent) {
257
- dropEvent.stopPropagation();
258
- dropEvent.preventDefault();
259
- this.#enterEventTarget = undefined;
260
- this.rejectedOver = false;
261
- this.acceptedOver = false;
262
- if (dropEvent.dataTransfer && dropEvent.dataTransfer.files) {
263
- if (dropEvent.dataTransfer.files.length > 1) {
264
- return;
265
- }
266
- if (this.#fileAttachmentService.hasDirectory(dropEvent.dataTransfer.files)) {
267
- return;
268
- }
269
- this.#handleFiles(dropEvent.dataTransfer.files);
270
- }
271
- }
272
- fileDragLeave(dragLeaveEvent) {
273
- if (this.#enterEventTarget === dragLeaveEvent.target) {
274
- this.rejectedOver = false;
275
- this.acceptedOver = false;
276
- }
277
- }
278
- deleteFileAttachment() {
279
- const fileName = this.value?.file.name;
280
- this.value = undefined;
281
- this.#emitFileChangeEvent(this.value);
282
- /* istanbul ignore else: safety check */
283
- if (fileName) {
284
- this.#announceState('skyux_file_attachment_file_upload_file_removed', fileName);
285
- }
286
- this.#changeDetector.markForCheck();
287
- }
288
- ngOnDestroy() {
289
- this.fileChange.complete();
290
- this.#ngUnsubscribe.next();
291
- this.#ngUnsubscribe.complete();
292
- }
293
- registerOnChange(fn) {
294
- this.#onChange = fn;
295
- }
296
- registerOnTouched(fn) {
297
- this.#onTouched = fn;
298
- }
299
- writeValue(value) {
300
- this.value = value;
301
- this.#changeDetector.markForCheck();
302
- }
303
- /**
304
- * @internal
305
- * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.
306
- * @param isDisabled Whether the control should be disabled.
307
- */
308
- setDisabledState(isDisabled) {
309
- this.disabled = isDisabled;
310
- this.#changeDetector.markForCheck();
311
- }
312
- emitClick() {
313
- /* istanbul ignore else */
314
- if (this.value) {
315
- this.fileClick.emit({
316
- file: this.value,
317
- });
318
- }
319
- }
320
- #announceState(resourceString, ...args) {
321
- this.#resourcesSvc
322
- .getString(resourceString, ...args)
323
- .pipe(take(1))
324
- .subscribe((internationalizedString) => {
325
- this.#liveAnnouncerSvc.announce(internationalizedString);
326
- });
327
- }
328
- #emitFileChangeEvent(currentFile) {
329
- if (currentFile && !currentFile.errorType) {
330
- this.writeValue(currentFile);
331
- this.fileErrorName = undefined;
332
- this.fileErrorParam = undefined;
333
- this.fileErrorValidation = undefined;
334
- }
335
- else {
336
- this.writeValue(undefined);
337
- // Makes sure value accessor is marked as dirty even if current file is undefined
338
- this.#onChange(undefined);
339
- this.fileErrorValidation = { fileError: true };
340
- this.fileErrorName = currentFile?.errorType;
341
- this.fileErrorParam = currentFile?.errorParam;
342
- }
343
- this.fileChange.emit({
344
- file: currentFile,
345
- });
346
- /* istanbul ignore else */
347
- if (this.inputEl) {
348
- this.inputEl.nativeElement.value = '';
349
- }
350
- }
351
- #loadFile(file) {
352
- if (file.file) {
353
- const reader = new FileReader();
354
- reader.addEventListener('load', (event) => {
355
- const previousFileName = this.value?.file.name;
356
- file.url = event.target.result;
357
- this.#emitFileChangeEvent(file);
358
- if (previousFileName) {
359
- this.#announceState('skyux_file_attachment_file_upload_file_replaced', previousFileName, file.file.name);
360
- }
361
- else {
362
- this.#announceState('skyux_file_attachment_file_upload_file_added', file.file.name);
363
- }
364
- });
365
- reader.addEventListener('error', () => {
366
- this.#emitFileChangeEvent(file);
367
- });
368
- reader.addEventListener('abort', () => {
369
- this.#emitFileChangeEvent(file);
370
- });
371
- reader.readAsDataURL(file.file);
372
- }
373
- }
374
- #handleFiles(files) {
375
- if (files) {
376
- const processedFiles = this.#fileAttachmentService.checkFiles(files, this.minFileSize, this.maxFileSize, this.acceptedTypes, this.validateFn);
377
- for (const file of processedFiles) {
378
- if (file.errorType) {
379
- this.#emitFileChangeEvent(file);
380
- }
381
- else {
382
- this.#loadFile(file);
383
- }
384
- }
385
- }
386
- }
387
- #setFileName(file) {
388
- if (file) {
389
- const dropName = this.#fileItemService.isFile(file) && file.file.name
390
- ? file.file.name
391
- : file.url;
392
- this.fileName = dropName;
393
- if (dropName.length > 26) {
394
- this.truncatedFileName = dropName.slice(0, 26) + '...';
395
- }
396
- else {
397
- this.truncatedFileName = dropName;
398
- }
399
- }
400
- else {
401
- this.fileName = '';
402
- this.truncatedFileName = '';
403
- }
404
- }
405
- #updateFileAttachmentButton() {
406
- this.showFileAttachmentButton = !(this.value && this.currentThemeName === 'modern');
407
- this.#changeDetector.markForCheck();
408
- }
409
- // istanbul ignore next
410
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
411
- #onChange;
412
- // istanbul ignore next
413
- // eslint-disable-next-line @typescript-eslint/no-empty-function
414
- #onTouched;
415
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: SkyFileAttachmentComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.SkyFileAttachmentService }, { token: i2.SkyFileItemService }, { token: i3.NgControl, optional: true, self: true }, { token: i4.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
416
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.0.5", type: SkyFileAttachmentComponent, selector: "sky-file-attachment", inputs: { acceptedTypes: "acceptedTypes", disabled: "disabled", helpPopoverContent: "helpPopoverContent", helpPopoverTitle: "helpPopoverTitle", helpKey: "helpKey", labelText: "labelText", labelHidden: ["labelHidden", "labelHidden", booleanAttribute], hintText: "hintText", maxFileSize: "maxFileSize", minFileSize: "minFileSize", stacked: ["stacked", "stacked", booleanAttribute], validateFn: "validateFn", required: "required" }, outputs: { fileChange: "fileChange", fileClick: "fileClick" }, host: { properties: { "class.sky-margin-stacked-lg": "this.stacked", "style.display": "this.display" } }, providers: [
417
- SkyFileAttachmentService,
418
- { provide: SKY_FORM_ERRORS_ENABLED, useValue: true },
419
- ], queries: [{ propertyName: "labelComponents", predicate: SkyFileAttachmentLabelComponent }], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [attr.id]=\"labelElementId\"\n [ngClass]=\"{\n 'sky-control-label-required': !labelText && required && hasLabelComponent\n }\"\n >\n <ng-container *ngIf=\"labelText; else labelContent\">\n <span\n *ngIf=\"!labelHidden\"\n class=\"sky-control-label sky-margin-inline-xs\"\n [ngClass]=\"{\n 'sky-control-label-required': required\n }\"\n >{{ labelText }}</span\n ><sky-help-inline\n *ngIf=\"helpPopoverContent || helpKey\"\n [labelText]=\"labelText\"\n [helpKey]=\"helpKey\"\n [popoverTitle]=\"helpPopoverTitle\"\n [popoverContent]=\"helpPopoverContent\"\n />\n </ng-container>\n <span\n class=\"sky-screen-reader-only\"\n *ngIf=\"required && (hasLabelComponent || labelText)\"\n >{{ 'skyux_file_attachment_required' | skyLibResources }}</span\n >\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n role=\"tooltip\"\n [attr.id]=\"fileDropDescriptionElementId\"\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n <ng-container *ngIf=\"showFileAttachmentButton\">\n <button\n *ngIf=\"showFileAttachmentButton\"\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n skyId\n [attr.aria-describedby]=\"\n (hintText ? hintTextEl.id + ' ' : '') + fileDropDescriptionElementId\n \"\n [attr.aria-label]=\"\n value\n ? ('skyux_file_attachment_button_label_replace_file_label'\n | skyLibResources: fileName)\n : ('skyux_file_attachment_button_label_choose_file_label'\n | skyLibResources)\n \"\n [attr.aria-labelledby]=\"\n attachButton.id +\n ' ' +\n (labelText\n ? labelElementId\n : hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n #attachButton=\"skyId\"\n >\n <sky-icon icon=\"folder-open-o\" />\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file'\n | skyLibResources)\n }}\n </button>\n </ng-container>\n <sky-icon\n *ngIf=\"value && !isImage && currentThemeName === 'modern'\"\n class=\"sky-file-attachment-icon sky-deemphasized\"\n icon=\"file-o\"\n size=\"2x\"\n />\n <span\n *ngIf=\"value || currentThemeName === 'default'\"\n class=\"sky-file-attachment-name\"\n >\n <a\n *ngIf=\"value; else noFile\"\n [attr.title]=\"fileName\"\n (click)=\"emitClick()\"\n >\n {{ truncatedFileName }}\n </a>\n </span>\n <ng-template #noFile>\n <span class=\"sky-file-attachment-none sky-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n </ng-template>\n <button\n *ngIf=\"value\"\n class=\"sky-btn sky-btn-borderless sky-file-attachment-delete\"\n skyId\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_remove' | skyLibResources: fileName\n \"\n [attr.aria-labelledby]=\"\n deleteButton.id +\n ' ' +\n (hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n [skyThemeClass]=\"{\n 'sky-btn-icon-borderless': 'modern'\n }\"\n (click)=\"deleteFileAttachment()\"\n #deleteButton=\"skyId\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\" />\n </button>\n </div>\n\n <img\n *ngIf=\"value && isImage\"\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n</div>\n<div skyId #hintTextEl=\"skyId\">\n <div\n *ngIf=\"hintText\"\n class=\"sky-font-deemphasized sky-file-attachment-hint-text\"\n >\n {{ hintText }}\n </div>\n</div>\n\n<sky-form-errors\n *ngIf=\"labelText && (ngControl?.control?.errors || fileErrorValidation)\"\n [id]=\"errorId\"\n [errors]=\"\n ngControl?.errors !== null ? ngControl?.errors : fileErrorValidation\n \"\n [labelText]=\"labelText\"\n [showErrors]=\"ngControl?.touched || ngControl?.dirty\"\n>\n <ng-content select=\"sky-form-error\" />\n <sky-form-error\n *ngIf=\"fileErrorName === 'fileType'\"\n [errorName]=\"'fileType'\"\n [errorText]=\"\n 'skyux_file_attachment_file_type_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'maxFileSize'\"\n [errorName]=\"'maxFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_max_file_size_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'minFileSize'\"\n [errorName]=\"'minFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_min_file_size_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n</sky-form-errors>\n\n<ng-template #labelContent>\n <ng-content select=\"sky-file-attachment-label\" />\n</ng-template>\n", styles: [":host.sky-margin-stacked-lg{display:block}.sky-file-attachment-wrapper{display:inline-block}.sky-file-attachment-upload{padding-right:8px;display:block;border:1px solid transparent}.sky-file-attachment-accept{border-color:#72bf44;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}.sky-file-attachment-reject{border-color:#ef4044;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044}.sky-file-attachment-name{padding:0 5px}.sky-file-attachment-name a{cursor:pointer}.sky-file-attachment-delete{border:none;color:#cdcfd2;cursor:pointer;padding:0}.sky-file-attachment-delete:hover{color:#979ba2;transition:color .15s}.sky-file-attachment-preview-img{max-width:25%;height:auto;box-shadow:0 0 5px #666;margin:10px}.sky-file-attachment-hint-text{margin-top:var(--sky-margin-stacked-xs)}:host-context(.sky-theme-modern) .sky-control-label{color:#686c73;font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-none{font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}.sky-theme-modern .sky-control-label{color:#686c73;font-size:13px}.sky-theme-modern .sky-file-attachment-none{font-size:13px}.sky-theme-modern .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.SkyFormErrorComponent, selector: "sky-form-error", inputs: ["errorName", "errorText"] }, { kind: "component", type: i7.SkyFormErrorsComponent, selector: "sky-form-errors", inputs: ["errors", "labelText", "showErrors"] }, { kind: "component", type: i8.λ1, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i9.λ2, selector: "[skyId]", exportAs: ["skyId"] }, { kind: "directive", type: i4.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "component", type: i10.λ1, selector: "sky-help-inline", inputs: ["ariaControls", "ariaExpanded", "ariaLabel", "helpKey", "labelledBy", "labelText", "popoverContent", "popoverTitle"], outputs: ["actionClick"] }, { kind: "pipe", type: i11.SkyLibResourcesPipe, name: "skyLibResources" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
420
- }
421
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: SkyFileAttachmentComponent, decorators: [{
422
- type: Component,
423
- args: [{ selector: 'sky-file-attachment', providers: [
424
- SkyFileAttachmentService,
425
- { provide: SKY_FORM_ERRORS_ENABLED, useValue: true },
426
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sky-file-attachment-wrapper\">\n <div\n class=\"sky-file-attachment-label-wrapper\"\n [attr.id]=\"labelElementId\"\n [ngClass]=\"{\n 'sky-control-label-required': !labelText && required && hasLabelComponent\n }\"\n >\n <ng-container *ngIf=\"labelText; else labelContent\">\n <span\n *ngIf=\"!labelHidden\"\n class=\"sky-control-label sky-margin-inline-xs\"\n [ngClass]=\"{\n 'sky-control-label-required': required\n }\"\n >{{ labelText }}</span\n ><sky-help-inline\n *ngIf=\"helpPopoverContent || helpKey\"\n [labelText]=\"labelText\"\n [helpKey]=\"helpKey\"\n [popoverTitle]=\"helpPopoverTitle\"\n [popoverContent]=\"helpPopoverContent\"\n />\n </ng-container>\n <span\n class=\"sky-screen-reader-only\"\n *ngIf=\"required && (hasLabelComponent || labelText)\"\n >{{ 'skyux_file_attachment_required' | skyLibResources }}</span\n >\n </div>\n <div\n class=\"sky-file-attachment-upload sky-file-attachment sky-file-attachment-target\"\n [ngClass]=\"{\n 'sky-file-attachment-accept': acceptedOver,\n 'sky-file-attachment-reject': rejectedOver\n }\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragover)=\"fileDragOver($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n >\n <div\n aria-hidden=\"true\"\n class=\"sky-screen-reader-only\"\n role=\"tooltip\"\n [attr.id]=\"fileDropDescriptionElementId\"\n >\n {{ 'skyux_file_attachment_file_upload_drag_or_click' | skyLibResources }}\n </div>\n <input\n hidden\n tabindex=\"-1\"\n type=\"file\"\n [attr.accept]=\"acceptedTypes || null\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n <ng-container *ngIf=\"showFileAttachmentButton\">\n <button\n *ngIf=\"showFileAttachmentButton\"\n class=\"sky-file-attachment-btn sky-btn sky-btn-default\"\n type=\"button\"\n skyId\n [attr.aria-describedby]=\"\n (hintText ? hintTextEl.id + ' ' : '') + fileDropDescriptionElementId\n \"\n [attr.aria-label]=\"\n value\n ? ('skyux_file_attachment_button_label_replace_file_label'\n | skyLibResources: fileName)\n : ('skyux_file_attachment_button_label_choose_file_label'\n | skyLibResources)\n \"\n [attr.aria-labelledby]=\"\n attachButton.id +\n ' ' +\n (labelText\n ? labelElementId\n : hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n (click)=\"onDropClicked()\"\n #attachButton=\"skyId\"\n >\n <sky-icon icon=\"folder-open-o\" />\n {{\n value\n ? ('skyux_file_attachment_button_label_replace_file'\n | skyLibResources)\n : ('skyux_file_attachment_button_label_choose_file'\n | skyLibResources)\n }}\n </button>\n </ng-container>\n <sky-icon\n *ngIf=\"value && !isImage && currentThemeName === 'modern'\"\n class=\"sky-file-attachment-icon sky-deemphasized\"\n icon=\"file-o\"\n size=\"2x\"\n />\n <span\n *ngIf=\"value || currentThemeName === 'default'\"\n class=\"sky-file-attachment-name\"\n >\n <a\n *ngIf=\"value; else noFile\"\n [attr.title]=\"fileName\"\n (click)=\"emitClick()\"\n >\n {{ truncatedFileName }}\n </a>\n </span>\n <ng-template #noFile>\n <span class=\"sky-file-attachment-none sky-deemphasized\">\n {{ 'skyux_file_attachment_label_no_file_chosen' | skyLibResources }}\n </span>\n </ng-template>\n <button\n *ngIf=\"value\"\n class=\"sky-btn sky-btn-borderless sky-file-attachment-delete\"\n skyId\n type=\"button\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_remove' | skyLibResources: fileName\n \"\n [attr.aria-labelledby]=\"\n deleteButton.id +\n ' ' +\n (hasLabelComponent\n ? labelComponents?.get(0)?.labelContentId?.id\n : undefined)\n \"\n [disabled]=\"disabled\"\n [skyThemeClass]=\"{\n 'sky-btn-icon-borderless': 'modern'\n }\"\n (click)=\"deleteFileAttachment()\"\n #deleteButton=\"skyId\"\n >\n <sky-icon icon=\"trash-o\" size=\"md\" />\n </button>\n </div>\n\n <img\n *ngIf=\"value && isImage\"\n class=\"sky-file-attachment-preview-img\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n [src]=\"value.url\"\n />\n</div>\n<div skyId #hintTextEl=\"skyId\">\n <div\n *ngIf=\"hintText\"\n class=\"sky-font-deemphasized sky-file-attachment-hint-text\"\n >\n {{ hintText }}\n </div>\n</div>\n\n<sky-form-errors\n *ngIf=\"labelText && (ngControl?.control?.errors || fileErrorValidation)\"\n [id]=\"errorId\"\n [errors]=\"\n ngControl?.errors !== null ? ngControl?.errors : fileErrorValidation\n \"\n [labelText]=\"labelText\"\n [showErrors]=\"ngControl?.touched || ngControl?.dirty\"\n>\n <ng-content select=\"sky-form-error\" />\n <sky-form-error\n *ngIf=\"fileErrorName === 'fileType'\"\n [errorName]=\"'fileType'\"\n [errorText]=\"\n 'skyux_file_attachment_file_type_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'maxFileSize'\"\n [errorName]=\"'maxFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_max_file_size_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n <sky-form-error\n *ngIf=\"fileErrorName === 'minFileSize'\"\n [errorName]=\"'minFileSize'\"\n [errorText]=\"\n 'skyux_file_attachment_min_file_size_error_label_text'\n | skyLibResources: fileErrorParam\n \"\n />\n</sky-form-errors>\n\n<ng-template #labelContent>\n <ng-content select=\"sky-file-attachment-label\" />\n</ng-template>\n", styles: [":host.sky-margin-stacked-lg{display:block}.sky-file-attachment-wrapper{display:inline-block}.sky-file-attachment-upload{padding-right:8px;display:block;border:1px solid transparent}.sky-file-attachment-accept{border-color:#72bf44;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}.sky-file-attachment-reject{border-color:#ef4044;border-style:dashed;border-width:1px;border-radius:5px;color:#212327}:host(.ng-invalid.ng-dirty) .sky-file-attachment-btn{box-shadow:0 0 8px #ef404499;border:1px solid #ef4044}.sky-file-attachment-name{padding:0 5px}.sky-file-attachment-name a{cursor:pointer}.sky-file-attachment-delete{border:none;color:#cdcfd2;cursor:pointer;padding:0}.sky-file-attachment-delete:hover{color:#979ba2;transition:color .15s}.sky-file-attachment-preview-img{max-width:25%;height:auto;box-shadow:0 0 5px #666;margin:10px}.sky-file-attachment-hint-text{margin-top:var(--sky-margin-stacked-xs)}:host-context(.sky-theme-modern) .sky-control-label{color:#686c73;font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-none{font-size:13px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}:host-context(.sky-theme-modern) .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}.sky-theme-modern .sky-control-label{color:#686c73;font-size:13px}.sky-theme-modern .sky-file-attachment-none{font-size:13px}.sky-theme-modern .sky-file-attachment-wrapper{display:flex;flex-wrap:wrap}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-label-wrapper{width:100%}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-preview-img{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;box-shadow:none;margin:0 10px 0 0;width:100px;flex:0;order:1}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-btn{margin:0 10px 0 0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-icon{margin:5px 10px 5px 5px}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload{flex:1;order:2;display:flex;align-items:flex-start}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-upload .sky-file-attachment-name{margin:10px 10px 0 0;padding:0}.sky-theme-modern .sky-file-attachment-wrapper .sky-file-attachment-delete{width:40px;height:40px;color:#686c73!important}\n"] }]
427
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.SkyFileAttachmentService }, { type: i2.SkyFileItemService }, { type: i3.NgControl, decorators: [{
428
- type: Self
429
- }, {
430
- type: Optional
431
- }] }, { type: i4.SkyThemeService, decorators: [{
432
- type: Optional
433
- }] }], propDecorators: { acceptedTypes: [{
434
- type: Input
435
- }], disabled: [{
436
- type: Input
437
- }], helpPopoverContent: [{
438
- type: Input
439
- }], helpPopoverTitle: [{
440
- type: Input
441
- }], helpKey: [{
442
- type: Input
443
- }], labelText: [{
444
- type: Input
445
- }], labelHidden: [{
446
- type: Input,
447
- args: [{ transform: booleanAttribute }]
448
- }], hintText: [{
449
- type: Input
450
- }], maxFileSize: [{
451
- type: Input
452
- }], minFileSize: [{
453
- type: Input
454
- }], stacked: [{
455
- type: Input,
456
- args: [{ transform: booleanAttribute }]
457
- }, {
458
- type: HostBinding,
459
- args: ['class.sky-margin-stacked-lg']
460
- }], validateFn: [{
461
- type: Input
462
- }], fileChange: [{
463
- type: Output
464
- }], fileClick: [{
465
- type: Output
466
- }], required: [{
467
- type: Input
468
- }], display: [{
469
- type: HostBinding,
470
- args: ['style.display']
471
- }], inputEl: [{
472
- type: ViewChild,
473
- args: ['fileInput']
474
- }], labelComponents: [{
475
- type: ContentChildren,
476
- args: [SkyFileAttachmentLabelComponent]
477
- }] } });
478
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9mb3Jtcy9zcmMvbGliL21vZHVsZXMvZmlsZS1hdHRhY2htZW50L2ZpbGUtYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZm9ybXMvc3JjL2xpYi9tb2R1bGVzL2ZpbGUtYXR0YWNobWVudC9maWxlLWF0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsWUFBWSxFQUNaLHVCQUF1QixHQUN4QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBRXhHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBUXJFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FB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QkFEYixLQUFLO2dCQU9DLFNBQVM7c0JBRGYsS0FBSztnQkFPQyxXQUFXO3NCQURqQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQVEvQixRQUFRO3NCQURkLEtBQUs7Z0JBUUssV0FBVztzQkFEckIsS0FBSztnQkFjSyxXQUFXO3NCQURyQixLQUFLO2dCQWVDLE9BQU87c0JBRmIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTs7c0JBQ3JDLFdBQVc7dUJBQUMsNkJBQTZCO2dCQVFuQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLFVBQVU7c0JBRGhCLE1BQU07Z0JBUUEsU0FBUztzQkFEZixNQUFNO2dCQXFCQSxRQUFRO3NCQURkLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixXQUFXO3VCQUFDLGVBQWU7Z0JBb0NyQixPQUFPO3NCQURiLFNBQVM7dUJBQUMsV0FBVztnQkFJZixlQUFlO3NCQURyQixlQUFlO3VCQUFDLCtCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTZWxmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgU2t5Rm9ybXNVdGlsaXR5LFxuICBTa3lJZFNlcnZpY2UsXG4gIFNreUxpdmVBbm5vdW5jZXJTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQgeyBTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2kxOG4nO1xuaW1wb3J0IHsgU2t5VGhlbWVTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L3RoZW1lJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTS1lfRk9STV9FUlJPUlNfRU5BQkxFRCB9IGZyb20gJy4uL2Zvcm0tZXJyb3IvZm9ybS1lcnJvcnMtZW5hYmxlZC10b2tlbic7XG5pbXBvcnQgeyBTa3lGb3JtRmllbGRMYWJlbFRleHRSZXF1aXJlZFNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZm9ybS1maWVsZC1sYWJlbC10ZXh0LXJlcXVpcmVkLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudExhYmVsQ29tcG9uZW50IH0gZnJvbSAnLi9maWxlLWF0dGFjaG1lbnQtbGFiZWwuY29tcG9uZW50JztcbmltcG9ydCB7IFNreUZpbGVBdHRhY2htZW50U2VydmljZSB9IGZyb20gJy4vZmlsZS1hdHRhY2htZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2t5RmlsZUl0ZW0gfSBmcm9tICcuL2ZpbGUtaXRlbSc7XG5pbXBvcnQgeyBTa3lGaWxlSXRlbUVycm9yVHlwZSB9IGZyb20gJy4vZmlsZS1pdGVtLWVycm9yLXR5cGUnO1xuaW1wb3J0IHsgU2t5RmlsZUl0ZW1TZXJ2aWNlIH0gZnJvbSAnLi9maWxlLWl0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBTa3lGaWxlVmFsaWRhdGVGbiB9IGZyb20gJy4vZmlsZS12YWxpZGF0ZS1mdW5jdGlvbic7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudENoYW5nZSB9IGZyb20gJy4vdHlwZXMvZmlsZS1hdHRhY2htZW50LWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lGaWxlQXR0YWNobWVudENsaWNrIH0gZnJvbSAnLi90eXBlcy9maWxlLWF0dGFjaG1lbnQtY2xpY2snO1xuXG5sZXQgdW5pcXVlSWQgPSAwO1xuXG5jb25zdCBNQVhfRklMRV9TSVpFX0RFRkFVTFQgPSA1MDAwMDA7XG5jb25zdCBNSU5fRklMRV9TSVpFX0RFRkFVTFQgPSAwO1xuXG4vKipcbiAqIFByb3ZpZGVzIGFuIGVsZW1lbnQgdG8gYXR0YWNoIGEgc2luZ2xlIGxvY2FsIGZpbGUuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1maWxlLWF0dGFjaG1lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS1hdHRhY2htZW50LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIFNreUZpbGVBdHRhY2htZW50U2VydmljZSxcbiAgICB7IHByb3ZpZGU6IFNLWV9GT1JNX0VSUk9SU19FTkFCTEVELCB1c2VWYWx1ZTogdHJ1ZSB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5RmlsZUF0dGFjaG1lbnRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkluaXQsIE9uRGVzdHJveVxue1xuICAvKipcbiAgICogVGhlIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgbGl0ZXJhbCBvZiBNSU1FIHR5cGVzIHRoYXQgdXNlcnMgY2FuIGF0dGFjaC5cbiAgICogQnkgZGVmYXVsdCwgYWxsIGZpbGUgdHlwZXMgYXJlIGFsbG93ZWQuXG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFjY2VwdGVkVHlwZXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBpbnB1dCBvbiB0ZW1wbGF0ZS1kcml2ZW4gZm9ybXMuIERvbid0IHVzZSB0aGlzIGlucHV0IG9uIHJlYWN0aXZlIGZvcm1zIGJlY2F1c2UgdGhleSBtYXkgb3ZlcndyaXRlIHRoZSBpbnB1dCBvciBsZWF2ZSB0aGUgY29udHJvbCBvdXQgb2Ygc3luYy5cbiAgICogVG8gc2V0IHRoZSBkaXNhYmxlZCBzdGF0ZSBvbiByZWFjdGl2ZSBmb3JtcywgdXNlIHRoZSBgRm9ybUNvbnRyb2xgIGluc3RlYWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV3RGlzYWJsZWRTdGF0ZSA9IFNreUZvcm1zVXRpbGl0eS5jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICh0aGlzLiNfZGlzYWJsZWQgIT09IG5ld0Rpc2FibGVkU3RhdGUpIHtcbiAgICAgIHRoaXMuI19kaXNhYmxlZCA9IG5ld0Rpc2FibGVkU3RhdGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jX2Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBoZWxwIHBvcG92ZXIuIFdoZW4gc3BlY2lmaWVkIGFsb25nIHdpdGggYGxhYmVsVGV4dGAsIGEgW2hlbHAgaW5saW5lXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvaGVscC1pbmxpbmUpXG4gICAqIGJ1dHRvbiBpcyBhZGRlZCB0byB0aGUgc2luZ2xlIGZpbGUgYXR0YWNobWVudCBsYWJlbC4gVGhlIGhlbHAgaW5saW5lIGJ1dHRvbiBkaXNwbGF5cyBhIFtwb3BvdmVyXShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvcG9wb3ZlcilcbiAgICogd2hlbiBjbGlja2VkIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29udGVudCBhbmQgb3B0aW9uYWwgdGl0bGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVscFBvcG92ZXJDb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHRpdGxlIG9mIHRoZSBoZWxwIHBvcG92ZXIuIFRoaXMgcHJvcGVydHkgb25seSBhcHBsaWVzIHdoZW4gYGhlbHBQb3BvdmVyQ29udGVudGAgaXNcbiAgICogYWxzbyBzcGVjaWZpZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVscFBvcG92ZXJUaXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGhlbHAga2V5IHRoYXQgaWRlbnRpZmllcyB0aGUgZ2xvYmFsIGhlbHAgY29udGVudCB0byBkaXNwbGF5LiBXaGVuIHNwZWNpZmllZCwgYSBbaGVscCBpbmxpbmVdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvY29tcG9uZW50cy9oZWxwLWlubGluZSlcbiAgICogYnV0dG9uIGlzIHBsYWNlZCBiZXNpZGUgdGhlIHNpbmdsZSBmaWxlIGF0dGFjaG1lbnQgbGFiZWwuIENsaWNraW5nIHRoZSBidXR0b24gaW52b2tlcyBbZ2xvYmFsIGhlbHBdKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vZGV2ZWxvcC9nbG9iYWwtaGVscClcbiAgICogYXMgY29uZmlndXJlZCBieSB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgaGVscEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGFzIHRoZSBmaWxlIGF0dGFjaG1lbnQncyBsYWJlbC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsYWJlbFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoaWRlIGBsYWJlbFRleHRgIGZyb20gdmlldy5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgbGFiZWxIaWRkZW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogW1BlcnNpc3RlbnQgaW5saW5lIGhlbHAgdGV4dF0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9kZXNpZ24vZ3VpZGVsaW5lcy91c2VyLWFzc2lzdGFuY2UjaW5saW5lLWhlbHApIHRoYXQgcHJvdmlkZXNcbiAgICogYWRkaXRpb25hbCBjb250ZXh0IHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGhpbnRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgZm9yIHZhbGlkIGZpbGVzLlxuICAgKiBAZGVmYXVsdCA1MDAwMDBcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWF4RmlsZVNpemUodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19tYXhGaWxlU2l6ZSA9IHZhbHVlID8/IE1BWF9GSUxFX1NJWkVfREVGQVVMVDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4RmlsZVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX21heEZpbGVTaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHNpemUgaW4gYnl0ZXMgZm9yIHZhbGlkIGZpbGVzLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG1pbkZpbGVTaXplKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfbWluRmlsZVNpemUgPSB2YWx1ZSA/PyBNSU5fRklMRV9TSVpFX0RFRkFVTFQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbkZpbGVTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI19taW5GaWxlU2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzaW5nbGUgZmlsZSBhdHRhY2htZW50IGlzIHN0YWNrZWQgb24gYW5vdGhlciBmb3JtIGNvbXBvbmVudC4gV2hlbiBzcGVjaWZpZWQsXG4gICAqIHRoZSBhcHByb3ByaWF0ZSB2ZXJ0aWNhbCBzcGFjaW5nIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNpbmdsZSBmaWxlIGF0dGFjaG1lbnQuXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5za3ktbWFyZ2luLXN0YWNrZWQtbGcnKVxuICBwdWJsaWMgc3RhY2tlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24uIFRoaXMgdmFsaWRhdGlvbiBydW5zIGFsb25nc2lkZSB0aGUgaW50ZXJuYWxcbiAgICogZmlsZSB2YWxpZGF0aW9uLiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgYFNreUZpbGVJdGVtYCBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdmFsaWRhdGVGbjogU2t5RmlsZVZhbGlkYXRlRm4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgYWRkIG9yIHJlbW92ZSBmaWxlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5RmlsZUF0dGFjaG1lbnRDaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgc2VsZWN0IHRoZSBmaWxlIG5hbWUgbGluay4gTWFrZSBzdXJlIHRvIGJpbmQgdGhlIGV2ZW50LlxuICAgKiBJZiB5b3UgZG8gbm90LCB0aGUgZmlsZSBuYW1lIGxpbmsgd2lsbCBiZSBhIGRlYWQgbGluay5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZmlsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lGaWxlQXR0YWNobWVudENsaWNrPigpO1xuXG4gIHB1YmxpYyBhY2NlcHRlZE92ZXIgPSBmYWxzZTtcblxuICBwdWJsaWMgaGFzTGFiZWxDb21wb25lbnQgPSBmYWxzZTtcblxuICBwdWJsaWMgZmlsZURyb3BEZXNjcmlwdGlvbkVsZW1lbnRJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyBsYWJlbEVsZW1lbnRJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyByZWplY3RlZE92ZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgcmVxdWlyZWQgZm9yIGZvcm0gdmFsaWRhdGlvbi5cbiAgICogV2hlbiB5b3Ugc2V0IHRoaXMgcHJvcGVydHkgdG8gYHRydWVgLCB0aGUgY29tcG9uZW50IGFkZHMgYGFyaWEtcmVxdWlyZWRgIGFuZCBgcmVxdWlyZWRgXG4gICAqIGF0dHJpYnV0ZXMgdG8gdGhlIGlucHV0IGVsZW1lbnQgc28gdGhhdCBmb3JtcyBkaXNwbGF5IGFuIGludmFsaWQgc3RhdGUgdW50aWwgdGhlIGlucHV0IGVsZW1lbnRcbiAgICogaXMgY29tcGxldGUuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgYXJpYS1yZXF1aXJlZGAgYXR0cmlidXRlLCBzZWUgdGhlIFtXQUktQVJJQSBkZWZpbml0aW9uXShodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEvI2FyaWEtcmVxdWlyZWQpLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHJlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5kaXNwbGF5JylcbiAgcHVibGljIGRpc3BsYXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBTa3lGaWxlSXRlbSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcbiAgICAvLyBUaGUgbnVsbCBjaGVjayBpcyBuZWVkZWQgdG8gYWRkcmVzcyBhIGJ1ZyBpbiBBbmd1bGFyIDQuXG4gICAgLy8gd3JpdGVWYWx1ZSBpcyBiZWluZyBjYWxsZWQgdHdpY2UsIGZpcnN0IHRpbWUgd2l0aCBhIHBoYW50b20gbnVsbCB2YWx1ZVxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTQ5ODhcbiAgICBjb25zdCBpc05ld1ZhbHVlID0gdmFsdWUgIT09IHRoaXMudmFsdWUgJiYgdmFsdWUgIT09IG51bGw7XG5cbiAgICBpZiAoaXNOZXdWYWx1ZSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuaXNJbWFnZSA9IHRoaXMuI2ZpbGVJdGVtU2VydmljZS5pc0ltYWdlKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNJbWFnZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy4jc2V0RmlsZU5hbWUodmFsdWUpO1xuXG4gICAgICB0aGlzLiNfdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI29uQ2hhbmdlKHZhbHVlKTtcbiAgICAgIHRoaXMuI3VwZGF0ZUZpbGVBdHRhY2htZW50QnV0dG9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBTa3lGaWxlSXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI192YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjdXJyZW50VGhlbWVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGZpbGVOYW1lID0gJyc7XG5cbiAgcHVibGljIHNob3dGaWxlQXR0YWNobWVudEJ1dHRvbiA9IHRydWU7XG5cbiAgcHVibGljIHRydW5jYXRlZEZpbGVOYW1lID0gJyc7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0JylcbiAgcHVibGljIGlucHV0RWw6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTa3lGaWxlQXR0YWNobWVudExhYmVsQ29tcG9uZW50KVxuICBwdWJsaWMgbGFiZWxDb21wb25lbnRzOlxuICAgIHwgUXVlcnlMaXN0PFNreUZpbGVBdHRhY2htZW50TGFiZWxDb21wb25lbnQ+XG4gICAgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGlzSW1hZ2UgPSBmYWxzZTtcblxuICAjZW50ZXJFdmVudFRhcmdldDogRXZlbnRUYXJnZXQgfCB1bmRlZmluZWQgfCBudWxsO1xuXG4gICNmaWxlQXR0YWNobWVudElkID0gdW5pcXVlSWQrKztcblxuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI19kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICNfbWF4RmlsZVNpemUgPSBNQVhfRklMRV9TSVpFX0RFRkFVTFQ7XG5cbiAgI19taW5GaWxlU2l6ZSA9IE1JTl9GSUxFX1NJWkVfREVGQVVMVDtcblxuICAjX3ZhbHVlOiBTa3lGaWxlSXRlbSB8IHVuZGVmaW5lZDtcblxuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuICAjZmlsZUF0dGFjaG1lbnRTZXJ2aWNlOiBTa3lGaWxlQXR0YWNobWVudFNlcnZpY2U7XG4gICNmaWxlSXRlbVNlcnZpY2U6IFNreUZpbGVJdGVtU2VydmljZTtcbiAgI3RoZW1lU3ZjOiBTa3lUaGVtZVNlcnZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgI2lkU3ZjID0gaW5qZWN0KFNreUlkU2VydmljZSk7XG4gIHJlYWRvbmx5ICNsaXZlQW5ub3VuY2VyU3ZjID0gaW5qZWN0KFNreUxpdmVBbm5vdW5jZXJTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3Jlc291cmNlc1N2YyA9IGluamVjdChTa3lMaWJSZXNvdXJjZXNTZXJ2aWNlKTtcblxuICByZWFkb25seSAjbGFiZWxUZXh0UmVxdWlyZWQgPSBpbmplY3QoU2t5Rm9ybUZpZWxkTGFiZWxUZXh0UmVxdWlyZWRTZXJ2aWNlLCB7XG4gICAgb3B0aW9uYWw6IHRydWUsXG4gIH0pO1xuXG4gIHByb3RlY3RlZCBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGVycm9ySWQgPSB0aGlzLiNpZFN2Yy5nZW5lcmF0ZUlkKCk7XG5cbiAgcHJvdGVjdGVkIGZpbGVFcnJvck5hbWU6IFNreUZpbGVJdGVtRXJyb3JUeXBlIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgZmlsZUVycm9yUGFyYW06IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGZpbGVFcnJvclZhbGlkYXRpb246IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBmaWxlQXR0YWNobWVudFNlcnZpY2U6IFNreUZpbGVBdHRhY2htZW50U2VydmljZSxcbiAgICBmaWxlSXRlbVNlcnZpY2U6IFNreUZpbGVJdGVtU2VydmljZSxcbiAgICBAU2VsZigpIEBPcHRpb25hbCgpIG5nQ29udHJvbD86IE5nQ29udHJvbCxcbiAgICBAT3B0aW9uYWwoKSB0aGVtZVN2Yz86IFNreVRoZW1lU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IgPSBjaGFuZ2VEZXRlY3RvcjtcbiAgICB0aGlzLiNmaWxlQXR0YWNobWVudFNlcnZpY2UgPSBmaWxlQXR0YWNobWVudFNlcnZpY2U7XG4gICAgdGhpcy4jZmlsZUl0ZW1TZXJ2aWNlID0gZmlsZUl0ZW1TZXJ2aWNlO1xuICAgIHRoaXMubmdDb250cm9sID0gbmdDb250cm9sO1xuICAgIHRoaXMuI3RoZW1lU3ZjID0gdGhlbWVTdmM7XG5cbiAgICB0aGlzLmxhYmVsRWxlbWVudElkID0gYHNreS1maWxlLWF0dGFjaG1lbnQtbGFiZWwtJHt0aGlzLiNmaWxlQXR0YWNobWVudElkfWA7XG4gICAgdGhpcy5maWxlRHJvcERlc2NyaXB0aW9uRWxlbWVudElkID0gYHNreS1maWxlLWF0dGFjaG1lbnQtZHJvcC1kZXNjcmlwdGlvbi0ke3RoaXMuI2ZpbGVBdHRhY2htZW50SWR9YDtcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jdGhlbWVTdmMpIHtcbiAgICAgIHRoaXMuI3RoZW1lU3ZjLnNldHRpbmdzQ2hhbmdlXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgLnN1YnNjcmliZSgodGhlbWVTZXR0aW5ncykgPT4ge1xuICAgICAgICAgIHRoaXMuY3VycmVudFRoZW1lTmFtZSA9IHRoZW1lU2V0dGluZ3MuY3VycmVudFNldHRpbmdzLnRoZW1lLm5hbWU7XG4gICAgICAgICAgdGhpcy4jdXBkYXRlRmlsZUF0dGFjaG1lbnRCdXR0b24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI2xhYmVsVGV4dFJlcXVpcmVkICYmICF0aGlzLmxhYmVsVGV4dCkge1xuICAgICAgdGhpcy5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgICB0aGlzLiNsYWJlbFRleHRSZXF1aXJlZD8udmFsaWRhdGVMYWJlbFRleHQodGhpcy5sYWJlbFRleHQpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhZGRyZXNzIGEgYnVnIGluIEFuZ3VsYXIgNy5cbiAgICAvLyBXaGVuIGEgY29udHJvbCB2YWx1ZSBpcyBzZXQgaW5pdGlhbGx5LCBpdHMgdmFsdWUgaXMgbm90IHJlcHJlc2VudGVkIG9uIHRoZSB2aWV3LlxuICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM3OTJcbiAgICAvLyBPZiBub3RlIGlzIHRoZSBwYXJlbnQgY2hlY2sgd2hpY2ggYWxsb3dzIHVzIHRvIGRldGVybWluZSBpZiB0aGUgZm9ybSBpcyByZWFjdGl2ZS5cbiAgICAvLyBXaXRob3V0IHRoaXMgY2hlY2sgdGhlcmUgaXMgYSBjaGFuZ2VkIGJlZm9yZSBjaGVja2VkIGVycm9yXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCEuY29udHJvbCEuc2V0VmFsdWUodGhpcy52YWx1ZSwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnJlcXVpcmVkID1cbiAgICAgICAgdGhpcy5yZXF1aXJlZCB8fCBTa3lGb3Jtc1V0aWxpdHkuaGFzUmVxdWlyZWRWYWxpZGF0aW9uKHRoaXMubmdDb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxhYmVsQ29tcG9uZW50cykge1xuICAgICAgdGhpcy5oYXNMYWJlbENvbXBvbmVudCA9IHRoaXMubGFiZWxDb21wb25lbnRzLmxlbmd0aCA+IDA7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgIC8vIEhhbmRsZXMgdXBkYXRpbmcgY2xhc3NlcyB3aGVuIGxhYmVsIGNoYW5nZXNcbiAgICAgIHRoaXMubGFiZWxDb21wb25lbnRzLmNoYW5nZXNcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIChuZXdMYWJlbENvbXBvbmVudHM6IFF1ZXJ5TGlzdDxTa3lGaWxlQXR0YWNobWVudExhYmVsQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNMYWJlbENvbXBvbmVudCA9IG5ld0xhYmVsQ29tcG9uZW50cy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Ecm9wQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLiNvblRvdWNoZWQoKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLmlucHV0RWwpIHtcbiAgICAgIHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVDaGFuZ2VFdmVudChmaWxlQ2hhbmdlRXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy4jaGFuZGxlRmlsZXMoXG4gICAgICAoZmlsZUNoYW5nZUV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkKT8uZmlsZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWxlRHJhZ0VudGVyKGRyYWdFbnRlckV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTYXZlIHRoaXMgdGFyZ2V0IHRvIGtub3cgd2hlbiB0aGUgZHJhZyBldmVudCBsZWF2ZXNcbiAgICB0aGlzLiNlbnRlckV2ZW50VGFyZ2V0ID0gZHJhZ0VudGVyRXZlbnQudGFyZ2V0O1xuICAgIGRyYWdFbnRlckV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyYWdFbnRlckV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICBwdWJsaWMgZmlsZURyYWdPdmVyKGRyYWdPdmVyRXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYW5zZmVyID0gZHJhZ092ZXJFdmVudC5kYXRhVHJhbnNmZXI7XG5cbiAgICBkcmFnT3ZlckV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyYWdPdmVyRXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0cmFuc2Zlcikge1xuICAgICAgaWYgKHRyYW5zZmVyLml0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gQXJyYXkuZnJvbSh0cmFuc2Zlci5pdGVtcyk7XG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmlsZS50eXBlICYmXG4gICAgICAgICAgICB0aGlzLiNmaWxlQXR0YWNobWVudFNlcnZpY2UuZmlsZVR5cGVSZWplY3RlZChcbiAgICAgICAgICAgICAgZmlsZS50eXBlLFxuICAgICAgICAgICAgICB0aGlzLmFjY2VwdGVkVHlwZXMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggPiAwICYmICF0aGlzLmFjY2VwdGVkT3Zlcikge1xuICAgICAgICAgIHRoaXMucmVqZWN0ZWRPdmVyID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5hY2NlcHRlZE92ZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRyYW5zZmVyLmZpbGVzKSB7XG4gICAgICAgIC8vIElmIHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgRGF0YVRyYW5zZmVyLml0ZW1zLFxuICAgICAgICAvLyBkZWZlciBmaWxlLXR5cGUgY2hlY2tpbmcgdG8gZHJvcCBoYW5kbGVyLlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRGF0YVRyYW5zZmVyL2l0ZW1zI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICAgICAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjY2VwdGVkT3ZlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZpbGVEcm9wKGRyb3BFdmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZHJvcEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGRyb3BFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy4jZW50ZXJFdmVudFRhcmdldCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlamVjdGVkT3ZlciA9IGZhbHNlO1xuICAgIHRoaXMuYWNjZXB0ZWRPdmVyID0gZmFsc2U7XG5cbiAgICBpZiAoZHJvcEV2ZW50LmRhdGFUcmFuc2ZlciAmJiBkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKSB7XG4gICAgICBpZiAoZHJvcEV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLiNmaWxlQXR0YWNobWVudFNlcnZpY2UuaGFzRGlyZWN0b3J5KGRyb3BFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNoYW5kbGVGaWxlcyhkcm9wRXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmlsZURyYWdMZWF2ZShkcmFnTGVhdmVFdmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI2VudGVyRXZlbnRUYXJnZXQgPT09IGRyYWdMZWF2ZUV2ZW50LnRhcmdldCkge1xuICAgICAgdGhpcy5yZWplY3RlZE92ZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWNjZXB0ZWRPdmVyID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRlbGV0ZUZpbGVBdHRhY2htZW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy52YWx1ZT8uZmlsZS5uYW1lO1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudCh0aGlzLnZhbHVlKTtcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlOiBzYWZldHkgY2hlY2sgKi9cbiAgICBpZiAoZmlsZU5hbWUpIHtcbiAgICAgIHRoaXMuI2Fubm91bmNlU3RhdGUoXG4gICAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV91cGxvYWRfZmlsZV9yZW1vdmVkJyxcbiAgICAgICAgZmlsZU5hbWUsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZUNoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gYW55KTogdm9pZCB7XG4gICAgdGhpcy4jb25DaGFuZ2UgPSBmbjtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IGFueSk6IHZvaWQge1xuICAgIHRoaXMuI29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGNvbnRyb2wuIEltcGxlbWVudGVkIGFzIGEgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci5cbiAgICogQHBhcmFtIGlzRGlzYWJsZWQgV2hldGhlciB0aGUgY29udHJvbCBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZW1pdENsaWNrKCk6IHZvaWQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsZUNsaWNrLmVtaXQoe1xuICAgICAgICBmaWxlOiB0aGlzLnZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgI2Fubm91bmNlU3RhdGUocmVzb3VyY2VTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLiNyZXNvdXJjZXNTdmNcbiAgICAgIC5nZXRTdHJpbmcocmVzb3VyY2VTdHJpbmcsIC4uLmFyZ3MpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoaW50ZXJuYXRpb25hbGl6ZWRTdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy4jbGl2ZUFubm91bmNlclN2Yy5hbm5vdW5jZShpbnRlcm5hdGlvbmFsaXplZFN0cmluZyk7XG4gICAgICB9KTtcbiAgfVxuXG4gICNlbWl0RmlsZUNoYW5nZUV2ZW50KGN1cnJlbnRGaWxlPzogU2t5RmlsZUl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoY3VycmVudEZpbGUgJiYgIWN1cnJlbnRGaWxlLmVycm9yVHlwZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKGN1cnJlbnRGaWxlKTtcbiAgICAgIHRoaXMuZmlsZUVycm9yTmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZmlsZUVycm9yUGFyYW0gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmZpbGVFcnJvclZhbGlkYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh1bmRlZmluZWQpO1xuICAgICAgLy8gTWFrZXMgc3VyZSB2YWx1ZSBhY2Nlc3NvciBpcyBtYXJrZWQgYXMgZGlydHkgZXZlbiBpZiBjdXJyZW50IGZpbGUgaXMgdW5kZWZpbmVkXG4gICAgICB0aGlzLiNvbkNoYW5nZSh1bmRlZmluZWQpO1xuICAgICAgdGhpcy5maWxlRXJyb3JWYWxpZGF0aW9uID0geyBmaWxlRXJyb3I6IHRydWUgfTtcbiAgICAgIHRoaXMuZmlsZUVycm9yTmFtZSA9IGN1cnJlbnRGaWxlPy5lcnJvclR5cGU7XG4gICAgICB0aGlzLmZpbGVFcnJvclBhcmFtID0gY3VycmVudEZpbGU/LmVycm9yUGFyYW07XG4gICAgfVxuICAgIHRoaXMuZmlsZUNoYW5nZS5lbWl0KHtcbiAgICAgIGZpbGU6IGN1cnJlbnRGaWxlLFxuICAgIH0gYXMgU2t5RmlsZUF0dGFjaG1lbnRDaGFuZ2UpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGhpcy5pbnB1dEVsKSB7XG4gICAgICB0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gICNsb2FkRmlsZShmaWxlOiBTa3lGaWxlSXRlbSk6IHZvaWQge1xuICAgIGlmIChmaWxlLmZpbGUpIHtcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKGV2ZW50OiBhbnkpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNGaWxlTmFtZSA9IHRoaXMudmFsdWU/LmZpbGUubmFtZTtcbiAgICAgICAgZmlsZS51cmwgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICB0aGlzLiNlbWl0RmlsZUNoYW5nZUV2ZW50KGZpbGUpO1xuICAgICAgICBpZiAocHJldmlvdXNGaWxlTmFtZSkge1xuICAgICAgICAgIHRoaXMuI2Fubm91bmNlU3RhdGUoXG4gICAgICAgICAgICAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2ZpbGVfdXBsb2FkX2ZpbGVfcmVwbGFjZWQnLFxuICAgICAgICAgICAgcHJldmlvdXNGaWxlTmFtZSxcbiAgICAgICAgICAgIGZpbGUuZmlsZS5uYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jYW5ub3VuY2VTdGF0ZShcbiAgICAgICAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV91cGxvYWRfZmlsZV9hZGRlZCcsXG4gICAgICAgICAgICBmaWxlLmZpbGUubmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLiNlbWl0RmlsZUNoYW5nZUV2ZW50KGZpbGUpO1xuICAgICAgfSk7XG5cbiAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy4jZW1pdEZpbGVDaGFuZ2VFdmVudChmaWxlKTtcbiAgICAgIH0pO1xuXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlLmZpbGUpO1xuICAgIH1cbiAgfVxuXG4gICNoYW5kbGVGaWxlcyhmaWxlcz86IEZpbGVMaXN0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmIChmaWxlcykge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkRmlsZXMgPSB0aGlzLiNmaWxlQXR0YWNobWVudFNlcnZpY2UuY2hlY2tGaWxlcyhcbiAgICAgICAgZmlsZXMsXG4gICAgICAgIHRoaXMubWluRmlsZVNpemUsXG4gICAgICAgIHRoaXMubWF4RmlsZVNpemUsXG4gICAgICAgIHRoaXMuYWNjZXB0ZWRUeXBlcyxcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZuLFxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHByb2Nlc3NlZEZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlLmVycm9yVHlwZSkge1xuICAgICAgICAgIHRoaXMuI2VtaXRGaWxlQ2hhbmdlRXZlbnQoZmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jbG9hZEZpbGUoZmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjc2V0RmlsZU5hbWUoZmlsZT86IFNreUZpbGVJdGVtKTogdm9pZCB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGNvbnN0IGRyb3BOYW1lID1cbiAgICAgICAgdGhpcy4jZmlsZUl0ZW1TZXJ2aWNlLmlzRmlsZShmaWxlKSAmJiBmaWxlLmZpbGUubmFtZVxuICAgICAgICAgID8gZmlsZS5maWxlLm5hbWVcbiAgICAgICAgICA6IGZpbGUudXJsO1xuXG4gICAgICB0aGlzLmZpbGVOYW1lID0gZHJvcE5hbWU7XG5cbiAgICAgIGlmIChkcm9wTmFtZS5sZW5ndGggPiAyNikge1xuICAgICAgICB0aGlzLnRydW5jYXRlZEZpbGVOYW1lID0gZHJvcE5hbWUuc2xpY2UoMCwgMjYpICsgJy4uLic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRydW5jYXRlZEZpbGVOYW1lID0gZHJvcE5hbWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZU5hbWUgPSAnJztcbiAgICAgIHRoaXMudHJ1bmNhdGVkRmlsZU5hbWUgPSAnJztcbiAgICB9XG4gIH1cblxuICAjdXBkYXRlRmlsZUF0dGFjaG1lbnRCdXR0b24oKTogdm9pZCB7XG4gICAgdGhpcy5zaG93RmlsZUF0dGFjaG1lbnRCdXR0b24gPSAhKFxuICAgICAgdGhpcy52YWx1ZSAmJiB0aGlzLmN1cnJlbnRUaGVtZU5hbWUgPT09ICdtb2Rlcm4nXG4gICAgKTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24sIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAjb25DaGFuZ2UgPSAoXzogYW55KTogdm9pZCA9PiB7XG4gICAgcmV0dXJuO1xuICB9O1xuICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICNvblRvdWNoZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgcmV0dXJuO1xuICB9O1xufVxuIiwiPGRpdiBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtd3JhcHBlclwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LWxhYmVsLXdyYXBwZXJcIlxuICAgIFthdHRyLmlkXT1cImxhYmVsRWxlbWVudElkXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2t5LWNvbnRyb2wtbGFiZWwtcmVxdWlyZWQnOiAhbGFiZWxUZXh0ICYmIHJlcXVpcmVkICYmIGhhc0xhYmVsQ29tcG9uZW50XG4gICAgfVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGFiZWxUZXh0OyBlbHNlIGxhYmVsQ29udGVudFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgKm5nSWY9XCIhbGFiZWxIaWRkZW5cIlxuICAgICAgICBjbGFzcz1cInNreS1jb250cm9sLWxhYmVsIHNreS1tYXJnaW4taW5saW5lLXhzXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdza3ktY29udHJvbC1sYWJlbC1yZXF1aXJlZCc6IHJlcXVpcmVkXG4gICAgICAgIH1cIlxuICAgICAgICA+e3sgbGFiZWxUZXh0IH19PC9zcGFuXG4gICAgICA+PHNreS1oZWxwLWlubGluZVxuICAgICAgICAqbmdJZj1cImhlbHBQb3BvdmVyQ29udGVudCB8fCBoZWxwS2V5XCJcbiAgICAgICAgW2xhYmVsVGV4dF09XCJsYWJlbFRleHRcIlxuICAgICAgICBbaGVscEtleV09XCJoZWxwS2V5XCJcbiAgICAgICAgW3BvcG92ZXJUaXRsZV09XCJoZWxwUG9wb3ZlclRpdGxlXCJcbiAgICAgICAgW3BvcG92ZXJDb250ZW50XT1cImhlbHBQb3BvdmVyQ29udGVudFwiXG4gICAgICAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxzcGFuXG4gICAgICBjbGFzcz1cInNreS1zY3JlZW4tcmVhZGVyLW9ubHlcIlxuICAgICAgKm5nSWY9XCJyZXF1aXJlZCAmJiAoaGFzTGFiZWxDb21wb25lbnQgfHwgbGFiZWxUZXh0KVwiXG4gICAgICA+e3sgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9yZXF1aXJlZCcgfCBza3lMaWJSZXNvdXJjZXMgfX08L3NwYW5cbiAgICA+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LXVwbG9hZCBza3ktZmlsZS1hdHRhY2htZW50IHNreS1maWxlLWF0dGFjaG1lbnQtdGFyZ2V0XCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnc2t5LWZpbGUtYXR0YWNobWVudC1hY2NlcHQnOiBhY2NlcHRlZE92ZXIsXG4gICAgICAnc2t5LWZpbGUtYXR0YWNobWVudC1yZWplY3QnOiByZWplY3RlZE92ZXJcbiAgICB9XCJcbiAgICAoZHJhZ2VudGVyKT1cImZpbGVEcmFnRW50ZXIoJGV2ZW50KVwiXG4gICAgKGRyYWdvdmVyKT1cImZpbGVEcmFnT3ZlcigkZXZlbnQpXCJcbiAgICAoZHJhZ2xlYXZlKT1cImZpbGVEcmFnTGVhdmUoJGV2ZW50KVwiXG4gICAgKGRyb3ApPVwiZmlsZURyb3AoJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2XG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgY2xhc3M9XCJza3ktc2NyZWVuLXJlYWRlci1vbmx5XCJcbiAgICAgIHJvbGU9XCJ0b29sdGlwXCJcbiAgICAgIFthdHRyLmlkXT1cImZpbGVEcm9wRGVzY3JpcHRpb25FbGVtZW50SWRcIlxuICAgID5cbiAgICAgIHt7ICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV91cGxvYWRfZHJhZ19vcl9jbGljaycgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICA8L2Rpdj5cbiAgICA8aW5wdXRcbiAgICAgIGhpZGRlblxuICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICBbYXR0ci5hY2NlcHRdPVwiYWNjZXB0ZWRUeXBlcyB8fCBudWxsXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50KVwiXG4gICAgICAjZmlsZUlucHV0XG4gICAgLz5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpbGVBdHRhY2htZW50QnV0dG9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd0ZpbGVBdHRhY2htZW50QnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LWJ0biBza3ktYnRuIHNreS1idG4tZGVmYXVsdFwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBza3lJZFxuICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIlxuICAgICAgICAgIChoaW50VGV4dCA/IGhpbnRUZXh0RWwuaWQgKyAnICcgOiAnJykgKyBmaWxlRHJvcERlc2NyaXB0aW9uRWxlbWVudElkXG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgID8gKCdza3l1eF9maWxlX2F0dGFjaG1lbnRfYnV0dG9uX2xhYmVsX3JlcGxhY2VfZmlsZV9sYWJlbCdcbiAgICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXM6IGZpbGVOYW1lKVxuICAgICAgICAgICAgOiAoJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9idXR0b25fbGFiZWxfY2hvb3NlX2ZpbGVfbGFiZWwnXG4gICAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzKVxuICAgICAgICBcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgYXR0YWNoQnV0dG9uLmlkICtcbiAgICAgICAgICAnICcgK1xuICAgICAgICAgIChsYWJlbFRleHRcbiAgICAgICAgICAgID8gbGFiZWxFbGVtZW50SWRcbiAgICAgICAgICAgIDogaGFzTGFiZWxDb21wb25lbnRcbiAgICAgICAgICAgICAgPyBsYWJlbENvbXBvbmVudHM/LmdldCgwKT8ubGFiZWxDb250ZW50SWQ/LmlkXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkKVxuICAgICAgICBcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAoY2xpY2spPVwib25Ecm9wQ2xpY2tlZCgpXCJcbiAgICAgICAgI2F0dGFjaEJ1dHRvbj1cInNreUlkXCJcbiAgICAgID5cbiAgICAgICAgPHNreS1pY29uIGljb249XCJmb2xkZXItb3Blbi1vXCIgLz5cbiAgICAgICAge3tcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgPyAoJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9idXR0b25fbGFiZWxfcmVwbGFjZV9maWxlJ1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgICAgIDogKCdza3l1eF9maWxlX2F0dGFjaG1lbnRfYnV0dG9uX2xhYmVsX2Nob29zZV9maWxlJ1xuICAgICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcylcbiAgICAgICAgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxza3ktaWNvblxuICAgICAgKm5nSWY9XCJ2YWx1ZSAmJiAhaXNJbWFnZSAmJiBjdXJyZW50VGhlbWVOYW1lID09PSAnbW9kZXJuJ1wiXG4gICAgICBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtaWNvbiBza3ktZGVlbXBoYXNpemVkXCJcbiAgICAgIGljb249XCJmaWxlLW9cIlxuICAgICAgc2l6ZT1cIjJ4XCJcbiAgICAvPlxuICAgIDxzcGFuXG4gICAgICAqbmdJZj1cInZhbHVlIHx8IGN1cnJlbnRUaGVtZU5hbWUgPT09ICdkZWZhdWx0J1wiXG4gICAgICBjbGFzcz1cInNreS1maWxlLWF0dGFjaG1lbnQtbmFtZVwiXG4gICAgPlxuICAgICAgPGFcbiAgICAgICAgKm5nSWY9XCJ2YWx1ZTsgZWxzZSBub0ZpbGVcIlxuICAgICAgICBbYXR0ci50aXRsZV09XCJmaWxlTmFtZVwiXG4gICAgICAgIChjbGljayk9XCJlbWl0Q2xpY2soKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHRydW5jYXRlZEZpbGVOYW1lIH19XG4gICAgICA8L2E+XG4gICAgPC9zcGFuPlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9GaWxlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJza3ktZmlsZS1hdHRhY2htZW50LW5vbmUgc2t5LWRlZW1waGFzaXplZFwiPlxuICAgICAgICB7eyAnc2t5dXhfZmlsZV9hdHRhY2htZW50X2xhYmVsX25vX2ZpbGVfY2hvc2VuJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgPC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJ2YWx1ZVwiXG4gICAgICBjbGFzcz1cInNreS1idG4gc2t5LWJ0bi1ib3JkZXJsZXNzIHNreS1maWxlLWF0dGFjaG1lbnQtZGVsZXRlXCJcbiAgICAgIHNreUlkXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV9pdGVtX3JlbW92ZScgfCBza3lMaWJSZXNvdXJjZXM6IGZpbGVOYW1lXG4gICAgICBcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIlxuICAgICAgICBkZWxldGVCdXR0b24uaWQgK1xuICAgICAgICAnICcgK1xuICAgICAgICAoaGFzTGFiZWxDb21wb25lbnRcbiAgICAgICAgICA/IGxhYmVsQ29tcG9uZW50cz8uZ2V0KDApPy5sYWJlbENvbnRlbnRJZD8uaWRcbiAgICAgICAgICA6IHVuZGVmaW5lZClcbiAgICAgIFwiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgICAnc2t5LWJ0bi1pY29uLWJvcmRlcmxlc3MnOiAnbW9kZXJuJ1xuICAgICAgfVwiXG4gICAgICAoY2xpY2spPVwiZGVsZXRlRmlsZUF0dGFjaG1lbnQoKVwiXG4gICAgICAjZGVsZXRlQnV0dG9uPVwic2t5SWRcIlxuICAgID5cbiAgICAgIDxza3ktaWNvbiBpY29uPVwidHJhc2gtb1wiIHNpemU9XCJtZFwiIC8+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxpbWdcbiAgICAqbmdJZj1cInZhbHVlICYmIGlzSW1hZ2VcIlxuICAgIGNsYXNzPVwic2t5LWZpbGUtYXR0YWNobWVudC1wcmV2aWV3LWltZ1wiXG4gICAgW2FsdF09XCJcbiAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV91cGxvYWRfaW1hZ2VfcHJldmlld19hbHRfdGV4dCdcbiAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICBcIlxuICAgIFtzcmNdPVwidmFsdWUudXJsXCJcbiAgLz5cbjwvZGl2PlxuPGRpdiBza3lJZCAjaGludFRleHRFbD1cInNreUlkXCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cImhpbnRUZXh0XCJcbiAgICBjbGFzcz1cInNreS1mb250LWRlZW1waGFzaXplZCBza3ktZmlsZS1hdHRhY2htZW50LWhpbnQtdGV4dFwiXG4gID5cbiAgICB7eyBoaW50VGV4dCB9fVxuICA8L2Rpdj5cbjwvZGl2PlxuXG48c2t5LWZvcm0tZXJyb3JzXG4gICpuZ0lmPVwibGFiZWxUZXh0ICYmIChuZ0NvbnRyb2w/LmNvbnRyb2w/LmVycm9ycyB8fCBmaWxlRXJyb3JWYWxpZGF0aW9uKVwiXG4gIFtpZF09XCJlcnJvcklkXCJcbiAgW2Vycm9yc109XCJcbiAgICBuZ0NvbnRyb2w/LmVycm9ycyAhPT0gbnVsbCA/IG5nQ29udHJvbD8uZXJyb3JzIDogZmlsZUVycm9yVmFsaWRhdGlvblxuICBcIlxuICBbbGFiZWxUZXh0XT1cImxhYmVsVGV4dFwiXG4gIFtzaG93RXJyb3JzXT1cIm5nQ29udHJvbD8udG91Y2hlZCB8fCBuZ0NvbnRyb2w/LmRpcnR5XCJcbj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwic2t5LWZvcm0tZXJyb3JcIiAvPlxuICA8c2t5LWZvcm0tZXJyb3JcbiAgICAqbmdJZj1cImZpbGVFcnJvck5hbWUgPT09ICdmaWxlVHlwZSdcIlxuICAgIFtlcnJvck5hbWVdPVwiJ2ZpbGVUeXBlJ1wiXG4gICAgW2Vycm9yVGV4dF09XCJcbiAgICAgICdza3l1eF9maWxlX2F0dGFjaG1lbnRfZmlsZV90eXBlX2Vycm9yX2xhYmVsX3RleHQnXG4gICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiBmaWxlRXJyb3JQYXJhbVxuICAgIFwiXG4gIC8+XG4gIDxza3ktZm9ybS1lcnJvclxuICAgICpuZ0lmPVwiZmlsZUVycm9yTmFtZSA9PT0gJ21heEZpbGVTaXplJ1wiXG4gICAgW2Vycm9yTmFtZV09XCInbWF4RmlsZVNpemUnXCJcbiAgICBbZXJyb3JUZXh0XT1cIlxuICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9tYXhfZmlsZV9zaXplX2Vycm9yX2xhYmVsX3RleHQnXG4gICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiBmaWxlRXJyb3JQYXJhbVxuICAgIFwiXG4gIC8+XG4gIDxza3ktZm9ybS1lcnJvclxuICAgICpuZ0lmPVwiZmlsZUVycm9yTmFtZSA9PT0gJ21pbkZpbGVTaXplJ1wiXG4gICAgW2Vycm9yTmFtZV09XCInbWluRmlsZVNpemUnXCJcbiAgICBbZXJyb3JUZXh0XT1cIlxuICAgICAgJ3NreXV4X2ZpbGVfYXR0YWNobWVudF9taW5fZmlsZV9zaXplX2Vycm9yX2xhYmVsX3RleHQnXG4gICAgICAgIHwgc2t5TGliUmVzb3VyY2VzOiBmaWxlRXJyb3JQYXJhbVxuICAgIFwiXG4gIC8+XG48L3NreS1mb3JtLWVycm9ycz5cblxuPG5nLXRlbXBsYXRlICNsYWJlbENvbnRlbnQ+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cInNreS1maWxlLWF0dGFjaG1lbnQtbGFiZWxcIiAvPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==