@cqa-lib/cqa-ui 1.1.542 → 1.1.543
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/esm2020/lib/dialogs/name-prompt-modal.component.mjs +122 -0
- package/esm2020/lib/templates/modular-table-template/modular-table-template.component.mjs +24 -6
- package/esm2020/lib/ui-kit.module.mjs +6 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +144 -6
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +144 -6
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/dialogs/name-prompt-modal.component.d.ts +50 -0
- package/lib/templates/modular-table-template/modular-table-template.component.d.ts +15 -2
- package/lib/ui-kit.module.d.ts +150 -149
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/icon";
|
|
4
|
+
import * as i2 from "../custom-input/custom-input.component";
|
|
5
|
+
import * as i3 from "../button/button.component";
|
|
6
|
+
import * as i4 from "@angular/common";
|
|
7
|
+
/**
|
|
8
|
+
* Generic single-input prompt modal. Used wherever a flow needs to ask the
|
|
9
|
+
* user for a single name (or short text) and confirm with a primary button.
|
|
10
|
+
*
|
|
11
|
+
* Examples: New Folder, Clone Suite, Rename, New Plan, etc.
|
|
12
|
+
*
|
|
13
|
+
* All copy is configurable through Inputs — see `title`, `description`,
|
|
14
|
+
* `label`, `placeholder`, `submitButtonText`, `cancelButtonText`. Defaults
|
|
15
|
+
* preserve the legacy "New Folder" wording for callers that haven't migrated.
|
|
16
|
+
*/
|
|
17
|
+
export class NamePromptModalComponent {
|
|
18
|
+
constructor(cdr) {
|
|
19
|
+
this.cdr = cdr;
|
|
20
|
+
this.isOpen = false;
|
|
21
|
+
this.title = 'New Folder';
|
|
22
|
+
this.description = 'Rename any time by double-clicking';
|
|
23
|
+
this.label = 'Folder name';
|
|
24
|
+
this.placeholder = 'e.g. Checkout Flow, User Auth, Payment Tests';
|
|
25
|
+
/** Submit (primary) button text. Lets consumers reuse this modal for
|
|
26
|
+
* "Create folder", "Clone Suite", "Rename", etc. */
|
|
27
|
+
this.submitButtonText = 'Create folder';
|
|
28
|
+
/** Cancel (secondary) button text. Most consumers can leave the default. */
|
|
29
|
+
this.cancelButtonText = 'Cancel';
|
|
30
|
+
/** When true, locks the modal: spinner on the submit button, all dismiss
|
|
31
|
+
* paths (cancel, close X, backdrop, ESC) become no-ops, and submit() bails
|
|
32
|
+
* out so a fast Enter press can't double-fire while the parent is mid-API. */
|
|
33
|
+
this.isSubmitting = false;
|
|
34
|
+
this._name = '';
|
|
35
|
+
this.nameChange = new EventEmitter();
|
|
36
|
+
this.submitted = new EventEmitter();
|
|
37
|
+
this.cancelled = new EventEmitter();
|
|
38
|
+
this.nameTouched = false;
|
|
39
|
+
}
|
|
40
|
+
set name(value) {
|
|
41
|
+
this._name = value || '';
|
|
42
|
+
this.nameTouched = false;
|
|
43
|
+
this.cdr.markForCheck();
|
|
44
|
+
}
|
|
45
|
+
get name() {
|
|
46
|
+
return this._name;
|
|
47
|
+
}
|
|
48
|
+
onNameChange(value) {
|
|
49
|
+
this._name = value;
|
|
50
|
+
this.nameTouched = true;
|
|
51
|
+
this.nameChange.emit(value);
|
|
52
|
+
this.cdr.markForCheck();
|
|
53
|
+
}
|
|
54
|
+
get nameErrors() {
|
|
55
|
+
if (!this.nameTouched)
|
|
56
|
+
return [];
|
|
57
|
+
const trimmed = (this._name || '').trim();
|
|
58
|
+
if (!trimmed)
|
|
59
|
+
return [`${this.label} is required`];
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
get isValid() {
|
|
63
|
+
return (this._name || '').trim().length > 0;
|
|
64
|
+
}
|
|
65
|
+
submit() {
|
|
66
|
+
if (!this.isValid || this.isSubmitting)
|
|
67
|
+
return;
|
|
68
|
+
this.submitted.emit({ name: this._name.trim() });
|
|
69
|
+
}
|
|
70
|
+
onCancel() {
|
|
71
|
+
if (this.isSubmitting)
|
|
72
|
+
return;
|
|
73
|
+
this.cancelled.emit();
|
|
74
|
+
}
|
|
75
|
+
onClose() {
|
|
76
|
+
if (this.isSubmitting)
|
|
77
|
+
return;
|
|
78
|
+
this.cancelled.emit();
|
|
79
|
+
}
|
|
80
|
+
onBackdropClick() {
|
|
81
|
+
if (this.isSubmitting)
|
|
82
|
+
return;
|
|
83
|
+
this.cancelled.emit();
|
|
84
|
+
}
|
|
85
|
+
onEscape(event) {
|
|
86
|
+
event.stopPropagation();
|
|
87
|
+
if (this.isSubmitting)
|
|
88
|
+
return;
|
|
89
|
+
this.cancelled.emit();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
NamePromptModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NamePromptModalComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
93
|
+
NamePromptModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: NamePromptModalComponent, selector: "cqa-name-prompt-modal", inputs: { isOpen: "isOpen", title: "title", description: "description", label: "label", placeholder: "placeholder", submitButtonText: "submitButtonText", cancelButtonText: "cancelButtonText", isSubmitting: "isSubmitting", name: "name" }, outputs: { nameChange: "nameChange", submitted: "submitted", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div *ngIf=\"isOpen\"\n id=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 1000;\">\n <div class=\"cqa-fixed cqa-inset-0 cqa-bg-black/40\"\n (click)=\"onBackdropClick()\"></div>\n\n <div class=\"cqa-fixed cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-pointer-events-none\">\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[480px] cqa-bg-white cqa-rounded-2xl cqa-shadow-md cqa-border cqa-border-border-default cqa-pointer-events-auto\"\n (keydown.escape)=\"onEscape($event)\"\n tabindex=\"-1\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-p-6 cqa-pb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-title cqa-m-0\">{{ title }}</h2>\n <p *ngIf=\"description\"\n class=\"cqa-text-sm cqa-text-description cqa-m-0\">\n {{ description }}\n </p>\n </div>\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-bg-transparent cqa-border-0 cqa-text-description hover:cqa-text-title\"\n [class.cqa-cursor-pointer]=\"!isSubmitting\"\n [class.cqa-cursor-not-allowed]=\"isSubmitting\"\n [class.cqa-opacity-50]=\"isSubmitting\"\n [disabled]=\"isSubmitting\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-text-[20px] cqa-leading-5 cqa-h-5 cqa-w-5\">close</mat-icon>\n </button>\n </div>\n\n <div class=\"cqa-px-6 cqa-pb-5\">\n <cqa-custom-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrors\"\n (valueChange)=\"onNameChange($event)\"\n (enterPressed)=\"submit()\">\n </cqa-custom-input>\n </div>\n\n <div class=\"cqa-border-t cqa-border-border-default cqa-px-6 cqa-py-4 cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <cqa-button variant=\"outlined\"\n [text]=\"cancelButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button variant=\"filled\"\n [text]=\"submitButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [loading]=\"isSubmitting\"\n [disabled]=\"!isValid || isSubmitting\"\n (clicked)=\"submit()\">\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i3.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
94
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: NamePromptModalComponent, decorators: [{
|
|
95
|
+
type: Component,
|
|
96
|
+
args: [{ selector: 'cqa-name-prompt-modal', changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'cqa-ui-root' }, template: "<div *ngIf=\"isOpen\"\n id=\"cqa-ui-root\"\n style=\"position: fixed; inset: 0; z-index: 1000;\">\n <div class=\"cqa-fixed cqa-inset-0 cqa-bg-black/40\"\n (click)=\"onBackdropClick()\"></div>\n\n <div class=\"cqa-fixed cqa-inset-0 cqa-flex cqa-items-center cqa-justify-center cqa-p-4 cqa-pointer-events-none\">\n <div class=\"cqa-relative cqa-w-full cqa-max-w-[480px] cqa-bg-white cqa-rounded-2xl cqa-shadow-md cqa-border cqa-border-border-default cqa-pointer-events-auto\"\n (keydown.escape)=\"onEscape($event)\"\n tabindex=\"-1\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-p-6 cqa-pb-4\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-title cqa-m-0\">{{ title }}</h2>\n <p *ngIf=\"description\"\n class=\"cqa-text-sm cqa-text-description cqa-m-0\">\n {{ description }}\n </p>\n </div>\n <button type=\"button\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-h-6 cqa-w-6 cqa-rounded cqa-bg-transparent cqa-border-0 cqa-text-description hover:cqa-text-title\"\n [class.cqa-cursor-pointer]=\"!isSubmitting\"\n [class.cqa-cursor-not-allowed]=\"isSubmitting\"\n [class.cqa-opacity-50]=\"isSubmitting\"\n [disabled]=\"isSubmitting\"\n (click)=\"onClose()\"\n aria-label=\"Close\">\n <mat-icon class=\"cqa-text-[20px] cqa-leading-5 cqa-h-5 cqa-w-5\">close</mat-icon>\n </button>\n </div>\n\n <div class=\"cqa-px-6 cqa-pb-5\">\n <cqa-custom-input\n [label]=\"label\"\n [placeholder]=\"placeholder\"\n [value]=\"name\"\n [required]=\"true\"\n [fullWidth]=\"true\"\n [errors]=\"nameErrors\"\n (valueChange)=\"onNameChange($event)\"\n (enterPressed)=\"submit()\">\n </cqa-custom-input>\n </div>\n\n <div class=\"cqa-border-t cqa-border-border-default cqa-px-6 cqa-py-4 cqa-grid cqa-grid-cols-2 cqa-gap-3\">\n <cqa-button variant=\"outlined\"\n [text]=\"cancelButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [disabled]=\"isSubmitting\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button variant=\"filled\"\n [text]=\"submitButtonText\"\n btnSize=\"lg\"\n [fullWidth]=\"true\"\n [loading]=\"isSubmitting\"\n [disabled]=\"!isValid || isSubmitting\"\n (clicked)=\"submit()\">\n </cqa-button>\n </div>\n </div>\n </div>\n</div>\n" }]
|
|
97
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { isOpen: [{
|
|
98
|
+
type: Input
|
|
99
|
+
}], title: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], description: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], label: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], placeholder: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], submitButtonText: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], cancelButtonText: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], isSubmitting: [{
|
|
112
|
+
type: Input
|
|
113
|
+
}], name: [{
|
|
114
|
+
type: Input
|
|
115
|
+
}], nameChange: [{
|
|
116
|
+
type: Output
|
|
117
|
+
}], submitted: [{
|
|
118
|
+
type: Output
|
|
119
|
+
}], cancelled: [{
|
|
120
|
+
type: Output
|
|
121
|
+
}] } });
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS1wcm9tcHQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9kaWFsb2dzL25hbWUtcHJvbXB0LW1vZGFsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9ncy9uYW1lLXByb21wdC1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBTW5IOzs7Ozs7Ozs7R0FTRztBQU9ILE1BQU0sT0FBTyx3QkFBd0I7SUFnQ25DLFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBL0JqQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsVUFBSyxHQUFHLFlBQVksQ0FBQztRQUNyQixnQkFBVyxHQUFrQixvQ0FBb0MsQ0FBQztRQUNsRSxVQUFLLEdBQUcsYUFBYSxDQUFDO1FBQ3RCLGdCQUFXLEdBQUcsOENBQThDLENBQUM7UUFDdEU7NERBQ29EO1FBQzNDLHFCQUFnQixHQUFHLGVBQWUsQ0FBQztRQUM1Qyw0RUFBNEU7UUFDbkUscUJBQWdCLEdBQUcsUUFBUSxDQUFDO1FBQ3JDOztzRkFFOEU7UUFDckUsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFdEIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQVVULGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3hDLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUN4RCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV2QyxnQkFBVyxHQUFHLEtBQUssQ0FBQztJQUVpQixDQUFDO0lBZjlDLElBQWEsSUFBSSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBVUQsWUFBWSxDQUFDLEtBQWE7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDakMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssY0FBYyxDQUFDLENBQUM7UUFDbkQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQVk7UUFDbkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPO1FBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7cUhBNUVVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDJhQ3RCckMsc3ZGQStEQTsyRkR6Q2Esd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLHVCQUF1QixtQkFFaEIsdUJBQXVCLENBQUMsTUFBTSxRQUN6QyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7d0dBR3JCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR08sSUFBSTtzQkFBaEIsS0FBSztnQkFTSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBOYW1lUHJvbXB0U3VibWl0UGF5bG9hZCB7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZW5lcmljIHNpbmdsZS1pbnB1dCBwcm9tcHQgbW9kYWwuIFVzZWQgd2hlcmV2ZXIgYSBmbG93IG5lZWRzIHRvIGFzayB0aGVcbiAqIHVzZXIgZm9yIGEgc2luZ2xlIG5hbWUgKG9yIHNob3J0IHRleHQpIGFuZCBjb25maXJtIHdpdGggYSBwcmltYXJ5IGJ1dHRvbi5cbiAqXG4gKiBFeGFtcGxlczogTmV3IEZvbGRlciwgQ2xvbmUgU3VpdGUsIFJlbmFtZSwgTmV3IFBsYW4sIGV0Yy5cbiAqXG4gKiBBbGwgY29weSBpcyBjb25maWd1cmFibGUgdGhyb3VnaCBJbnB1dHMg4oCUIHNlZSBgdGl0bGVgLCBgZGVzY3JpcHRpb25gLFxuICogYGxhYmVsYCwgYHBsYWNlaG9sZGVyYCwgYHN1Ym1pdEJ1dHRvblRleHRgLCBgY2FuY2VsQnV0dG9uVGV4dGAuIERlZmF1bHRzXG4gKiBwcmVzZXJ2ZSB0aGUgbGVnYWN5IFwiTmV3IEZvbGRlclwiIHdvcmRpbmcgZm9yIGNhbGxlcnMgdGhhdCBoYXZlbid0IG1pZ3JhdGVkLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtbmFtZS1wcm9tcHQtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmFtZS1wcm9tcHQtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxufSlcbmV4cG9ydCBjbGFzcyBOYW1lUHJvbXB0TW9kYWxDb21wb25lbnQge1xuICBASW5wdXQoKSBpc09wZW4gPSBmYWxzZTtcbiAgQElucHV0KCkgdGl0bGUgPSAnTmV3IEZvbGRlcic7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsID0gJ1JlbmFtZSBhbnkgdGltZSBieSBkb3VibGUtY2xpY2tpbmcnO1xuICBASW5wdXQoKSBsYWJlbCA9ICdGb2xkZXIgbmFtZSc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ2UuZy4gQ2hlY2tvdXQgRmxvdywgVXNlciBBdXRoLCBQYXltZW50IFRlc3RzJztcbiAgLyoqIFN1Ym1pdCAocHJpbWFyeSkgYnV0dG9uIHRleHQuIExldHMgY29uc3VtZXJzIHJldXNlIHRoaXMgbW9kYWwgZm9yXG4gICAqIFwiQ3JlYXRlIGZvbGRlclwiLCBcIkNsb25lIFN1aXRlXCIsIFwiUmVuYW1lXCIsIGV0Yy4gKi9cbiAgQElucHV0KCkgc3VibWl0QnV0dG9uVGV4dCA9ICdDcmVhdGUgZm9sZGVyJztcbiAgLyoqIENhbmNlbCAoc2Vjb25kYXJ5KSBidXR0b24gdGV4dC4gTW9zdCBjb25zdW1lcnMgY2FuIGxlYXZlIHRoZSBkZWZhdWx0LiAqL1xuICBASW5wdXQoKSBjYW5jZWxCdXR0b25UZXh0ID0gJ0NhbmNlbCc7XG4gIC8qKiBXaGVuIHRydWUsIGxvY2tzIHRoZSBtb2RhbDogc3Bpbm5lciBvbiB0aGUgc3VibWl0IGJ1dHRvbiwgYWxsIGRpc21pc3NcbiAgICogcGF0aHMgKGNhbmNlbCwgY2xvc2UgWCwgYmFja2Ryb3AsIEVTQykgYmVjb21lIG5vLW9wcywgYW5kIHN1Ym1pdCgpIGJhaWxzXG4gICAqIG91dCBzbyBhIGZhc3QgRW50ZXIgcHJlc3MgY2FuJ3QgZG91YmxlLWZpcmUgd2hpbGUgdGhlIHBhcmVudCBpcyBtaWQtQVBJLiAqL1xuICBASW5wdXQoKSBpc1N1Ym1pdHRpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIF9uYW1lID0gJyc7XG4gIEBJbnB1dCgpIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gdmFsdWUgfHwgJyc7XG4gICAgdGhpcy5uYW1lVG91Y2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBAT3V0cHV0KCkgbmFtZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgc3VibWl0dGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOYW1lUHJvbXB0U3VibWl0UGF5bG9hZD4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbGxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIG5hbWVUb3VjaGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG9uTmFtZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICAgIHRoaXMubmFtZVRvdWNoZWQgPSB0cnVlO1xuICAgIHRoaXMubmFtZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCBuYW1lRXJyb3JzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMubmFtZVRvdWNoZWQpIHJldHVybiBbXTtcbiAgICBjb25zdCB0cmltbWVkID0gKHRoaXMuX25hbWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAoIXRyaW1tZWQpIHJldHVybiBbYCR7dGhpcy5sYWJlbH0gaXMgcmVxdWlyZWRgXTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX25hbWUgfHwgJycpLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkIHx8IHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5zdWJtaXR0ZWQuZW1pdCh7IG5hbWU6IHRoaXMuX25hbWUudHJpbSgpIH0pO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcpIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBvbkJhY2tkcm9wQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG5cbiAgb25Fc2NhcGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuaXNTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsZWQuZW1pdCgpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaXNPcGVuXCJcbiAgICAgaWQ9XCJjcWEtdWktcm9vdFwiXG4gICAgIHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyBpbnNldDogMDsgei1pbmRleDogMTAwMDtcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS1maXhlZCBjcWEtaW5zZXQtMCBjcWEtYmctYmxhY2svNDBcIlxuICAgICAgIChjbGljayk9XCJvbkJhY2tkcm9wQ2xpY2soKVwiPjwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjcWEtZml4ZWQgY3FhLWluc2V0LTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXAtNCBjcWEtcG9pbnRlci1ldmVudHMtbm9uZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtcmVsYXRpdmUgY3FhLXctZnVsbCBjcWEtbWF4LXctWzQ4MHB4XSBjcWEtYmctd2hpdGUgY3FhLXJvdW5kZWQtMnhsIGNxYS1zaGFkb3ctbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWJvcmRlci1kZWZhdWx0IGNxYS1wb2ludGVyLWV2ZW50cy1hdXRvXCJcbiAgICAgICAgIChrZXlkb3duLmVzY2FwZSk9XCJvbkVzY2FwZSgkZXZlbnQpXCJcbiAgICAgICAgIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtc3RhcnQgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcC02IGNxYS1wYi00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtdGl0bGUgY3FhLW0tMFwiPnt7IHRpdGxlIH19PC9oMj5cbiAgICAgICAgICA8cCAqbmdJZj1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWRlc2NyaXB0aW9uIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIHt7IGRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1oLTYgY3FhLXctNiBjcWEtcm91bmRlZCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci0wIGNxYS10ZXh0LWRlc2NyaXB0aW9uIGhvdmVyOmNxYS10ZXh0LXRpdGxlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY3FhLWN1cnNvci1wb2ludGVyXT1cIiFpc1N1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jcWEtY3Vyc29yLW5vdC1hbGxvd2VkXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNxYS1vcGFjaXR5LTUwXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY3FhLXRleHQtWzIwcHhdIGNxYS1sZWFkaW5nLTUgY3FhLWgtNSBjcWEtdy01XCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXB4LTYgY3FhLXBiLTVcIj5cbiAgICAgICAgPGNxYS1jdXN0b20taW5wdXRcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW3ZhbHVlXT1cIm5hbWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgIFtlcnJvcnNdPVwibmFtZUVycm9yc1wiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uTmFtZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAoZW50ZXJQcmVzc2VkKT1cInN1Ym1pdCgpXCI+XG4gICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWJvcmRlci10IGNxYS1ib3JkZXItYm9yZGVyLWRlZmF1bHQgY3FhLXB4LTYgY3FhLXB5LTQgY3FhLWdyaWQgY3FhLWdyaWQtY29scy0yIGNxYS1nYXAtM1wiPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgICAgICAgICAgICAgICBbdGV4dF09XCJjYW5jZWxCdXR0b25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgYnRuU2l6ZT1cImxnXCJcbiAgICAgICAgICAgICAgICAgICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cIm9uQ2FuY2VsKClcIj5cbiAgICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgICA8Y3FhLWJ1dHRvbiB2YXJpYW50PVwiZmlsbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW3RleHRdPVwic3VibWl0QnV0dG9uVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIGJ0blNpemU9XCJsZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cImlzU3VibWl0dGluZ1wiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNWYWxpZCB8fCBpc1N1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzdWJtaXQoKVwiPlxuICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|