design-angular-kit 1.0.0-2 → 1.0.0-4
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 +7 -2
- package/assets/i18n/en.json +84 -0
- package/assets/i18n/it.json +3 -0
- package/esm2020/lib/components/core/callout/callout.component.mjs +49 -24
- package/esm2020/lib/components/form/input/input.component.mjs +70 -3
- package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +7 -4
- package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +6 -4
- package/esm2020/lib/components/utils/icon/icon.component.mjs +1 -1
- package/esm2020/lib/components/utils/language-switcher/language-switcher.component.mjs +39 -0
- package/esm2020/lib/design-angular-kit.module.mjs +23 -8
- package/esm2020/lib/interfaces/form.mjs +1 -1
- package/esm2020/lib/interfaces/utils.mjs +2 -0
- package/esm2020/lib/modules/components.module.mjs +12 -4
- package/esm2020/lib/pipes/mark-matching-text.pipe.mjs +36 -0
- package/esm2020/lib/validators/it-validators.mjs +13 -10
- package/esm2020/public_api.mjs +5 -1
- package/fesm2015/design-angular-kit.mjs +263 -84
- package/fesm2015/design-angular-kit.mjs.map +1 -1
- package/fesm2020/design-angular-kit.mjs +266 -82
- package/fesm2020/design-angular-kit.mjs.map +1 -1
- package/lib/components/core/callout/callout.component.d.ts +26 -15
- package/lib/components/form/input/input.component.d.ts +30 -2
- package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +1 -1
- package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +3 -1
- package/lib/components/utils/icon/icon.component.d.ts +1 -1
- package/lib/components/utils/language-switcher/language-switcher.component.d.ts +23 -0
- package/lib/design-angular-kit.module.d.ts +4 -1
- package/lib/interfaces/form.d.ts +21 -2
- package/lib/interfaces/utils.d.ts +10 -0
- package/lib/modules/components.module.d.ts +7 -5
- package/lib/pipes/mark-matching-text.pipe.d.ts +10 -0
- package/lib/validators/it-validators.d.ts +7 -7
- package/package.json +3 -1
- package/public_api.d.ts +3 -0
package/README.md
CHANGED
|
@@ -63,7 +63,6 @@ Procedi a registrare `DesignAngularKitModule` nel tuo **app.module.ts**.
|
|
|
63
63
|
```typescript
|
|
64
64
|
imports: [
|
|
65
65
|
...
|
|
66
|
-
TranslateModule.forRoot(),
|
|
67
66
|
DesignAngularKitModule
|
|
68
67
|
]
|
|
69
68
|
```
|
|
@@ -145,6 +144,12 @@ Modifica il tuo `angular.json` aggiungendo:
|
|
|
145
144
|
]
|
|
146
145
|
```
|
|
147
146
|
|
|
147
|
+
Puoi anche utilizzare le label localizzate di `design-angular-kit` nella tua applicazione. [Vedi le nostre label](projects/design-angular-kit/assets/i18n/it.json)
|
|
148
|
+
|
|
149
|
+
Es: `{{'it.errors.required-field' | translate}}`
|
|
150
|
+
|
|
151
|
+
#### Caricamento file localizzazione app
|
|
152
|
+
|
|
148
153
|
Se utilizzi già i file di localizzazione nella tua app, puoi utilizzare la libreria [ngx-translate-multi-http-loader](https://www.npmjs.com/package/ngx-translate-multi-http-loader)
|
|
149
154
|
per caricare i file di localizzazione dell'app e di `design-angular-kit`
|
|
150
155
|
|
|
@@ -171,7 +176,7 @@ imports: [
|
|
|
171
176
|
|
|
172
177
|
#### Usa la localizzazione personalizzata
|
|
173
178
|
|
|
174
|
-
|
|
179
|
+
Non includere il supporto i18n nel tuo `angular.json` ma crea i tuoi file di localizzazione personalizzata nella tua cartella `assets/bootstrap-italia/i18n/` (crea il percorso se non esiste). Il json deve avere [questo formato](projects/design-angular-kit/assets/i18n/it.json).
|
|
175
180
|
|
|
176
181
|
Se utilizzi già i file di localizzazione nella tua app, puoi aggiungere le localizzazioni nei tuoi file json, sovrascrivendo le chiavi del json della libreria.
|
|
177
182
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"it": {
|
|
3
|
+
"general": {
|
|
4
|
+
"save": "Save",
|
|
5
|
+
"send": "Send",
|
|
6
|
+
"abort": "Abort",
|
|
7
|
+
"continue": "Continue",
|
|
8
|
+
"edit": "Edit",
|
|
9
|
+
"show-all": "Show all",
|
|
10
|
+
"details": "Details"
|
|
11
|
+
},
|
|
12
|
+
"errors": {
|
|
13
|
+
"generic": "An error has occurred",
|
|
14
|
+
"generic-support-message": "There was an unexpected error. Please try again later or contact support.",
|
|
15
|
+
"invalid-field": "This field is invalid",
|
|
16
|
+
"required-field": "This field is required",
|
|
17
|
+
"check-all-fields": "Check that you have filled in all the fields correctly",
|
|
18
|
+
"min-invalid": "The minimum value for this field is: {{min}}",
|
|
19
|
+
"max-invalid": "The maximum value for this field is: {{max}}",
|
|
20
|
+
"min-length-invalid": "The minimum length for this field is: {{min}}",
|
|
21
|
+
"max-length-invalid": "The minimum length for this field is: {{max}}",
|
|
22
|
+
"email-invalid": "Enter a valid email",
|
|
23
|
+
"tel-invalid": "Please enter a valid phone number format",
|
|
24
|
+
"url-invalid": "Please enter a valid URL",
|
|
25
|
+
"tax-code-invalid": "Enter a valid tax code",
|
|
26
|
+
"vat-number-invalid": "Enter a valid VAT number",
|
|
27
|
+
"cap-invalid": "Enter a valid zip code",
|
|
28
|
+
"regex-invalid": "Please enter a valid REGEX expression",
|
|
29
|
+
"pattern-invalid": "The field must have the pattern {{pattern}}",
|
|
30
|
+
"password-no-match": "Passwords must match",
|
|
31
|
+
"password-min-length": "Password must contain at least {{minLength}} characters!",
|
|
32
|
+
"password-number": "The password must have at least 1 number!",
|
|
33
|
+
"password-capital-case": "The password should contain at least 1 uppercase character!",
|
|
34
|
+
"password-small-case": "Password must contain at least 1 lowercase character!",
|
|
35
|
+
"password-special-character": "Password must contain at least 1 special character!"
|
|
36
|
+
},
|
|
37
|
+
"core": {
|
|
38
|
+
"close-modal": "Close modal window",
|
|
39
|
+
"close-notification": "Close Notification: {{title}}",
|
|
40
|
+
"close-alert": "Close alert",
|
|
41
|
+
"page": "Page",
|
|
42
|
+
"previous-page": "Previous page",
|
|
43
|
+
"next-page": "Next page",
|
|
44
|
+
"progress": "Progress",
|
|
45
|
+
"loading": "Loading",
|
|
46
|
+
"active": "Active",
|
|
47
|
+
"remove": "Delete"
|
|
48
|
+
},
|
|
49
|
+
"form": {
|
|
50
|
+
"increase-value": "Increase value",
|
|
51
|
+
"decrease-value": "Decrease value",
|
|
52
|
+
"upload": "Upload",
|
|
53
|
+
"upload-drag-file": "Drag the file to upload it",
|
|
54
|
+
"upload-loading": "Loading...",
|
|
55
|
+
"upload-complete": "Upload completed",
|
|
56
|
+
"upload-or": "or",
|
|
57
|
+
"upload-select-device": "select it from the device",
|
|
58
|
+
"uploaded-file": "File uploaded: {{name}}",
|
|
59
|
+
"delete-file": "Delete file {{name}}"
|
|
60
|
+
},
|
|
61
|
+
"navigation": {
|
|
62
|
+
"home": "Home",
|
|
63
|
+
"go-back": "Go back",
|
|
64
|
+
"upper-level": "Upper level",
|
|
65
|
+
"secondary-navigation": "Secondary navigation",
|
|
66
|
+
"login": "Log in",
|
|
67
|
+
"full-login": "Access the personal area",
|
|
68
|
+
"search": "Search",
|
|
69
|
+
"website-search": "Search in the site",
|
|
70
|
+
"navigation-path": "Navigation path"
|
|
71
|
+
},
|
|
72
|
+
"utils": {
|
|
73
|
+
"selected": "Selected",
|
|
74
|
+
"language-selection": "Language selection: {{lang}}",
|
|
75
|
+
"select-language": "Select a language",
|
|
76
|
+
"404": {
|
|
77
|
+
"title": "Resource not found",
|
|
78
|
+
"description": "Oops! The resource you are looking for was not found, go back to the homepage and use the menu to continue browsing.",
|
|
79
|
+
"go-back": "Go back",
|
|
80
|
+
"go-to-homepage": "Return to homepage"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
package/assets/i18n/it.json
CHANGED
|
@@ -70,6 +70,9 @@
|
|
|
70
70
|
"navigation-path": "Percorso di navigazione"
|
|
71
71
|
},
|
|
72
72
|
"utils": {
|
|
73
|
+
"selected": "Selezionata",
|
|
74
|
+
"language-selection": "Selezione lingua: {{lang}}",
|
|
75
|
+
"select-language": "Seleziona una lingua",
|
|
73
76
|
"404": {
|
|
74
77
|
"title": "Risorsa non trovata",
|
|
75
78
|
"description": "Oops! La risorsa che cerchi non è stata trovata, torna alla homepage e utilizza il menu per continuare la navigazione.",
|
|
@@ -1,26 +1,52 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "@angular/common";
|
|
4
4
|
import * as i2 from "../../utils/icon/icon.component";
|
|
5
5
|
export class CalloutComponent {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
8
|
-
this.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
* - <b>highlight</b>: Callout version with border only on the left side
|
|
13
|
-
* - <b>more</b>: It looks radically different from the other styles available and is suitable for more extensive texts
|
|
14
|
-
* @default default
|
|
15
|
-
*/
|
|
16
|
-
this.appearance = 'default';
|
|
6
|
+
constructor() {
|
|
7
|
+
this._label = undefined;
|
|
8
|
+
this._hiddenLabel = undefined;
|
|
9
|
+
this._color = undefined;
|
|
10
|
+
this._appearance = 'default';
|
|
11
|
+
this._icon = undefined;
|
|
17
12
|
}
|
|
18
13
|
/**
|
|
19
|
-
*
|
|
14
|
+
* Callout label
|
|
20
15
|
*/
|
|
16
|
+
set label(value) { this._label = value; }
|
|
17
|
+
get label() { return this._label; }
|
|
18
|
+
/**
|
|
19
|
+
* Callout hiddenLabel
|
|
20
|
+
*/
|
|
21
|
+
set hiddenLabel(value) { this._hiddenLabel = value; }
|
|
22
|
+
get hiddenLabel() { return this._hiddenLabel; }
|
|
23
|
+
/**
|
|
24
|
+
* Callout color
|
|
25
|
+
* - <b>success</b>
|
|
26
|
+
* - <b>danger</b>
|
|
27
|
+
* - <b>warning</b>
|
|
28
|
+
* - <b>important</b>
|
|
29
|
+
* - <b>note</b>
|
|
30
|
+
*/
|
|
31
|
+
set color(value) { this._color = value; }
|
|
32
|
+
get color() { return this._color; }
|
|
33
|
+
/**
|
|
34
|
+
* Callout appearance
|
|
35
|
+
* - <b>default</b>
|
|
36
|
+
* - <b>highlight</b>: Callout version with border only on the left side
|
|
37
|
+
* - <b>more</b>: It looks radically different from the other styles available and is suitable for more extensive texts
|
|
38
|
+
* @default default
|
|
39
|
+
*/
|
|
40
|
+
set appearance(value) { this._appearance = value; }
|
|
41
|
+
get appearance() { return this._appearance; }
|
|
42
|
+
/**
|
|
43
|
+
* Custom icon
|
|
44
|
+
*/
|
|
45
|
+
set icon(value) { this._icon = value; }
|
|
46
|
+
get icon() { return this._icon; }
|
|
21
47
|
get iconName() {
|
|
22
|
-
if (this.
|
|
23
|
-
return this.
|
|
48
|
+
if (this._icon) {
|
|
49
|
+
return this._icon;
|
|
24
50
|
}
|
|
25
51
|
if (this.appearance === 'more') {
|
|
26
52
|
return 'zoom-in';
|
|
@@ -38,22 +64,21 @@ export class CalloutComponent {
|
|
|
38
64
|
return 'info-circle';
|
|
39
65
|
}
|
|
40
66
|
}
|
|
41
|
-
ngAfterViewInit() {
|
|
42
|
-
this._renderer.removeAttribute(this._elementRef.nativeElement, 'title');
|
|
43
|
-
}
|
|
44
67
|
}
|
|
45
|
-
CalloutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CalloutComponent, deps: [
|
|
46
|
-
CalloutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: CalloutComponent, selector: "it-callout", inputs: {
|
|
68
|
+
CalloutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CalloutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
69
|
+
CalloutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: CalloutComponent, selector: "it-callout", inputs: { label: "label", hiddenLabel: "hiddenLabel", color: "color", appearance: "appearance", icon: "icon" }, ngImport: i0, template: "<div class=\"callout {{color}}\" [class.callout-highlight]=\"appearance === 'highlight'\"\n [class.callout-more]=\"appearance === 'more'\">\n <div class=\"callout-title\" *ngIf=\"label\">\n <it-icon [name]=\"iconName\"></it-icon>\n <span *ngIf=\"hiddenLabel\" class=\"visually-hidden\">{{ hiddenLabel }}</span>\n <span>{{ label }}</span>\n </div>\n <p class=\"callout-big-text\">\n <ng-content select=\"[bigText]\"></ng-content>\n </p>\n <ng-content></ng-content>\n</div>", styles: [".callout-big-text:empty{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
47
70
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: CalloutComponent, decorators: [{
|
|
48
71
|
type: Component,
|
|
49
|
-
args: [{ selector: 'it-callout', template: "<div class=\"callout {{color}}\"
|
|
50
|
-
}],
|
|
72
|
+
args: [{ selector: 'it-callout', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"callout {{color}}\" [class.callout-highlight]=\"appearance === 'highlight'\"\n [class.callout-more]=\"appearance === 'more'\">\n <div class=\"callout-title\" *ngIf=\"label\">\n <it-icon [name]=\"iconName\"></it-icon>\n <span *ngIf=\"hiddenLabel\" class=\"visually-hidden\">{{ hiddenLabel }}</span>\n <span>{{ label }}</span>\n </div>\n <p class=\"callout-big-text\">\n <ng-content select=\"[bigText]\"></ng-content>\n </p>\n <ng-content></ng-content>\n</div>", styles: [".callout-big-text:empty{display:none}\n"] }]
|
|
73
|
+
}], propDecorators: { label: [{
|
|
51
74
|
type: Input
|
|
52
|
-
}],
|
|
75
|
+
}], hiddenLabel: [{
|
|
53
76
|
type: Input
|
|
54
77
|
}], color: [{
|
|
55
78
|
type: Input
|
|
56
79
|
}], appearance: [{
|
|
57
80
|
type: Input
|
|
81
|
+
}], icon: [{
|
|
82
|
+
type: Input
|
|
58
83
|
}] } });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsbG91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9jb21wb25lbnRzL2NvcmUvY2FsbG91dC9jYWxsb3V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvY29yZS9jYWxsb3V0L2NhbGxvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFjekUsTUFBTSxPQUFPLGdCQUFnQjtJQVY3QjtRQWlCVSxXQUFNLEdBQXVCLFNBQVMsQ0FBQztRQU92QyxpQkFBWSxHQUF1QixTQUFTLENBQUM7UUFZN0MsV0FBTSxHQUE2QixTQUFTLENBQUM7UUFXN0MsZ0JBQVcsR0FBc0IsU0FBUyxDQUFDO1FBTzNDLFVBQUssR0FBeUIsU0FBUyxDQUFDO0tBeUJqRDtJQW5FQzs7T0FFRztJQUNILElBQWEsS0FBSyxDQUFFLEtBQXlCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksS0FBSyxLQUEwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBR3hEOztPQUVHO0lBQ0gsSUFBYSxXQUFXLENBQUUsS0FBeUIsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkYsSUFBSSxXQUFXLEtBQTBCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFHcEU7Ozs7Ozs7T0FPRztJQUNILElBQWEsS0FBSyxDQUFFLEtBQStCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQUksS0FBSyxLQUFnQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRzlEOzs7Ozs7T0FNRztJQUNILElBQWEsVUFBVSxDQUFFLEtBQXdCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hGLElBQUksVUFBVSxLQUF5QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBR2pFOztPQUVHO0lBQ0gsSUFBYSxJQUFJLENBQUUsS0FBMkIsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkUsSUFBSSxJQUFJLEtBQTJCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBLENBQUM7SUFHdEQsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ25CO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUM5QixPQUFPLFNBQVMsQ0FBQztTQUNsQjtRQUVELFFBQVEsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxjQUFjLENBQUM7WUFDeEIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCLEtBQUssUUFBUTtnQkFDWCxPQUFPLGNBQWMsQ0FBQztZQUN4QixLQUFLLFdBQVcsQ0FBQztZQUNqQixLQUFLLE1BQU0sQ0FBQztZQUNaO2dCQUNFLE9BQU8sYUFBYSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQzs7NkdBbkVVLGdCQUFnQjtpR0FBaEIsZ0JBQWdCLGtLQ2Q3QiwyZUFXTTsyRkRHTyxnQkFBZ0I7a0JBVjVCLFNBQVM7K0JBQ0UsWUFBWSxtQkFPTCx1QkFBdUIsQ0FBQyxNQUFNOzhCQU9sQyxLQUFLO3NCQUFqQixLQUFLO2dCQU9PLFdBQVc7c0JBQXZCLEtBQUs7Z0JBWU8sS0FBSztzQkFBakIsS0FBSztnQkFXTyxVQUFVO3NCQUF0QixLQUFLO2dCQU9PLElBQUk7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NhbGxvdXRBcHBlYXJhbmNlLCBDYWxsb3V0Q29sb3J9IGZyb20gXCIuLi8uLi8uLi9pbnRlcmZhY2VzL2NvcmVcIjtcbmltcG9ydCB7IEljb25OYW1lIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9pY29uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaXQtY2FsbG91dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYWxsb3V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVzOiBbYFxuICAgIC5jYWxsb3V0LWJpZy10ZXh0OmVtcHR5IHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICBgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2FsbG91dENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIENhbGxvdXQgbGFiZWxcbiAgICovXG4gIEBJbnB1dCgpIHNldCBsYWJlbCAodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgeyB0aGlzLl9sYWJlbCA9IHZhbHVlOyB9XG4gIGdldCBsYWJlbCAoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2xhYmVsOyB9XG4gIHByaXZhdGUgX2xhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENhbGxvdXQgaGlkZGVuTGFiZWxcbiAgICovXG4gIEBJbnB1dCgpIHNldCBoaWRkZW5MYWJlbCAodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkgeyB0aGlzLl9oaWRkZW5MYWJlbCA9IHZhbHVlOyB9XG4gIGdldCBoaWRkZW5MYWJlbCAoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2hpZGRlbkxhYmVsOyB9XG4gIHByaXZhdGUgX2hpZGRlbkxhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENhbGxvdXQgY29sb3JcbiAgICogLSA8Yj5zdWNjZXNzPC9iPlxuICAgKiAtIDxiPmRhbmdlcjwvYj5cbiAgICogLSA8Yj53YXJuaW5nPC9iPlxuICAgKiAtIDxiPmltcG9ydGFudDwvYj5cbiAgICogLSA8Yj5ub3RlPC9iPlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNvbG9yICh2YWx1ZTogQ2FsbG91dENvbG9yIHwgdW5kZWZpbmVkKSB7IHRoaXMuX2NvbG9yID0gdmFsdWU7IH1cbiAgZ2V0IGNvbG9yICgpOiBDYWxsb3V0Q29sb3IgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29sb3I7IH1cbiAgcHJpdmF0ZSBfY29sb3I6IENhbGxvdXRDb2xvciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ2FsbG91dCBhcHBlYXJhbmNlXG4gICAqIC0gPGI+ZGVmYXVsdDwvYj5cbiAgICogLSA8Yj5oaWdobGlnaHQ8L2I+OiBDYWxsb3V0IHZlcnNpb24gd2l0aCBib3JkZXIgb25seSBvbiB0aGUgbGVmdCBzaWRlXG4gICAqIC0gPGI+bW9yZTwvYj46IEl0IGxvb2tzIHJhZGljYWxseSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgc3R5bGVzIGF2YWlsYWJsZSBhbmQgaXMgc3VpdGFibGUgZm9yIG1vcmUgZXh0ZW5zaXZlIHRleHRzXG4gICAqIEBkZWZhdWx0IGRlZmF1bHRcbiAgICovXG4gIEBJbnB1dCgpIHNldCBhcHBlYXJhbmNlICh2YWx1ZTogQ2FsbG91dEFwcGVhcmFuY2UpIHsgdGhpcy5fYXBwZWFyYW5jZSA9IHZhbHVlOyB9XG4gIGdldCBhcHBlYXJhbmNlICgpOiBDYWxsb3V0QXBwZWFyYW5jZSB7IHJldHVybiB0aGlzLl9hcHBlYXJhbmNlOyB9XG4gIHByaXZhdGUgX2FwcGVhcmFuY2U6IENhbGxvdXRBcHBlYXJhbmNlID0gJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gaWNvblxuICAgKi9cbiAgQElucHV0KCkgc2V0IGljb24gKHZhbHVlOiBJY29uTmFtZSB8IHVuZGVmaW5lZCkgeyB0aGlzLl9pY29uID0gdmFsdWU7IH1cbiAgZ2V0IGljb24oKTogSWNvbk5hbWUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5faWNvbjt9XG4gIHByaXZhdGUgX2ljb246IEljb25OYW1lIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGdldCBpY29uTmFtZSAoKTogSWNvbk5hbWUge1xuICAgIGlmICh0aGlzLl9pY29uKSB7XG4gICAgICByZXR1cm4gdGhpcy5faWNvbjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcHBlYXJhbmNlID09PSAnbW9yZScpIHtcbiAgICAgIHJldHVybiAnem9vbS1pbic7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLmNvbG9yKSB7XG4gICAgICBjYXNlICdzdWNjZXNzJzpcbiAgICAgICAgcmV0dXJuICdjaGVjay1jaXJjbGUnO1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiAnaGVscC1jaXJjbGUnO1xuICAgICAgY2FzZSAnZGFuZ2VyJzpcbiAgICAgICAgcmV0dXJuICdjbG9zZS1jaXJjbGUnO1xuICAgICAgY2FzZSAnaW1wb3J0YW50JzpcbiAgICAgIGNhc2UgJ25vdGUnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdpbmZvLWNpcmNsZSc7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYWxsb3V0IHt7Y29sb3J9fVwiIFtjbGFzcy5jYWxsb3V0LWhpZ2hsaWdodF09XCJhcHBlYXJhbmNlID09PSAnaGlnaGxpZ2h0J1wiXG4gIFtjbGFzcy5jYWxsb3V0LW1vcmVdPVwiYXBwZWFyYW5jZSA9PT0gJ21vcmUnXCI+XG4gIDxkaXYgY2xhc3M9XCJjYWxsb3V0LXRpdGxlXCIgKm5nSWY9XCJsYWJlbFwiPlxuICAgIDxpdC1pY29uIFtuYW1lXT1cImljb25OYW1lXCI+PC9pdC1pY29uPlxuICAgIDxzcGFuICpuZ0lmPVwiaGlkZGVuTGFiZWxcIiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7IGhpZGRlbkxhYmVsIH19PC9zcGFuPlxuICAgIDxzcGFuPnt7IGxhYmVsIH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPHAgY2xhc3M9XCJjYWxsb3V0LWJpZy10ZXh0XCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2JpZ1RleHRdXCI+PC9uZy1jb250ZW50PlxuICA8L3A+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PiJdfQ==
|
|
@@ -3,9 +3,12 @@ import { AbstractFormComponent } from '../../../abstracts/abstract-form-componen
|
|
|
3
3
|
import { Validators } from '@angular/forms';
|
|
4
4
|
import { ItValidators } from '../../../validators/it-validators';
|
|
5
5
|
import { isTrueBooleanInput } from '../../../utils/boolean-input';
|
|
6
|
+
import { map, Observable, of } from 'rxjs';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
import * as i1 from "@angular/common";
|
|
8
9
|
import * as i2 from "@angular/forms";
|
|
10
|
+
import * as i3 from "../../utils/icon/icon.component";
|
|
11
|
+
import * as i4 from "../../../pipes/mark-matching-text.pipe";
|
|
9
12
|
export class InputComponent extends AbstractFormComponent {
|
|
10
13
|
constructor() {
|
|
11
14
|
super(...arguments);
|
|
@@ -18,7 +21,18 @@ export class InputComponent extends AbstractFormComponent {
|
|
|
18
21
|
* The input placeholder
|
|
19
22
|
*/
|
|
20
23
|
this.placeholder = '';
|
|
24
|
+
this._autoCompleteData = [];
|
|
25
|
+
this.showAutocompletion = false;
|
|
26
|
+
/** Observable da cui vengono emessi i risultati dell'auto completamento */
|
|
27
|
+
this.autocompleteResults$ = new Observable();
|
|
21
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Opzionale.
|
|
31
|
+
* Disponibile solo se il type è search.
|
|
32
|
+
* Indica la lista di elementi ricercabili su cui basare il sistema di autocompletamento della input
|
|
33
|
+
*/
|
|
34
|
+
set autoCompleteData(value) { this._autoCompleteData = value; }
|
|
35
|
+
get autoCompleteData() { return this._autoCompleteData; }
|
|
22
36
|
get isActiveLabel() {
|
|
23
37
|
const value = this.control.value;
|
|
24
38
|
if ((!!value && value !== 0) || value === 0 || !!this.placeholder) {
|
|
@@ -108,6 +122,7 @@ export class InputComponent extends AbstractFormComponent {
|
|
|
108
122
|
break;
|
|
109
123
|
}
|
|
110
124
|
this.addValidators(validators);
|
|
125
|
+
this.autocompleteResults$ = this.getAutocompleteResults$();
|
|
111
126
|
}
|
|
112
127
|
/**
|
|
113
128
|
* Increment or decrease the input number value of step
|
|
@@ -129,12 +144,62 @@ export class InputComponent extends AbstractFormComponent {
|
|
|
129
144
|
}
|
|
130
145
|
this.control.setValue(value);
|
|
131
146
|
}
|
|
147
|
+
getAutocompleteResults$() {
|
|
148
|
+
if (this.type === 'search') {
|
|
149
|
+
return this.control.valueChanges.pipe(map((value) => {
|
|
150
|
+
const searchedValue = value;
|
|
151
|
+
if (searchedValue) {
|
|
152
|
+
const lowercaseValue = searchedValue.toLowerCase();
|
|
153
|
+
const lowercaseData = this._autoCompleteData.filter((item) => item.value).map(item => {
|
|
154
|
+
return { ...item, original: item.value, lowercase: item.value.toLowerCase() };
|
|
155
|
+
});
|
|
156
|
+
const relatedEntries = [];
|
|
157
|
+
lowercaseData.forEach(lowercaseEntry => {
|
|
158
|
+
const matching = (lowercaseEntry.lowercase).includes(lowercaseValue);
|
|
159
|
+
if (matching) {
|
|
160
|
+
relatedEntries.push(lowercaseEntry);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
return { searchedValue, relatedEntries };
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
return { searchedValue, relatedEntries: [] };
|
|
167
|
+
}
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return of({ searchedValue: '', relatedEntries: [] });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
isAutocompletable() {
|
|
175
|
+
if (this._autoCompleteData && this.type === 'search') {
|
|
176
|
+
return this._autoCompleteData.length > 0;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
onEntryClick(entry, event) {
|
|
183
|
+
// Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
|
|
184
|
+
// non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
|
|
185
|
+
if (!entry.link) {
|
|
186
|
+
event.preventDefault();
|
|
187
|
+
}
|
|
188
|
+
this.control.setValue(entry.value);
|
|
189
|
+
this.showAutocompletion = false;
|
|
190
|
+
}
|
|
191
|
+
autocompleteItemTrackByValueFn(index, item) {
|
|
192
|
+
return item.value;
|
|
193
|
+
}
|
|
194
|
+
onKeyDown() {
|
|
195
|
+
this.showAutocompletion = this.type === 'search';
|
|
196
|
+
}
|
|
132
197
|
}
|
|
133
198
|
InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
134
|
-
InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: InputComponent, selector: "it-input[id]", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", max: "max", min: "min", step: "step", currency: "currency", percentage: "percentage", adaptive: "adaptive" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
199
|
+
InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: InputComponent, selector: "it-input[id]", inputs: { type: "type", placeholder: "placeholder", description: "description", readonly: "readonly", max: "max", min: "min", step: "step", currency: "currency", percentage: "percentage", adaptive: "adaptive", autoCompleteData: "autoCompleteData" }, usesInheritance: true, ngImport: i0, template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n\n\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n\n\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\" *ngIf=\"isAutocompletable()\">\n <it-icon name = \"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" *ngIf=\"isAutocompletable()\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\" (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\" >\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML] = \"entry.original | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n \n\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n\n\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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: "component", type: i3.IconComponent, selector: "it-icon[name]", inputs: ["name", "size", "color", "padded", "class"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.MarkMatchingTextPipe, name: "markMatchingText" }] });
|
|
135
200
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: InputComponent, decorators: [{
|
|
136
201
|
type: Component,
|
|
137
|
-
args: [{ selector: 'it-input[id]', template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"] }]
|
|
202
|
+
args: [{ selector: 'it-input[id]', template: "<div class=\"form-group\">\n <div class=\"input-group\">\n <div class=\"input-group-prepend\" [class.d-none]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n <div #prepend>\n <ng-content select=\"[prepend]\"></ng-content>\n </div>\n <div class=\"input-group-text\" #prependText>\n <ng-content select=\"[prependText]\"></ng-content>\n </div>\n </div>\n\n <label *ngIf=\"label\" [for]=\"id\" [class.active]=\"isActiveLabel\"\n [class.empty-prepend-label]=\"!prependText.hasChildNodes() && !prepend.hasChildNodes()\">\n {{label}}\n </label>\n\n <span *ngIf=\"type === 'number'\"\n class=\"input-number\"\n [class.input-number-currency]=\"currency\"\n [class.input-number-percentage]=\"percentage\"\n [class.input-number-adaptive]=\"adaptive\">\n\n <input type=\"number\"\n [id]=\"id\"\n [step]=\"step ?? null\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\" />\n\n <button type=\"button\" class=\"input-number-add\" (click)=\"incrementNumber()\">\n <span class=\"visually-hidden\">{{'it.form.increase-value'}}</span>\n </button>\n <button type=\"button\" class=\"input-number-sub\" (click)=\"incrementNumber(true)\">\n <span class=\"visually-hidden\">{{'it.form.decrease-value'}}</span>\n </button>\n </span>\n\n <input *ngIf=\"type !== 'number'\"\n [id]=\"id\"\n [type]=\"type\"\n [class.form-control]=\"readonly !== 'plaintext'\"\n [class.form-control-plaintext]=\"readonly === 'plaintext'\"\n [class.is-invalid]=\"isInvalid\"\n [class.is-valid]=\"isValid\"\n [formControl]=\"control\"\n [placeholder]=\"placeholder\"\n [readonly]=\"isReadonly\"\n (keydown)=\"onKeyDown()\"\n [attr.aria-describedby]=\"id + '-description'\"\n (blur)=\"markAsTouched()\">\n\n <div class=\"input-group-append\">\n <ng-content select=\"[append]\"></ng-content>\n\n <div class=\"input-group-text\">\n <ng-content select=\"[appendText]\"></ng-content>\n </div>\n </div>\n </div>\n\n <small *ngIf=\"description\" [id]=\"id + '-description'\" class=\"form-text\">{{description}}</small>\n\n\n\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n\n\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\" *ngIf=\"isAutocompletable()\">\n <it-icon name = \"search\" size=\"sm\"></it-icon>\n </span>\n\n <ng-container *ngIf=\"autocompleteResults$ | async as autocomplete\">\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" *ngIf=\"isAutocompletable()\" [class.autocomplete-list-show]=\"autocomplete.relatedEntries?.length && showAutocompletion\">\n <li *ngFor=\"let entry of autocomplete.relatedEntries; trackBy: autocompleteItemTrackByValueFn\" (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\" >\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [name]=\"entry.icon\" size=\"sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML] = \"entry.original | markMatchingText: autocomplete.searchedValue\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n </ng-container>\n \n\n <!-- FINE gestione AUTOCOMPLETAMENTO -->\n\n\n\n\n <div *ngIf=\"isInvalid\" class=\"form-feedback just-validate-error-label\" [id]=\"id + '-error'\">\n <div #customError>\n <ng-content select=\"[error]\"></ng-content>\n </div>\n <ng-container *ngIf=\"!customError.hasChildNodes()\">{{invalidMessage | async}}</ng-container>\n </div>\n</div>\n", styles: [".form-group label{z-index:1000}.form-group input:focus:not(.focus--mouse){box-shadow:inherit!important;border-color:inherit!important}.form-group .input-number button.input-number-add{top:0}.form-group .input-number button.input-number-sub{bottom:0}.form-group .input-group-text:empty{display:none}.form-group label.empty-prepend-label{left:auto!important;max-width:100%!important}\n"] }]
|
|
138
203
|
}], propDecorators: { type: [{
|
|
139
204
|
type: Input
|
|
140
205
|
}], placeholder: [{
|
|
@@ -155,5 +220,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImpor
|
|
|
155
220
|
type: Input
|
|
156
221
|
}], adaptive: [{
|
|
157
222
|
type: Input
|
|
223
|
+
}], autoCompleteData: [{
|
|
224
|
+
type: Input
|
|
158
225
|
}] } });
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVuRixPQUFPLEVBQWdDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFRaEYsTUFBTSxPQUFPLGNBQWUsU0FBUSxxQkFBc0M7SUFMMUU7O1FBT0U7OztXQUdHO1FBQ00sU0FBSSxHQUFxQixNQUFNLENBQUM7UUFFekM7O1dBRUc7UUFDTSxnQkFBVyxHQUFXLEVBQUUsQ0FBQztLQXFLbkM7SUExSEMsSUFBSSxhQUFhO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDakUsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxrQkFB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QyxDQUFDLDJCQUEyQjtRQUVwRSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzlDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ2xCO2FBQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyRCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUNsQjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7OzJHQTlLVSxjQUFjOytGQUFkLGNBQWMsK1JDYjNCLHd4RkF1RUE7MkZEMURhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsY0FBYzs4QkFVZixJQUFJO3NCQUFaLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csR0FBRztzQkFBWCxLQUFLO2dCQUtHLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9hYnN0cmFjdHMvYWJzdHJhY3QtZm9ybS1jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5wdXRDb250cm9sVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZm9ybSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSXRWYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vLi4vdmFsaWRhdG9ycy9pdC12YWxpZGF0b3JzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgaXNUcnVlQm9vbGVhbklucHV0IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYm9vbGVhbi1pbnB1dCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2l0LWlucHV0W2lkXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db21wb25lbnQ8c3RyaW5nIHwgbnVtYmVyPiB7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCB0eXBlXG4gICAqIEBkZWZhdWx0IHRleHRcbiAgICovXG4gIEBJbnB1dCgpIHR5cGU6IElucHV0Q29udHJvbFR5cGUgPSAndGV4dCc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBwbGFjZWhvbGRlclxuICAgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUbyBwcmV2ZW50IG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udGFpbmVkIHZhbHVlLlxuICAgKiAtIDxiPnBsYWludGV4dDwvYj46IFJlYWRvbmx5IGZpZWxkIGluIHRoZSBmb3JtIHN0eWxpemVkIGFzIHBsYWluIHRleHRcbiAgICovXG4gIEBJbnB1dCgpIHJlYWRvbmx5PzogQm9vbGVhbklucHV0IHwgJ3BsYWludGV4dCc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBtYXg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW4gdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBtaW4/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGVwIHZhbHVlIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgc3RlcD86IG51bWJlciB8ICdhbnknO1xuXG4gIC8qKlxuICAgKiBJZiBpcyBhIGN1cnJlbmN5IG51bWJlciBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIGN1cnJlbmN5PzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBJZiBpcyBhIHBlcmNlbnRhZ2UgbnVtYmVyIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgcGVyY2VudGFnZT86IEJvb2xlYW5JbnB1dDtcblxuICAvKipcbiAgICogVG8gbWFrZSB0aGUgbnVtZXJpYyBmaWVsZCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiBpdC4gW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBhZGFwdGl2ZT86IEJvb2xlYW5JbnB1dDtcblxuICBnZXQgaXNBY3RpdmVMYWJlbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udHJvbC52YWx1ZTtcbiAgICBpZiAoKCEhdmFsdWUgJiYgdmFsdWUgIT09IDApIHx8IHZhbHVlID09PSAwIHx8ICEhdGhpcy5wbGFjZWhvbGRlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ251bWJlcicgJiYgKGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLmN1cnJlbmN5KSB8fCBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5wZXJjZW50YWdlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdkYXRlJyB8fCB0aGlzLnR5cGUgPT09ICd0aW1lJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpcyByZWFkb25seSBmaWVsZFxuICAgKi9cbiAgZ2V0IGlzUmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgPT09ICdwbGFpbnRleHQnIHx8IGlzVHJ1ZUJvb2xlYW5JbnB1dCh0aGlzLnJlYWRvbmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGludmFsaWQgbWVzc2FnZSBzdHJpbmcgZnJvbSBUcmFuc2xhdGVTZXJ2aWNlXG4gICAqL1xuICBvdmVycmlkZSBnZXQgaW52YWxpZE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWluJykgJiYgdGhpcy5taW4pIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLm1pbi1pbnZhbGlkJywge1xuICAgICAgICBtaW46IHRoaXMubWluXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ21heCcpICYmIHRoaXMubWF4KSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5tYXgtaW52YWxpZCcsIHtcbiAgICAgICAgbWF4OiB0aGlzLm1heFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtaW5sZW5ndGgnKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmdldEVycm9yKCdtaW5sZW5ndGgnKTtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLm1pbi1sZW5ndGgtaW52YWxpZCcsIHsgbWluOiBlcnJvci5yZXF1aXJlZExlbmd0aCB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ21heGxlbmd0aCcpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0RXJyb3IoJ21heGxlbmd0aCcpO1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWF4LWxlbmd0aC1pbnZhbGlkJywgeyBtYXg6IGVycm9yLnJlcXVpcmVkTGVuZ3RoIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignZW1haWwnKSB8fCB0aGlzLmhhc0Vycm9yKCdpbnZhbGlkRW1haWwnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMuZW1haWwtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZFRlbCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy50ZWwtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZFVybCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy51cmwtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZFRheENvZGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudGF4LWNvZGUtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignaW52YWxpZFZhdE51bWJlcicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy52YXQtbnVtYmVyLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRDYXAnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMuY2FwLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRSZWdleCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5yZWdleC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdwYXR0ZXJuJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcigncGF0dGVybicpO1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucGF0dGVybi1pbnZhbGlkJywgeyBwYXR0ZXJuOiBlcnJvci5yZXF1aXJlZFBhdHRlcm4gfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmludmFsaWRNZXNzYWdlO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvckZuPiA9IFtdO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucGVyY2VudGFnZSkpIHtcbiAgICAgICAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8IDA7XG4gICAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAxMDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG1pbi9tYXggdmFsaWRhdG9yc1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdGhpcy5taW4gPyBWYWxpZGF0b3JzLm1pbih0aGlzLm1pbikoY29udHJvbCkgOiBudWxsKTtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHRoaXMubWF4ID8gVmFsaWRhdG9ycy5tYXgodGhpcy5tYXgpKGNvbnRyb2wpIDogbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZWwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLnRlbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy51cmwpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmFkZFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVtZW50IG9yIGRlY3JlYXNlIHRoZSBpbnB1dCBudW1iZXIgdmFsdWUgb2Ygc3RlcFxuICAgKiBAcGFyYW0gZGVjcmVhc2UgdHJ1ZSB0byBkZWNyZWFzZSB2YWx1ZVxuICAgKi9cbiAgaW5jcmVtZW50TnVtYmVyKGRlY3JlYXNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwID0gKHRoaXMuc3RlcCA9PT0gJ2FueScgPyAxIDogKHRoaXMuc3RlcCA/PyAxKSk7XG4gICAgbGV0IHZhbHVlID0gTnVtYmVyKHRoaXMuY29udHJvbC52YWx1ZSk7XG4gICAgdmFsdWUgPSAoaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlKSArIChkZWNyZWFzZSA/IC1zdGVwIDogc3RlcCk7XG4gICAgdmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlICogMWUxMikgLyAxZTEyOyAvLyBwcmV2ZW50IGpzIGRlY2ltYWwgZXJyb3JcblxuICAgIGlmICh0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgdGhpcy5taW4pIHtcbiAgICAgIHZhbHVlID0gdGhpcy5taW47XG4gICAgfSBlbHNlIGlmICh0aGlzLm1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gdGhpcy5tYXgpIHtcbiAgICAgIHZhbHVlID0gdGhpcy5tYXg7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuXG59XG4iLCI8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiIFtjbGFzcy5kLW5vbmVdPVwiIXByZXBlbmRUZXh0Lmhhc0NoaWxkTm9kZXMoKSAmJiAhcHJlcGVuZC5oYXNDaGlsZE5vZGVzKClcIj5cbiAgICAgIDxkaXYgI3ByZXBlbmQ+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwcmVwZW5kXVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiAjcHJlcGVuZFRleHQ+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltwcmVwZW5kVGV4dF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgW2Zvcl09XCJpZFwiIFtjbGFzcy5hY3RpdmVdPVwiaXNBY3RpdmVMYWJlbFwiXG4gICAgICAgICAgIFtjbGFzcy5lbXB0eS1wcmVwZW5kLWxhYmVsXT1cIiFwcmVwZW5kVGV4dC5oYXNDaGlsZE5vZGVzKCkgJiYgIXByZXBlbmQuaGFzQ2hpbGROb2RlcygpXCI+XG4gICAgICB7e2xhYmVsfX1cbiAgICA8L2xhYmVsPlxuXG4gICAgPHNwYW4gKm5nSWY9XCJ0eXBlID09PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgY2xhc3M9XCJpbnB1dC1udW1iZXJcIlxuICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItY3VycmVuY3ldPVwiY3VycmVuY3lcIlxuICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItcGVyY2VudGFnZV09XCJwZXJjZW50YWdlXCJcbiAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLWFkYXB0aXZlXT1cImFkYXB0aXZlXCI+XG5cbiAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgIFtzdGVwXT1cInN0ZXAgPz8gbnVsbFwiXG4gICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwiaXNJbnZhbGlkXCJcbiAgICAgICAgICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgICAgKGJsdXIpPVwibWFya0FzVG91Y2hlZCgpXCIgLz5cblxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbnB1dC1udW1iZXItYWRkXCIgKGNsaWNrKT1cImluY3JlbWVudE51bWJlcigpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+e3snaXQuZm9ybS5pbmNyZWFzZS12YWx1ZSd9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJpbnB1dC1udW1iZXItc3ViXCIgKGNsaWNrKT1cImluY3JlbWVudE51bWJlcih0cnVlKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7J2l0LmZvcm0uZGVjcmVhc2UtdmFsdWUnfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8aW5wdXQgKm5nSWY9XCJ0eXBlICE9PSAnbnVtYmVyJ1wiXG4gICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgICAgICBbY2xhc3MuZm9ybS1jb250cm9sXT1cInJlYWRvbmx5ICE9PSAncGxhaW50ZXh0J1wiXG4gICAgICAgICAgIFtjbGFzcy5mb3JtLWNvbnRyb2wtcGxhaW50ZXh0XT1cInJlYWRvbmx5ID09PSAncGxhaW50ZXh0J1wiXG4gICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImlzSW52YWxpZFwiXG4gICAgICAgICAgIFtjbGFzcy5pcy12YWxpZF09XCJpc1ZhbGlkXCJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICBbcmVhZG9ubHldPVwiaXNSZWFkb25seVwiXG4gICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgIChibHVyKT1cIm1hcmtBc1RvdWNoZWQoKVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FwcGVuZF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthcHBlbmRUZXh0XVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8c21hbGwgKm5nSWY9XCJkZXNjcmlwdGlvblwiIFtpZF09XCJpZCArICctZGVzY3JpcHRpb24nXCIgY2xhc3M9XCJmb3JtLXRleHRcIj57e2Rlc2NyaXB0aW9ufX08L3NtYWxsPlxuICA8ZGl2ICpuZ0lmPVwiaXNJbnZhbGlkXCIgY2xhc3M9XCJmb3JtLWZlZWRiYWNrIGp1c3QtdmFsaWRhdGUtZXJyb3ItbGFiZWxcIiBbaWRdPVwiaWQgKyAnLWVycm9yJ1wiPlxuICAgIDxkaXYgI2N1c3RvbUVycm9yPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Vycm9yXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbUVycm9yLmhhc0NoaWxkTm9kZXMoKVwiPnt7aW52YWxpZE1lc3NhZ2UgfCBhc3luY319PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
226
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2lucHV0L2lucHV0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2NvbXBvbmVudHMvZm9ybS9pbnB1dC9pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVuRixPQUFPLEVBQWdDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNqRSxPQUFPLEVBQWdCLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFPM0MsTUFBTSxPQUFPLGNBQWUsU0FBUSxxQkFBc0M7SUFMMUU7O1FBT0U7OztXQUdHO1FBQ00sU0FBSSxHQUFxQixNQUFNLENBQUM7UUFFekM7O1dBRUc7UUFDTSxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQW1EMUIsc0JBQWlCLEdBQTRCLEVBQUUsQ0FBQztRQUV4RCx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUEwRTNCLDJFQUEyRTtRQUMzRSx5QkFBb0IsR0FBNEgsSUFBSSxVQUFVLEVBQUUsQ0FBQztLQWdIbEs7SUFyTUM7Ozs7T0FJRztJQUNILElBQ0ksZ0JBQWdCLENBQUMsS0FBOEIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFD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T0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsS0FBdUIsRUFBRSxLQUFZO1FBQ2hELHlHQUF5RztRQUN6Ryx3R0FBd0c7UUFDeEcsSUFBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDZCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRUQsOEJBQThCLENBQUMsS0FBYSxFQUFFLElBQXNCO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztJQUNuRCxDQUFDOzsyR0ExUFUsY0FBYzsrRkFBZCxjQUFjLHFVQ2IzQiw0d0lBK0dBOzJGRGxHYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLGNBQWM7OEJBVWYsSUFBSTtzQkFBWixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFNRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLEdBQUc7c0JBQVgsS0FBSztnQkFLRyxHQUFHO3NCQUFYLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQVFGLGdCQUFnQjtzQkFEbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2Fic3RyYWN0cy9hYnN0cmFjdC1mb3JtLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRvQ29tcGxldGVJdGVtLCBJbnB1dENvbnRyb2xUeXBlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9mb3JtJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJdFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi8uLi92YWxpZGF0b3JzL2l0LXZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBpc1RydWVCb29sZWFuSW5wdXQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ib29sZWFuLWlucHV0JztcbmltcG9ydCB7IG1hcCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaXQtaW5wdXRbaWRdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJbnB1dENvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbXBvbmVudDxzdHJpbmcgfCBudW1iZXI+IHtcblxuICAvKipcbiAgICogVGhlIGlucHV0IHR5cGVcbiAgICogQGRlZmF1bHQgdGV4dFxuICAgKi9cbiAgQElucHV0KCkgdHlwZTogSW5wdXRDb250cm9sVHlwZSA9ICd0ZXh0JztcblxuICAvKipcbiAgICogVGhlIGlucHV0IHBsYWNlaG9sZGVyXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbnB1dCBkZXNjcmlwdGlvblxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvIHByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250YWluZWQgdmFsdWUuXG4gICAqIC0gPGI+cGxhaW50ZXh0PC9iPjogUmVhZG9ubHkgZmllbGQgaW4gdGhlIGZvcm0gc3R5bGl6ZWQgYXMgcGxhaW4gdGV4dFxuICAgKi9cbiAgQElucHV0KCkgcmVhZG9ubHk/OiBCb29sZWFuSW5wdXQgfCAncGxhaW50ZXh0JztcblxuICAvKipcbiAgICogVGhlIG1heCB2YWx1ZSBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIG1heD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1pbiB2YWx1ZSBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIG1pbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0ZXAgdmFsdWUgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBzdGVwPzogbnVtYmVyIHwgJ2FueSc7XG5cbiAgLyoqXG4gICAqIElmIGlzIGEgY3VycmVuY3kgbnVtYmVyIFtVc2VkIG9ubHkgaW4gdHlwZSA9ICdudW1iZXInXVxuICAgKi9cbiAgQElucHV0KCkgY3VycmVuY3k/OiBCb29sZWFuSW5wdXQ7XG5cbiAgLyoqXG4gICAqIElmIGlzIGEgcGVyY2VudGFnZSBudW1iZXIgW1VzZWQgb25seSBpbiB0eXBlID0gJ251bWJlciddXG4gICAqL1xuICBASW5wdXQoKSBwZXJjZW50YWdlPzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBUbyBtYWtlIHRoZSBudW1lcmljIGZpZWxkIGF1dG9tYXRpY2FsbHkgcmVzaXplIGFjY29yZGluZyB0byB0aGUgdmFsdWUgY29udGFpbmVkIGluIGl0LiBbVXNlZCBvbmx5IGluIHR5cGUgPSAnbnVtYmVyJ11cbiAgICovXG4gIEBJbnB1dCgpIGFkYXB0aXZlPzogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBPcHppb25hbGUuXG4gICAqIERpc3BvbmliaWxlIHNvbG8gc2UgaWwgdHlwZSDDqCBzZWFyY2guXG4gICAqIEluZGljYSBsYSBsaXN0YSBkaSBlbGVtZW50aSByaWNlcmNhYmlsaSBzdSBjdWkgYmFzYXJlIGlsIHNpc3RlbWEgZGkgYXV0b2NvbXBsZXRhbWVudG8gZGVsbGEgaW5wdXRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBhdXRvQ29tcGxldGVEYXRhKHZhbHVlOiBBcnJheTxBdXRvQ29tcGxldGVJdGVtPikgeyB0aGlzLl9hdXRvQ29tcGxldGVEYXRhID0gdmFsdWU7IH1cbiAgZ2V0IGF1dG9Db21wbGV0ZURhdGEoKTogQXJyYXk8QXV0b0NvbXBsZXRlSXRlbT4geyByZXR1cm4gdGhpcy5fYXV0b0NvbXBsZXRlRGF0YTsgfVxuICBwcml2YXRlIF9hdXRvQ29tcGxldGVEYXRhOiBBcnJheTxBdXRvQ29tcGxldGVJdGVtPiA9IFtdO1xuXG4gIHNob3dBdXRvY29tcGxldGlvbiA9IGZhbHNlO1xuXG5cbiAgZ2V0IGlzQWN0aXZlTGFiZWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnRyb2wudmFsdWU7XG4gICAgaWYgKCghIXZhbHVlICYmIHZhbHVlICE9PSAwKSB8fCB2YWx1ZSA9PT0gMCB8fCAhIXRoaXMucGxhY2Vob2xkZXIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdudW1iZXInICYmIChpc1RydWVCb29sZWFuSW5wdXQodGhpcy5jdXJyZW5jeSkgfHwgaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucGVyY2VudGFnZSkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnZGF0ZScgfHwgdGhpcy50eXBlID09PSAndGltZSc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaXMgcmVhZG9ubHkgZmllbGRcbiAgICovXG4gIGdldCBpc1JlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRvbmx5ID09PSAncGxhaW50ZXh0JyB8fCBpc1RydWVCb29sZWFuSW5wdXQodGhpcy5yZWFkb25seSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbnZhbGlkIG1lc3NhZ2Ugc3RyaW5nIGZyb20gVHJhbnNsYXRlU2VydmljZVxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGludmFsaWRNZXNzYWdlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ21pbicpICYmIHRoaXMubWluKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5taW4taW52YWxpZCcsIHtcbiAgICAgICAgbWluOiB0aGlzLm1pblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtYXgnKSAmJiB0aGlzLm1heCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMubWF4LWludmFsaWQnLCB7XG4gICAgICAgIG1heDogdGhpcy5tYXhcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcignbWlubGVuZ3RoJykpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5nZXRFcnJvcignbWlubGVuZ3RoJyk7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZS5nZXQoJ2l0LmVycm9ycy5taW4tbGVuZ3RoLWludmFsaWQnLCB7IG1pbjogZXJyb3IucmVxdWlyZWRMZW5ndGggfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgICAgY29uc3QgZXJyb3IgPSB0aGlzLmdldEVycm9yKCdtYXhsZW5ndGgnKTtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLm1heC1sZW5ndGgtaW52YWxpZCcsIHsgbWF4OiBlcnJvci5yZXF1aXJlZExlbmd0aCB9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2VtYWlsJykgfHwgdGhpcy5oYXNFcnJvcignaW52YWxpZEVtYWlsJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLmVtYWlsLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRUZWwnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudGVsLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRVcmwnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudXJsLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRUYXhDb2RlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnRheC1jb2RlLWludmFsaWQnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzRXJyb3IoJ2ludmFsaWRWYXROdW1iZXInKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMudmF0LW51bWJlci1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkQ2FwJykpIHtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLmNhcC1pbnZhbGlkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0Vycm9yKCdpbnZhbGlkUmVnZXgnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KCdpdC5lcnJvcnMucmVnZXgtaW52YWxpZCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNFcnJvcigncGF0dGVybicpKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZ2V0RXJyb3IoJ3BhdHRlcm4nKTtcbiAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnaXQuZXJyb3JzLnBhdHRlcm4taW52YWxpZCcsIHsgcGF0dGVybjogZXJyb3IucmVxdWlyZWRQYXR0ZXJuIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5pbnZhbGlkTWVzc2FnZTtcbiAgfVxuXG4gIC8qKiBPYnNlcnZhYmxlIGRhIGN1aSB2ZW5nb25vIGVtZXNzaSBpIHJpc3VsdGF0aSBkZWxsJ2F1dG8gY29tcGxldGFtZW50byAqL1xuICBhdXRvY29tcGxldGVSZXN1bHRzJDogT2JzZXJ2YWJsZTx7IHNlYXJjaGVkVmFsdWU6IHN0cmluZywgcmVsYXRlZEVudHJpZXM6IEFycmF5PEF1dG9Db21wbGV0ZUl0ZW0gJiB7IG9yaWdpbmFsOiBzdHJpbmcsIGxvd2VyY2FzZTogc3RyaW5nIH0+fT4gPSBuZXcgT2JzZXJ2YWJsZSgpO1xuXG5cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvckZuPiA9IFtdO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpZiAoaXNUcnVlQm9vbGVhbklucHV0KHRoaXMucGVyY2VudGFnZSkpIHtcbiAgICAgICAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8IDA7XG4gICAgICAgICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAxMDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEeW5hbWljIG1pbi9tYXggdmFsaWRhdG9yc1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdGhpcy5taW4gPyBWYWxpZGF0b3JzLm1pbih0aGlzLm1pbikoY29udHJvbCkgOiBudWxsKTtcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHRoaXMubWF4ID8gVmFsaWRhdG9ycy5tYXgodGhpcy5tYXgpKGNvbnRyb2wpIDogbnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZWwnOlxuICAgICAgICB2YWxpZGF0b3JzLnB1c2goSXRWYWxpZGF0b3JzLnRlbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEl0VmFsaWRhdG9ycy51cmwpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmFkZFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgdGhpcy5hdXRvY29tcGxldGVSZXN1bHRzJCA9IHRoaXMuZ2V0QXV0b2NvbXBsZXRlUmVzdWx0cyQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnQgb3IgZGVjcmVhc2UgdGhlIGlucHV0IG51bWJlciB2YWx1ZSBvZiBzdGVwXG4gICAqIEBwYXJhbSBkZWNyZWFzZSB0cnVlIHRvIGRlY3JlYXNlIHZhbHVlXG4gICAqL1xuICBpbmNyZW1lbnROdW1iZXIoZGVjcmVhc2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0ZXAgPSAodGhpcy5zdGVwID09PSAnYW55JyA/IDEgOiAodGhpcy5zdGVwID8/IDEpKTtcbiAgICBsZXQgdmFsdWUgPSBOdW1iZXIodGhpcy5jb250cm9sLnZhbHVlKTtcbiAgICB2YWx1ZSA9IChpc05hTih2YWx1ZSkgPyAwIDogdmFsdWUpICsgKGRlY3JlYXNlID8gLXN0ZXAgOiBzdGVwKTtcbiAgICB2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgKiAxZTEyKSAvIDFlMTI7IC8vIHByZXZlbnQganMgZGVjaW1hbCBlcnJvclxuXG4gICAgaWYgKHRoaXMubWluICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPCB0aGlzLm1pbikge1xuICAgICAgdmFsdWUgPSB0aGlzLm1pbjtcbiAgICB9IGVsc2UgaWYgKHRoaXMubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgPiB0aGlzLm1heCkge1xuICAgICAgdmFsdWUgPSB0aGlzLm1heDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cblxuICBcbiAgZ2V0QXV0b2NvbXBsZXRlUmVzdWx0cyQoKTogT2JzZXJ2YWJsZTx7IHNlYXJjaGVkVmFsdWU6IHN0cmluZywgcmVsYXRlZEVudHJpZXM6IEFycmF5PEF1dG9Db21wbGV0ZUl0ZW0gJiB7IG9yaWdpbmFsOiBzdHJpbmcsIGxvd2VyY2FzZTogc3RyaW5nIH0+fT4ge1xuXG4gICAgaWYodGhpcy50eXBlID09PSAnc2VhcmNoJykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShtYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHNlYXJjaGVkVmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBsb3dlcmNhc2VWYWx1ZSA9IHNlYXJjaGVkVmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb25zdCBsb3dlcmNhc2VEYXRhID0gdGhpcy5fYXV0b0NvbXBsZXRlRGF0YS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udmFsdWUpLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLml0ZW0sIG9yaWdpbmFsIDogaXRlbS52YWx1ZSwgbG93ZXJjYXNlIDogaXRlbS52YWx1ZS50b0xvd2VyQ2FzZSgpIH07XG4gICAgICAgICAgfSk7XG4gICAgXG4gICAgICAgICAgY29uc3QgcmVsYXRlZEVudHJpZXM6IEFycmF5PEF1dG9Db21wbGV0ZUl0ZW0gJiB7IG9yaWdpbmFsOiBzdHJpbmcsIGxvd2VyY2FzZTogc3RyaW5nIH0+ID0gW107XG4gICAgICAgICAgbG93ZXJjYXNlRGF0YS5mb3JFYWNoKGxvd2VyY2FzZUVudHJ5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nID0gKGxvd2VyY2FzZUVudHJ5Lmxvd2VyY2FzZSkuaW5jbHVkZXMobG93ZXJjYXNlVmFsdWUpO1xuICAgICAgICAgICAgaWYgKG1hdGNoaW5nKSB7XG4gICAgICAgICAgICAgIHJlbGF0ZWRFbnRyaWVzLnB1c2gobG93ZXJjYXNlRW50cnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgICByZXR1cm4geyBzZWFyY2hlZFZhbHVlLCByZWxhdGVkRW50cmllcyB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IHNlYXJjaGVkVmFsdWUsIHJlbGF0ZWRFbnRyaWVzOiBbXX07XG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKHtzZWFyY2hlZFZhbHVlOiAnJywgcmVsYXRlZEVudHJpZXM6IFtdfSk7XG4gICAgfVxuICAgIFxuICB9XG5cbiAgaXNBdXRvY29tcGxldGFibGUoKSB7XG4gICAgaWYgKHRoaXMuX2F1dG9Db21wbGV0ZURhdGEgJiYgdGhpcy50eXBlID09PSAnc2VhcmNoJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2F1dG9Db21wbGV0ZURhdGEubGVuZ3RoID4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG9uRW50cnlDbGljayhlbnRyeTogQXV0b0NvbXBsZXRlSXRlbSwgZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gU2Ugbm9uIMOoIHN0YXRvIGRlZmluaXRvIHVuIGxpbmsgYXNzb2NpYXRvIGFsbCdlbGVtZW50byBkZWxsJ2F1dG9jb21wbGV0ZSwgcHJvYmFiaWxtZW50ZSBpbCBkZXNpZGVyYXRhIFxuICAgIC8vIG5vbiDDqCBlZmZldHR1YXJlIGxhIG5hdmlnYXppb25lIGFsIGRlZmF1bHQgJyMnLCBwZXJ0YW50byBpbiB0YWwgY2FzbyBtZWdsaW8gYW5udWxsYXJlIGxhIG5hdmlnYXppb25lLlxuICAgIGlmKCFlbnRyeS5saW5rKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUoZW50cnkudmFsdWUpO1xuICAgIHRoaXMuc2hvd0F1dG9jb21wbGV0aW9uID0gZmFsc2U7XG4gIH1cblxuICBhdXRvY29tcGxldGVJdGVtVHJhY2tCeVZhbHVlRm4oaW5kZXg6IG51bWJlciwgaXRlbTogQXV0b0NvbXBsZXRlSXRlbSkge1xuICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICB9XG5cbiAgb25LZXlEb3duKCkge1xuICAgIHRoaXMuc2hvd0F1dG9jb21wbGV0aW9uID0gdGhpcy50eXBlID09PSAnc2VhcmNoJztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIiBbY2xhc3MuZC1ub25lXT1cIiFwcmVwZW5kVGV4dC5oYXNDaGlsZE5vZGVzKCkgJiYgIXByZXBlbmQuaGFzQ2hpbGROb2RlcygpXCI+XG4gICAgICA8ZGl2ICNwcmVwZW5kPlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlcGVuZF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgI3ByZXBlbmRUZXh0PlxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcHJlcGVuZFRleHRdXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIFtmb3JdPVwiaWRcIiBbY2xhc3MuYWN0aXZlXT1cImlzQWN0aXZlTGFiZWxcIlxuICAgICAgICAgICBbY2xhc3MuZW1wdHktcHJlcGVuZC1sYWJlbF09XCIhcHJlcGVuZFRleHQuaGFzQ2hpbGROb2RlcygpICYmICFwcmVwZW5kLmhhc0NoaWxkTm9kZXMoKVwiPlxuICAgICAge3tsYWJlbH19XG4gICAgPC9sYWJlbD5cblxuICAgIDxzcGFuICpuZ0lmPVwidHlwZSA9PT0gJ251bWJlcidcIlxuICAgICAgICAgIGNsYXNzPVwiaW5wdXQtbnVtYmVyXCJcbiAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLWN1cnJlbmN5XT1cImN1cnJlbmN5XCJcbiAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLXBlcmNlbnRhZ2VdPVwicGVyY2VudGFnZVwiXG4gICAgICAgICAgW2NsYXNzLmlucHV0LW51bWJlci1hZGFwdGl2ZV09XCJhZGFwdGl2ZVwiPlxuXG4gICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgW2lkXT1cImlkXCJcbiAgICAgICAgICAgICBbc3RlcF09XCJzdGVwID8/IG51bGxcIlxuICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cImlzSW52YWxpZFwiXG4gICAgICAgICAgICAgW2NsYXNzLmlzLXZhbGlkXT1cImlzVmFsaWRcIlxuICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgIFtyZWFkb25seV09XCJpc1JlYWRvbmx5XCJcbiAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImlkICsgJy1kZXNjcmlwdGlvbidcIlxuICAgICAgICAgICAgIChibHVyKT1cIm1hcmtBc1RvdWNoZWQoKVwiIC8+XG5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtbnVtYmVyLWFkZFwiIChjbGljayk9XCJpbmNyZW1lbnROdW1iZXIoKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPnt7J2l0LmZvcm0uaW5jcmVhc2UtdmFsdWUnfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiaW5wdXQtbnVtYmVyLXN1YlwiIChjbGljayk9XCJpbmNyZW1lbnROdW1iZXIodHJ1ZSlcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2aXN1YWxseS1oaWRkZW5cIj57eydpdC5mb3JtLmRlY3JlYXNlLXZhbHVlJ319PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9zcGFuPlxuXG4gICAgPGlucHV0ICpuZ0lmPVwidHlwZSAhPT0gJ251bWJlcidcIlxuICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgW2NsYXNzLmZvcm0tY29udHJvbF09XCJyZWFkb25seSAhPT0gJ3BsYWludGV4dCdcIlxuICAgICAgICAgICBbY2xhc3MuZm9ybS1jb250cm9sLXBsYWludGV4dF09XCJyZWFkb25seSA9PT0gJ3BsYWludGV4dCdcIlxuICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJpc0ludmFsaWRcIlxuICAgICAgICAgICBbY2xhc3MuaXMtdmFsaWRdPVwiaXNWYWxpZFwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oKVwiXG4gICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiXG4gICAgICAgICAgIChibHVyKT1cIm1hcmtBc1RvdWNoZWQoKVwiPlxuXG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FwcGVuZF1cIj48L25nLWNvbnRlbnQ+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthcHBlbmRUZXh0XVwiPjwvbmctY29udGVudD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8c21hbGwgKm5nSWY9XCJkZXNjcmlwdGlvblwiIFtpZF09XCJpZCArICctZGVzY3JpcHRpb24nXCIgY2xhc3M9XCJmb3JtLXRleHRcIj57e2Rlc2NyaXB0aW9ufX08L3NtYWxsPlxuXG5cblxuXG4gIDwhLS0gSU5JWklPIGdlc3Rpb25lIEFVVE9DT01QTEVUQU1FTlRPIC0tPlxuXG5cbiAgPCEtLSBJY29uYSBsZW50ZSBwZXIgYXV0b2NvbXBsZXRhbWVudG8gLS0+XG4gIDxzcGFuIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIiAqbmdJZj1cImlzQXV0b2NvbXBsZXRhYmxlKClcIj5cbiAgICA8aXQtaWNvbiBuYW1lID0gXCJzZWFyY2hcIiBzaXplPVwic21cIj48L2l0LWljb24+XG4gIDwvc3Bhbj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXV0b2NvbXBsZXRlUmVzdWx0cyQgfCBhc3luYyBhcyBhdXRvY29tcGxldGVcIj5cbiAgICA8IS0tIExpc3RhIGRpIGF1dG9jb21wbGV0YW1lbnRvIC0tPlxuICAgIDx1bCBjbGFzcz1cImF1dG9jb21wbGV0ZS1saXN0XCIgKm5nSWY9XCJpc0F1dG9jb21wbGV0YWJsZSgpXCIgIFtjbGFzcy5hdXRvY29tcGxldGUtbGlzdC1zaG93XT1cImF1dG9jb21wbGV0ZS5yZWxhdGVkRW50cmllcz8ubGVuZ3RoICYmIHNob3dBdXRvY29tcGxldGlvblwiPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBhdXRvY29tcGxldGUucmVsYXRlZEVudHJpZXM7IHRyYWNrQnk6IGF1dG9jb21wbGV0ZUl0ZW1UcmFja0J5VmFsdWVGblwiIChjbGljayk9XCJvbkVudHJ5Q2xpY2soZW50cnksICRldmVudClcIj5cbiAgICAgICAgPGEgW2hyZWZdPVwiZW50cnkubGlua1wiID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNhdXRvY29tcGxldGVJdGVtVGVtcGxhdGU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhciBzaXplLXNtXCIgKm5nSWY9XCJlbnRyeS5hdmF0YXJTcmNQYXRoXCI+XG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwiZW50cnkuYXZhdGFyU3JjUGF0aFwiIFthbHRdPVwiZW50cnkuYXZhdGFyQWx0VGV4dFwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxpdC1pY29uICpuZ0lmPVwiZW50cnkuaWNvblwiIFtuYW1lXT1cImVudHJ5Lmljb25cIiBzaXplPVwic21cIj48L2l0LWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtbGlzdC10ZXh0XCI+XG4gICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXSA9IFwiZW50cnkub3JpZ2luYWwgfCBtYXJrTWF0Y2hpbmdUZXh0OiBhdXRvY29tcGxldGUuc2VhcmNoZWRWYWx1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDxlbSAqbmdJZj1cImVudHJ5LmxhYmVsXCI+e3tlbnRyeS5sYWJlbH19PC9lbT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvbmctY29udGFpbmVyPlxuICBcblxuICA8IS0tIEZJTkUgZ2VzdGlvbmUgQVVUT0NPTVBMRVRBTUVOVE8gLS0+XG5cblxuXG5cbiAgPGRpdiAqbmdJZj1cImlzSW52YWxpZFwiIGNsYXNzPVwiZm9ybS1mZWVkYmFjayBqdXN0LXZhbGlkYXRlLWVycm9yLWxhYmVsXCIgW2lkXT1cImlkICsgJy1lcnJvcidcIj5cbiAgICA8ZGl2ICNjdXN0b21FcnJvcj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltlcnJvcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjdXN0b21FcnJvci5oYXNDaGlsZE5vZGVzKClcIj57e2ludmFsaWRNZXNzYWdlIHwgYXN5bmN9fTwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|