@snabcentr/client-ui 3.22.0 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cart/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from './cart-item/sc-cart-item.component';
2
+ export * from './sc-car-add-products-from-csv-dialog/sc-car-add-products-from-csv-dialog.component';
@@ -0,0 +1,62 @@
1
+ import { Signal } from '@angular/core';
2
+ import { FormControl } from '@angular/forms';
3
+ import { TuiDialogContext } from '@taiga-ui/core';
4
+ import { Observable, Subject } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Компонент диалога для добавления товаров в корзину из CSV файла.
8
+ */
9
+ export declare class ScCarAddProductsFromCsvDialogComponent {
10
+ /**
11
+ * Контекст диалогового окна, в котором открыт компонент.
12
+ */
13
+ protected readonly context: TuiDialogContext;
14
+ /**
15
+ * Сервис для работы с корзиной.
16
+ */
17
+ private readonly cartService;
18
+ /**
19
+ * Объект окна.
20
+ */
21
+ private readonly window;
22
+ /**
23
+ * {@link Subject} события скачивания цен каталога.
24
+ */
25
+ protected readonly onDownloadClick: Subject<void>;
26
+ /**
27
+ * {@link Observable} запроса на скачивание цен каталога.
28
+ */
29
+ protected readonly downloadRequest$: Observable<Blob | null | undefined>;
30
+ /**
31
+ * Признак того, что запрос выполняется.
32
+ */
33
+ protected readonly isDownloadLoading: Signal<boolean>;
34
+ /**
35
+ * {@link Subject} события отправки формы.
36
+ */
37
+ protected readonly onSubmit$: Subject<void>;
38
+ /**
39
+ * {@link Observable} запроса на добавление товаров из CSV файла.
40
+ */
41
+ protected readonly submitRequest$: Observable<import("@snabcentr/client-core").ScCart | null>;
42
+ /**
43
+ * Признак того, что запрос на добавление товаров выполняется.
44
+ */
45
+ protected readonly isSubmitLoading: Signal<boolean>;
46
+ /**
47
+ * Поле для загрузки файла.
48
+ */
49
+ protected readonly control: FormControl<File | null>;
50
+ /**
51
+ * Метод для удаления загруженного файла.
52
+ */
53
+ protected removeFile(): void;
54
+ /**
55
+ * Метод для скачивания примера файла.
56
+ *
57
+ * @param blob Бинарный объект.
58
+ */
59
+ private downloadExampleFile;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScCarAddProductsFromCsvDialogComponent, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScCarAddProductsFromCsvDialogComponent, "sc-car-add-products-from-csv-dialog", never, {}, {}, never, never, true, never>;
62
+ }
@@ -1,6 +1,7 @@
1
1
  export * from './download-price-list/sc-download-price-list.component';
2
2
  export * from './category-card/sc-category-card.component';
3
3
  export * from './input-quantity/sc-input-quantity.component';
4
+ export * from './notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component';
4
5
  export * from './price-card/sc-price-card.component';
5
6
  export * from './price-card-inline/sc-price-card-inline.component';
6
7
  export * from './price-history/sc-price-history.component';
@@ -0,0 +1,68 @@
1
+ import { Signal } from '@angular/core';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+ import { ScCatalogService, ScISuggestionType, ScIWarehouse, ScProduct } from '@snabcentr/client-core';
4
+ import { TuiContext, TuiStringHandler } from '@taiga-ui/cdk';
5
+ import { TuiDialogContext } from '@taiga-ui/core';
6
+ import { Subject } from 'rxjs';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * Компонент формы отправки запроса на уведомление о поступлении товара.
10
+ */
11
+ export declare class ScNotifyWhenInStockDialogComponent {
12
+ /**
13
+ * Контекст диалогового окна, в котором открыт компонент.
14
+ */
15
+ protected readonly context: TuiDialogContext<void, {
16
+ product: ScProduct;
17
+ onClickOfferHandler: () => void;
18
+ }>;
19
+ /**
20
+ * Товар.
21
+ */
22
+ protected readonly product: ScProduct;
23
+ /**
24
+ * Форма для отправки запроса на уведомление о поступлении товара.
25
+ */
26
+ protected readonly form: FormGroup<{
27
+ email: FormControl<string | null>;
28
+ phone: FormControl<string | null>;
29
+ verificationCode: FormControl<string | null>;
30
+ warehouseId: FormControl<string | null>;
31
+ }>;
32
+ /**
33
+ * Список складов.
34
+ */
35
+ protected readonly warehouses: Signal<ScIWarehouse[] | null>;
36
+ /**
37
+ * Перечисление типов подсказок.
38
+ */
39
+ protected readonly suggestionType: typeof ScISuggestionType;
40
+ /**
41
+ * Сервис для работы с каталогом.
42
+ */
43
+ protected readonly catalogService: ScCatalogService;
44
+ /**
45
+ * {@link Subject} события отправки формы.
46
+ */
47
+ protected readonly onSubmit$: Subject<void>;
48
+ /**
49
+ * {@link Observable} запроса данных уведомления о поступлении товара.
50
+ */
51
+ private readonly request$;
52
+ /**
53
+ * Сигнал изменения состояния загрузки данных.
54
+ */
55
+ protected readonly loading: Signal<boolean>;
56
+ /**
57
+ * Проверяет, является ли товар в наличии.
58
+ */
59
+ protected isStock(): boolean;
60
+ /**
61
+ * Преобразует объект в значение, отображаемое в поле ввода.
62
+ *
63
+ * @param items Выбранные значения.
64
+ */
65
+ protected stringify(items: readonly ScIWarehouse[]): TuiStringHandler<TuiContext<number>>;
66
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScNotifyWhenInStockDialogComponent, never>;
67
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScNotifyWhenInStockDialogComponent, "sc-notify-when-in-stock-dialog", never, {}, {}, never, never, true, never>;
68
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './cart-item/sc-cart-item.component';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9DQUFvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jYXJ0LWl0ZW0vc2MtY2FydC1pdGVtLmNvbXBvbmVudCc7XG4iXX0=
2
+ export * from './sc-car-add-products-from-csv-dialog/sc-car-add-products-from-csv-dialog.component';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMscUZBQXFGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NhcnQtaXRlbS9zYy1jYXJ0LWl0ZW0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cvc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cuY29tcG9uZW50JztcbiJdfQ==
@@ -0,0 +1,110 @@
1
+ import { NgIf } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { toSignal } from '@angular/core/rxjs-interop';
4
+ import { FormControl, ReactiveFormsModule } from '@angular/forms';
5
+ import { WA_WINDOW } from '@ng-web-apis/common';
6
+ import { ScCartService, ScUploadedFile } from '@snabcentr/client-core';
7
+ import { tuiIsPresent } from '@taiga-ui/cdk';
8
+ import { TuiButton, TuiLink, TuiLoader } from '@taiga-ui/core';
9
+ import { TuiButtonLoading, TuiFiles } from '@taiga-ui/kit';
10
+ import { POLYMORPHEUS_CONTEXT } from '@taiga-ui/polymorpheus';
11
+ import { filter, map, Observable, share, startWith, Subject, switchMap, tap } from 'rxjs';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@taiga-ui/kit";
14
+ import * as i2 from "@angular/forms";
15
+ /**
16
+ * Компонент диалога для добавления товаров в корзину из CSV файла.
17
+ */
18
+ export class ScCarAddProductsFromCsvDialogComponent {
19
+ constructor() {
20
+ /**
21
+ * Контекст диалогового окна, в котором открыт компонент.
22
+ */
23
+ this.context = inject(POLYMORPHEUS_CONTEXT);
24
+ /**
25
+ * Сервис для работы с корзиной.
26
+ */
27
+ this.cartService = inject(ScCartService);
28
+ /**
29
+ * Объект окна.
30
+ */
31
+ this.window = inject(WA_WINDOW);
32
+ /**
33
+ * {@link Subject} события скачивания цен каталога.
34
+ */
35
+ this.onDownloadClick = new Subject();
36
+ /**
37
+ * {@link Observable} запроса на скачивание цен каталога.
38
+ */
39
+ this.downloadRequest$ = this.onDownloadClick.pipe(switchMap(() => this.cartService.getCartCsvExample$().pipe(tap((blob) => {
40
+ this.downloadExampleFile(blob);
41
+ }), startWith(null))), share(),
42
+ // eslint-disable-next-line unicorn/no-useless-undefined
43
+ startWith(undefined));
44
+ /**
45
+ * Признак того, что запрос выполняется.
46
+ */
47
+ this.isDownloadLoading = toSignal(this.downloadRequest$.pipe(map((value) => value === null)), {
48
+ initialValue: false,
49
+ });
50
+ /**
51
+ * {@link Subject} события отправки формы.
52
+ */
53
+ this.onSubmit$ = new Subject();
54
+ /**
55
+ * {@link Observable} запроса на добавление товаров из CSV файла.
56
+ */
57
+ this.submitRequest$ = this.onSubmit$.pipe(map(() => this.control.value), filter(tuiIsPresent), switchMap((file) => new Observable((observer) => {
58
+ const reader = new FileReader();
59
+ reader.addEventListener('load', () => {
60
+ observer.next(new ScUploadedFile(file.name, reader.result));
61
+ });
62
+ reader.addEventListener('error', (e) => {
63
+ observer.error(e);
64
+ });
65
+ reader.readAsDataURL(file);
66
+ return () => {
67
+ reader.abort();
68
+ };
69
+ })), switchMap((file) => this.cartService.addProductsFromCsv$(file).pipe(tap(() => {
70
+ this.context.$implicit.complete();
71
+ }), startWith(null))));
72
+ /**
73
+ * Признак того, что запрос на добавление товаров выполняется.
74
+ */
75
+ this.isSubmitLoading = toSignal(this.submitRequest$.pipe(map((value) => value === null)), {
76
+ initialValue: false,
77
+ });
78
+ /**
79
+ * Поле для загрузки файла.
80
+ */
81
+ this.control = new FormControl(null);
82
+ }
83
+ /**
84
+ * Метод для удаления загруженного файла.
85
+ */
86
+ removeFile() {
87
+ this.control.setValue(null);
88
+ }
89
+ /**
90
+ * Метод для скачивания примера файла.
91
+ *
92
+ * @param blob Бинарный объект.
93
+ */
94
+ downloadExampleFile(blob) {
95
+ const url = this.window.URL.createObjectURL(blob);
96
+ // используем ссылку и download, чтобы указать название файла.
97
+ const a = this.window.document.createElement('a');
98
+ a.href = url;
99
+ a.download = 'Пример файла добавления товаров в корзину.csv';
100
+ a.click();
101
+ this.window.URL.revokeObjectURL(url);
102
+ }
103
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScCarAddProductsFromCsvDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ScCarAddProductsFromCsvDialogComponent, isStandalone: true, selector: "sc-car-add-products-from-csv-dialog", ngImport: i0, template: "<div class=\"flex flex-col items-center gap-8\">\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"isDownloadLoading()\"\n size=\"s\"\n class=\"mt-8\"\n >\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"onDownloadClick.next()\"\n >\n \u041F\u0440\u0438\u043C\u0435\u0440 .csv \u0444\u0430\u0439\u043B\u0430\n </button>\n </tui-loader>\n\n <div class=\"flex w-full flex-col gap-1\">\n <label\n tuiInputFiles\n class=\"w-full\"\n >\n <input\n accept=\"text/csv\"\n tuiInputFiles\n [formControl]=\"control\"\n />\n </label>\n\n <tui-files class=\"tui-space_top-1\">\n <tui-file\n *ngIf=\"control.value as file\"\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n </tui-files>\n </div>\n <div class=\"flex gap-2\">\n <button\n tuiButton\n [disabled]=\"!control.value\"\n [loading]=\"isSubmitLoading()\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n (click)=\"onSubmit$.next()\"\n >\n \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C\n </button>\n <button\n tuiButton\n (click)=\"context.$implicit.complete()\"\n type=\"button\"\n appearance=\"secondary\"\n >\n \u041E\u0442\u043C\u0435\u043D\u0430\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "component", type: i1.TuiFile, selector: "tui-file,a[tuiFile],button[tuiFile]", inputs: ["file", "state", "size", "showDelete", "showSize", "leftContent"], outputs: ["remove"] }, { kind: "component", type: i1.TuiInputFiles, selector: "label[tuiInputFiles]" }, { kind: "component", type: i1.TuiFilesComponent, selector: "tui-files", inputs: ["max", "expanded"], outputs: ["expandedChange"] }, { kind: "directive", type: i1.TuiInputFilesDirective, selector: "input[tuiInputFiles]", outputs: ["reject"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
105
+ }
106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScCarAddProductsFromCsvDialogComponent, decorators: [{
107
+ type: Component,
108
+ args: [{ standalone: true, selector: 'sc-car-add-products-from-csv-dialog', imports: [TuiLink, TuiLoader, TuiFiles, ReactiveFormsModule, NgIf, TuiButton, TuiButtonLoading], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col items-center gap-8\">\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"isDownloadLoading()\"\n size=\"s\"\n class=\"mt-8\"\n >\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"onDownloadClick.next()\"\n >\n \u041F\u0440\u0438\u043C\u0435\u0440 .csv \u0444\u0430\u0439\u043B\u0430\n </button>\n </tui-loader>\n\n <div class=\"flex w-full flex-col gap-1\">\n <label\n tuiInputFiles\n class=\"w-full\"\n >\n <input\n accept=\"text/csv\"\n tuiInputFiles\n [formControl]=\"control\"\n />\n </label>\n\n <tui-files class=\"tui-space_top-1\">\n <tui-file\n *ngIf=\"control.value as file\"\n [file]=\"file\"\n (remove)=\"removeFile()\"\n />\n </tui-files>\n </div>\n <div class=\"flex gap-2\">\n <button\n tuiButton\n [disabled]=\"!control.value\"\n [loading]=\"isSubmitLoading()\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n (click)=\"onSubmit$.next()\"\n >\n \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C\n </button>\n <button\n tuiButton\n (click)=\"context.$implicit.complete()\"\n type=\"button\"\n appearance=\"secondary\"\n >\n \u041E\u0442\u043C\u0435\u043D\u0430\n </button>\n </div>\n</div>\n" }]
109
+ }] });
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhcnQvc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cvc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhcnQvc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cvc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxF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QUFFLElBQUksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsbUJBQzlFLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgV0FfV0lORE9XIH0gZnJvbSAnQG5nLXdlYi1hcGlzL2NvbW1vbic7XG5pbXBvcnQgeyBTY0NhcnRTZXJ2aWNlLCBTY1VwbG9hZGVkRmlsZSB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgdHVpSXNQcmVzZW50IH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUdWlCdXR0b24sIFR1aURpYWxvZ0NvbnRleHQsIFR1aUxpbmssIFR1aUxvYWRlciB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aUJ1dHRvbkxvYWRpbmcsIFR1aUZpbGVzIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBQT0xZTU9SUEhFVVNfQ09OVEVYVCB9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIHNoYXJlLCBzdGFydFdpdGgsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINC00LjQsNC70L7Qs9CwINC00LvRjyDQtNC+0LHQsNCy0LvQtdC90LjRjyDRgtC+0LLQsNGA0L7QsiDQsiDQutC+0YDQt9C40L3RgyDQuNC3IENTViDRhNCw0LnQu9CwLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2MtY2FyLWFkZC1wcm9kdWN0cy1mcm9tLWNzdi1kaWFsb2cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1jYXItYWRkLXByb2R1Y3RzLWZyb20tY3N2LWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1R1aUxpbmssIFR1aUxvYWRlciwgVHVpRmlsZXMsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIE5nSWYsIFR1aUJ1dHRvbiwgVHVpQnV0dG9uTG9hZGluZ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjQ2FyQWRkUHJvZHVjdHNGcm9tQ3N2RGlhbG9nQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQmtC+0L3RgtC10LrRgdGCINC00LjQsNC70L7Qs9C+0LLQvtCz0L4g0L7QutC90LAsINCyINC60L7RgtC+0YDQvtC8INC+0YLQutGA0YvRgiDQutC+0LzQv9C+0L3QtdC90YIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRleHQ6IFR1aURpYWxvZ0NvbnRleHQgPSBpbmplY3Q8VHVpRGlhbG9nQ29udGV4dD4oUE9MWU1PUlBIRVVTX0NPTlRFWFQpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrQvtGA0LfQuNC90L7QuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBTY0NhcnRTZXJ2aWNlID0gaW5qZWN0KFNjQ2FydFNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0J7QsdGK0LXQutGCINC+0LrQvdCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcyA9IGluamVjdDxXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcz4oV0FfV0lORE9XKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBTdWJqZWN0fSDRgdC+0LHRi9GC0LjRjyDRgdC60LDRh9C40LLQsNC90LjRjyDRhtC10L0g0LrQsNGC0LDQu9C+0LPQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25Eb3dubG9hZENsaWNrOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQt9Cw0L/RgNC+0YHQsCDQvdCwINGB0LrQsNGH0LjQstCw0L3QuNC1INGG0LXQvSDQutCw0YLQsNC70L7Qs9CwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkb3dubG9hZFJlcXVlc3QkID0gdGhpcy5vbkRvd25sb2FkQ2xpY2sucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldENhcnRDc3ZFeGFtcGxlJCgpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChibG9iOiBCbG9iKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRFeGFtcGxlRmlsZShibG9iKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgobnVsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgc2hhcmUoKSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdXNlbGVzcy11bmRlZmluZWRcbiAgICAgICAgc3RhcnRXaXRoKHVuZGVmaW5lZClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0YLQvtCz0L4sINGH0YLQviDQt9Cw0L/RgNC+0YEg0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNEb3dubG9hZExvYWRpbmc6IFNpZ25hbDxib29sZWFuPiA9IHRvU2lnbmFsKHRoaXMuZG93bmxvYWRSZXF1ZXN0JC5waXBlKG1hcCgodmFsdWUpID0+IHZhbHVlID09PSBudWxsKSksIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBTdWJqZWN0fSDRgdC+0LHRi9GC0LjRjyDQvtGC0L/RgNCw0LLQutC4INGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uU3VibWl0JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0LfQsNC/0YDQvtGB0LAg0L3QsCDQtNC+0LHQsNCy0LvQtdC90LjQtSDRgtC+0LLQsNGA0L7QsiDQuNC3IENTViDRhNCw0LnQu9CwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzdWJtaXRSZXF1ZXN0JCA9IHRoaXMub25TdWJtaXQkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLmNvbnRyb2wudmFsdWUpLFxuICAgICAgICBmaWx0ZXIodHVpSXNQcmVzZW50KSxcbiAgICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAgICAgKGZpbGU6IEZpbGUpID0+XG4gICAgICAgICAgICAgICAgbmV3IE9ic2VydmFibGU8U2NVcGxvYWRlZEZpbGU+KChvYnNlcnZlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChuZXcgU2NVcGxvYWRlZEZpbGUoZmlsZS5uYW1lLCByZWFkZXIucmVzdWx0IGFzIHN0cmluZykpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICApLFxuICAgICAgICBzd2l0Y2hNYXAoKGZpbGUpID0+XG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFByb2R1Y3RzRnJvbUNzdiQoZmlsZSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJGltcGxpY2l0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0YLQvtCz0L4sINGH0YLQviDQt9Cw0L/RgNC+0YEg0L3QsCDQtNC+0LHQsNCy0LvQtdC90LjQtSDRgtC+0LLQsNGA0L7QsiDQstGL0L/QvtC70L3Rj9C10YLRgdGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1N1Ym1pdExvYWRpbmc6IFNpZ25hbDxib29sZWFuPiA9IHRvU2lnbmFsKHRoaXMuc3VibWl0UmVxdWVzdCQucGlwZShtYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCkpLCB7XG4gICAgICAgIGluaXRpYWxWYWx1ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LvQtSDQtNC70Y8g0LfQsNCz0YDRg9C30LrQuCDRhNCw0LnQu9CwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb250cm9sOiBGb3JtQ29udHJvbDxGaWxlIHwgbnVsbD4gPSBuZXcgRm9ybUNvbnRyb2w8RmlsZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqXG4gICAgICog0JzQtdGC0L7QtCDQtNC70Y8g0YPQtNCw0LvQtdC90LjRjyDQt9Cw0LPRgNGD0LbQtdC90L3QvtCz0L4g0YTQsNC50LvQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlRmlsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCc0LXRgtC+0LQg0LTQu9GPINGB0LrQsNGH0LjQstCw0L3QuNGPINC/0YDQuNC80LXRgNCwINGE0LDQudC70LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvYiDQkdC40L3QsNGA0L3Ri9C5INC+0LHRitC10LrRgi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRvd25sb2FkRXhhbXBsZUZpbGUoYmxvYjogQmxvYik6IHZvaWQge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLndpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAvLyDQuNGB0L/QvtC70YzQt9GD0LXQvCDRgdGB0YvQu9C60YMg0LggZG93bmxvYWQsINGH0YLQvtCx0Ysg0YPQutCw0LfQsNGC0Ywg0L3QsNC30LLQsNC90LjQtSDRhNCw0LnQu9CwLlxuICAgICAgICBjb25zdCBhID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgICAgIGEuaHJlZiA9IHVybDtcbiAgICAgICAgYS5kb3dubG9hZCA9ICfQn9GA0LjQvNC10YAg0YTQsNC50LvQsCDQtNC+0LHQsNCy0LvQtdC90LjRjyDRgtC+0LLQsNGA0L7QsiDQsiDQutC+0YDQt9C40L3Rgy5jc3YnO1xuICAgICAgICBhLmNsaWNrKCk7XG4gICAgICAgIHRoaXMud2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLThcIj5cbiAgICA8dHVpLWxvYWRlclxuICAgICAgICBbb3ZlcmxheV09XCJ0cnVlXCJcbiAgICAgICAgW3Nob3dMb2FkZXJdPVwiaXNEb3dubG9hZExvYWRpbmcoKVwiXG4gICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgY2xhc3M9XCJtdC04XCJcbiAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgIFtwc2V1ZG9dPVwidHJ1ZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkRvd25sb2FkQ2xpY2submV4dCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0J/RgNC40LzQtdGAIC5jc3Yg0YTQsNC50LvQsFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L3R1aS1sb2FkZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICB0dWlJbnB1dEZpbGVzXG4gICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIGFjY2VwdD1cInRleHQvY3N2XCJcbiAgICAgICAgICAgICAgICB0dWlJbnB1dEZpbGVzXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICA8dHVpLWZpbGVzIGNsYXNzPVwidHVpLXNwYWNlX3RvcC0xXCI+XG4gICAgICAgICAgICA8dHVpLWZpbGVcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRyb2wudmFsdWUgYXMgZmlsZVwiXG4gICAgICAgICAgICAgICAgW2ZpbGVdPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgKHJlbW92ZSk9XCJyZW1vdmVGaWxlKClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC90dWktZmlsZXM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgW2xvYWRpbmddPVwiaXNTdWJtaXRMb2FkaW5nKClcIlxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5zYy5zZW5kXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0JC5uZXh0KClcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQl9Cw0LPRgNGD0LfQuNGC0YxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbnRleHQuJGltcGxpY2l0LmNvbXBsZXRlKClcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0J7RgtC80LXQvdCwXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -1,6 +1,7 @@
1
1
  export * from './download-price-list/sc-download-price-list.component';
2
2
  export * from './category-card/sc-category-card.component';
3
3
  export * from './input-quantity/sc-input-quantity.component';
4
+ export * from './notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component';
4
5
  export * from './price-card/sc-price-card.component';
5
6
  export * from './price-card-inline/sc-price-card-inline.component';
6
7
  export * from './price-history/sc-price-history.component';
@@ -8,4 +9,4 @@ export * from './price-list-pagination/sc-price-list-pagination.component';
8
9
  export * from './price-warehouse-stock/sc-price-warehouse-stock.component';
9
10
  export * from './sc-favorite-button/sc-favorite-button.component';
10
11
  export * from './sc-catalog.module';
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyw4Q0FBOEMsQ0FBQztBQUM3RCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kb3dubG9hZC1wcmljZS1saXN0L3NjLWRvd25sb2FkLXByaWNlLWxpc3QuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY2F0ZWdvcnktY2FyZC9zYy1jYXRlZ29yeS1jYXJkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2lucHV0LXF1YW50aXR5L3NjLWlucHV0LXF1YW50aXR5LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ByaWNlLWNhcmQvc2MtcHJpY2UtY2FyZC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wcmljZS1jYXJkLWlubGluZS9zYy1wcmljZS1jYXJkLWlubGluZS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wcmljZS1oaXN0b3J5L3NjLXByaWNlLWhpc3RvcnkuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtbGlzdC1wYWdpbmF0aW9uL3NjLXByaWNlLWxpc3QtcGFnaW5hdGlvbi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wcmljZS13YXJlaG91c2Utc3RvY2svc2MtcHJpY2Utd2FyZWhvdXNlLXN0b2NrLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWZhdm9yaXRlLWJ1dHRvbi9zYy1mYXZvcml0ZS1idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtY2F0YWxvZy5tb2R1bGUnO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyw4Q0FBOEMsQ0FBQztBQUM3RCxjQUFjLHdFQUF3RSxDQUFDO0FBQ3ZGLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLG1EQUFtRCxDQUFDO0FBQ2xFLGNBQWMscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Rvd25sb2FkLXByaWNlLWxpc3Qvc2MtZG93bmxvYWQtcHJpY2UtbGlzdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jYXRlZ29yeS1jYXJkL3NjLWNhdGVnb3J5LWNhcmQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaW5wdXQtcXVhbnRpdHkvc2MtaW5wdXQtcXVhbnRpdHkuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZ5LXdoZW4taW4tc3RvY2stZGlhbG9nL3NjLW5vdGlmeS13aGVuLWluLXN0b2NrLWRpYWxvZy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wcmljZS1jYXJkL3NjLXByaWNlLWNhcmQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtY2FyZC1pbmxpbmUvc2MtcHJpY2UtY2FyZC1pbmxpbmUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtaGlzdG9yeS9zYy1wcmljZS1oaXN0b3J5LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ByaWNlLWxpc3QtcGFnaW5hdGlvbi9zYy1wcmljZS1saXN0LXBhZ2luYXRpb24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2Utd2FyZWhvdXNlLXN0b2NrL3NjLXByaWNlLXdhcmVob3VzZS1zdG9jay5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1mYXZvcml0ZS1idXR0b24vc2MtZmF2b3JpdGUtYnV0dG9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWNhdGFsb2cubW9kdWxlJztcbiJdfQ==
@@ -0,0 +1,126 @@
1
+ /* eslint-disable class-methods-use-this,unicorn/no-useless-undefined, @typescript-eslint/unbound-method */
2
+ import { AsyncPipe, NgIf } from '@angular/common';
3
+ import { HttpErrorResponse } from '@angular/common/http';
4
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
5
+ import { toSignal } from '@angular/core/rxjs-interop';
6
+ import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
7
+ import { ScCatalogService, ScISuggestionType, ScWarehouseService } from '@snabcentr/client-core';
8
+ import { TuiButton, TuiError, TuiLabel, TuiLink, TuiLoader } from '@taiga-ui/core';
9
+ import { TuiButtonLoading, TuiFieldErrorPipe } from '@taiga-ui/kit';
10
+ import { TuiInputModule, TuiSelectModule } from '@taiga-ui/legacy';
11
+ import { POLYMORPHEUS_CONTEXT } from '@taiga-ui/polymorpheus';
12
+ import { catchError, filter, map, of, share, startWith, Subject, switchMap, tap } from 'rxjs';
13
+ import { ScFormFieldsModule } from '../../form-fields/form-fields.module';
14
+ import { ScVerificationModule } from '../../verification/sc-verification.module';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../../verification/verification-phone-check-form/sc-verification-phone-check-form.component";
17
+ import * as i2 from "@angular/forms";
18
+ import * as i3 from "@taiga-ui/legacy";
19
+ import * as i4 from "../../form-fields/suggestion-field/sc-suggestion-field.component";
20
+ import * as i5 from "@taiga-ui/core/components/data-list";
21
+ /**
22
+ * Компонент формы отправки запроса на уведомление о поступлении товара.
23
+ */
24
+ export class ScNotifyWhenInStockDialogComponent {
25
+ constructor() {
26
+ /**
27
+ * Контекст диалогового окна, в котором открыт компонент.
28
+ */
29
+ this.context = inject(POLYMORPHEUS_CONTEXT);
30
+ /**
31
+ * Товар.
32
+ */
33
+ this.product = this.context.data.product;
34
+ /**
35
+ * Форма для отправки запроса на уведомление о поступлении товара.
36
+ */
37
+ this.form = new FormGroup({
38
+ email: new FormControl(null, [Validators.required, Validators.email]),
39
+ phone: new FormControl(null, [Validators.required, Validators.minLength(12)]),
40
+ verificationCode: new FormControl(null, [Validators.required, Validators.minLength(6)]),
41
+ warehouseId: new FormControl(null, Validators.required),
42
+ });
43
+ /**
44
+ * Список складов.
45
+ */
46
+ this.warehouses = toSignal(inject(ScWarehouseService).getWarehouses$(), { initialValue: null });
47
+ /**
48
+ * Перечисление типов подсказок.
49
+ */
50
+ this.suggestionType = ScISuggestionType;
51
+ /**
52
+ * Сервис для работы с каталогом.
53
+ */
54
+ this.catalogService = inject(ScCatalogService);
55
+ /**
56
+ * {@link Subject} события отправки формы.
57
+ */
58
+ this.onSubmit$ = new Subject();
59
+ /**
60
+ * {@link Observable} запроса данных уведомления о поступлении товара.
61
+ */
62
+ this.request$ = this.onSubmit$.pipe(filter(() => this.form.valid), map(() => this.form.value), switchMap((value) => this.catalogService.getProductNotifyWhenInStock$(this.product.id, value).pipe(tap(() => {
63
+ this.context.completeWith();
64
+ }), catchError((error) => {
65
+ if (error instanceof HttpErrorResponse) {
66
+ const { errors, message } = error.error;
67
+ if (errors) {
68
+ // eslint-disable-next-line no-shadow
69
+ Object.entries(errors).forEach(([key, value]) => {
70
+ this.form.get(key)?.setErrors({ serverResponse: value });
71
+ });
72
+ }
73
+ else if (message) {
74
+ this.form.setErrors({ serverResponse: [message] });
75
+ }
76
+ }
77
+ return of(undefined);
78
+ }), startWith(null))), share());
79
+ /**
80
+ * Сигнал изменения состояния загрузки данных.
81
+ */
82
+ this.loading = toSignal(this.request$.pipe(map((value) => value === null)), { initialValue: false });
83
+ }
84
+ /**
85
+ * Проверяет, является ли товар в наличии.
86
+ */
87
+ isStock() {
88
+ const warehouseId = Number(this.form.get('warehouseId')?.value ?? 0);
89
+ return this.product.isWarehouseStockExist(warehouseId);
90
+ }
91
+ /**
92
+ * Преобразует объект в значение, отображаемое в поле ввода.
93
+ *
94
+ * @param items Выбранные значения.
95
+ */
96
+ stringify(items) {
97
+ const itemsMap = new Map(items.map((item) => {
98
+ return [item.id, item.name];
99
+ }));
100
+ return ({ $implicit }) => itemsMap.get($implicit) ?? '';
101
+ }
102
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScNotifyWhenInStockDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
103
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ScNotifyWhenInStockDialogComponent, isStandalone: true, selector: "sc-notify-when-in-stock-dialog", ngImport: i0, template: "<form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit$.next()\"\n class=\"flex flex-col gap-6\"\n>\n <div class=\"flex flex-col gap-3\">\n <sc-verification-phone-check-form [shouldBeConfirmed]=\"true\" />\n\n <label tuiLabel>\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <tui-input formControlName=\"email\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <sc-suggestion-field\n *tuiDataList\n [type]=\"suggestionType.email\"\n />\n </tui-input>\n <tui-error\n formControlName=\"email\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0421\u043A\u043B\u0430\u0434\n <tui-select\n formControlName=\"warehouseId\"\n [valueContent]=\"warehouses() ? stringify(warehouses()!) : selectLoading\"\n >\n \u0421\u043A\u043B\u0430\u0434\n <tui-data-list *tuiDataList>\n @for (warehouse of warehouses(); track warehouse.id) {\n <button\n tuiOption\n [value]=\"warehouse.id\"\n >\n {{ warehouse.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"warehouseId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n\n <span\n *ngIf=\"isStock()\"\n [style.color]=\"'var(--tui-text-positive)'\"\n >\u0422\u043E\u0432\u0430\u0440 \u0438\u043C\u0435\u0435\u0442\u0441\u044F \u0432 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C \u0441\u043A\u043B\u0430\u0434\u0435</span\n >\n </label>\n <ng-template #selectLoading> <tui-loader /> </ng-template>\n </div>\n\n <div class=\"flex flex-wrap items-center gap-3\">\n <button\n tuiButton\n type=\"submit\"\n [disabled]=\"form.invalid || isStock()\"\n [loading]=\"loading()\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n >\n \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\n </button>\n <div class=\"grow basis-60 text-body-s\">\n \u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443, \u0432\u044B \u0441\u043E\u0433\u043B\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044C \u0441\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"context.data.onClickOfferHandler()\"\n >\n \u041F\u043E\u043B\u0438\u0442\u0438\u043A\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n </button>\n </div>\n </div>\n\n <tui-error\n *ngIf=\"form.errors && form.errors['serverResponse']\"\n [error]=\"[] | tuiFieldError | async\"\n />\n</form>\n", dependencies: [{ kind: "ngmodule", type: ScVerificationModule }, { kind: "component", type: i1.ScVerificationPhoneCheckFormComponent, selector: "sc-verification-phone-check-form", inputs: ["showCodeFields", "readOnly", "shouldBeBusy", "shouldBeConfirmed", "haveCode"], outputs: ["haveCodeChange", "isBusyChange", "isConfirmedChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: TuiInputModule }, { kind: "component", type: i3.TuiInputComponent, selector: "tui-input" }, { kind: "directive", type: i3.TuiInputDirective, selector: "tui-input" }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "ngmodule", type: ScFormFieldsModule }, { kind: "component", type: i4.ScSuggestionFieldComponent, selector: "sc-suggestion-field", inputs: ["type"], outputs: ["selectedClick"] }, { kind: "ngmodule", type: TuiSelectModule }, { kind: "component", type: i3.TuiSelectComponent, selector: "tui-select", inputs: ["stringify", "identityMatcher", "valueContent"] }, { kind: "directive", type: i3.TuiSelectDirective, selector: "tui-select" }, { kind: "component", type: i5.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "directive", type: i5.TuiDataListDirective, selector: "ng-template[tuiDataList]" }, { kind: "component", type: i5.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
104
+ }
105
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScNotifyWhenInStockDialogComponent, decorators: [{
106
+ type: Component,
107
+ args: [{ standalone: true, selector: 'sc-notify-when-in-stock-dialog', imports: [
108
+ ScVerificationModule,
109
+ FormsModule,
110
+ ReactiveFormsModule,
111
+ TuiInputModule,
112
+ TuiLink,
113
+ TuiButton,
114
+ TuiLabel,
115
+ TuiFieldErrorPipe,
116
+ TuiError,
117
+ ScVerificationModule,
118
+ ScFormFieldsModule,
119
+ TuiSelectModule,
120
+ TuiButtonLoading,
121
+ TuiLoader,
122
+ AsyncPipe,
123
+ NgIf,
124
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit$.next()\"\n class=\"flex flex-col gap-6\"\n>\n <div class=\"flex flex-col gap-3\">\n <sc-verification-phone-check-form [shouldBeConfirmed]=\"true\" />\n\n <label tuiLabel>\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <tui-input formControlName=\"email\">\n \u0410\u0434\u0440\u0435\u0441 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u044B\n <sc-suggestion-field\n *tuiDataList\n [type]=\"suggestionType.email\"\n />\n </tui-input>\n <tui-error\n formControlName=\"email\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0421\u043A\u043B\u0430\u0434\n <tui-select\n formControlName=\"warehouseId\"\n [valueContent]=\"warehouses() ? stringify(warehouses()!) : selectLoading\"\n >\n \u0421\u043A\u043B\u0430\u0434\n <tui-data-list *tuiDataList>\n @for (warehouse of warehouses(); track warehouse.id) {\n <button\n tuiOption\n [value]=\"warehouse.id\"\n >\n {{ warehouse.name }}\n </button>\n }\n </tui-data-list>\n </tui-select>\n <tui-error\n formControlName=\"warehouseId\"\n [error]=\"[] | tuiFieldError | async\"\n />\n\n <span\n *ngIf=\"isStock()\"\n [style.color]=\"'var(--tui-text-positive)'\"\n >\u0422\u043E\u0432\u0430\u0440 \u0438\u043C\u0435\u0435\u0442\u0441\u044F \u0432 \u043D\u0430\u043B\u0438\u0447\u0438\u0438 \u043D\u0430 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u043C \u0441\u043A\u043B\u0430\u0434\u0435</span\n >\n </label>\n <ng-template #selectLoading> <tui-loader /> </ng-template>\n </div>\n\n <div class=\"flex flex-wrap items-center gap-3\">\n <button\n tuiButton\n type=\"submit\"\n [disabled]=\"form.invalid || isStock()\"\n [loading]=\"loading()\"\n iconStart=\"@tui.sc.send\"\n class=\"self-center\"\n >\n \u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C\n </button>\n <div class=\"grow basis-60 text-body-s\">\n \u041D\u0430\u0436\u0438\u043C\u0430\u044F \u043D\u0430 \u043A\u043D\u043E\u043F\u043A\u0443, \u0432\u044B \u0441\u043E\u0433\u043B\u0430\u0448\u0430\u0435\u0442\u0435\u0441\u044C \u0441\n <button\n tuiLink\n [pseudo]=\"true\"\n type=\"button\"\n (click)=\"context.data.onClickOfferHandler()\"\n >\n \u041F\u043E\u043B\u0438\u0442\u0438\u043A\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0434\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438\n </button>\n </div>\n </div>\n\n <tui-error\n *ngIf=\"form.errors && form.errors['serverResponse']\"\n [error]=\"[] | tuiFieldError | async\"\n />\n</form>\n" }]
125
+ }] });
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtbm90aWZ5LXdoZW4taW4tc3RvY2stZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9jYXRhbG9nL25vdGlmeS13aGVuLWluLXN0b2NrLWRpYWxvZy9zYy1ub3RpZnktd2hlbi1pbi1zdG9jay1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvbm90aWZ5LXdoZW4taW4tc3RvY2stZGlhbG9nL3NjLW5vdGlmeS13aGVuLWluLXN0b2NrLWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyR0FBMkc7QUFFM0csT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBK0IsaUJBQWlCLEVBQTJCLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkosT0FBTyxFQUFFLFNBQVMsRUFBb0IsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1B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LENBQUMsQ0FBQyxDQUNMLENBQUM7UUFFRixPQUFPLENBQUMsRUFBRSxTQUFTLEVBQXNCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hGLENBQUM7K0dBdEdRLGtDQUFrQzttR0FBbEMsa0NBQWtDLDBGQzlDL0MsczdHQW9GQSwyQ0R6RFEsb0JBQW9CLDhTQUNwQixXQUFXLDJZQUNYLG1CQUFtQiwrVUFDbkIsY0FBYyxtTEFDZCxPQUFPLDRGQUNQLFNBQVMsb0lBQ1QsUUFBUSx1REFDUixpQkFBaUIsc0RBQ2pCLFFBQVEsd0VBRVIsa0JBQWtCLHlLQUNsQixlQUFlLDBtQkFDZixnQkFBZ0IsdUhBQ2hCLFNBQVMsNEhBQ1QsU0FBUyw4Q0FDVCxJQUFJOzs0RkFJQyxrQ0FBa0M7a0JBeEI5QyxTQUFTO2lDQUNNLElBQUksWUFDTixnQ0FBZ0MsV0FFakM7d0JBQ0wsb0JBQW9CO3dCQUNwQixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsY0FBYzt3QkFDZCxPQUFPO3dCQUNQLFNBQVM7d0JBQ1QsUUFBUTt3QkFDUixpQkFBaUI7d0JBQ2pCLFFBQVE7d0JBQ1Isb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixTQUFTO3dCQUNULFNBQVM7d0JBQ1QsSUFBSTtxQkFDUCxtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMsdW5pY29ybi9uby11c2VsZXNzLXVuZGVmaW5lZCwgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5cbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2NDYXRhbG9nU2VydmljZSwgU2NJUHJvZHVjdE5vdGlmeVdoZW5JblN0b2NrLCBTY0lTdWdnZXN0aW9uVHlwZSwgU2NJV2FyZWhvdXNlLCBTY1Byb2R1Y3QsIFNjV2FyZWhvdXNlU2VydmljZSB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVHVpQ29udGV4dCwgVHVpU3RyaW5nSGFuZGxlciB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVHVpQnV0dG9uLCBUdWlEaWFsb2dDb250ZXh0LCBUdWlFcnJvciwgVHVpTGFiZWwsIFR1aUxpbmssIFR1aUxvYWRlciB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aUJ1dHRvbkxvYWRpbmcsIFR1aUZpZWxkRXJyb3JQaXBlIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBUdWlJbnB1dE1vZHVsZSwgVHVpU2VsZWN0TW9kdWxlIH0gZnJvbSAnQHRhaWdhLXVpL2xlZ2FjeSc7XG5pbXBvcnQgeyBQT0xZTU9SUEhFVVNfQ09OVEVYVCB9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlsdGVyLCBtYXAsIG9mLCBzaGFyZSwgc3RhcnRXaXRoLCBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcGlFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXV0aCc7XG5pbXBvcnQgeyBTY0Zvcm1GaWVsZHNNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3JtLWZpZWxkcy9mb3JtLWZpZWxkcy5tb2R1bGUnO1xuaW1wb3J0IHsgU2NWZXJpZmljYXRpb25Nb2R1bGUgfSBmcm9tICcuLi8uLi92ZXJpZmljYXRpb24vc2MtdmVyaWZpY2F0aW9uLm1vZHVsZSc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINGE0L7RgNC80Ysg0L7RgtC/0YDQsNCy0LrQuCDQt9Cw0L/RgNC+0YHQsCDQvdCwINGD0LLQtdC00L7QvNC70LXQvdC40LUg0L4g0L/QvtGB0YLRg9C/0LvQtdC90LjQuCDRgtC+0LLQsNGA0LAuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1ub3RpZnktd2hlbi1pbi1zdG9jay1kaWFsb2cnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1ub3RpZnktd2hlbi1pbi1zdG9jay1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgU2NWZXJpZmljYXRpb25Nb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBUdWlJbnB1dE1vZHVsZSxcbiAgICAgICAgVHVpTGluayxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlMYWJlbCxcbiAgICAgICAgVHVpRmllbGRFcnJvclBpcGUsXG4gICAgICAgIFR1aUVycm9yLFxuICAgICAgICBTY1ZlcmlmaWNhdGlvbk1vZHVsZSxcbiAgICAgICAgU2NGb3JtRmllbGRzTW9kdWxlLFxuICAgICAgICBUdWlTZWxlY3RNb2R1bGUsXG4gICAgICAgIFR1aUJ1dHRvbkxvYWRpbmcsXG4gICAgICAgIFR1aUxvYWRlcixcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBOZ0lmLFxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjTm90aWZ5V2hlbkluU3RvY2tEaWFsb2dDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqINCa0L7QvdGC0LXQutGB0YIg0LTQuNCw0LvQvtCz0L7QstC+0LPQviDQvtC60L3QsCwg0LIg0LrQvtGC0L7RgNC+0Lwg0L7RgtC60YDRi9GCINC60L7QvNC/0L7QvdC10L3Rgi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29udGV4dDogVHVpRGlhbG9nQ29udGV4dDx2b2lkLCB7IHByb2R1Y3Q6IFNjUHJvZHVjdDsgb25DbGlja09mZmVySGFuZGxlcjogKCkgPT4gdm9pZCB9PiA9XG4gICAgICAgIGluamVjdDxUdWlEaWFsb2dDb250ZXh0PHZvaWQsIHsgcHJvZHVjdDogU2NQcm9kdWN0OyBvbkNsaWNrT2ZmZXJIYW5kbGVyOiAoKSA9PiB2b2lkIH0+PihQT0xZTU9SUEhFVVNfQ09OVEVYVCk7XG5cbiAgICAvKipcbiAgICAgKiDQotC+0LLQsNGALlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcm9kdWN0OiBTY1Byb2R1Y3QgPSB0aGlzLmNvbnRleHQuZGF0YS5wcm9kdWN0O1xuXG4gICAgLyoqXG4gICAgICog0KTQvtGA0LzQsCDQtNC70Y8g0L7RgtC/0YDQsNCy0LrQuCDQt9Cw0L/RgNC+0YHQsCDQvdCwINGD0LLQtdC00L7QvNC70LXQvdC40LUg0L4g0L/QvtGB0YLRg9C/0LvQtdC90LjQuCDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgZW1haWw6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0pLFxuICAgICAgICBwaG9uZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxMildKSxcbiAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg2KV0pLFxuICAgICAgICB3YXJlaG91c2VJZDogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0LrQu9Cw0LTQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSB3YXJlaG91c2VzOiBTaWduYWw8U2NJV2FyZWhvdXNlW10gfCBudWxsPiA9IHRvU2lnbmFsKGluamVjdChTY1dhcmVob3VzZVNlcnZpY2UpLmdldFdhcmVob3VzZXMkKCksIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXRh9C40YHQu9C10L3QuNC1INGC0LjQv9C+0LIg0L/QvtC00YHQutCw0LfQvtC6LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzdWdnZXN0aW9uVHlwZTogdHlwZW9mIFNjSVN1Z2dlc3Rpb25UeXBlID0gU2NJU3VnZ2VzdGlvblR5cGU7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutCw0YLQsNC70L7Qs9C+0LwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhdGFsb2dTZXJ2aWNlOiBTY0NhdGFsb2dTZXJ2aWNlID0gaW5qZWN0KFNjQ2F0YWxvZ1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIFN1YmplY3R9INGB0L7QsdGL0YLQuNGPINC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgb25TdWJtaXQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDQt9Cw0L/RgNC+0YHQsCDQtNCw0L3QvdGL0YUg0YPQstC10LTQvtC80LvQtdC90LjRjyDQviDQv9C+0YHRgtGD0L/Qu9C10L3QuNC4INGC0L7QstCw0YDQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3QkID0gdGhpcy5vblN1Ym1pdCQucGlwZShcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZm9ybS52YWxpZCksXG4gICAgICAgIG1hcCgoKSA9PiB0aGlzLmZvcm0udmFsdWUgYXMgU2NJUHJvZHVjdE5vdGlmeVdoZW5JblN0b2NrKSxcbiAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0UHJvZHVjdE5vdGlmeVdoZW5JblN0b2NrJCh0aGlzLnByb2R1Y3QuaWQsIHZhbHVlKS5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5jb21wbGV0ZVdpdGgoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvcnMsIG1lc3NhZ2UgfSA9IGVycm9yLmVycm9yIGFzIEFwaUVycm9yUmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZXJyb3JzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldChrZXkpPy5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IFttZXNzYWdlXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN0YXJ0V2l0aChudWxsKVxuICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBzaGFyZSgpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCh0LjQs9C90LDQuyDQuNC30LzQtdC90LXQvdC40Y8g0YHQvtGB0YLQvtGP0L3QuNGPINC30LDQs9GA0YPQt9C60Lgg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBsb2FkaW5nOiBTaWduYWw8Ym9vbGVhbj4gPSB0b1NpZ25hbCh0aGlzLnJlcXVlc3QkLnBpcGUobWFwKCh2YWx1ZSkgPT4gdmFsdWUgPT09IG51bGwpKSwgeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDRj9Cy0LvRj9C10YLRgdGPINC70Lgg0YLQvtCy0LDRgCDQsiDQvdCw0LvQuNGH0LjQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaXNTdG9jaygpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgd2FyZWhvdXNlSWQgPSBOdW1iZXIodGhpcy5mb3JtLmdldCgnd2FyZWhvdXNlSWQnKT8udmFsdWUgPz8gMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdC5pc1dhcmVob3VzZVN0b2NrRXhpc3Qod2FyZWhvdXNlSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0L7QsdGK0LXQutGCINCyINC30L3QsNGH0LXQvdC40LUsINC+0YLQvtCx0YDQsNC20LDQtdC80L7QtSDQsiDQv9C+0LvQtSDQstCy0L7QtNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zINCS0YvQsdGA0LDQvdC90YvQtSDQt9C90LDRh9C10L3QuNGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdHJpbmdpZnkoaXRlbXM6IHJlYWRvbmx5IFNjSVdhcmVob3VzZVtdKTogVHVpU3RyaW5nSGFuZGxlcjxUdWlDb250ZXh0PG51bWJlcj4+IHtcbiAgICAgICAgY29uc3QgaXRlbXNNYXAgPSBuZXcgTWFwKFxuICAgICAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtpdGVtLmlkLCBpdGVtLm5hbWVdIGFzIFtudW1iZXIsIHN0cmluZ107XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiAoeyAkaW1wbGljaXQgfTogVHVpQ29udGV4dDxudW1iZXI+KSA9PiBpdGVtc01hcC5nZXQoJGltcGxpY2l0KSA/PyAnJztcbiAgICB9XG59XG4iLCI8Zm9ybVxuICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgKG5nU3VibWl0KT1cIm9uU3VibWl0JC5uZXh0KClcIlxuICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiXG4+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgPHNjLXZlcmlmaWNhdGlvbi1waG9uZS1jaGVjay1mb3JtIFtzaG91bGRCZUNvbmZpcm1lZF09XCJ0cnVlXCIgLz5cblxuICAgICAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgICAgICDQkNC00YDQtdGBINGN0LvQtdC60YLRgNC+0L3QvdC+0Lkg0L/QvtGH0YLRi1xuICAgICAgICAgICAgPHR1aS1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiPlxuICAgICAgICAgICAgICAgINCQ0LTRgNC10YEg0Y3Qu9C10LrRgtGA0L7QvdC90L7QuSDQv9C+0YfRgtGLXG4gICAgICAgICAgICAgICAgPHNjLXN1Z2dlc3Rpb24tZmllbGRcbiAgICAgICAgICAgICAgICAgICAgKnR1aURhdGFMaXN0XG4gICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cInN1Z2dlc3Rpb25UeXBlLmVtYWlsXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90dWktaW5wdXQ+XG4gICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIlxuICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgINCh0LrQu9Cw0LRcbiAgICAgICAgICAgIDx0dWktc2VsZWN0XG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2FyZWhvdXNlSWRcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZUNvbnRlbnRdPVwid2FyZWhvdXNlcygpID8gc3RyaW5naWZ5KHdhcmVob3VzZXMoKSEpIDogc2VsZWN0TG9hZGluZ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0KHQutC70LDQtFxuICAgICAgICAgICAgICAgIDx0dWktZGF0YS1saXN0ICp0dWlEYXRhTGlzdD5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAod2FyZWhvdXNlIG9mIHdhcmVob3VzZXMoKTsgdHJhY2sgd2FyZWhvdXNlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpT3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIndhcmVob3VzZS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgd2FyZWhvdXNlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90dWktZGF0YS1saXN0PlxuICAgICAgICAgICAgPC90dWktc2VsZWN0PlxuICAgICAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndhcmVob3VzZUlkXCJcbiAgICAgICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzU3RvY2soKVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIid2YXIoLS10dWktdGV4dC1wb3NpdGl2ZSknXCJcbiAgICAgICAgICAgICAgICA+0KLQvtCy0LDRgCDQuNC80LXQtdGC0YHRjyDQsiDQvdCw0LvQuNGH0LjQuCDQvdCwINCy0YvQsdGA0LDQvdC90L7QvCDRgdC60LvQsNC00LU8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RMb2FkaW5nPiA8dHVpLWxvYWRlciAvPiA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCB8fCBpc1N0b2NrKClcIlxuICAgICAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZygpXCJcbiAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkuc2Muc2VuZFwiXG4gICAgICAgICAgICBjbGFzcz1cInNlbGYtY2VudGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0J7RgtC/0YDQsNCy0LjRgtGMXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdyBiYXNpcy02MCB0ZXh0LWJvZHktc1wiPlxuICAgICAgICAgICAg0J3QsNC20LjQvNCw0Y8g0L3QsCDQutC90L7Qv9C60YMsINCy0Ysg0YHQvtCz0LvQsNGI0LDQtdGC0LXRgdGMINGBXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgICAgIFtwc2V1ZG9dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbnRleHQuZGF0YS5vbkNsaWNrT2ZmZXJIYW5kbGVyKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgINCf0L7Qu9C40YLQuNC60L7QuSDQutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90L7RgdGC0LhcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDx0dWktZXJyb3JcbiAgICAgICAgKm5nSWY9XCJmb3JtLmVycm9ycyAmJiBmb3JtLmVycm9yc1snc2VydmVyUmVzcG9uc2UnXVwiXG4gICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgLz5cbjwvZm9ybT5cbiJdfQ==