@recursyve/nice-ui-kit.v2 14.0.0-beta.119 → 14.0.0-beta.120

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.
@@ -25,7 +25,7 @@ export class NiceAssetsCarouselComponent {
25
25
  this.color = this.defaultColor;
26
26
  this.edit = false;
27
27
  this.loading = false;
28
- this.accept = ["image/*"];
28
+ this.accept = [];
29
29
  this.customActions = [];
30
30
  this.multipleUpload = false;
31
31
  this.visiblePreviewAsset = 4;
@@ -33,6 +33,7 @@ export class NiceAssetsCarouselComponent {
33
33
  this.activeChange = new EventEmitter();
34
34
  this.removedAsset = new EventEmitter();
35
35
  this.listStyle = { transform: "translateX(0px)" };
36
+ this._imagesMimeTypes = ["image/png", "image/jpeg", "image/webp", "image/avif"];
36
37
  if (!this.options) {
37
38
  this.options = {
38
39
  actionButtons: {
@@ -94,6 +95,20 @@ export class NiceAssetsCarouselComponent {
94
95
  || this._active >= this.visiblePreviewAsset;
95
96
  this.activeChange.emit(this._active);
96
97
  }
98
+ ngOnInit() {
99
+ if (!this.accept?.length) {
100
+ this.accept = [...this._imagesMimeTypes];
101
+ }
102
+ }
103
+ ngOnChanges(changes) {
104
+ if ("accept" in changes && this.accept) {
105
+ const index = this.accept.indexOf("image/*");
106
+ if (index >= 0) {
107
+ this.accept.splice(index, 1);
108
+ this.accept.push(...this._imagesMimeTypes);
109
+ }
110
+ }
111
+ }
97
112
  writeValue(assets) {
98
113
  this._assets = assets ?? [];
99
114
  if (this._assets.length === 0) {
@@ -136,39 +151,27 @@ export class NiceAssetsCarouselComponent {
136
151
  this.activeAsset = index;
137
152
  }
138
153
  async onFilesChange(event) {
139
- let files = event.target?.files;
140
- if (this.imagesProcessor) {
141
- files = await this.getProcessedFiles(files);
142
- }
154
+ const files = event.target?.files;
143
155
  await this.onFilesDrop(files);
144
156
  this.inputElement.nativeElement.value = "";
145
157
  }
146
- async onFilesDrop(files) {
158
+ async onFilesDrop(fileList) {
159
+ let files = this.filterOutUnsupportedFiles(fileList);
160
+ if (this.imagesProcessor) {
161
+ files = await this.getProcessedFiles(files);
162
+ }
147
163
  if (!files?.length) {
148
164
  return;
149
165
  }
150
- let newAssetsAdded = false;
151
- for (let i = 0; i < files.length; i++) {
152
- const file = files.item(i);
153
- if (!this.accept.some((accept) => {
154
- if (accept.endsWith("*")) {
155
- return file.type.startsWith(accept.replace("*", ""));
156
- }
157
- return accept === file.type;
158
- })) {
159
- continue;
160
- }
161
- newAssetsAdded = true;
166
+ for (const file of files) {
162
167
  this._assets.push({
163
168
  file,
164
169
  type: file.type.split("/").shift(),
165
170
  base64: await FileUtils.getDataUrl(file)
166
171
  });
167
172
  }
168
- if (newAssetsAdded) {
169
- this.clickAsset(this._assets.length - 1);
170
- this.propagate?.(this._assets);
171
- }
173
+ this.clickAsset(this._assets.length - 1);
174
+ this.propagate?.(this._assets);
172
175
  }
173
176
  clickRemove() {
174
177
  this.removedAsset.emit(this._assets[this._active]);
@@ -191,11 +194,31 @@ export class NiceAssetsCarouselComponent {
191
194
  await this._activeVideoElement.nativeElement.play();
192
195
  await this._assetsElement.get(this._active).nativeElement.firstElementChild.play();
193
196
  }
197
+ filterOutUnsupportedFiles(fileList) {
198
+ const files = [];
199
+ for (let i = 0; i < fileList.length; i++) {
200
+ const file = fileList.item(i);
201
+ if (this.accept.some((accept) => {
202
+ if (accept.endsWith("*")) {
203
+ return file.type.startsWith(accept.replace("*", ""));
204
+ }
205
+ return accept === file.type;
206
+ })) {
207
+ files.push(file);
208
+ }
209
+ }
210
+ return files;
211
+ }
194
212
  async getProcessedFiles(files) {
195
213
  try {
214
+ if (!files.length) {
215
+ return null;
216
+ }
196
217
  return await this.imagesProcessor(files);
197
218
  }
198
- catch (e) { }
219
+ catch (e) {
220
+ return null;
221
+ }
199
222
  }
200
223
  }
201
224
  NiceAssetsCarouselComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NiceAssetsCarouselComponent, deps: [{ token: NICE_ASSETS_CAROUSEL_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Component });
@@ -205,7 +228,7 @@ NiceAssetsCarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.
205
228
  useExisting: forwardRef(() => NiceAssetsCarouselComponent),
206
229
  multi: true
207
230
  }
208
- ], queries: [{ propertyName: "activeContent", first: true, predicate: NiceAssetsCarouselActiveContentDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "activeVideoElement", first: true, predicate: ["activeVideo"], descendants: true }, { propertyName: "assetsElement", predicate: ["assets"], descendants: true }], ngImport: i0, template: "<div class=\"carousel-container\" niceDropzone (filesDropped)=\"onFilesDrop($event)\">\n <div\n class=\"active-image\"\n matRipple\n [class.empty-state]=\"!_activeAsset\"\n (click)=\"edit && fileInput.click();\n $event.stopPropagation()\"\n >\n <div *ngIf=\"loading\" class=\"flex flex-row justify-center items-center h-full\">\n <mat-spinner [diameter]=\"32\"></mat-spinner>\n </div>\n <ng-container *ngIf=\"!loading\">\n <ng-container\n *ngIf=\"_activeAsset && activeContent\"\n [ngTemplateOutlet]=\"activeContent\"\n [ngTemplateOutletContext]=\"{ $implicit: _activeAsset}\"\n ></ng-container>\n <img\n *ngIf=\"_activeAsset?.type === 'image'\"\n (mouseover)=\"showOverlay=true\"\n [src]=\"_activeAsset.url ?? _activeAsset.base64\"\n draggable=\"false\"\n class=\"relative\"\n alt=\"active-image\"\n >\n <video #activeVideo *ngIf=\"_activeAsset?.type === 'video'\" draggable=\"false\" loop [src]=\"_activeAsset.url ?? _activeAsset.base64\"></video>\n\n <div class=\"empty-state-content\" *ngIf=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n <div class=\"text\">\n {{ \"nice_ui_kit.assets_carousel.upload_here\" | translate }}\n </div>\n </div>\n\n <div *ngIf=\"_activeAsset && showOverlay && edit\" class=\"active-image-overlay\">\n <div\n (mouseout)=\"showOverlay=false\"\n class=\"flex flex-col justify-center items-center w-full h-full\"\n >\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n </div>\n </div>\n\n <div *ngIf=\"edit\" class=\"active-buttons\">\n <button mat-icon-button (click)=\"fileInput.click(); $event.stopPropagation()\">\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.matIcon\">{{ options.actionButtons.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.svgIcon\" [svgIcon]=\"options.actionButtons.addPhoto.svgIcon\"></mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"assetActions\" (click)=\"$event.stopPropagation()\" [disabled]=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.matIcon\">{{ options.actionButtons.moreOptions.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.svgIcon\" [svgIcon]=\"options.actionButtons.moreOptions.svgIcon\"></mat-icon>\n </button>\n <mat-menu class=\"nice-asset-options-menu\" [xPosition]=\"'before'\" #assetActions=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let action of customActions\"\n (click)=\"clickCustom(action)\"\n >\n <mat-icon *ngIf=\"action.icon.matIcon\">{{ action.icon.matIcon }}</mat-icon>\n <mat-icon [svgIcon]=\"action.icon.svgIcon\" *ngIf=\"action.icon.svgIcon\"></mat-icon>\n <span>{{ action.name | translate }}</span>\n </button>\n <button mat-menu-item (click)=\"clickRemove()\">\n <mat-icon *ngIf=\"options.actionButtons.remove.matIcon\">{{ options.actionButtons.remove.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.remove.svgIcon\" [svgIcon]=\"options.actionButtons.remove.svgIcon\"></mat-icon>\n <span>{{ \"nice_ui_kit.assets_carousel.delete\" | translate }}</span>\n </button>\n </mat-menu>\n </div>\n </ng-container>\n </div>\n\n <div class=\"carousel\">\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button left-arrow\" mat-icon-button [disabled]=\"!_active\" (click)=\"clickLeft()\">\n <mat-icon *ngIf=\"options.leftArrow.matIcon\">{{ options.leftArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.leftArrow.svgIcon\" [svgIcon]=\"options.leftArrow.svgIcon\"></mat-icon>\n </button>\n <div class=\"asset-list-container\">\n <div *ngIf=\"showAddAssetContainer && edit\" class=\"add-asset-container\">\n <div class=\"add-asset\" matRipple (click)=\"fileInput.click()\">\n <mat-icon *ngIf=\"options.addPhoto.matIcon\">{{ options.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.addPhoto.svgIcon\" [svgIcon]=\"options.addPhoto.svgIcon\"></mat-icon>\n </div>\n </div>\n <div class=\"asset-list\" [ngStyle]=\"listStyle\">\n <div\n #assets\n class=\"asset\"\n *ngFor=\"let asset of _assets; let i = index\"\n (click)=\"clickAsset(i)\"\n [ngClass]=\"color\"\n [class.active]=\"_active === i\"\n >\n <ng-container>\n <img\n *ngIf=\"asset.type === 'image'\"\n draggable=\"false\"\n [src]=\"asset.url ?? asset.base64\"\n alt=\"add-image\"\n />\n <video\n *ngIf=\"asset.type === 'video'\"\n draggable=\"false\"\n loop\n [src]=\"asset.url ?? asset.base64\"\n ></video>\n </ng-container>\n </div>\n </div>\n </div>\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button right-arrow\" mat-icon-button [disabled]=\"_lastAsset\" (click)=\"clickRight()\">\n <mat-icon *ngIf=\"options.rightArrow.matIcon\">{{ options.rightArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.rightArrow.svgIcon\" [svgIcon]=\"options.rightArrow.svgIcon\"></mat-icon>\n </button>\n </div>\n</div>\n\n<input #fileInput type=\"file\" hidden [accept]=\"accept\" (change)=\"onFilesChange($event)\" [multiple]=\"multipleUpload\">\n", styles: [":root{--nice-assets-carousel-asset-width: 90px;--nice-assets-carousel-asset-height: 60px;--nice-assets-carousel-asset-gap: .75rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i6.NiceDropzoneDirective, selector: "[niceDropzone]", outputs: ["filesDropped"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], animations: niceAnimations, encapsulation: i0.ViewEncapsulation.None });
231
+ ], queries: [{ propertyName: "activeContent", first: true, predicate: NiceAssetsCarouselActiveContentDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "activeVideoElement", first: true, predicate: ["activeVideo"], descendants: true }, { propertyName: "assetsElement", predicate: ["assets"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"carousel-container\" niceDropzone (filesDropped)=\"onFilesDrop($event)\">\n <div\n class=\"active-image\"\n matRipple\n [class.empty-state]=\"!_activeAsset\"\n (click)=\"edit && fileInput.click();\n $event.stopPropagation()\"\n >\n <div *ngIf=\"loading\" class=\"flex flex-row justify-center items-center h-full\">\n <mat-spinner [diameter]=\"32\"></mat-spinner>\n </div>\n <ng-container *ngIf=\"!loading\">\n <ng-container\n *ngIf=\"_activeAsset && activeContent\"\n [ngTemplateOutlet]=\"activeContent\"\n [ngTemplateOutletContext]=\"{ $implicit: _activeAsset}\"\n ></ng-container>\n <img\n *ngIf=\"_activeAsset?.type === 'image'\"\n (mouseover)=\"showOverlay=true\"\n [src]=\"_activeAsset.url ?? _activeAsset.base64\"\n draggable=\"false\"\n class=\"relative\"\n alt=\"active-image\"\n >\n <video #activeVideo *ngIf=\"_activeAsset?.type === 'video'\" draggable=\"false\" loop [src]=\"_activeAsset.url ?? _activeAsset.base64\"></video>\n\n <div class=\"empty-state-content\" *ngIf=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n <div class=\"text\">\n {{ \"nice_ui_kit.assets_carousel.upload_here\" | translate }}\n </div>\n </div>\n\n <div *ngIf=\"_activeAsset && showOverlay && edit\" class=\"active-image-overlay\">\n <div\n (mouseout)=\"showOverlay=false\"\n class=\"flex flex-col justify-center items-center w-full h-full\"\n >\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n </div>\n </div>\n\n <div *ngIf=\"edit\" class=\"active-buttons\">\n <button mat-icon-button (click)=\"fileInput.click(); $event.stopPropagation()\">\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.matIcon\">{{ options.actionButtons.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.svgIcon\" [svgIcon]=\"options.actionButtons.addPhoto.svgIcon\"></mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"assetActions\" (click)=\"$event.stopPropagation()\" [disabled]=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.matIcon\">{{ options.actionButtons.moreOptions.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.svgIcon\" [svgIcon]=\"options.actionButtons.moreOptions.svgIcon\"></mat-icon>\n </button>\n <mat-menu class=\"nice-asset-options-menu\" [xPosition]=\"'before'\" #assetActions=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let action of customActions\"\n (click)=\"clickCustom(action)\"\n >\n <mat-icon *ngIf=\"action.icon.matIcon\">{{ action.icon.matIcon }}</mat-icon>\n <mat-icon [svgIcon]=\"action.icon.svgIcon\" *ngIf=\"action.icon.svgIcon\"></mat-icon>\n <span>{{ action.name | translate }}</span>\n </button>\n <button mat-menu-item (click)=\"clickRemove()\">\n <mat-icon *ngIf=\"options.actionButtons.remove.matIcon\">{{ options.actionButtons.remove.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.remove.svgIcon\" [svgIcon]=\"options.actionButtons.remove.svgIcon\"></mat-icon>\n <span>{{ \"nice_ui_kit.assets_carousel.delete\" | translate }}</span>\n </button>\n </mat-menu>\n </div>\n </ng-container>\n </div>\n\n <div class=\"carousel\">\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button left-arrow\" mat-icon-button [disabled]=\"!_active\" (click)=\"clickLeft()\">\n <mat-icon *ngIf=\"options.leftArrow.matIcon\">{{ options.leftArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.leftArrow.svgIcon\" [svgIcon]=\"options.leftArrow.svgIcon\"></mat-icon>\n </button>\n <div class=\"asset-list-container\">\n <div *ngIf=\"showAddAssetContainer && edit\" class=\"add-asset-container\">\n <div class=\"add-asset\" matRipple (click)=\"fileInput.click()\">\n <mat-icon *ngIf=\"options.addPhoto.matIcon\">{{ options.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.addPhoto.svgIcon\" [svgIcon]=\"options.addPhoto.svgIcon\"></mat-icon>\n </div>\n </div>\n <div class=\"asset-list\" [ngStyle]=\"listStyle\">\n <div\n #assets\n class=\"asset\"\n *ngFor=\"let asset of _assets; let i = index\"\n (click)=\"clickAsset(i)\"\n [ngClass]=\"color\"\n [class.active]=\"_active === i\"\n >\n <ng-container>\n <img\n *ngIf=\"asset.type === 'image'\"\n draggable=\"false\"\n [src]=\"asset.url ?? asset.base64\"\n alt=\"add-image\"\n />\n <video\n *ngIf=\"asset.type === 'video'\"\n draggable=\"false\"\n loop\n [src]=\"asset.url ?? asset.base64\"\n ></video>\n </ng-container>\n </div>\n </div>\n </div>\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button right-arrow\" mat-icon-button [disabled]=\"_lastAsset\" (click)=\"clickRight()\">\n <mat-icon *ngIf=\"options.rightArrow.matIcon\">{{ options.rightArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.rightArrow.svgIcon\" [svgIcon]=\"options.rightArrow.svgIcon\"></mat-icon>\n </button>\n </div>\n</div>\n\n<input #fileInput type=\"file\" hidden [accept]=\"accept\" (change)=\"onFilesChange($event)\" [multiple]=\"multipleUpload\">\n", styles: [":root{--nice-assets-carousel-asset-width: 90px;--nice-assets-carousel-asset-height: 60px;--nice-assets-carousel-asset-gap: .75rem}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i6.NiceDropzoneDirective, selector: "[niceDropzone]", outputs: ["filesDropped"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }], animations: niceAnimations, encapsulation: i0.ViewEncapsulation.None });
209
232
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NiceAssetsCarouselComponent, decorators: [{
210
233
  type: Component,
211
234
  args: [{ selector: "nice-assets-carousel", encapsulation: ViewEncapsulation.None, animations: niceAnimations, providers: [
@@ -257,4 +280,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.3", ngImpor
257
280
  }], assets: [{
258
281
  type: Input
259
282
  }] } });
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLWNhcm91c2VsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9hc3NldHMtY2Fyb3VzZWwvYXNzZXRzLWNhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9hc3NldHMtY2Fyb3VzZWwvYXNzZXRzLWNhcm91c2VsLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7Ozs7Ozs7O0FBNENqSCxNQUFNLE9BQU8sMkJBQTJCO0lBc0dwQyxZQUE4RSxPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQXJHekcsK0JBQTBCLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUUzQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FB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LEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUl0RSxZQUFZO3NCQURsQixNQUFNO2dCQUlBLFlBQVk7c0JBRGxCLE1BQU07Z0JBVUksa0JBQWtCO3NCQUQ1QixTQUFTO3VCQUFDLGFBQWE7Z0JBWWIsYUFBYTtzQkFEdkIsWUFBWTt1QkFBQyxRQUFRO2dCQVlYLE1BQU07c0JBRGhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBDYW5Db2xvciwgVGhlbWVQYWxldHRlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcbmltcG9ydCB7IG5pY2VBbmltYXRpb25zIH0gZnJvbSBcIi4uLy4uL2FuaW1hdGlvbnNcIjtcbmltcG9ydCB7IEZpbGVVdGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuaW1wb3J0IHsgTklDRV9BU1NFVFNfQ0FST1VTRUxfT1BUSU9OUyB9IGZyb20gXCIuL2Fzc2V0cy1jYXJvdXNlbC5jb25zdGFudFwiO1xuaW1wb3J0IHsgTmljZUFzc2V0c0Nhcm91c2VsQWN0aXZlQ29udGVudERpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvYXNzZXRzLWNhcm91c2VsLWFjdGl2ZS1jb250ZW50LmRpcmVjdGl2ZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5pY2VBc3NldHMge1xuICAgIHR5cGU6IFwiaW1hZ2VcIiB8IFwidmlkZW9cIjtcbiAgICBpZD86IG51bWJlciB8IHN0cmluZztcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgYmFzZTY0Pzogc3RyaW5nO1xuICAgIGZpbGU/OiBGaWxlO1xufVxuXG5leHBvcnQgdHlwZSBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uID0geyBtYXRJY29uOiBzdHJpbmc7IHN2Z0ljb24/OiBzdHJpbmc7IH0gfCB7IG1hdEljb24/OiBzdHJpbmc7IHN2Z0ljb246IHN0cmluZzsgfTtcblxuZXhwb3J0IGludGVyZmFjZSBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25zIHtcbiAgICBpY29uOiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhY3Rpb246IChhY3RpdmU6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOaWNlQXNzZXRzQ2Fyb3VzZWxPcHRpb25zIHtcbiAgICBhY3Rpb25CdXR0b25zPzoge1xuICAgICAgICBtb3JlT3B0aW9ucz86IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbkljb247XG4gICAgICAgIGFkZFBob3RvPzogTmljZUFzc2V0c0Nhcm91c2VsQWN0aW9uSWNvbjtcbiAgICAgICAgcmVtb3ZlPzogTmljZUFzc2V0c0Nhcm91c2VsQWN0aW9uSWNvbjtcbiAgICB9O1xuICAgIGFkZFBob3RvPzogTmljZUFzc2V0c0Nhcm91c2VsQWN0aW9uSWNvbjtcbiAgICBsZWZ0QXJyb3c/OiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uO1xuICAgIHJpZ2h0QXJyb3c/OiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uO1xuICAgIHVwbG9hZD86IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbkljb247XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm5pY2UtYXNzZXRzLWNhcm91c2VsXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiYXNzZXRzLWNhcm91c2VsLnRlbXBsYXRlLmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcImFzc2V0cy1jYXJvdXNlbC50aGVtZS5zY3NzXCJdLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgYW5pbWF0aW9uczogbmljZUFuaW1hdGlvbnMsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmljZUFzc2V0c0Nhcm91c2VsQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIE5pY2VBc3NldHNDYXJvdXNlbENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBDYW5Db2xvciB7XG4gICAgcHVibGljIF9hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uID0gMDtcbiAgICBwdWJsaWMgX2FjdGl2ZSA9IDA7XG4gICAgcHVibGljIF9hc3NldHM6IE5pY2VBc3NldHNbXSA9IFtdO1xuICAgIHB1YmxpYyBfYWN0aXZlQXNzZXQ6IE5pY2VBc3NldHM7XG4gICAgcHVibGljIF9sYXN0QXNzZXQgPSB0cnVlO1xuICAgIHB1YmxpYyBfc2hvdWxkVHJhbnNmb3JtID0gZmFsc2U7XG4gICAgcHVibGljIF9hY3RpdmVWaWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG4gICAgcHVibGljIF9hc3NldHNFbGVtZW50OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+O1xuICAgIHB1YmxpYyBkZWZhdWx0Q29sb3I6IFRoZW1lUGFsZXR0ZSA9IFwicHJpbWFyeVwiO1xuXG4gICAgQFZpZXdDaGlsZChcImZpbGVJbnB1dFwiKVxuICAgIHB1YmxpYyBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2xvcjogVGhlbWVQYWxldHRlID0gdGhpcy5kZWZhdWx0Q29sb3I7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlZGl0ID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhY2NlcHQ6IHN0cmluZ1tdID0gW1wiaW1hZ2UvKlwiXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGN1c3RvbUFjdGlvbnM6IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbnNbXSA9IFtdO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaW1hZ2VzUHJvY2Vzc29yOiAoZmlsZUxpc3Q6IEZpbGVMaXN0KSA9PiBQcm9taXNlPEZpbGVMaXN0PjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlVXBsb2FkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2aXNpYmxlUHJldmlld0Fzc2V0ID0gNDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dBZGRBc3NldENvbnRhaW5lciA9IHRydWU7XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VBc3NldHNDYXJvdXNlbEFjdGl2ZUNvbnRlbnREaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgYWN0aXZlQ29udGVudDogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW1vdmVkQXNzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPE5pY2VBc3NldHM+KCk7XG5cbiAgICBwdWJsaWMgbGlzdFN0eWxlOiB7IHRyYW5zZm9ybTogc3RyaW5nIH0gPSB7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVYKDBweClcIiB9O1xuXG4gICAgcHVibGljIHNob3dPdmVybGF5OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGU6IChhc3NldHM6IE5pY2VBc3NldHNbXSkgPT4gdm9pZDtcblxuICAgIEBWaWV3Q2hpbGQoXCJhY3RpdmVWaWRlb1wiKVxuICAgIHB1YmxpYyBzZXQgYWN0aXZlVmlkZW9FbGVtZW50KGFjdGl2ZVZpZGVvRWxlbWVudDogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50Pikge1xuICAgICAgICB0aGlzLl9hY3RpdmVWaWRlb0VsZW1lbnQgPSBhY3RpdmVWaWRlb0VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmVWaWRlb0VsZW1lbnQgfHwgIXRoaXMuX2Fzc2V0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRTeW5jVmlkZW8oKTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkcmVuKFwiYXNzZXRzXCIpXG4gICAgcHVibGljIHNldCBhc3NldHNFbGVtZW50KGFzc2V0c0VsZW1lbnQ6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4pIHtcbiAgICAgICAgdGhpcy5fYXNzZXRzRWxlbWVudCA9IGFzc2V0c0VsZW1lbnQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmVWaWRlb0VsZW1lbnQgfHwgIXRoaXMuX2Fzc2V0c0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3RhcnRTeW5jVmlkZW8oKTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgYXNzZXRzKGFzc2V0czogTmljZUFzc2V0c1tdKSB7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShhc3NldHMgPz8gW10pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0IGFjdGl2ZVRyYW5zbGF0aW9uUG9zaXRpb24ocG9zaXRpb246IG51bWJlcikge1xuICAgICAgICB0aGlzLl9hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICAgIHRoaXMubGlzdFN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKGNhbGMoKHZhcigtLW5pY2UtYXNzZXRzLWNhcm91c2VsLWFzc2V0LXdpZHRoKSArIHZhcigtLW5pY2UtYXNzZXRzLWNhcm91c2VsLWFzc2V0LWdhcCkpICogJHtwb3NpdGlvbn0pKWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXQgYWN0aXZlQXNzZXQocG9zaXRpb246IG51bWJlcikge1xuICAgICAgICBpZiAocG9zaXRpb24gPCAwKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hY3RpdmUgPSBwb3NpdGlvbjtcbiAgICAgICAgdGhpcy5fYWN0aXZlQXNzZXQgPSB0aGlzLl9hc3NldHNbdGhpcy5fYWN0aXZlXTtcbiAgICAgICAgdGhpcy5fbGFzdEFzc2V0ID0gdGhpcy5fYWN0aXZlID09PSB0aGlzLl9hc3NldHMubGVuZ3RoIC0gMSB8fCAhdGhpcy5fYXNzZXRzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5fc2hvdWxkVHJhbnNmb3JtXG4gICAgICAgICAgICA9ICgodGhpcy5lZGl0ICYmIHRoaXMuc2hvd0FkZEFzc2V0Q29udGFpbmVyKSAmJiB0aGlzLl9hY3RpdmUgPj0gKHRoaXMudmlzaWJsZVByZXZpZXdBc3NldCAtIDEpKVxuICAgICAgICAgICAgfHwgdGhpcy5fYWN0aXZlID49IHRoaXMudmlzaWJsZVByZXZpZXdBc3NldDtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFuZ2UuZW1pdCh0aGlzLl9hY3RpdmUpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoTklDRV9BU1NFVFNfQ0FST1VTRUxfT1BUSU9OUykgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IE5pY2VBc3NldHNDYXJvdXNlbE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBhY3Rpb25CdXR0b25zOiB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFBob3RvOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRJY29uOiBcInBob3RvX2NhbWVyYVwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vcmVPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRJY29uOiBcIm1vcmVfdmVydFwiXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SWNvbjogXCJkZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhZGRQaG90bzoge1xuICAgICAgICAgICAgICAgICAgICBtYXRJY29uOiBcInBob3RvX2NhbWVyYVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsZWZ0QXJyb3c6IHtcbiAgICAgICAgICAgICAgICAgICAgbWF0SWNvbjogXCJjaGV2cm9uX2xlZnRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmlnaHRBcnJvdzoge1xuICAgICAgICAgICAgICAgICAgICBtYXRJY29uOiBcImNoZXZyb25fcmlnaHRcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgIG1hdEljb246IFwiZmlsZV91cGxvYWRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZShhc3NldHM6IE5pY2VBc3NldHNbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hc3NldHMgPSBhc3NldHMgPz8gW107XG5cbiAgICAgICAgaWYgKHRoaXMuX2Fzc2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUFzc2V0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RBc3NldCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fYXNzZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUFzc2V0ID0gdGhpcy5fYXNzZXRzW3RoaXMuX2FjdGl2ZV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKGFzc2V0czogTmljZUFzc2V0c1tdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoYXNzZXRzOiBOaWNlQXNzZXRzW10pID0+IHZvaWQpOiB2b2lkIHt9XG5cbiAgICBwdWJsaWMgY2xpY2tMZWZ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUFzc2V0ID0gdGhpcy5fYWN0aXZlIC0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uID0gdGhpcy5fYWN0aXZlVHJhbnNsYXRpb25Qb3NpdGlvbiArIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tSaWdodCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RBc3NldCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVBc3NldCA9IHRoaXMuX2FjdGl2ZSArIDE7XG4gICAgICAgIGlmICh0aGlzLl9zaG91bGRUcmFuc2Zvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlVHJhbnNsYXRpb25Qb3NpdGlvbiA9IHRoaXMuX2FjdGl2ZVRyYW5zbGF0aW9uUG9zaXRpb24gLSAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsaWNrQXNzZXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgdmlzaWJsZUFzc2V0cyA9ICh0aGlzLmVkaXQgJiYgdGhpcy5zaG93QWRkQXNzZXRDb250YWluZXIpID8gKHRoaXMudmlzaWJsZVByZXZpZXdBc3NldCAtIDIpIDogKHRoaXMudmlzaWJsZVByZXZpZXdBc3NldCAtIDEpO1xuICAgICAgICBpZiAoaW5kZXggPCB2aXNpYmxlQXNzZXRzKSB7XG4gICAgICAgICAgICB2aXNpYmxlQXNzZXRzID0gaW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uID0gKGluZGV4IC0gdmlzaWJsZUFzc2V0cykgKiAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlQXNzZXQgPSBpbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgb25GaWxlc0NoYW5nZShldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGZpbGVzID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8uZmlsZXM7XG5cbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VzUHJvY2Vzc29yKSB7XG4gICAgICAgICAgICBmaWxlcyA9IGF3YWl0IHRoaXMuZ2V0UHJvY2Vzc2VkRmlsZXMoZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5vbkZpbGVzRHJvcChmaWxlcyk7XG5cbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uRmlsZXNEcm9wKGZpbGVzOiBGaWxlTGlzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIWZpbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuZXdBc3NldHNBZGRlZCA9IGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlcy5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFjY2VwdC5zb21lKChhY2NlcHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYWNjZXB0LmVuZHNXaXRoKFwiKlwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS50eXBlLnN0YXJ0c1dpdGgoYWNjZXB0LnJlcGxhY2UoXCIqXCIsIFwiXCIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXB0ID09PSBmaWxlLnR5cGU7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuZXdBc3NldHNBZGRlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuX2Fzc2V0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgIHR5cGU6IGZpbGUudHlwZS5zcGxpdChcIi9cIikuc2hpZnQoKSBhcyBcImltYWdlXCIgfCBcInZpZGVvXCIsXG4gICAgICAgICAgICAgICAgYmFzZTY0OiBhd2FpdCBGaWxlVXRpbHMuZ2V0RGF0YVVybChmaWxlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3QXNzZXRzQWRkZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tBc3NldCh0aGlzLl9hc3NldHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZT8uKHRoaXMuX2Fzc2V0cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tSZW1vdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlZEFzc2V0LmVtaXQodGhpcy5fYXNzZXRzW3RoaXMuX2FjdGl2ZV0pO1xuICAgICAgICB0aGlzLl9hc3NldHMuc3BsaWNlKHRoaXMuX2FjdGl2ZSwgMSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RBc3NldCkge1xuICAgICAgICAgICAgdGhpcy5jbGlja0Fzc2V0KHRoaXMuX2Fzc2V0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tBc3NldCh0aGlzLl9hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9wYWdhdGU/Lih0aGlzLl9hc3NldHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGlja0N1c3RvbShhY3Rpb246IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uLmFjdGlvbih0aGlzLl9hY3RpdmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydFN5bmNWaWRlbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgKHRoaXMuX2Fzc2V0c0VsZW1lbnQuZ2V0KHRoaXMuX2FjdGl2ZSkubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MVmlkZW9FbGVtZW50KS5wYXVzZSgpO1xuICAgICAgICAodGhpcy5fYXNzZXRzRWxlbWVudC5nZXQodGhpcy5fYWN0aXZlKS5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxWaWRlb0VsZW1lbnQpLmN1cnJlbnRUaW1lID0gMDtcblxuICAgICAgICB0aGlzLl9hY3RpdmVWaWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fYWN0aXZlVmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgICAgICBhd2FpdCAodGhpcy5fYXNzZXRzRWxlbWVudC5nZXQodGhpcy5fYWN0aXZlKS5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnBsYXkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldFByb2Nlc3NlZEZpbGVzKGZpbGVzOiBGaWxlTGlzdCk6IFByb21pc2U8RmlsZUxpc3Q+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmltYWdlc1Byb2Nlc3NvcihmaWxlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcm91c2VsLWNvbnRhaW5lclwiIG5pY2VEcm9wem9uZSAoZmlsZXNEcm9wcGVkKT1cIm9uRmlsZXNEcm9wKCRldmVudClcIj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYWN0aXZlLWltYWdlXCJcbiAgICAgICAgbWF0UmlwcGxlXG4gICAgICAgIFtjbGFzcy5lbXB0eS1zdGF0ZV09XCIhX2FjdGl2ZUFzc2V0XCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXQgJiYgZmlsZUlucHV0LmNsaWNrKCk7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgaC1mdWxsXCI+XG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjMyXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiX2FjdGl2ZUFzc2V0ICYmIGFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX2FjdGl2ZUFzc2V0fVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJfYWN0aXZlQXNzZXQ/LnR5cGUgPT09ICdpbWFnZSdcIlxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwic2hvd092ZXJsYXk9dHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3NyY109XCJfYWN0aXZlQXNzZXQudXJsID8/IF9hY3RpdmVBc3NldC5iYXNlNjRcIlxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJhY3RpdmUtaW1hZ2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHZpZGVvICNhY3RpdmVWaWRlbyAqbmdJZj1cIl9hY3RpdmVBc3NldD8udHlwZSA9PT0gJ3ZpZGVvJ1wiIGRyYWdnYWJsZT1cImZhbHNlXCIgbG9vcCBbc3JjXT1cIl9hY3RpdmVBc3NldC51cmwgPz8gX2FjdGl2ZUFzc2V0LmJhc2U2NFwiPjwvdmlkZW8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZS1jb250ZW50XCIgKm5nSWY9XCIhX2FjdGl2ZUFzc2V0XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy51cGxvYWQubWF0SWNvblwiPnt7IG9wdGlvbnMudXBsb2FkLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMudXBsb2FkLnN2Z0ljb25cIiBbc3ZnSWNvbl09XCJvcHRpb25zLnVwbG9hZC5zdmdJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBcIm5pY2VfdWlfa2l0LmFzc2V0c19jYXJvdXNlbC51cGxvYWRfaGVyZVwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIl9hY3RpdmVBc3NldCAmJiBzaG93T3ZlcmxheSAmJiBlZGl0XCIgY2xhc3M9XCJhY3RpdmUtaW1hZ2Utb3ZlcmxheVwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3V0KT1cInNob3dPdmVybGF5PWZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMudXBsb2FkLm1hdEljb25cIj57eyBvcHRpb25zLnVwbG9hZC5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy51cGxvYWQuc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMudXBsb2FkLnN2Z0ljb25cIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlZGl0XCIgY2xhc3M9XCJhY3RpdmUtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5hZGRQaG90by5tYXRJY29uXCI+e3sgb3B0aW9ucy5hY3Rpb25CdXR0b25zLmFkZFBob3RvLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJvcHRpb25zLmFjdGlvbkJ1dHRvbnMuYWRkUGhvdG8uc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5hZGRQaG90by5zdmdJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYXNzZXRBY3Rpb25zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCIhX2FjdGl2ZUFzc2V0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5tb3JlT3B0aW9ucy5tYXRJY29uXCI+e3sgb3B0aW9ucy5hY3Rpb25CdXR0b25zLm1vcmVPcHRpb25zLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJvcHRpb25zLmFjdGlvbkJ1dHRvbnMubW9yZU9wdGlvbnMuc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5tb3JlT3B0aW9ucy5zdmdJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XCJuaWNlLWFzc2V0LW9wdGlvbnMtbWVudVwiIFt4UG9zaXRpb25dPVwiJ2JlZm9yZSdcIiAjYXNzZXRBY3Rpb25zPVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGN1c3RvbUFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQ3VzdG9tKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJhY3Rpb24uaWNvbi5tYXRJY29uXCI+e3sgYWN0aW9uLmljb24ubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiYWN0aW9uLmljb24uc3ZnSWNvblwiICpuZ0lmPVwiYWN0aW9uLmljb24uc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2xpY2tSZW1vdmUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy5hY3Rpb25CdXR0b25zLnJlbW92ZS5tYXRJY29uXCI+e3sgb3B0aW9ucy5hY3Rpb25CdXR0b25zLnJlbW92ZS5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5yZW1vdmUuc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5yZW1vdmUuc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBcIm5pY2VfdWlfa2l0LmFzc2V0c19jYXJvdXNlbC5kZWxldGVcIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbFwiPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0FkZEFzc2V0Q29udGFpbmVyIHx8IF9hY3RpdmVBc3NldFwiIGNsYXNzPVwiYWN0aW9uLWJ1dHRvbiBsZWZ0LWFycm93XCIgbWF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCIhX2FjdGl2ZVwiIChjbGljayk9XCJjbGlja0xlZnQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy5sZWZ0QXJyb3cubWF0SWNvblwiPnt7IG9wdGlvbnMubGVmdEFycm93Lm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYXJyb3dzXCIgKm5nSWY9XCJvcHRpb25zLmxlZnRBcnJvdy5zdmdJY29uXCIgW3N2Z0ljb25dPVwib3B0aW9ucy5sZWZ0QXJyb3cuc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXNzZXQtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QWRkQXNzZXRDb250YWluZXIgJiYgZWRpdFwiIGNsYXNzPVwiYWRkLWFzc2V0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYXNzZXRcIiBtYXRSaXBwbGUgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWRkUGhvdG8ubWF0SWNvblwiPnt7IG9wdGlvbnMuYWRkUGhvdG8ubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWRkUGhvdG8uc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWRkUGhvdG8uc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhc3NldC1saXN0XCIgW25nU3R5bGVdPVwibGlzdFN0eWxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAjYXNzZXRzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXRcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgX2Fzc2V0czsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0Fzc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIl9hY3RpdmUgPT09IGlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFzc2V0LnR5cGUgPT09ICdpbWFnZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImFzc2V0LnVybCA/PyBhc3NldC5iYXNlNjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImFkZC1pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhc3NldC50eXBlID09PSAndmlkZW8nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYXNzZXQudXJsID8/IGFzc2V0LmJhc2U2NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93QWRkQXNzZXRDb250YWluZXIgfHwgX2FjdGl2ZUFzc2V0XCIgY2xhc3M9XCJhY3Rpb24tYnV0dG9uIHJpZ2h0LWFycm93XCIgbWF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCJfbGFzdEFzc2V0XCIgKGNsaWNrKT1cImNsaWNrUmlnaHQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy5yaWdodEFycm93Lm1hdEljb25cIj57eyBvcHRpb25zLnJpZ2h0QXJyb3cubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhcnJvd3NcIiAqbmdJZj1cIm9wdGlvbnMucmlnaHRBcnJvdy5zdmdJY29uXCIgW3N2Z0ljb25dPVwib3B0aW9ucy5yaWdodEFycm93LnN2Z0ljb25cIj48L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48aW5wdXQgI2ZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIGhpZGRlbiBbYWNjZXB0XT1cImFjY2VwdFwiIChjaGFuZ2UpPVwib25GaWxlc0NoYW5nZSgkZXZlbnQpXCIgW211bHRpcGxlXT1cIm11bHRpcGxlVXBsb2FkXCI+XG4iXX0=
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLWNhcm91c2VsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9hc3NldHMtY2Fyb3VzZWwvYXNzZXRzLWNhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25pY2UtdWkta2l0LXYyL3NyYy9saWIvY29tcG9uZW50cy9hc3NldHMtY2Fyb3VzZWwvYXNzZXRzLWNhcm91c2VsLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7Ozs7Ozs7O0FBNENqSCxNQUFNLE9BQU8sMkJBQTJCO0lBdUdwQyxZQUE4RSxPQUFrQztRQUFsQyxZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQXRHekcsK0JBQTBCLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUUzQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FB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c0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5qZWN0LFxuICAgIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LCBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IENhbkNvbG9yLCBUaGVtZVBhbGV0dGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZVwiO1xuaW1wb3J0IHsgbmljZUFuaW1hdGlvbnMgfSBmcm9tIFwiLi4vLi4vYW5pbWF0aW9uc1wiO1xuaW1wb3J0IHsgRmlsZVV0aWxzIH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBOSUNFX0FTU0VUU19DQVJPVVNFTF9PUFRJT05TIH0gZnJvbSBcIi4vYXNzZXRzLWNhcm91c2VsLmNvbnN0YW50XCI7XG5pbXBvcnQgeyBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3RpdmVDb250ZW50RGlyZWN0aXZlIH0gZnJvbSBcIi4vZGlyZWN0aXZlcy9hc3NldHMtY2Fyb3VzZWwtYWN0aXZlLWNvbnRlbnQuZGlyZWN0aXZlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmljZUFzc2V0cyB7XG4gICAgdHlwZTogXCJpbWFnZVwiIHwgXCJ2aWRlb1wiO1xuICAgIGlkPzogbnVtYmVyIHwgc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBiYXNlNjQ/OiBzdHJpbmc7XG4gICAgZmlsZT86IEZpbGU7XG59XG5cbmV4cG9ydCB0eXBlIE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbkljb24gPSB7IG1hdEljb246IHN0cmluZzsgc3ZnSWNvbj86IHN0cmluZzsgfSB8IHsgbWF0SWNvbj86IHN0cmluZzsgc3ZnSWNvbjogc3RyaW5nOyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbnMge1xuICAgIGljb246IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbkljb247XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGFjdGlvbjogKGFjdGl2ZTogbnVtYmVyKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5pY2VBc3NldHNDYXJvdXNlbE9wdGlvbnMge1xuICAgIGFjdGlvbkJ1dHRvbnM/OiB7XG4gICAgICAgIG1vcmVPcHRpb25zPzogTmljZUFzc2V0c0Nhcm91c2VsQWN0aW9uSWNvbjtcbiAgICAgICAgYWRkUGhvdG8/OiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uO1xuICAgICAgICByZW1vdmU/OiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uO1xuICAgIH07XG4gICAgYWRkUGhvdG8/OiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25JY29uO1xuICAgIGxlZnRBcnJvdz86IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbkljb247XG4gICAgcmlnaHRBcnJvdz86IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbkljb247XG4gICAgdXBsb2FkPzogTmljZUFzc2V0c0Nhcm91c2VsQWN0aW9uSWNvbjtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibmljZS1hc3NldHMtY2Fyb3VzZWxcIixcbiAgICB0ZW1wbGF0ZVVybDogXCJhc3NldHMtY2Fyb3VzZWwudGVtcGxhdGUuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiYXNzZXRzLWNhcm91c2VsLnRoZW1lLnNjc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBhbmltYXRpb25zOiBuaWNlQW5pbWF0aW9ucyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOaWNlQXNzZXRzQ2Fyb3VzZWxDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmljZUFzc2V0c0Nhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBDYW5Db2xvciB7XG4gICAgcHVibGljIF9hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uID0gMDtcbiAgICBwdWJsaWMgX2FjdGl2ZSA9IDA7XG4gICAgcHVibGljIF9hc3NldHM6IE5pY2VBc3NldHNbXSA9IFtdO1xuICAgIHB1YmxpYyBfYWN0aXZlQXNzZXQ6IE5pY2VBc3NldHM7XG4gICAgcHVibGljIF9sYXN0QXNzZXQgPSB0cnVlO1xuICAgIHB1YmxpYyBfc2hvdWxkVHJhbnNmb3JtID0gZmFsc2U7XG4gICAgcHVibGljIF9hY3RpdmVWaWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD47XG4gICAgcHVibGljIF9hc3NldHNFbGVtZW50OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+O1xuICAgIHB1YmxpYyBkZWZhdWx0Q29sb3I6IFRoZW1lUGFsZXR0ZSA9IFwicHJpbWFyeVwiO1xuXG4gICAgQFZpZXdDaGlsZChcImZpbGVJbnB1dFwiKVxuICAgIHB1YmxpYyBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2xvcjogVGhlbWVQYWxldHRlID0gdGhpcy5kZWZhdWx0Q29sb3I7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBlZGl0ID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhY2NlcHQ6IHN0cmluZ1tdID0gW107XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjdXN0b21BY3Rpb25zOiBOaWNlQXNzZXRzQ2Fyb3VzZWxBY3Rpb25zW10gPSBbXTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGltYWdlc1Byb2Nlc3NvcjogKGZpbGVzOiBGaWxlW10pID0+IFByb21pc2U8RmlsZVtdPjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG11bHRpcGxlVXBsb2FkID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB2aXNpYmxlUHJldmlld0Fzc2V0ID0gNDtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNob3dBZGRBc3NldENvbnRhaW5lciA9IHRydWU7XG5cbiAgICBAQ29udGVudENoaWxkKE5pY2VBc3NldHNDYXJvdXNlbEFjdGl2ZUNvbnRlbnREaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwdWJsaWMgYWN0aXZlQ29udGVudDogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByZW1vdmVkQXNzZXQgPSBuZXcgRXZlbnRFbWl0dGVyPE5pY2VBc3NldHM+KCk7XG5cbiAgICBwdWJsaWMgbGlzdFN0eWxlOiB7IHRyYW5zZm9ybTogc3RyaW5nIH0gPSB7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVYKDBweClcIiB9O1xuXG4gICAgcHVibGljIHNob3dPdmVybGF5OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBfaW1hZ2VzTWltZVR5cGVzID0gW1wiaW1hZ2UvcG5nXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3dlYnBcIiwgXCJpbWFnZS9hdmlmXCJdO1xuICAgIHByaXZhdGUgcHJvcGFnYXRlOiAoYXNzZXRzOiBOaWNlQXNzZXRzW10pID0+IHZvaWQ7XG5cbiAgICBAVmlld0NoaWxkKFwiYWN0aXZlVmlkZW9cIilcbiAgICBwdWJsaWMgc2V0IGFjdGl2ZVZpZGVvRWxlbWVudChhY3RpdmVWaWRlb0VsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTFZpZGVvRWxlbWVudD4pIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVmlkZW9FbGVtZW50ID0gYWN0aXZlVmlkZW9FbGVtZW50O1xuXG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlVmlkZW9FbGVtZW50IHx8ICF0aGlzLl9hc3NldHNFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0U3luY1ZpZGVvKCk7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZHJlbihcImFzc2V0c1wiKVxuICAgIHB1YmxpYyBzZXQgYXNzZXRzRWxlbWVudChhc3NldHNFbGVtZW50OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KSB7XG4gICAgICAgIHRoaXMuX2Fzc2V0c0VsZW1lbnQgPSBhc3NldHNFbGVtZW50O1xuXG4gICAgICAgIGlmICghdGhpcy5fYWN0aXZlVmlkZW9FbGVtZW50IHx8ICF0aGlzLl9hc3NldHNFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXJ0U3luY1ZpZGVvKCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGFzc2V0cyhhc3NldHM6IE5pY2VBc3NldHNbXSkge1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoYXNzZXRzID8/IFtdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldCBhY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uKHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVHJhbnNsYXRpb25Qb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICB0aGlzLmxpc3RTdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWChjYWxjKCh2YXIoLS1uaWNlLWFzc2V0cy1jYXJvdXNlbC1hc3NldC13aWR0aCkgKyB2YXIoLS1uaWNlLWFzc2V0cy1jYXJvdXNlbC1hc3NldC1nYXApKSAqICR7cG9zaXRpb259KSlgO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0IGFjdGl2ZUFzc2V0KHBvc2l0aW9uOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYWN0aXZlID0gcG9zaXRpb247XG4gICAgICAgIHRoaXMuX2FjdGl2ZUFzc2V0ID0gdGhpcy5fYXNzZXRzW3RoaXMuX2FjdGl2ZV07XG4gICAgICAgIHRoaXMuX2xhc3RBc3NldCA9IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fYXNzZXRzLmxlbmd0aCAtIDEgfHwgIXRoaXMuX2Fzc2V0cy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3Nob3VsZFRyYW5zZm9ybVxuICAgICAgICAgICAgPSAoKHRoaXMuZWRpdCAmJiB0aGlzLnNob3dBZGRBc3NldENvbnRhaW5lcikgJiYgdGhpcy5fYWN0aXZlID49ICh0aGlzLnZpc2libGVQcmV2aWV3QXNzZXQgLSAxKSlcbiAgICAgICAgICAgIHx8IHRoaXMuX2FjdGl2ZSA+PSB0aGlzLnZpc2libGVQcmV2aWV3QXNzZXQ7XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQodGhpcy5fYWN0aXZlKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KE5JQ0VfQVNTRVRTX0NBUk9VU0VMX09QVElPTlMpIHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBOaWNlQXNzZXRzQ2Fyb3VzZWxPcHRpb25zKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uQnV0dG9uczoge1xuICAgICAgICAgICAgICAgICAgICBhZGRQaG90bzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SWNvbjogXCJwaG90b19jYW1lcmFcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3JlT3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0SWNvbjogXCJtb3JlX3ZlcnRcIlxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICByZW1vdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdEljb246IFwiZGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWRkUGhvdG86IHtcbiAgICAgICAgICAgICAgICAgICAgbWF0SWNvbjogXCJwaG90b19jYW1lcmFcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGVmdEFycm93OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hdEljb246IFwiY2hldnJvbl9sZWZ0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJpZ2h0QXJyb3c6IHtcbiAgICAgICAgICAgICAgICAgICAgbWF0SWNvbjogXCJjaGV2cm9uX3JpZ2h0XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwbG9hZDoge1xuICAgICAgICAgICAgICAgICAgICBtYXRJY29uOiBcImZpbGVfdXBsb2FkXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYWNjZXB0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gWy4uLnRoaXMuX2ltYWdlc01pbWVUeXBlc107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoXCJhY2NlcHRcIiBpbiBjaGFuZ2VzICYmIHRoaXMuYWNjZXB0KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuYWNjZXB0LmluZGV4T2YoXCJpbWFnZS8qXCIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2VwdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYWNjZXB0LnB1c2goLi4udGhpcy5faW1hZ2VzTWltZVR5cGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKGFzc2V0czogTmljZUFzc2V0c1tdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Fzc2V0cyA9IGFzc2V0cyA/PyBbXTtcblxuICAgICAgICBpZiAodGhpcy5fYXNzZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQXNzZXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEFzc2V0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hc3NldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQXNzZXQgPSB0aGlzLl9hc3NldHNbdGhpcy5fYWN0aXZlXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoYXNzZXRzOiBOaWNlQXNzZXRzW10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wYWdhdGUgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IChhc3NldHM6IE5pY2VBc3NldHNbXSkgPT4gdm9pZCk6IHZvaWQge31cblxuICAgIHB1YmxpYyBjbGlja0xlZnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQXNzZXQgPSB0aGlzLl9hY3RpdmUgLSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVRyYW5zbGF0aW9uUG9zaXRpb24gPCAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRyYW5zbGF0aW9uUG9zaXRpb24gPSB0aGlzLl9hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uICsgMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGlja1JpZ2h0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbGFzdEFzc2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZUFzc2V0ID0gdGhpcy5fYWN0aXZlICsgMTtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFRyYW5zZm9ybSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUcmFuc2xhdGlvblBvc2l0aW9uID0gdGhpcy5fYWN0aXZlVHJhbnNsYXRpb25Qb3NpdGlvbiAtIDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tBc3NldChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGxldCB2aXNpYmxlQXNzZXRzID0gKHRoaXMuZWRpdCAmJiB0aGlzLnNob3dBZGRBc3NldENvbnRhaW5lcikgPyAodGhpcy52aXNpYmxlUHJldmlld0Fzc2V0IC0gMikgOiAodGhpcy52aXNpYmxlUHJldmlld0Fzc2V0IC0gMSk7XG4gICAgICAgIGlmIChpbmRleCA8IHZpc2libGVBc3NldHMpIHtcbiAgICAgICAgICAgIHZpc2libGVBc3NldHMgPSBpbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVRyYW5zbGF0aW9uUG9zaXRpb24gPSAoaW5kZXggLSB2aXNpYmxlQXNzZXRzKSAqIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVBc3NldCA9IGluZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkZpbGVzQ2hhbmdlKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBmaWxlcyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCk/LmZpbGVzO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25GaWxlc0Ryb3AoZmlsZXMpO1xuXG4gICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBvbkZpbGVzRHJvcChmaWxlTGlzdDogRmlsZUxpc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGZpbGVzID0gdGhpcy5maWx0ZXJPdXRVbnN1cHBvcnRlZEZpbGVzKGZpbGVMaXN0KTtcblxuICAgICAgICBpZiAodGhpcy5pbWFnZXNQcm9jZXNzb3IpIHtcbiAgICAgICAgICAgIGZpbGVzID0gYXdhaXQgdGhpcy5nZXRQcm9jZXNzZWRGaWxlcyhmaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWZpbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgdGhpcy5fYXNzZXRzLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgdHlwZTogZmlsZS50eXBlLnNwbGl0KFwiL1wiKS5zaGlmdCgpIGFzIFwiaW1hZ2VcIiB8IFwidmlkZW9cIixcbiAgICAgICAgICAgICAgICBiYXNlNjQ6IGF3YWl0IEZpbGVVdGlscy5nZXREYXRhVXJsKGZpbGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xpY2tBc3NldCh0aGlzLl9hc3NldHMubGVuZ3RoIC0gMSk7XG4gICAgICAgIHRoaXMucHJvcGFnYXRlPy4odGhpcy5fYXNzZXRzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xpY2tSZW1vdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlZEFzc2V0LmVtaXQodGhpcy5fYXNzZXRzW3RoaXMuX2FjdGl2ZV0pO1xuICAgICAgICB0aGlzLl9hc3NldHMuc3BsaWNlKHRoaXMuX2FjdGl2ZSwgMSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RBc3NldCkge1xuICAgICAgICAgICAgdGhpcy5jbGlja0Fzc2V0KHRoaXMuX2Fzc2V0cy5sZW5ndGggLSAxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xpY2tBc3NldCh0aGlzLl9hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9wYWdhdGU/Lih0aGlzLl9hc3NldHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGlja0N1c3RvbShhY3Rpb246IE5pY2VBc3NldHNDYXJvdXNlbEFjdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgYWN0aW9uLmFjdGlvbih0aGlzLl9hY3RpdmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydFN5bmNWaWRlbygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgKHRoaXMuX2Fzc2V0c0VsZW1lbnQuZ2V0KHRoaXMuX2FjdGl2ZSkubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCBhcyBIVE1MVmlkZW9FbGVtZW50KS5wYXVzZSgpO1xuICAgICAgICAodGhpcy5fYXNzZXRzRWxlbWVudC5nZXQodGhpcy5fYWN0aXZlKS5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxWaWRlb0VsZW1lbnQpLmN1cnJlbnRUaW1lID0gMDtcblxuICAgICAgICB0aGlzLl9hY3RpdmVWaWRlb0VsZW1lbnQubmF0aXZlRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fYWN0aXZlVmlkZW9FbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxheSgpO1xuICAgICAgICBhd2FpdCAodGhpcy5fYXNzZXRzRWxlbWVudC5nZXQodGhpcy5fYWN0aXZlKS5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnBsYXkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbHRlck91dFVuc3VwcG9ydGVkRmlsZXMoZmlsZUxpc3Q6IEZpbGVMaXN0KTogRmlsZVtdIHtcbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlTGlzdC5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0LnNvbWUoKGFjY2VwdCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhY2NlcHQuZW5kc1dpdGgoXCIqXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLnR5cGUuc3RhcnRzV2l0aChhY2NlcHQucmVwbGFjZShcIipcIiwgXCJcIikpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBhY2NlcHQgPT09IGZpbGUudHlwZTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGdldFByb2Nlc3NlZEZpbGVzKGZpbGVzOiBGaWxlW10pOiBQcm9taXNlPEZpbGVbXSB8IG51bGw+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmltYWdlc1Byb2Nlc3NvcihmaWxlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNhcm91c2VsLWNvbnRhaW5lclwiIG5pY2VEcm9wem9uZSAoZmlsZXNEcm9wcGVkKT1cIm9uRmlsZXNEcm9wKCRldmVudClcIj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYWN0aXZlLWltYWdlXCJcbiAgICAgICAgbWF0UmlwcGxlXG4gICAgICAgIFtjbGFzcy5lbXB0eS1zdGF0ZV09XCIhX2FjdGl2ZUFzc2V0XCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXQgJiYgZmlsZUlucHV0LmNsaWNrKCk7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibG9hZGluZ1wiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgaC1mdWxsXCI+XG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjMyXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiX2FjdGl2ZUFzc2V0ICYmIGFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjdGl2ZUNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogX2FjdGl2ZUFzc2V0fVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJfYWN0aXZlQXNzZXQ/LnR5cGUgPT09ICdpbWFnZSdcIlxuICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwic2hvd092ZXJsYXk9dHJ1ZVwiXG4gICAgICAgICAgICAgICAgW3NyY109XCJfYWN0aXZlQXNzZXQudXJsID8/IF9hY3RpdmVBc3NldC5iYXNlNjRcIlxuICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlXCJcbiAgICAgICAgICAgICAgICBhbHQ9XCJhY3RpdmUtaW1hZ2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPHZpZGVvICNhY3RpdmVWaWRlbyAqbmdJZj1cIl9hY3RpdmVBc3NldD8udHlwZSA9PT0gJ3ZpZGVvJ1wiIGRyYWdnYWJsZT1cImZhbHNlXCIgbG9vcCBbc3JjXT1cIl9hY3RpdmVBc3NldC51cmwgPz8gX2FjdGl2ZUFzc2V0LmJhc2U2NFwiPjwvdmlkZW8+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlbXB0eS1zdGF0ZS1jb250ZW50XCIgKm5nSWY9XCIhX2FjdGl2ZUFzc2V0XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy51cGxvYWQubWF0SWNvblwiPnt7IG9wdGlvbnMudXBsb2FkLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMudXBsb2FkLnN2Z0ljb25cIiBbc3ZnSWNvbl09XCJvcHRpb25zLnVwbG9hZC5zdmdJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBcIm5pY2VfdWlfa2l0LmFzc2V0c19jYXJvdXNlbC51cGxvYWRfaGVyZVwiIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIl9hY3RpdmVBc3NldCAmJiBzaG93T3ZlcmxheSAmJiBlZGl0XCIgY2xhc3M9XCJhY3RpdmUtaW1hZ2Utb3ZlcmxheVwiPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlb3V0KT1cInNob3dPdmVybGF5PWZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciB3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMudXBsb2FkLm1hdEljb25cIj57eyBvcHRpb25zLnVwbG9hZC5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy51cGxvYWQuc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMudXBsb2FkLnN2Z0ljb25cIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJlZGl0XCIgY2xhc3M9XCJhY3RpdmUtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5hZGRQaG90by5tYXRJY29uXCI+e3sgb3B0aW9ucy5hY3Rpb25CdXR0b25zLmFkZFBob3RvLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJvcHRpb25zLmFjdGlvbkJ1dHRvbnMuYWRkUGhvdG8uc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5hZGRQaG90by5zdmdJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYXNzZXRBY3Rpb25zXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIFtkaXNhYmxlZF09XCIhX2FjdGl2ZUFzc2V0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5tb3JlT3B0aW9ucy5tYXRJY29uXCI+e3sgb3B0aW9ucy5hY3Rpb25CdXR0b25zLm1vcmVPcHRpb25zLm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJvcHRpb25zLmFjdGlvbkJ1dHRvbnMubW9yZU9wdGlvbnMuc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5tb3JlT3B0aW9ucy5zdmdJY29uXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW1lbnUgY2xhc3M9XCJuaWNlLWFzc2V0LW9wdGlvbnMtbWVudVwiIFt4UG9zaXRpb25dPVwiJ2JlZm9yZSdcIiAjYXNzZXRBY3Rpb25zPVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGN1c3RvbUFjdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQ3VzdG9tKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJhY3Rpb24uaWNvbi5tYXRJY29uXCI+e3sgYWN0aW9uLmljb24ubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwiYWN0aW9uLmljb24uc3ZnSWNvblwiICpuZ0lmPVwiYWN0aW9uLmljb24uc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBhY3Rpb24ubmFtZSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY2xpY2tSZW1vdmUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy5hY3Rpb25CdXR0b25zLnJlbW92ZS5tYXRJY29uXCI+e3sgb3B0aW9ucy5hY3Rpb25CdXR0b25zLnJlbW92ZS5tYXRJY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5yZW1vdmUuc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWN0aW9uQnV0dG9ucy5yZW1vdmUuc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBcIm5pY2VfdWlfa2l0LmFzc2V0c19jYXJvdXNlbC5kZWxldGVcIiB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjYXJvdXNlbFwiPlxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd0FkZEFzc2V0Q29udGFpbmVyIHx8IF9hY3RpdmVBc3NldFwiIGNsYXNzPVwiYWN0aW9uLWJ1dHRvbiBsZWZ0LWFycm93XCIgbWF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCIhX2FjdGl2ZVwiIChjbGljayk9XCJjbGlja0xlZnQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy5sZWZ0QXJyb3cubWF0SWNvblwiPnt7IG9wdGlvbnMubGVmdEFycm93Lm1hdEljb24gfX08L21hdC1pY29uPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYXJyb3dzXCIgKm5nSWY9XCJvcHRpb25zLmxlZnRBcnJvdy5zdmdJY29uXCIgW3N2Z0ljb25dPVwib3B0aW9ucy5sZWZ0QXJyb3cuc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXNzZXQtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QWRkQXNzZXRDb250YWluZXIgJiYgZWRpdFwiIGNsYXNzPVwiYWRkLWFzc2V0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGQtYXNzZXRcIiBtYXRSaXBwbGUgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWRkUGhvdG8ubWF0SWNvblwiPnt7IG9wdGlvbnMuYWRkUGhvdG8ubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIm9wdGlvbnMuYWRkUGhvdG8uc3ZnSWNvblwiIFtzdmdJY29uXT1cIm9wdGlvbnMuYWRkUGhvdG8uc3ZnSWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhc3NldC1saXN0XCIgW25nU3R5bGVdPVwibGlzdFN0eWxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAjYXNzZXRzXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXNzZXRcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYXNzZXQgb2YgX2Fzc2V0czsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0Fzc2V0KGkpXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cIl9hY3RpdmUgPT09IGlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFzc2V0LnR5cGUgPT09ICdpbWFnZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImFzc2V0LnVybCA/PyBhc3NldC5iYXNlNjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImFkZC1pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhc3NldC50eXBlID09PSAndmlkZW8nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2FibGU9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiYXNzZXQudXJsID8/IGFzc2V0LmJhc2U2NFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC92aWRlbz5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93QWRkQXNzZXRDb250YWluZXIgfHwgX2FjdGl2ZUFzc2V0XCIgY2xhc3M9XCJhY3Rpb24tYnV0dG9uIHJpZ2h0LWFycm93XCIgbWF0LWljb24tYnV0dG9uIFtkaXNhYmxlZF09XCJfbGFzdEFzc2V0XCIgKGNsaWNrKT1cImNsaWNrUmlnaHQoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3B0aW9ucy5yaWdodEFycm93Lm1hdEljb25cIj57eyBvcHRpb25zLnJpZ2h0QXJyb3cubWF0SWNvbiB9fTwvbWF0LWljb24+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJhcnJvd3NcIiAqbmdJZj1cIm9wdGlvbnMucmlnaHRBcnJvdy5zdmdJY29uXCIgW3N2Z0ljb25dPVwib3B0aW9ucy5yaWdodEFycm93LnN2Z0ljb25cIj48L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48aW5wdXQgI2ZpbGVJbnB1dCB0eXBlPVwiZmlsZVwiIGhpZGRlbiBbYWNjZXB0XT1cImFjY2VwdFwiIChjaGFuZ2UpPVwib25GaWxlc0NoYW5nZSgkZXZlbnQpXCIgW211bHRpcGxlXT1cIm11bHRpcGxlVXBsb2FkXCI+XG4iXX0=
@@ -1731,7 +1731,7 @@ class NiceAssetsCarouselComponent {
1731
1731
  this.color = this.defaultColor;
1732
1732
  this.edit = false;
1733
1733
  this.loading = false;
1734
- this.accept = ["image/*"];
1734
+ this.accept = [];
1735
1735
  this.customActions = [];
1736
1736
  this.multipleUpload = false;
1737
1737
  this.visiblePreviewAsset = 4;
@@ -1739,6 +1739,7 @@ class NiceAssetsCarouselComponent {
1739
1739
  this.activeChange = new EventEmitter();
1740
1740
  this.removedAsset = new EventEmitter();
1741
1741
  this.listStyle = { transform: "translateX(0px)" };
1742
+ this._imagesMimeTypes = ["image/png", "image/jpeg", "image/webp", "image/avif"];
1742
1743
  if (!this.options) {
1743
1744
  this.options = {
1744
1745
  actionButtons: {
@@ -1800,6 +1801,21 @@ class NiceAssetsCarouselComponent {
1800
1801
  || this._active >= this.visiblePreviewAsset;
1801
1802
  this.activeChange.emit(this._active);
1802
1803
  }
1804
+ ngOnInit() {
1805
+ var _a;
1806
+ if (!((_a = this.accept) === null || _a === void 0 ? void 0 : _a.length)) {
1807
+ this.accept = [...this._imagesMimeTypes];
1808
+ }
1809
+ }
1810
+ ngOnChanges(changes) {
1811
+ if ("accept" in changes && this.accept) {
1812
+ const index = this.accept.indexOf("image/*");
1813
+ if (index >= 0) {
1814
+ this.accept.splice(index, 1);
1815
+ this.accept.push(...this._imagesMimeTypes);
1816
+ }
1817
+ }
1818
+ }
1803
1819
  writeValue(assets) {
1804
1820
  this._assets = assets !== null && assets !== void 0 ? assets : [];
1805
1821
  if (this._assets.length === 0) {
@@ -1844,42 +1860,30 @@ class NiceAssetsCarouselComponent {
1844
1860
  onFilesChange(event) {
1845
1861
  var _a;
1846
1862
  return __awaiter(this, void 0, void 0, function* () {
1847
- let files = (_a = event.target) === null || _a === void 0 ? void 0 : _a.files;
1848
- if (this.imagesProcessor) {
1849
- files = yield this.getProcessedFiles(files);
1850
- }
1863
+ const files = (_a = event.target) === null || _a === void 0 ? void 0 : _a.files;
1851
1864
  yield this.onFilesDrop(files);
1852
1865
  this.inputElement.nativeElement.value = "";
1853
1866
  });
1854
1867
  }
1855
- onFilesDrop(files) {
1868
+ onFilesDrop(fileList) {
1856
1869
  var _a;
1857
1870
  return __awaiter(this, void 0, void 0, function* () {
1871
+ let files = this.filterOutUnsupportedFiles(fileList);
1872
+ if (this.imagesProcessor) {
1873
+ files = yield this.getProcessedFiles(files);
1874
+ }
1858
1875
  if (!(files === null || files === void 0 ? void 0 : files.length)) {
1859
1876
  return;
1860
1877
  }
1861
- let newAssetsAdded = false;
1862
- for (let i = 0; i < files.length; i++) {
1863
- const file = files.item(i);
1864
- if (!this.accept.some((accept) => {
1865
- if (accept.endsWith("*")) {
1866
- return file.type.startsWith(accept.replace("*", ""));
1867
- }
1868
- return accept === file.type;
1869
- })) {
1870
- continue;
1871
- }
1872
- newAssetsAdded = true;
1878
+ for (const file of files) {
1873
1879
  this._assets.push({
1874
1880
  file,
1875
1881
  type: file.type.split("/").shift(),
1876
1882
  base64: yield FileUtils.getDataUrl(file)
1877
1883
  });
1878
1884
  }
1879
- if (newAssetsAdded) {
1880
- this.clickAsset(this._assets.length - 1);
1881
- (_a = this.propagate) === null || _a === void 0 ? void 0 : _a.call(this, this._assets);
1882
- }
1885
+ this.clickAsset(this._assets.length - 1);
1886
+ (_a = this.propagate) === null || _a === void 0 ? void 0 : _a.call(this, this._assets);
1883
1887
  });
1884
1888
  }
1885
1889
  clickRemove() {
@@ -1906,12 +1910,32 @@ class NiceAssetsCarouselComponent {
1906
1910
  yield this._assetsElement.get(this._active).nativeElement.firstElementChild.play();
1907
1911
  });
1908
1912
  }
1913
+ filterOutUnsupportedFiles(fileList) {
1914
+ const files = [];
1915
+ for (let i = 0; i < fileList.length; i++) {
1916
+ const file = fileList.item(i);
1917
+ if (this.accept.some((accept) => {
1918
+ if (accept.endsWith("*")) {
1919
+ return file.type.startsWith(accept.replace("*", ""));
1920
+ }
1921
+ return accept === file.type;
1922
+ })) {
1923
+ files.push(file);
1924
+ }
1925
+ }
1926
+ return files;
1927
+ }
1909
1928
  getProcessedFiles(files) {
1910
1929
  return __awaiter(this, void 0, void 0, function* () {
1911
1930
  try {
1931
+ if (!files.length) {
1932
+ return null;
1933
+ }
1912
1934
  return yield this.imagesProcessor(files);
1913
1935
  }
1914
- catch (e) { }
1936
+ catch (e) {
1937
+ return null;
1938
+ }
1915
1939
  });
1916
1940
  }
1917
1941
  }
@@ -1922,7 +1946,7 @@ NiceAssetsCarouselComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.
1922
1946
  useExisting: forwardRef(() => NiceAssetsCarouselComponent),
1923
1947
  multi: true
1924
1948
  }
1925
- ], queries: [{ propertyName: "activeContent", first: true, predicate: NiceAssetsCarouselActiveContentDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "activeVideoElement", first: true, predicate: ["activeVideo"], descendants: true }, { propertyName: "assetsElement", predicate: ["assets"], descendants: true }], ngImport: i0, template: "<div class=\"carousel-container\" niceDropzone (filesDropped)=\"onFilesDrop($event)\">\n <div\n class=\"active-image\"\n matRipple\n [class.empty-state]=\"!_activeAsset\"\n (click)=\"edit && fileInput.click();\n $event.stopPropagation()\"\n >\n <div *ngIf=\"loading\" class=\"flex flex-row justify-center items-center h-full\">\n <mat-spinner [diameter]=\"32\"></mat-spinner>\n </div>\n <ng-container *ngIf=\"!loading\">\n <ng-container\n *ngIf=\"_activeAsset && activeContent\"\n [ngTemplateOutlet]=\"activeContent\"\n [ngTemplateOutletContext]=\"{ $implicit: _activeAsset}\"\n ></ng-container>\n <img\n *ngIf=\"_activeAsset?.type === 'image'\"\n (mouseover)=\"showOverlay=true\"\n [src]=\"_activeAsset.url ?? _activeAsset.base64\"\n draggable=\"false\"\n class=\"relative\"\n alt=\"active-image\"\n >\n <video #activeVideo *ngIf=\"_activeAsset?.type === 'video'\" draggable=\"false\" loop [src]=\"_activeAsset.url ?? _activeAsset.base64\"></video>\n\n <div class=\"empty-state-content\" *ngIf=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n <div class=\"text\">\n {{ \"nice_ui_kit.assets_carousel.upload_here\" | translate }}\n </div>\n </div>\n\n <div *ngIf=\"_activeAsset && showOverlay && edit\" class=\"active-image-overlay\">\n <div\n (mouseout)=\"showOverlay=false\"\n class=\"flex flex-col justify-center items-center w-full h-full\"\n >\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n </div>\n </div>\n\n <div *ngIf=\"edit\" class=\"active-buttons\">\n <button mat-icon-button (click)=\"fileInput.click(); $event.stopPropagation()\">\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.matIcon\">{{ options.actionButtons.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.svgIcon\" [svgIcon]=\"options.actionButtons.addPhoto.svgIcon\"></mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"assetActions\" (click)=\"$event.stopPropagation()\" [disabled]=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.matIcon\">{{ options.actionButtons.moreOptions.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.svgIcon\" [svgIcon]=\"options.actionButtons.moreOptions.svgIcon\"></mat-icon>\n </button>\n <mat-menu class=\"nice-asset-options-menu\" [xPosition]=\"'before'\" #assetActions=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let action of customActions\"\n (click)=\"clickCustom(action)\"\n >\n <mat-icon *ngIf=\"action.icon.matIcon\">{{ action.icon.matIcon }}</mat-icon>\n <mat-icon [svgIcon]=\"action.icon.svgIcon\" *ngIf=\"action.icon.svgIcon\"></mat-icon>\n <span>{{ action.name | translate }}</span>\n </button>\n <button mat-menu-item (click)=\"clickRemove()\">\n <mat-icon *ngIf=\"options.actionButtons.remove.matIcon\">{{ options.actionButtons.remove.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.remove.svgIcon\" [svgIcon]=\"options.actionButtons.remove.svgIcon\"></mat-icon>\n <span>{{ \"nice_ui_kit.assets_carousel.delete\" | translate }}</span>\n </button>\n </mat-menu>\n </div>\n </ng-container>\n </div>\n\n <div class=\"carousel\">\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button left-arrow\" mat-icon-button [disabled]=\"!_active\" (click)=\"clickLeft()\">\n <mat-icon *ngIf=\"options.leftArrow.matIcon\">{{ options.leftArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.leftArrow.svgIcon\" [svgIcon]=\"options.leftArrow.svgIcon\"></mat-icon>\n </button>\n <div class=\"asset-list-container\">\n <div *ngIf=\"showAddAssetContainer && edit\" class=\"add-asset-container\">\n <div class=\"add-asset\" matRipple (click)=\"fileInput.click()\">\n <mat-icon *ngIf=\"options.addPhoto.matIcon\">{{ options.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.addPhoto.svgIcon\" [svgIcon]=\"options.addPhoto.svgIcon\"></mat-icon>\n </div>\n </div>\n <div class=\"asset-list\" [ngStyle]=\"listStyle\">\n <div\n #assets\n class=\"asset\"\n *ngFor=\"let asset of _assets; let i = index\"\n (click)=\"clickAsset(i)\"\n [ngClass]=\"color\"\n [class.active]=\"_active === i\"\n >\n <ng-container>\n <img\n *ngIf=\"asset.type === 'image'\"\n draggable=\"false\"\n [src]=\"asset.url ?? asset.base64\"\n alt=\"add-image\"\n />\n <video\n *ngIf=\"asset.type === 'video'\"\n draggable=\"false\"\n loop\n [src]=\"asset.url ?? asset.base64\"\n ></video>\n </ng-container>\n </div>\n </div>\n </div>\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button right-arrow\" mat-icon-button [disabled]=\"_lastAsset\" (click)=\"clickRight()\">\n <mat-icon *ngIf=\"options.rightArrow.matIcon\">{{ options.rightArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.rightArrow.svgIcon\" [svgIcon]=\"options.rightArrow.svgIcon\"></mat-icon>\n </button>\n </div>\n</div>\n\n<input #fileInput type=\"file\" hidden [accept]=\"accept\" (change)=\"onFilesChange($event)\" [multiple]=\"multipleUpload\">\n", styles: [":root{--nice-assets-carousel-asset-width: 90px;--nice-assets-carousel-asset-height: 60px;--nice-assets-carousel-asset-gap: .75rem}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i2$1.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: NiceDropzoneDirective, selector: "[niceDropzone]", outputs: ["filesDropped"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], animations: niceAnimations, encapsulation: i0.ViewEncapsulation.None });
1949
+ ], queries: [{ propertyName: "activeContent", first: true, predicate: NiceAssetsCarouselActiveContentDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["fileInput"], descendants: true }, { propertyName: "activeVideoElement", first: true, predicate: ["activeVideo"], descendants: true }, { propertyName: "assetsElement", predicate: ["assets"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"carousel-container\" niceDropzone (filesDropped)=\"onFilesDrop($event)\">\n <div\n class=\"active-image\"\n matRipple\n [class.empty-state]=\"!_activeAsset\"\n (click)=\"edit && fileInput.click();\n $event.stopPropagation()\"\n >\n <div *ngIf=\"loading\" class=\"flex flex-row justify-center items-center h-full\">\n <mat-spinner [diameter]=\"32\"></mat-spinner>\n </div>\n <ng-container *ngIf=\"!loading\">\n <ng-container\n *ngIf=\"_activeAsset && activeContent\"\n [ngTemplateOutlet]=\"activeContent\"\n [ngTemplateOutletContext]=\"{ $implicit: _activeAsset}\"\n ></ng-container>\n <img\n *ngIf=\"_activeAsset?.type === 'image'\"\n (mouseover)=\"showOverlay=true\"\n [src]=\"_activeAsset.url ?? _activeAsset.base64\"\n draggable=\"false\"\n class=\"relative\"\n alt=\"active-image\"\n >\n <video #activeVideo *ngIf=\"_activeAsset?.type === 'video'\" draggable=\"false\" loop [src]=\"_activeAsset.url ?? _activeAsset.base64\"></video>\n\n <div class=\"empty-state-content\" *ngIf=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n <div class=\"text\">\n {{ \"nice_ui_kit.assets_carousel.upload_here\" | translate }}\n </div>\n </div>\n\n <div *ngIf=\"_activeAsset && showOverlay && edit\" class=\"active-image-overlay\">\n <div\n (mouseout)=\"showOverlay=false\"\n class=\"flex flex-col justify-center items-center w-full h-full\"\n >\n <mat-icon *ngIf=\"options.upload.matIcon\">{{ options.upload.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.upload.svgIcon\" [svgIcon]=\"options.upload.svgIcon\"></mat-icon>\n </div>\n </div>\n\n <div *ngIf=\"edit\" class=\"active-buttons\">\n <button mat-icon-button (click)=\"fileInput.click(); $event.stopPropagation()\">\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.matIcon\">{{ options.actionButtons.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.addPhoto.svgIcon\" [svgIcon]=\"options.actionButtons.addPhoto.svgIcon\"></mat-icon>\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"assetActions\" (click)=\"$event.stopPropagation()\" [disabled]=\"!_activeAsset\">\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.matIcon\">{{ options.actionButtons.moreOptions.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.moreOptions.svgIcon\" [svgIcon]=\"options.actionButtons.moreOptions.svgIcon\"></mat-icon>\n </button>\n <mat-menu class=\"nice-asset-options-menu\" [xPosition]=\"'before'\" #assetActions=\"matMenu\">\n <button\n mat-menu-item\n *ngFor=\"let action of customActions\"\n (click)=\"clickCustom(action)\"\n >\n <mat-icon *ngIf=\"action.icon.matIcon\">{{ action.icon.matIcon }}</mat-icon>\n <mat-icon [svgIcon]=\"action.icon.svgIcon\" *ngIf=\"action.icon.svgIcon\"></mat-icon>\n <span>{{ action.name | translate }}</span>\n </button>\n <button mat-menu-item (click)=\"clickRemove()\">\n <mat-icon *ngIf=\"options.actionButtons.remove.matIcon\">{{ options.actionButtons.remove.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.actionButtons.remove.svgIcon\" [svgIcon]=\"options.actionButtons.remove.svgIcon\"></mat-icon>\n <span>{{ \"nice_ui_kit.assets_carousel.delete\" | translate }}</span>\n </button>\n </mat-menu>\n </div>\n </ng-container>\n </div>\n\n <div class=\"carousel\">\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button left-arrow\" mat-icon-button [disabled]=\"!_active\" (click)=\"clickLeft()\">\n <mat-icon *ngIf=\"options.leftArrow.matIcon\">{{ options.leftArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.leftArrow.svgIcon\" [svgIcon]=\"options.leftArrow.svgIcon\"></mat-icon>\n </button>\n <div class=\"asset-list-container\">\n <div *ngIf=\"showAddAssetContainer && edit\" class=\"add-asset-container\">\n <div class=\"add-asset\" matRipple (click)=\"fileInput.click()\">\n <mat-icon *ngIf=\"options.addPhoto.matIcon\">{{ options.addPhoto.matIcon }}</mat-icon>\n <mat-icon *ngIf=\"options.addPhoto.svgIcon\" [svgIcon]=\"options.addPhoto.svgIcon\"></mat-icon>\n </div>\n </div>\n <div class=\"asset-list\" [ngStyle]=\"listStyle\">\n <div\n #assets\n class=\"asset\"\n *ngFor=\"let asset of _assets; let i = index\"\n (click)=\"clickAsset(i)\"\n [ngClass]=\"color\"\n [class.active]=\"_active === i\"\n >\n <ng-container>\n <img\n *ngIf=\"asset.type === 'image'\"\n draggable=\"false\"\n [src]=\"asset.url ?? asset.base64\"\n alt=\"add-image\"\n />\n <video\n *ngIf=\"asset.type === 'video'\"\n draggable=\"false\"\n loop\n [src]=\"asset.url ?? asset.base64\"\n ></video>\n </ng-container>\n </div>\n </div>\n </div>\n <button *ngIf=\"showAddAssetContainer || _activeAsset\" class=\"action-button right-arrow\" mat-icon-button [disabled]=\"_lastAsset\" (click)=\"clickRight()\">\n <mat-icon *ngIf=\"options.rightArrow.matIcon\">{{ options.rightArrow.matIcon }}</mat-icon>\n <mat-icon class=\"arrows\" *ngIf=\"options.rightArrow.svgIcon\" [svgIcon]=\"options.rightArrow.svgIcon\"></mat-icon>\n </button>\n </div>\n</div>\n\n<input #fileInput type=\"file\" hidden [accept]=\"accept\" (change)=\"onFilesChange($event)\" [multiple]=\"multipleUpload\">\n", styles: [":root{--nice-assets-carousel-asset-width: 90px;--nice-assets-carousel-asset-height: 60px;--nice-assets-carousel-asset-gap: .75rem}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4$1.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i4$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i2$1.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: NiceDropzoneDirective, selector: "[niceDropzone]", outputs: ["filesDropped"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }], animations: niceAnimations, encapsulation: i0.ViewEncapsulation.None });
1926
1950
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.3", ngImport: i0, type: NiceAssetsCarouselComponent, decorators: [{
1927
1951
  type: Component,
1928
1952
  args: [{ selector: "nice-assets-carousel", encapsulation: ViewEncapsulation.None, animations: niceAnimations, providers: [