@sebgroup/green-angular 1.0.0-alpha.1 → 1.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # GreenAngular
2
+
3
+ This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.0.
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
8
+
9
+ ## Code scaffolding
10
+
11
+ Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
12
+
13
+ ## Build
14
+
15
+ Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
16
+
17
+ ## Running unit tests
18
+
19
+ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
20
+
21
+ ## Running end-to-end tests
22
+
23
+ Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
24
+
25
+ ## Further help
26
+
27
+ To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
@@ -0,0 +1,8 @@
1
+ export * from './lib/green-angular.module';
2
+ export * from './lib/dropdown/dropdown.module';
3
+ export * from './lib/dropdown/dropdown.component';
4
+ export * from './lib/datepicker/datepicker.module';
5
+ export * from './lib/datepicker/datepicker.component';
6
+ export * from './lib/segmented-control/segmented-control.module';
7
+ export * from './lib/segmented-control/segmented-control.component';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNEJBQTRCLENBQUE7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQTtBQUM5QyxjQUFjLG1DQUFtQyxDQUFBO0FBQ2pELGNBQWMsb0NBQW9DLENBQUE7QUFDbEQsY0FBYyx1Q0FBdUMsQ0FBQTtBQUNyRCxjQUFjLGtEQUFrRCxDQUFBO0FBQ2hFLGNBQWMscURBQXFELENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9ncmVlbi1hbmd1bGFyLm1vZHVsZSdcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Ryb3Bkb3duL2Ryb3Bkb3duLm1vZHVsZSdcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCdcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5tb2R1bGUnXG5leHBvcnQgKiBmcm9tICcuL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50J1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wubW9kdWxlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wuY29tcG9uZW50J1xuIl19
@@ -0,0 +1,140 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, Input, Output, ViewChild, EventEmitter, ChangeDetectorRef, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { createDatepicker, months, years, randomId, } from '@sebgroup/extract';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../dropdown/dropdown.component";
6
+ import * as i2 from "@angular/common";
7
+ export class NggDatepickerComponent {
8
+ constructor(_cdr) {
9
+ this._cdr = _cdr;
10
+ this.id = randomId();
11
+ this.valueChange = new EventEmitter();
12
+ this._months = months({});
13
+ this.years = years({});
14
+ this.trackByKey = (index, option) => {
15
+ return option.key;
16
+ };
17
+ this.listener = (data, state) => {
18
+ if (this.dp && state) {
19
+ this.dp.state = { ...state };
20
+ }
21
+ this.onTouchedFn && this.onTouchedFn();
22
+ if (data) {
23
+ this.valueChange.emit(data.selectedDate);
24
+ this.onChangeFn && this.onChangeFn(data.selectedDate);
25
+ this.data = data;
26
+ }
27
+ if (data || state) {
28
+ this._cdr.markForCheck();
29
+ }
30
+ };
31
+ }
32
+ get months() {
33
+ return this._months;
34
+ }
35
+ set months(value) {
36
+ this._months = value;
37
+ }
38
+ get options() {
39
+ return this._options;
40
+ }
41
+ set options(value) {
42
+ this._options = value;
43
+ if (value.locale) {
44
+ this.months = months({ locale: this.options?.locale });
45
+ }
46
+ }
47
+ get value() {
48
+ return this._value;
49
+ }
50
+ set value(newValue) {
51
+ if (newValue !== this._value) {
52
+ this._value = newValue;
53
+ }
54
+ }
55
+ writeValue(value) {
56
+ this.value = value;
57
+ // When binding using ngModel we need to set initial select date
58
+ // once we get initial value as it's not available when component is created
59
+ if (value && this.dp && !this.data?.selectedDate) {
60
+ this.dp.select(value);
61
+ }
62
+ }
63
+ registerOnChange(fn) {
64
+ this.onChangeFn = fn;
65
+ }
66
+ registerOnTouched(fn) {
67
+ this.onTouchedFn = fn;
68
+ }
69
+ get data() {
70
+ return this._data;
71
+ }
72
+ set data(value) {
73
+ this._data = value;
74
+ }
75
+ trackWeek(index, week) {
76
+ return week;
77
+ }
78
+ ngAfterViewInit() {
79
+ // initialize datepicker
80
+ if (this.datepickerElRef &&
81
+ this.datepickerDialogElRef &&
82
+ this.dateInputElRef &&
83
+ this.datepickerTriggerElRef &&
84
+ !this.dp) {
85
+ this.dp = createDatepicker(this.listener, {
86
+ ...this.options,
87
+ selectedDate: this.value,
88
+ }, this.datepickerElRef.nativeElement, this.datepickerDialogElRef.nativeElement, this.dateInputElRef.nativeElement, this.datepickerTriggerElRef.nativeElement);
89
+ this._cdr.detectChanges();
90
+ }
91
+ else {
92
+ throw 'Missing one or more elements...';
93
+ }
94
+ }
95
+ }
96
+ NggDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDatepickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
97
+ NggDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: NggDatepickerComponent, selector: "ngg-datepicker", inputs: { options: "options", value: "value", id: "id", label: "label", valid: "valid", invalid: "invalid" }, outputs: { valueChange: "valueChange" }, providers: [
98
+ {
99
+ provide: NG_VALUE_ACCESSOR,
100
+ useExisting: NggDatepickerComponent,
101
+ multi: true,
102
+ },
103
+ ], viewQueries: [{ propertyName: "datepickerDialogElRef", first: true, predicate: ["datepickerDialogElRef"], descendants: true }, { propertyName: "dateInputElRef", first: true, predicate: ["dateInputElRef"], descendants: true }, { propertyName: "datepickerElRef", first: true, predicate: ["datepickerElRef"], descendants: true }, { propertyName: "datepickerTriggerElRef", first: true, predicate: ["datepickerTriggerElRef"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"valid\"\n [class.is-invalid]=\"invalid\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"dp?.select(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n [options]=\"years\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"!day.currentMonth\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n", components: [{ type: i1.NggDropdownComponent, selector: "ngg-dropdown", inputs: ["id", "text", "loop", "label", "options", "valid", "invalid", "value"], outputs: ["valueChange"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
104
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDatepickerComponent, decorators: [{
105
+ type: Component,
106
+ args: [{ selector: 'ngg-datepicker', providers: [
107
+ {
108
+ provide: NG_VALUE_ACCESSOR,
109
+ useExisting: NggDatepickerComponent,
110
+ multi: true,
111
+ },
112
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-group\">\n <label *ngIf=\"label\" [for]=\"id\">{{ label }}</label>\n <div\n class=\"group\"\n #datepickerElRef\n [class.is-valid]=\"valid\"\n [class.is-invalid]=\"invalid\"\n >\n <input\n [attr.id]=\"id\"\n [attr.aria-describedby]=\"\n formInfo?.innerText && formInfo.innerText.length > 0\n ? id + '_info'\n : null\n \"\n type=\"text\"\n placeholder=\"yyyy-mm-dd\"\n #dateInputElRef\n [value]=\"data?.formattedSelectedDate || ''\"\n (change)=\"dp?.select(dateInputElRef.value)\"\n />\n <button\n #datepickerTriggerElRef\n (click)=\"dp?.toggle()\"\n type=\"button\"\n class=\"primary\"\n >\n <i class=\"sg-icon sg-icon-calendar\">Select date</i>\n </button>\n </div>\n <span class=\"form-info\" #formInfo [attr.id]=\"id + '_info'\"\n ><ng-content select=\"[data-form-info]\"></ng-content\n ></span>\n</div>\n<!-- TODO: get or set attributes from within datepicker instance (dp) -->\n<div\n #datepickerDialogElRef\n class=\"popover popover-datepicker\"\n [class.active]=\"dp?.state?.isActive\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Choose Date\"\n>\n <button type=\"button\" class=\"close\" (click)=\"dp?.close()\">Close</button>\n <div class=\"sg-date\">\n <header>\n <button type=\"button\" class=\"link\" (click)=\"dp?.sub(1, 'months')\">\n <i class=\"sg-icon sg-icon-previous\">Previous month</i>\n </button>\n <ngg-dropdown\n [options]=\"months\"\n text=\"Select\"\n [value]=\"data?.month\"\n (valueChange)=\"dp?.setMonth($event)\"\n ></ngg-dropdown>\n <ngg-dropdown\n [options]=\"years\"\n text=\"Select\"\n [value]=\"data?.year\"\n (valueChange)=\"dp?.setYear($event)\"\n ></ngg-dropdown>\n <button type=\"button\" class=\"link\" (click)=\"dp?.add(1, 'months')\">\n <i class=\"sg-icon sg-icon-next\">Next month</i>\n </button>\n </header>\n <main>\n <table role=\"grid\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let header of data?.calendar?.headers\"\n [abbr]=\"header.abbr\"\n [class.sg-week-header]=\"header.type === 'week'\"\n [class.sg-day-header]=\"header.type === 'day'\"\n >\n {{ header.displayText }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr\n *ngFor=\"\n let week of data?.calendar?.calendarGrid;\n trackBy: trackWeek;\n let i = index\n \"\n >\n <th\n *ngIf=\"data?.calendar?.weekNumbers as weekNumbers\"\n class=\"sg-week-number\"\n >\n {{ weekNumbers[i] }}\n </th>\n <td\n *ngFor=\"let day of week\"\n [attr.data-date]=\"day.formattedDate\"\n [attr.role]=\"day.selected ? 'gridcell' : null\"\n [attr.aria-selected]=\"\n day.selected && !data?.highlightedDate ? true : null\n \"\n [class.disabled]=\"!day.currentMonth\"\n [class.sg-date-today]=\"day.today\"\n [title]=\"day.today ? 'Today' : ''\"\n [tabIndex]=\"\n day.highlighted ||\n (day.selected && !data?.highlightedDate) ||\n (day.today && !data?.highlightedDate && !data?.selectedDate)\n ? 0\n : -1\n \"\n (click)=\"day.currentMonth && dp?.select(day.date)\"\n >\n {{ day.day }}\n </td>\n </tr>\n </tbody>\n </table>\n </main>\n </div>\n</div>\n" }]
113
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { options: [{
114
+ type: Input
115
+ }], value: [{
116
+ type: Input
117
+ }], id: [{
118
+ type: Input
119
+ }], label: [{
120
+ type: Input
121
+ }], valid: [{
122
+ type: Input
123
+ }], invalid: [{
124
+ type: Input
125
+ }], valueChange: [{
126
+ type: Output
127
+ }], datepickerDialogElRef: [{
128
+ type: ViewChild,
129
+ args: ['datepickerDialogElRef']
130
+ }], dateInputElRef: [{
131
+ type: ViewChild,
132
+ args: ['dateInputElRef']
133
+ }], datepickerElRef: [{
134
+ type: ViewChild,
135
+ args: ['datepickerElRef']
136
+ }], datepickerTriggerElRef: [{
137
+ type: ViewChild,
138
+ args: ['datepickerTriggerElRef']
139
+ }] } });
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFBO0FBQ3RCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN4RSxPQUFPLEVBT0wsZ0JBQWdCLEVBR2hCLE1BQU0sRUFDTixLQUFLLEVBQ0wsUUFBUSxHQUVULE1BQU0sbUJBQW1CLENBQUE7Ozs7QUFjMUIsTUFBTSxPQUFPLHNCQUFzQjtJQXlEakMsWUFBb0IsSUFBdUI7UUFBdkIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUE1QmxDLE9BQUUsR0FBWSxRQUFRLEVBQUUsQ0FBQTtRQUlkLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUE7UUFpQm5FLFlBQU8sR0FBMEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ25ELFVBQUssR0FBMEIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBMEJ4QyxlQUFVLEdBQUcsQ0FBQyxLQUFhLEVBQUUsTUFBOEIsRUFBVSxFQUFFO1lBQ3JFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQTtRQUNuQixDQUFDLENBQUE7UUFVRCxhQUFRLEdBQUcsQ0FDVCxJQUFnQyxFQUNoQyxLQUFrQyxFQUNsQyxFQUFFO1lBQ0YsSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLEtBQUssRUFBRTtn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Q3pCLEVBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQ2xDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQ3hDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUNqQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUMxQyxDQUFBO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtTQUMxQjthQUFNO1lBQ0wsTUFBTSxpQ0FBaUMsQ0FBQTtTQUN4QztJQUNILENBQUM7O21IQXpJVSxzQkFBc0I7dUdBQXRCLHNCQUFzQixnTUFUdEI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLHNCQUFzQjtZQUNuQyxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YscWRDckNILDB2SEF5SEE7MkZEakZhLHNCQUFzQjtrQkFabEMsU0FBUzsrQkFDRSxnQkFBZ0IsYUFFZjt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLHdCQUF3Qjs0QkFDbkMsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07d0dBYTNDLE9BQU87c0JBRFYsS0FBSztnQkFXRixLQUFLO3NCQURSLEtBQUs7Z0JBU0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNhLFdBQVc7c0JBQTdCLE1BQU07Z0JBRUEscUJBQXFCO3NCQUQzQixTQUFTO3VCQUFDLHVCQUF1QjtnQkFHM0IsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBRVUsZUFBZTtzQkFBbkQsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBRXJCLHNCQUFzQjtzQkFENUIsU0FBUzt1QkFBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7XG4gIEFic3RyYWN0RHJvcGRvd24sXG4gIERyb3Bkb3duSGFuZGxlcixcbiAgRXh0ZW5kZWREcm9wZG93bk9wdGlvbixcbiAgRWxlbWVudFByb3BzLFxuICBEYXRlcGlja2VyRGF0YSxcbiAgRGF0ZXBpY2tlcixcbiAgY3JlYXRlRGF0ZXBpY2tlcixcbiAgRGF0ZXBpY2tlclN0YXRlLFxuICBEcm9wZG93bk9wdGlvbixcbiAgbW9udGhzLFxuICB5ZWFycyxcbiAgcmFuZG9tSWQsXG4gIERhdGVwaWNrZXJPcHRpb25zLFxufSBmcm9tICdAc2ViZ3JvdXAvZXh0cmFjdCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmdnLWRhdGVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJ2RhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBOZ2dEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5nZ0RhdGVwaWNrZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdFxue1xuICBnZXQgbW9udGhzKCk6IEFycmF5PERyb3Bkb3duT3B0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuX21vbnRoc1xuICB9XG5cbiAgc2V0IG1vbnRocyh2YWx1ZTogQXJyYXk8RHJvcGRvd25PcHRpb24+KSB7XG4gICAgdGhpcy5fbW9udGhzID0gdmFsdWVcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgb3B0aW9ucygpOiBEYXRlcGlja2VyT3B0aW9ucyB7XG4gICAgcmV0dXJuIDxEYXRlcGlja2VyT3B0aW9ucz50aGlzLl9vcHRpb25zXG4gIH1cbiAgc2V0IG9wdGlvbnModmFsdWU6IERhdGVwaWNrZXJPcHRpb25zKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlXG4gICAgaWYgKHZhbHVlLmxvY2FsZSkge1xuICAgICAgdGhpcy5tb250aHMgPSBtb250aHMoeyBsb2NhbGU6IHRoaXMub3B0aW9ucz8ubG9jYWxlIH0pXG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBEYXRlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsdWU6IHN0cmluZyB8IERhdGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobmV3VmFsdWUgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlXG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nID0gcmFuZG9tSWQoKVxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZ1xuICBASW5wdXQoKSB2YWxpZD86IGJvb2xlYW5cbiAgQElucHV0KCkgaW52YWxpZD86IGJvb2xlYW5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJEaWFsb2dFbFJlZicpXG4gIHB1YmxpYyBkYXRlcGlja2VyRGlhbG9nRWxSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxuICBAVmlld0NoaWxkKCdkYXRlSW5wdXRFbFJlZicpXG4gIHB1YmxpYyBkYXRlSW5wdXRFbFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD5cbiAgQFZpZXdDaGlsZCgnZGF0ZXBpY2tlckVsUmVmJykgcHVibGljIGRhdGVwaWNrZXJFbFJlZj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJUcmlnZ2VyRWxSZWYnKVxuICBwdWJsaWMgZGF0ZXBpY2tlclRyaWdnZXJFbFJlZj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+XG5cbiAgb25DaGFuZ2VGbj86ICh2YWx1ZTogYW55KSA9PiB2b2lkXG4gIG9uVG91Y2hlZEZuPzogYW55XG5cbiAgZHJvcGRvd24/OiBBYnN0cmFjdERyb3Bkb3duXG4gIGhhbmRsZXI/OiBEcm9wZG93bkhhbmRsZXJcbiAgdG9nZ2xlcj86IFBhcnRpYWw8RWxlbWVudFByb3BzPlxuICBsaXN0Ym94PzogUGFydGlhbDxFbGVtZW50UHJvcHM+XG4gIF92YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IHVuZGVmaW5lZFxuICBwcml2YXRlIF9tb250aHM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IG1vbnRocyh7fSlcbiAgeWVhcnM6IEFycmF5PERyb3Bkb3duT3B0aW9uPiA9IHllYXJzKHt9KVxuICBwcml2YXRlIF9vcHRpb25zPzogRGF0ZXBpY2tlck9wdGlvbnNcblxuICBkcDogRGF0ZXBpY2tlciB8IHVuZGVmaW5lZFxuICBwcml2YXRlIF9kYXRhOiBEYXRlcGlja2VyRGF0YSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG5cbiAgICAvLyBXaGVuIGJpbmRpbmcgdXNpbmcgbmdNb2RlbCB3ZSBuZWVkIHRvIHNldCBpbml0aWFsIHNlbGVjdCBkYXRlXG4gICAgLy8gb25jZSB3ZSBnZXQgaW5pdGlhbCB2YWx1ZSBhcyBpdCdzIG5vdCBhdmFpbGFibGUgd2hlbiBjb21wb25lbnQgaXMgY3JlYXRlZFxuICAgIGlmICh2YWx1ZSAmJiB0aGlzLmRwICYmICF0aGlzLmRhdGE/LnNlbGVjdGVkRGF0ZSkge1xuICAgICAgdGhpcy5kcC5zZWxlY3QodmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm5cbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm5cbiAgfVxuXG4gIHRyYWNrQnlLZXkgPSAoaW5kZXg6IG51bWJlciwgb3B0aW9uOiBFeHRlbmRlZERyb3Bkb3duT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gb3B0aW9uLmtleVxuICB9XG5cbiAgZ2V0IGRhdGEoKTogRGF0ZXBpY2tlckRhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhXG4gIH1cblxuICBzZXQgZGF0YSh2YWx1ZTogRGF0ZXBpY2tlckRhdGEgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9kYXRhID0gdmFsdWVcbiAgfVxuXG4gIGxpc3RlbmVyID0gKFxuICAgIGRhdGE6IERhdGVwaWNrZXJEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBEYXRlcGlja2VyU3RhdGUgfCB1bmRlZmluZWRcbiAgKSA9PiB7XG4gICAgaWYgKHRoaXMuZHAgJiYgc3RhdGUpIHtcbiAgICAgIHRoaXMuZHAuc3RhdGUgPSB7IC4uLnN0YXRlIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uVG91Y2hlZEZuICYmIHRoaXMub25Ub3VjaGVkRm4oKVxuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChkYXRhLnNlbGVjdGVkRGF0ZSlcbiAgICAgIHRoaXMub25DaGFuZ2VGbiAmJiB0aGlzLm9uQ2hhbmdlRm4oZGF0YS5zZWxlY3RlZERhdGUpXG4gICAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgfHwgc3RhdGUpIHtcbiAgICAgIHRoaXMuX2Nkci5tYXJrRm9yQ2hlY2soKVxuICAgIH1cbiAgfVxuICB0cmFja1dlZWsoaW5kZXg6IGFueSwgd2VlazogYW55KSB7XG4gICAgcmV0dXJuIHdlZWtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBpbml0aWFsaXplIGRhdGVwaWNrZXJcbiAgICBpZiAoXG4gICAgICB0aGlzLmRhdGVwaWNrZXJFbFJlZiAmJlxuICAgICAgdGhpcy5kYXRlcGlja2VyRGlhbG9nRWxSZWYgJiZcbiAgICAgIHRoaXMuZGF0ZUlucHV0RWxSZWYgJiZcbiAgICAgIHRoaXMuZGF0ZXBpY2tlclRyaWdnZXJFbFJlZiAmJlxuICAgICAgIXRoaXMuZHBcbiAgICApIHtcbiAgICAgIHRoaXMuZHAgPSBjcmVhdGVEYXRlcGlja2VyKFxuICAgICAgICB0aGlzLmxpc3RlbmVyLFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgICAgIHNlbGVjdGVkRGF0ZTogdGhpcy52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyRWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyRGlhbG9nRWxSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5kYXRlSW5wdXRFbFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLmRhdGVwaWNrZXJUcmlnZ2VyRWxSZWYubmF0aXZlRWxlbWVudFxuICAgICAgKVxuICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBvbmUgb3IgbW9yZSBlbGVtZW50cy4uLidcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpZFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZ3JvdXBcIlxuICAgICNkYXRlcGlja2VyRWxSZWZcbiAgICBbY2xhc3MuaXMtdmFsaWRdPVwidmFsaWRcIlxuICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImludmFsaWRcIlxuICA+XG4gICAgPGlucHV0XG4gICAgICBbYXR0ci5pZF09XCJpZFwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIlxuICAgICAgICBmb3JtSW5mbz8uaW5uZXJUZXh0ICYmIGZvcm1JbmZvLmlubmVyVGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgPyBpZCArICdfaW5mbydcbiAgICAgICAgICA6IG51bGxcbiAgICAgIFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBwbGFjZWhvbGRlcj1cInl5eXktbW0tZGRcIlxuICAgICAgI2RhdGVJbnB1dEVsUmVmXG4gICAgICBbdmFsdWVdPVwiZGF0YT8uZm9ybWF0dGVkU2VsZWN0ZWREYXRlIHx8ICcnXCJcbiAgICAgIChjaGFuZ2UpPVwiZHA/LnNlbGVjdChkYXRlSW5wdXRFbFJlZi52YWx1ZSlcIlxuICAgIC8+XG4gICAgPGJ1dHRvblxuICAgICAgI2RhdGVwaWNrZXJUcmlnZ2VyRWxSZWZcbiAgICAgIChjbGljayk9XCJkcD8udG9nZ2xlKClcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cInByaW1hcnlcIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwic2ctaWNvbiBzZy1pY29uLWNhbGVuZGFyXCI+U2VsZWN0IGRhdGU8L2k+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8c3BhbiBjbGFzcz1cImZvcm0taW5mb1wiICNmb3JtSW5mbyBbYXR0ci5pZF09XCJpZCArICdfaW5mbydcIlxuICAgID48bmctY29udGVudCBzZWxlY3Q9XCJbZGF0YS1mb3JtLWluZm9dXCI+PC9uZy1jb250ZW50XG4gID48L3NwYW4+XG48L2Rpdj5cbjwhLS0gVE9ETzogZ2V0IG9yIHNldCBhdHRyaWJ1dGVzIGZyb20gd2l0aGluIGRhdGVwaWNrZXIgaW5zdGFuY2UgKGRwKSAtLT5cbjxkaXZcbiAgI2RhdGVwaWNrZXJEaWFsb2dFbFJlZlxuICBjbGFzcz1cInBvcG92ZXIgcG9wb3Zlci1kYXRlcGlja2VyXCJcbiAgW2NsYXNzLmFjdGl2ZV09XCJkcD8uc3RhdGU/LmlzQWN0aXZlXCJcbiAgcm9sZT1cImRpYWxvZ1wiXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcbiAgYXJpYS1sYWJlbD1cIkNob29zZSBEYXRlXCJcbj5cbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIChjbGljayk9XCJkcD8uY2xvc2UoKVwiPkNsb3NlPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJzZy1kYXRlXCI+XG4gICAgPGhlYWRlcj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibGlua1wiIChjbGljayk9XCJkcD8uc3ViKDEsICdtb250aHMnKVwiPlxuICAgICAgICA8aSBjbGFzcz1cInNnLWljb24gc2ctaWNvbi1wcmV2aW91c1wiPlByZXZpb3VzIG1vbnRoPC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmdnLWRyb3Bkb3duXG4gICAgICAgIFtvcHRpb25zXT1cIm1vbnRoc1wiXG4gICAgICAgIHRleHQ9XCJTZWxlY3RcIlxuICAgICAgICBbdmFsdWVdPVwiZGF0YT8ubW9udGhcIlxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZHA/LnNldE1vbnRoKCRldmVudClcIlxuICAgICAgPjwvbmdnLWRyb3Bkb3duPlxuICAgICAgPG5nZy1kcm9wZG93blxuICAgICAgICBbb3B0aW9uc109XCJ5ZWFyc1wiXG4gICAgICAgIHRleHQ9XCJTZWxlY3RcIlxuICAgICAgICBbdmFsdWVdPVwiZGF0YT8ueWVhclwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJkcD8uc2V0WWVhcigkZXZlbnQpXCJcbiAgICAgID48L25nZy1kcm9wZG93bj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibGlua1wiIChjbGljayk9XCJkcD8uYWRkKDEsICdtb250aHMnKVwiPlxuICAgICAgICA8aSBjbGFzcz1cInNnLWljb24gc2ctaWNvbi1uZXh0XCI+TmV4dCBtb250aDwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvaGVhZGVyPlxuICAgIDxtYWluPlxuICAgICAgPHRhYmxlIHJvbGU9XCJncmlkXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIGRhdGE/LmNhbGVuZGFyPy5oZWFkZXJzXCJcbiAgICAgICAgICAgICAgW2FiYnJdPVwiaGVhZGVyLmFiYnJcIlxuICAgICAgICAgICAgICBbY2xhc3Muc2ctd2Vlay1oZWFkZXJdPVwiaGVhZGVyLnR5cGUgPT09ICd3ZWVrJ1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZy1kYXktaGVhZGVyXT1cImhlYWRlci50eXBlID09PSAnZGF5J1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGhlYWRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RoZWFkPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgbGV0IHdlZWsgb2YgZGF0YT8uY2FsZW5kYXI/LmNhbGVuZGFyR3JpZDtcbiAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tXZWVrO1xuICAgICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAqbmdJZj1cImRhdGE/LmNhbGVuZGFyPy53ZWVrTnVtYmVycyBhcyB3ZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2ctd2Vlay1udW1iZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB3ZWVrTnVtYmVyc1tpXSB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtcIlxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRhdGVdPVwiZGF5LmZvcm1hdHRlZERhdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cImRheS5zZWxlY3RlZCA/ICdncmlkY2VsbCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJcbiAgICAgICAgICAgICAgICBkYXkuc2VsZWN0ZWQgJiYgIWRhdGE/LmhpZ2hsaWdodGVkRGF0ZSA/IHRydWUgOiBudWxsXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhZGF5LmN1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZy1kYXRlLXRvZGF5XT1cImRheS50b2RheVwiXG4gICAgICAgICAgICAgIFt0aXRsZV09XCJkYXkudG9kYXkgPyAnVG9kYXknIDogJydcIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwiXG4gICAgICAgICAgICAgICAgZGF5LmhpZ2hsaWdodGVkIHx8XG4gICAgICAgICAgICAgICAgKGRheS5zZWxlY3RlZCAmJiAhZGF0YT8uaGlnaGxpZ2h0ZWREYXRlKSB8fFxuICAgICAgICAgICAgICAgIChkYXkudG9kYXkgJiYgIWRhdGE/LmhpZ2hsaWdodGVkRGF0ZSAmJiAhZGF0YT8uc2VsZWN0ZWREYXRlKVxuICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICA6IC0xXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkYXkuY3VycmVudE1vbnRoICYmIGRwPy5zZWxlY3QoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L21haW4+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NggDatepickerComponent } from './datepicker.component';
4
+ import { NggDropdownModule } from '../dropdown/dropdown.module';
5
+ import * as i0 from "@angular/core";
6
+ export class NggDatepickerModule {
7
+ }
8
+ NggDatepickerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDatepickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9
+ NggDatepickerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDatepickerModule, declarations: [NggDatepickerComponent], imports: [CommonModule, NggDropdownModule], exports: [NggDatepickerComponent] });
10
+ NggDatepickerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDatepickerModule, imports: [[CommonModule, NggDropdownModule]] });
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDatepickerModule, decorators: [{
12
+ type: NgModule,
13
+ args: [{
14
+ declarations: [NggDatepickerComponent],
15
+ imports: [CommonModule, NggDropdownModule],
16
+ exports: [NggDatepickerComponent],
17
+ }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9kYXRlcGlja2VyL2RhdGVwaWNrZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZCQUE2QixDQUFBOztBQU8vRCxNQUFNLE9BQU8sbUJBQW1COztnSEFBbkIsbUJBQW1CO2lIQUFuQixtQkFBbUIsaUJBSmYsc0JBQXNCLGFBQzNCLFlBQVksRUFBRSxpQkFBaUIsYUFDL0Isc0JBQXNCO2lIQUVyQixtQkFBbUIsWUFIckIsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7MkZBRy9CLG1CQUFtQjtrQkFML0IsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdEMsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO29CQUMxQyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDbEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXG5pbXBvcnQgeyBOZ2dEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCdcbmltcG9ydCB7IE5nZ0Ryb3Bkb3duTW9kdWxlIH0gZnJvbSAnLi4vZHJvcGRvd24vZHJvcGRvd24ubW9kdWxlJ1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtOZ2dEYXRlcGlja2VyQ29tcG9uZW50XSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTmdnRHJvcGRvd25Nb2R1bGVdLFxuICBleHBvcnRzOiBbTmdnRGF0ZXBpY2tlckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIE5nZ0RhdGVwaWNrZXJNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,275 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, Output, ViewChild, EventEmitter, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { createDropdown, dropdownValues, } from '@sebgroup/extract';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export class NggDropdownComponent {
7
+ constructor(cd) {
8
+ this.cd = cd;
9
+ this.loop = false;
10
+ this.options = [];
11
+ this.valueChange = new EventEmitter();
12
+ this.toggler = dropdownValues.elements?.toggler;
13
+ this.listbox = dropdownValues.elements?.listbox;
14
+ this.trackByKey = (index, option) => {
15
+ return option.key;
16
+ };
17
+ }
18
+ get value() {
19
+ return this._value;
20
+ }
21
+ set value(newValue) {
22
+ this.setSelectionByValue(newValue);
23
+ }
24
+ ngAfterViewInit() {
25
+ if (this.togglerRef?.nativeElement && this.listboxRef?.nativeElement) {
26
+ this.handler = createDropdown(this.props, this.togglerRef.nativeElement, this.listboxRef.nativeElement, (dropdown) => {
27
+ this.dropdown = dropdown;
28
+ this.toggler = dropdown.elements.toggler;
29
+ this.listbox = dropdown.elements.listbox;
30
+ const selected = this.dropdown.options?.find((option) => option.selected);
31
+ if (selected && this._value !== selected?.value) {
32
+ setTimeout(() => {
33
+ this._value = selected.value;
34
+ this.valueChange.emit(selected.value);
35
+ this.onChangeFn && this.onChangeFn(selected.value);
36
+ this.onTouchedFn && this.onTouchedFn();
37
+ }, 0);
38
+ }
39
+ this.cd.detectChanges();
40
+ });
41
+ }
42
+ }
43
+ ngOnDestroy() {
44
+ this.handler?.destroy();
45
+ }
46
+ ngOnChanges(changes) {
47
+ if (this.handler &&
48
+ (changes.id || changes.text || changes.loop || changes.options)) {
49
+ this.handler.update(this.props);
50
+ }
51
+ }
52
+ writeValue(value) {
53
+ this.value = value;
54
+ }
55
+ registerOnChange(fn) {
56
+ this.onChangeFn = fn;
57
+ }
58
+ registerOnTouched(fn) {
59
+ this.onTouchedFn = fn;
60
+ }
61
+ select(option) {
62
+ this.handler?.select(option);
63
+ this._value = option.value;
64
+ this.valueChange.emit(option.value);
65
+ this.onChangeFn && this.onChangeFn(option.value);
66
+ this.onTouchedFn && this.onTouchedFn();
67
+ }
68
+ get props() {
69
+ return {
70
+ id: this.id || this.dropdown?.id,
71
+ text: this.text,
72
+ options: this.options,
73
+ loop: this.loop,
74
+ value: this.value,
75
+ };
76
+ }
77
+ setSelectionByValue(value) {
78
+ if (this._value !== value) {
79
+ this._value = value;
80
+ const selected = this.handler?.dropdown?.options.find((option) => option.value === value);
81
+ if (selected)
82
+ this.handler?.select(selected);
83
+ }
84
+ }
85
+ }
86
+ NggDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDropdownComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
87
+ NggDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: NggDropdownComponent, selector: "ngg-dropdown", inputs: { id: "id", text: "text", loop: "loop", label: "label", options: "options", valid: "valid", invalid: "invalid", value: "value" }, outputs: { valueChange: "valueChange" }, providers: [
88
+ {
89
+ provide: NG_VALUE_ACCESSOR,
90
+ useExisting: NggDropdownComponent,
91
+ multi: true,
92
+ },
93
+ ], viewQueries: [{ propertyName: "togglerRef", first: true, predicate: ["togglerRef"], descendants: true }, { propertyName: "listboxRef", first: true, predicate: ["listboxRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
94
+ <div>
95
+ <span
96
+ class="label"
97
+ *ngIf="label"
98
+ [id]="toggler?.attributes?.id + '_label'"
99
+ >{{ label }}</span
100
+ >
101
+ <button
102
+ [attr.aria-labelledby]="
103
+ label ? toggler?.attributes?.id + '_label' : null
104
+ "
105
+ [attr.aria-describedby]="
106
+ formInfo?.innerText && formInfo.innerText.length > 0
107
+ ? toggler?.attributes?.id + '_info'
108
+ : null
109
+ "
110
+ type="button"
111
+ #togglerRef
112
+ [id]="toggler?.attributes?.id"
113
+ [attr.aria-haspopup]="toggler?.attributes?.['aria-haspopup']"
114
+ [attr.aria-expanded]="toggler?.attributes?.['aria-expanded']"
115
+ [attr.aria-owns]="toggler?.attributes?.['aria-owns']"
116
+ [tabindex]="toggler?.attributes?.tabIndex"
117
+ [style]="toggler?.attributes?.style"
118
+ [class]="toggler?.classes"
119
+ (click)="handler?.toggle()"
120
+ [class.is-valid]="valid"
121
+ [class.is-invalid]="invalid"
122
+ >
123
+ <span>{{ dropdown?.text }}</span>
124
+ </button>
125
+ <span
126
+ class="form-info"
127
+ #formInfo
128
+ [attr.id]="toggler?.attributes?.id + '_info'"
129
+ ><ng-content select="[data-form-info]"></ng-content
130
+ ></span>
131
+ <div
132
+ #listboxRef
133
+ [id]="listbox?.attributes?.id"
134
+ [attr.role]="listbox?.attributes?.role"
135
+ [attr.aria-activedescendant]="
136
+ listbox?.attributes?.['aria-activedescendant']
137
+ "
138
+ [tabindex]="listbox?.attributes?.tabIndex"
139
+ [style]="listbox?.attributes?.style"
140
+ [class]="listbox?.classes"
141
+ >
142
+ <button
143
+ type="button"
144
+ class="close m-4 m-sm-2 d-block d-sm-none"
145
+ (click)="handler?.close()"
146
+ >
147
+ <span class="sr-only">Close</span>
148
+ </button>
149
+ <ul role="listbox">
150
+ <li
151
+ *ngFor="let option of dropdown?.options; trackBy: trackByKey"
152
+ [id]="option.attributes.id"
153
+ [attr.role]="option.attributes.role"
154
+ [attr.aria-selected]="option.attributes['aria-selected']"
155
+ [style]="option.attributes.style"
156
+ [class]="option.classes"
157
+ (click)="handler?.select(option)"
158
+ >
159
+ {{ option.key }}
160
+ </li>
161
+ </ul>
162
+ </div>
163
+ </div>
164
+ `, isInline: true, directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDropdownComponent, decorators: [{
166
+ type: Component,
167
+ args: [{
168
+ selector: 'ngg-dropdown',
169
+ template: `
170
+ <div>
171
+ <span
172
+ class="label"
173
+ *ngIf="label"
174
+ [id]="toggler?.attributes?.id + '_label'"
175
+ >{{ label }}</span
176
+ >
177
+ <button
178
+ [attr.aria-labelledby]="
179
+ label ? toggler?.attributes?.id + '_label' : null
180
+ "
181
+ [attr.aria-describedby]="
182
+ formInfo?.innerText && formInfo.innerText.length > 0
183
+ ? toggler?.attributes?.id + '_info'
184
+ : null
185
+ "
186
+ type="button"
187
+ #togglerRef
188
+ [id]="toggler?.attributes?.id"
189
+ [attr.aria-haspopup]="toggler?.attributes?.['aria-haspopup']"
190
+ [attr.aria-expanded]="toggler?.attributes?.['aria-expanded']"
191
+ [attr.aria-owns]="toggler?.attributes?.['aria-owns']"
192
+ [tabindex]="toggler?.attributes?.tabIndex"
193
+ [style]="toggler?.attributes?.style"
194
+ [class]="toggler?.classes"
195
+ (click)="handler?.toggle()"
196
+ [class.is-valid]="valid"
197
+ [class.is-invalid]="invalid"
198
+ >
199
+ <span>{{ dropdown?.text }}</span>
200
+ </button>
201
+ <span
202
+ class="form-info"
203
+ #formInfo
204
+ [attr.id]="toggler?.attributes?.id + '_info'"
205
+ ><ng-content select="[data-form-info]"></ng-content
206
+ ></span>
207
+ <div
208
+ #listboxRef
209
+ [id]="listbox?.attributes?.id"
210
+ [attr.role]="listbox?.attributes?.role"
211
+ [attr.aria-activedescendant]="
212
+ listbox?.attributes?.['aria-activedescendant']
213
+ "
214
+ [tabindex]="listbox?.attributes?.tabIndex"
215
+ [style]="listbox?.attributes?.style"
216
+ [class]="listbox?.classes"
217
+ >
218
+ <button
219
+ type="button"
220
+ class="close m-4 m-sm-2 d-block d-sm-none"
221
+ (click)="handler?.close()"
222
+ >
223
+ <span class="sr-only">Close</span>
224
+ </button>
225
+ <ul role="listbox">
226
+ <li
227
+ *ngFor="let option of dropdown?.options; trackBy: trackByKey"
228
+ [id]="option.attributes.id"
229
+ [attr.role]="option.attributes.role"
230
+ [attr.aria-selected]="option.attributes['aria-selected']"
231
+ [style]="option.attributes.style"
232
+ [class]="option.classes"
233
+ (click)="handler?.select(option)"
234
+ >
235
+ {{ option.key }}
236
+ </li>
237
+ </ul>
238
+ </div>
239
+ </div>
240
+ `,
241
+ providers: [
242
+ {
243
+ provide: NG_VALUE_ACCESSOR,
244
+ useExisting: NggDropdownComponent,
245
+ multi: true,
246
+ },
247
+ ],
248
+ changeDetection: ChangeDetectionStrategy.OnPush,
249
+ }]
250
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { id: [{
251
+ type: Input
252
+ }], text: [{
253
+ type: Input
254
+ }], loop: [{
255
+ type: Input
256
+ }], label: [{
257
+ type: Input
258
+ }], options: [{
259
+ type: Input
260
+ }], valid: [{
261
+ type: Input
262
+ }], invalid: [{
263
+ type: Input
264
+ }], value: [{
265
+ type: Input
266
+ }], valueChange: [{
267
+ type: Output
268
+ }], togglerRef: [{
269
+ type: ViewChild,
270
+ args: ['togglerRef']
271
+ }], listboxRef: [{
272
+ type: ViewChild,
273
+ args: ['listboxRef']
274
+ }] } });
275
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3hFLE9BQU8sRUFDTCxjQUFjLEVBT2QsY0FBYyxHQUNmLE1BQU0sbUJBQW1CLENBQUE7OztBQXFGMUIsTUFBTSxPQUFPLG9CQUFvQjtJQXNDL0IsWUFBb0IsRUFBcUI7UUFBckIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFqQ2hDLFNBQUksR0FBYSxLQUFLLENBQUE7UUFFdEIsWUFBTyxHQUFxQixFQUFFLENBQUE7UUFhcEIsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQTtRQWUzRSxZQUFPLEdBQTJCLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFBO1FBQ2xFLFlBQU8sR0FBMkIsY0FBYyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUE7UUFpRWxFLGVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBRSxNQUE4QixFQUFVLEVBQUU7WUFDckUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFBO1FBQ25CLENBQUMsQ0FBQTtJQWpFMkMsQ0FBQztJQTNCN0MsSUFDSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3BCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFhO1FBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBdUJELGVBQWU7UUFDYixJQUFJLElBQUks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QUFDLE1BQU07aUJBQ2hEO3dHQUlVLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFHRixLQUFLO3NCQURSLEtBQUs7Z0JBU2EsV0FBVztzQkFBN0IsTUFBTTtnQkFFeUIsVUFBVTtzQkFBekMsU0FBUzt1QkFBQyxZQUFZO2dCQUlTLFVBQVU7c0JBQXpDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7XG4gIGNyZWF0ZURyb3Bkb3duLFxuICBBYnN0cmFjdERyb3Bkb3duLFxuICBEcm9wZG93bkhhbmRsZXIsXG4gIERyb3Bkb3duT3B0aW9uLFxuICBFeHRlbmRlZERyb3Bkb3duT3B0aW9uLFxuICBFbGVtZW50UHJvcHMsXG4gIERyb3Bkb3duQXJncyxcbiAgZHJvcGRvd25WYWx1ZXMsXG59IGZyb20gJ0BzZWJncm91cC9leHRyYWN0J1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ2ctZHJvcGRvd24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImxhYmVsXCJcbiAgICAgICAgKm5nSWY9XCJsYWJlbFwiXG4gICAgICAgIFtpZF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5pZCArICdfbGFiZWwnXCJcbiAgICAgICAgPnt7IGxhYmVsIH19PC9zcGFuXG4gICAgICA+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJcbiAgICAgICAgICBsYWJlbCA/IHRvZ2dsZXI/LmF0dHJpYnV0ZXM/LmlkICsgJ19sYWJlbCcgOiBudWxsXG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiXG4gICAgICAgICAgZm9ybUluZm8/LmlubmVyVGV4dCAmJiBmb3JtSW5mby5pbm5lclRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgPyB0b2dnbGVyPy5hdHRyaWJ1dGVzPy5pZCArICdfaW5mbydcbiAgICAgICAgICAgIDogbnVsbFxuICAgICAgICBcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgI3RvZ2dsZXJSZWZcbiAgICAgICAgW2lkXT1cInRvZ2dsZXI/LmF0dHJpYnV0ZXM/LmlkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5bJ2FyaWEtaGFzcG9wdXAnXVwiXG4gICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uWydhcmlhLWV4cGFuZGVkJ11cIlxuICAgICAgICBbYXR0ci5hcmlhLW93bnNdPVwidG9nZ2xlcj8uYXR0cmlidXRlcz8uWydhcmlhLW93bnMnXVwiXG4gICAgICAgIFt0YWJpbmRleF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy50YWJJbmRleFwiXG4gICAgICAgIFtzdHlsZV09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5zdHlsZVwiXG4gICAgICAgIFtjbGFzc109XCJ0b2dnbGVyPy5jbGFzc2VzXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZXI/LnRvZ2dsZSgpXCJcbiAgICAgICAgW2NsYXNzLmlzLXZhbGlkXT1cInZhbGlkXCJcbiAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPnt7IGRyb3Bkb3duPy50ZXh0IH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cImZvcm0taW5mb1wiXG4gICAgICAgICNmb3JtSW5mb1xuICAgICAgICBbYXR0ci5pZF09XCJ0b2dnbGVyPy5hdHRyaWJ1dGVzPy5pZCArICdfaW5mbydcIlxuICAgICAgICA+PG5nLWNvbnRlbnQgc2VsZWN0PVwiW2RhdGEtZm9ybS1pbmZvXVwiPjwvbmctY29udGVudFxuICAgICAgPjwvc3Bhbj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2xpc3Rib3hSZWZcbiAgICAgICAgW2lkXT1cImxpc3Rib3g/LmF0dHJpYnV0ZXM/LmlkXCJcbiAgICAgICAgW2F0dHIucm9sZV09XCJsaXN0Ym94Py5hdHRyaWJ1dGVzPy5yb2xlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIlxuICAgICAgICAgIGxpc3Rib3g/LmF0dHJpYnV0ZXM/LlsnYXJpYS1hY3RpdmVkZXNjZW5kYW50J11cbiAgICAgICAgXCJcbiAgICAgICAgW3RhYmluZGV4XT1cImxpc3Rib3g/LmF0dHJpYnV0ZXM/LnRhYkluZGV4XCJcbiAgICAgICAgW3N0eWxlXT1cImxpc3Rib3g/LmF0dHJpYnV0ZXM/LnN0eWxlXCJcbiAgICAgICAgW2NsYXNzXT1cImxpc3Rib3g/LmNsYXNzZXNcIlxuICAgICAgPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjbG9zZSBtLTQgbS1zbS0yIGQtYmxvY2sgZC1zbS1ub25lXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlcj8uY2xvc2UoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDx1bCByb2xlPVwibGlzdGJveFwiPlxuICAgICAgICAgIDxsaVxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBkcm9wZG93bj8ub3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUtleVwiXG4gICAgICAgICAgICBbaWRdPVwib3B0aW9uLmF0dHJpYnV0ZXMuaWRcIlxuICAgICAgICAgICAgW2F0dHIucm9sZV09XCJvcHRpb24uYXR0cmlidXRlcy5yb2xlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uLmF0dHJpYnV0ZXNbJ2FyaWEtc2VsZWN0ZWQnXVwiXG4gICAgICAgICAgICBbc3R5bGVdPVwib3B0aW9uLmF0dHJpYnV0ZXMuc3R5bGVcIlxuICAgICAgICAgICAgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc2VzXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyPy5zZWxlY3Qob3B0aW9uKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgb3B0aW9uLmtleSB9fVxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogTmdnRHJvcGRvd25Db21wb25lbnQsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdnRHJvcGRvd25Db21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgQElucHV0KCkgaWQ/OiBzdHJpbmdcbiAgQElucHV0KCkgdGV4dD86IHN0cmluZ1xuICBASW5wdXQoKSBsb29wPzogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nXG4gIEBJbnB1dCgpIG9wdGlvbnM6IERyb3Bkb3duT3B0aW9uW10gPSBbXVxuICBASW5wdXQoKSB2YWxpZD86IGJvb2xlYW5cbiAgQElucHV0KCkgaW52YWxpZD86IGJvb2xlYW5cblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgIHRoaXMuc2V0U2VsZWN0aW9uQnlWYWx1ZShuZXdWYWx1ZSlcbiAgfVxuICBwcml2YXRlIF92YWx1ZTogYW55XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG5cbiAgQFZpZXdDaGlsZCgndG9nZ2xlclJlZicpIHB1YmxpYyB0b2dnbGVyUmVmOlxuICAgIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgICB8IHVuZGVmaW5lZFxuXG4gIEBWaWV3Q2hpbGQoJ2xpc3Rib3hSZWYnKSBwdWJsaWMgbGlzdGJveFJlZjpcbiAgICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gICAgfCB1bmRlZmluZWRcblxuICBvbkNoYW5nZUZuPzogKHZhbHVlOiBhbnkpID0+IHZvaWRcbiAgb25Ub3VjaGVkRm4/OiBhbnlcblxuICBkcm9wZG93bj86IEFic3RyYWN0RHJvcGRvd25cbiAgaGFuZGxlcj86IERyb3Bkb3duSGFuZGxlclxuICB0b2dnbGVyPzogUGFydGlhbDxFbGVtZW50UHJvcHM+ID0gZHJvcGRvd25WYWx1ZXMuZWxlbWVudHM/LnRvZ2dsZXJcbiAgbGlzdGJveD86IFBhcnRpYWw8RWxlbWVudFByb3BzPiA9IGRyb3Bkb3duVmFsdWVzLmVsZW1lbnRzPy5saXN0Ym94XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvZ2dsZXJSZWY/Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5saXN0Ym94UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmhhbmRsZXIgPSBjcmVhdGVEcm9wZG93bihcbiAgICAgICAgdGhpcy5wcm9wcyxcbiAgICAgICAgdGhpcy50b2dnbGVyUmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMubGlzdGJveFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAoZHJvcGRvd24pID0+IHtcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duID0gZHJvcGRvd25cbiAgICAgICAgICB0aGlzLnRvZ2dsZXIgPSBkcm9wZG93bi5lbGVtZW50cy50b2dnbGVyXG4gICAgICAgICAgdGhpcy5saXN0Ym94ID0gZHJvcGRvd24uZWxlbWVudHMubGlzdGJveFxuXG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmRyb3Bkb3duLm9wdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAob3B0aW9uKSA9PiBvcHRpb24uc2VsZWN0ZWRcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKHNlbGVjdGVkICYmIHRoaXMuX3ZhbHVlICE9PSBzZWxlY3RlZD8udmFsdWUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHNlbGVjdGVkLnZhbHVlXG4gICAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChzZWxlY3RlZC52YWx1ZSlcbiAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUZuICYmIHRoaXMub25DaGFuZ2VGbihzZWxlY3RlZC52YWx1ZSlcbiAgICAgICAgICAgICAgdGhpcy5vblRvdWNoZWRGbiAmJiB0aGlzLm9uVG91Y2hlZEZuKClcbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRsZXI/LmRlc3Ryb3koKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaGFuZGxlciAmJlxuICAgICAgKGNoYW5nZXMuaWQgfHwgY2hhbmdlcy50ZXh0IHx8IGNoYW5nZXMubG9vcCB8fCBjaGFuZ2VzLm9wdGlvbnMpXG4gICAgKSB7XG4gICAgICB0aGlzLmhhbmRsZXIudXBkYXRlKHRoaXMucHJvcHMpXG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmblxuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmblxuICB9XG5cbiAgc2VsZWN0KG9wdGlvbjogRXh0ZW5kZWREcm9wZG93bk9wdGlvbikge1xuICAgIHRoaXMuaGFuZGxlcj8uc2VsZWN0KG9wdGlvbilcbiAgICB0aGlzLl92YWx1ZSA9IG9wdGlvbi52YWx1ZVxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChvcHRpb24udmFsdWUpXG4gICAgdGhpcy5vbkNoYW5nZUZuICYmIHRoaXMub25DaGFuZ2VGbihvcHRpb24udmFsdWUpXG4gICAgdGhpcy5vblRvdWNoZWRGbiAmJiB0aGlzLm9uVG91Y2hlZEZuKClcbiAgfVxuXG4gIHRyYWNrQnlLZXkgPSAoaW5kZXg6IG51bWJlciwgb3B0aW9uOiBFeHRlbmRlZERyb3Bkb3duT3B0aW9uKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gb3B0aW9uLmtleVxuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcHJvcHMoKTogRHJvcGRvd25BcmdzIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQgfHwgdGhpcy5kcm9wZG93bj8uaWQsXG4gICAgICB0ZXh0OiB0aGlzLnRleHQsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICBsb29wOiB0aGlzLmxvb3AsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVcblxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLmhhbmRsZXI/LmRyb3Bkb3duPy5vcHRpb25zLmZpbmQoXG4gICAgICAgIChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSA9PT0gdmFsdWVcbiAgICAgIClcbiAgICAgIGlmIChzZWxlY3RlZCkgdGhpcy5oYW5kbGVyPy5zZWxlY3Qoc2VsZWN0ZWQpXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NggDropdownComponent } from './dropdown.component';
4
+ import * as i0 from "@angular/core";
5
+ export class NggDropdownModule {
6
+ }
7
+ NggDropdownModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDropdownModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
+ NggDropdownModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDropdownModule, declarations: [NggDropdownComponent], imports: [CommonModule], exports: [NggDropdownComponent] });
9
+ NggDropdownModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDropdownModule, imports: [[CommonModule]] });
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggDropdownModule, decorators: [{
11
+ type: NgModule,
12
+ args: [{
13
+ declarations: [NggDropdownComponent],
14
+ imports: [CommonModule],
15
+ exports: [NggDropdownComponent],
16
+ }]
17
+ }] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL3NyYy9saWIvZHJvcGRvd24vZHJvcGRvd24ubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFBOztBQU8zRCxNQUFNLE9BQU8saUJBQWlCOzs4R0FBakIsaUJBQWlCOytHQUFqQixpQkFBaUIsaUJBSmIsb0JBQW9CLGFBQ3pCLFlBQVksYUFDWixvQkFBb0I7K0dBRW5CLGlCQUFpQixZQUhuQixDQUFDLFlBQVksQ0FBQzsyRkFHWixpQkFBaUI7a0JBTDdCLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQ3BDLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsT0FBTyxFQUFFLENBQUMsb0JBQW9CLENBQUM7aUJBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJ1xuaW1wb3J0IHsgTmdnRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duLmNvbXBvbmVudCdcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbTmdnRHJvcGRvd25Db21wb25lbnRdLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgZXhwb3J0czogW05nZ0Ryb3Bkb3duQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTmdnRHJvcGRvd25Nb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { NggSegmentedControlModule } from './segmented-control/segmented-control.module';
4
+ import { NggDropdownModule } from './dropdown/dropdown.module';
5
+ import { NggDatepickerModule } from './datepicker/datepicker.module';
6
+ import * as i0 from "@angular/core";
7
+ export class NggModule {
8
+ }
9
+ NggModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ NggModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggModule, imports: [CommonModule], exports: [NggSegmentedControlModule, NggDropdownModule, NggDatepickerModule] });
11
+ NggModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggModule, imports: [[CommonModule], NggSegmentedControlModule, NggDropdownModule, NggDatepickerModule] });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: NggModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ declarations: [],
16
+ imports: [CommonModule],
17
+ exports: [NggSegmentedControlModule, NggDropdownModule, NggDatepickerModule],
18
+ }]
19
+ }] });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlZW4tYW5ndWxhci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvc3JjL2xpYi9ncmVlbi1hbmd1bGFyLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUM5QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQTtBQUN4RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQTs7QUFPcEUsTUFBTSxPQUFPLFNBQVM7O3NHQUFULFNBQVM7dUdBQVQsU0FBUyxZQUhWLFlBQVksYUFDWix5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7dUdBRWhFLFNBQVMsWUFIWCxDQUFDLFlBQVksQ0FBQyxFQUNiLHlCQUF5QixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjsyRkFFaEUsU0FBUztrQkFMckIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsRUFBRTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixPQUFPLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQztpQkFDN0UiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXG5pbXBvcnQgeyBOZ2dTZWdtZW50ZWRDb250cm9sTW9kdWxlIH0gZnJvbSAnLi9zZWdtZW50ZWQtY29udHJvbC9zZWdtZW50ZWQtY29udHJvbC5tb2R1bGUnXG5pbXBvcnQgeyBOZ2dEcm9wZG93bk1vZHVsZSB9IGZyb20gJy4vZHJvcGRvd24vZHJvcGRvd24ubW9kdWxlJ1xuaW1wb3J0IHsgTmdnRGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJy4vZGF0ZXBpY2tlci9kYXRlcGlja2VyLm1vZHVsZSdcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGV4cG9ydHM6IFtOZ2dTZWdtZW50ZWRDb250cm9sTW9kdWxlLCBOZ2dEcm9wZG93bk1vZHVsZSwgTmdnRGF0ZXBpY2tlck1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIE5nZ01vZHVsZSB7fVxuIl19