@cqa-lib/cqa-ui 1.1.201 → 1.1.203
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/item-list/item-list.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-action/step-builder-action.component.mjs +75 -13
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +3 -3
- package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +5 -6
- package/esm2020/lib/step-builder/step-builder-group/step-builder-group.component.mjs +148 -0
- package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +7 -5
- package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +7 -5
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +6 -5
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +9 -8
- package/esm2020/lib/ui-kit.module.mjs +6 -6
- package/esm2020/public-api.mjs +2 -2
- package/fesm2015/cqa-lib-cqa-ui.mjs +198 -623
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +201 -618
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/step-builder/step-builder-action/step-builder-action.component.d.ts +10 -2
- package/lib/step-builder/step-builder-group/step-builder-group.component.d.ts +48 -0
- package/lib/ui-kit.module.d.ts +2 -2
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
- package/styles.css +1 -1
- package/esm2020/lib/step-builder/step-builder-api/step-builder-api.component.mjs +0 -636
- package/lib/step-builder/step-builder-api/step-builder-api.component.d.ts +0 -121
|
@@ -36,13 +36,13 @@ export class ItemListComponent {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
ItemListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ItemListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
39
|
-
ItemListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ItemListComponent, selector: "cqa-item-list", inputs: { items: "items", selectedId: "selectedId", emptyMessage: "emptyMessage", scrollable: "scrollable" }, outputs: { itemSelect: "itemSelect", itemEdit: "itemEdit" }, host: { properties: { "class.cqa-item-list-scrollable-host": "scrollable" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0\"\n [class.cqa-flex-1]=\"scrollable\"\n [class.cqa-min-h-0]=\"scrollable\"\n [class.cqa-overflow-y-auto]=\"scrollable\"\n [class.cqa-item-list-scroll-hide-scrollbar]=\"scrollable\">\n <button\n *ngFor=\"let item of displayItems; trackBy: trackById\"\n type=\"button\"\n (click)=\"onItemClick(item)\"\n [class.cqa-bg-[#D8D9FC]]=\"isSelected(item)\"\n [class.cqa-border]=\"isSelected(item)\"\n [class.cqa-border-solid]=\"isSelected(item)\"\n [class.cqa-border-[#3F43EE]]=\"isSelected(item)\"\n class=\"cqa-item-list-row cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\" class=\"cqa-item-list-badge\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n (click)=\"onEditClick($event, item)\"\n class=\"cqa-p-1 cqa-rounded cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-flex cqa-items-center cqa-justify-center\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">edit</mat-icon>\n </button>\n </div>\n </div>\n </button>\n <p *ngIf=\"displayItems.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n {{ emptyMessage }}\n </p>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
39
|
+
ItemListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ItemListComponent, selector: "cqa-item-list", inputs: { items: "items", selectedId: "selectedId", emptyMessage: "emptyMessage", scrollable: "scrollable" }, outputs: { itemSelect: "itemSelect", itemEdit: "itemEdit" }, host: { properties: { "class.cqa-item-list-scrollable-host": "scrollable" }, classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-max-h-[200px]\"\n [class.cqa-flex-1]=\"scrollable\"\n [class.cqa-min-h-0]=\"scrollable\"\n [class.cqa-overflow-y-auto]=\"scrollable\"\n [class.cqa-item-list-scroll-hide-scrollbar]=\"scrollable\">\n <button\n *ngFor=\"let item of displayItems; trackBy: trackById\"\n type=\"button\"\n (click)=\"onItemClick(item)\"\n [class.cqa-bg-[#D8D9FC]]=\"isSelected(item)\"\n [class.cqa-border]=\"isSelected(item)\"\n [class.cqa-border-solid]=\"isSelected(item)\"\n [class.cqa-border-[#3F43EE]]=\"isSelected(item)\"\n class=\"cqa-item-list-row cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\" class=\"cqa-item-list-badge\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n (click)=\"onEditClick($event, item)\"\n class=\"cqa-p-1 cqa-rounded cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-flex cqa-items-center cqa-justify-center\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">edit</mat-icon>\n </button>\n </div>\n </div>\n </button>\n <p *ngIf=\"displayItems.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n {{ emptyMessage }}\n </p>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
40
40
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ItemListComponent, decorators: [{
|
|
41
41
|
type: Component,
|
|
42
42
|
args: [{ selector: 'cqa-item-list', host: {
|
|
43
43
|
class: 'cqa-ui-root',
|
|
44
44
|
'[class.cqa-item-list-scrollable-host]': 'scrollable',
|
|
45
|
-
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0\"\n [class.cqa-flex-1]=\"scrollable\"\n [class.cqa-min-h-0]=\"scrollable\"\n [class.cqa-overflow-y-auto]=\"scrollable\"\n [class.cqa-item-list-scroll-hide-scrollbar]=\"scrollable\">\n <button\n *ngFor=\"let item of displayItems; trackBy: trackById\"\n type=\"button\"\n (click)=\"onItemClick(item)\"\n [class.cqa-bg-[#D8D9FC]]=\"isSelected(item)\"\n [class.cqa-border]=\"isSelected(item)\"\n [class.cqa-border-solid]=\"isSelected(item)\"\n [class.cqa-border-[#3F43EE]]=\"isSelected(item)\"\n class=\"cqa-item-list-row cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\" class=\"cqa-item-list-badge\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n (click)=\"onEditClick($event, item)\"\n class=\"cqa-p-1 cqa-rounded cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-flex cqa-items-center cqa-justify-center\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">edit</mat-icon>\n </button>\n </div>\n </div>\n </button>\n <p *ngIf=\"displayItems.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n {{ emptyMessage }}\n </p>\n</div>\n" }]
|
|
45
|
+
}, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-min-h-0 cqa-max-h-[200px]\"\n [class.cqa-flex-1]=\"scrollable\"\n [class.cqa-min-h-0]=\"scrollable\"\n [class.cqa-overflow-y-auto]=\"scrollable\"\n [class.cqa-item-list-scroll-hide-scrollbar]=\"scrollable\">\n <button\n *ngFor=\"let item of displayItems; trackBy: trackById\"\n type=\"button\"\n (click)=\"onItemClick(item)\"\n [class.cqa-bg-[#D8D9FC]]=\"isSelected(item)\"\n [class.cqa-border]=\"isSelected(item)\"\n [class.cqa-border-solid]=\"isSelected(item)\"\n [class.cqa-border-[#3F43EE]]=\"isSelected(item)\"\n class=\"cqa-item-list-row cqa-w-full cqa-text-left cqa-rounded-lg cqa-p-1 cqa-transition-colors cqa-bg-white hover:cqa-bg-[#F9FAFB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#D8D9FC]\">\n <div class=\"cqa-flex cqa-items-start cqa-justify-between cqa-gap-2\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <p class=\"cqa-font-semibold cqa-text-[12px] cqa-leading-[20px] cqa-text-[#111827] cqa-m-0 cqa-truncate\">\n {{ item.title }}\n </p>\n <p *ngIf=\"item.subtitle\" class=\"cqa-text-[10px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-mt-0.5 cqa-truncate\">\n {{ item.subtitle }}\n </p>\n </div>\n <div class=\"cqa-flex cqa-flex-col cqa-items-end cqa-gap-1 cqa-flex-shrink-0\">\n <span *ngIf=\"item.badge\" class=\"cqa-item-list-badge\">\n {{ item.badge }}\n </span>\n <button\n *ngIf=\"item.showEdit\"\n type=\"button\"\n (click)=\"onEditClick($event, item)\"\n class=\"cqa-p-1 cqa-rounded cqa-text-[#1447E6] hover:cqa-bg-[#E5E7EB] cqa-flex cqa-items-center cqa-justify-center\"\n title=\"Edit\"\n aria-label=\"Edit\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">edit</mat-icon>\n </button>\n </div>\n </div>\n </button>\n <p *ngIf=\"displayItems.length === 0\" class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-m-0 cqa-py-4 cqa-text-center\">\n {{ emptyMessage }}\n </p>\n</div>\n" }]
|
|
46
46
|
}], propDecorators: { items: [{
|
|
47
47
|
type: Input
|
|
48
48
|
}], selectedId: [{
|
|
@@ -56,4 +56,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
56
56
|
}], itemEdit: [{
|
|
57
57
|
type: Output
|
|
58
58
|
}] } });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaXRlbS1saXN0L2l0ZW0tbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2l0ZW0tbGlzdC9pdGVtLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7Ozs7QUFZdkIsTUFBTSxPQUFPLGlCQUFpQjtJQVQ5QjtRQVVFLDJGQUEyRjtRQUNsRixVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUV6Qyx3R0FBd0c7UUFDL0YsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFFMUMsd0ZBQXdGO1FBQy9FLGlCQUFZLEdBQUcsc0JBQXNCLENBQUM7UUFFL0MsOEZBQThGO1FBQ3JGLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFM0IsZ0VBQWdFO1FBQ3RELGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWxELDRHQUE0RztRQUNsRyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztLQXVCakQ7SUFyQkMsOERBQThEO0lBQzlELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFjLEVBQUUsSUFBdUI7UUFDL0MsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBdUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUF1QjtRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFZLEVBQUUsSUFBdUI7UUFDL0MsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDOzs4R0F2Q1UsaUJBQWlCO2tHQUFqQixpQkFBaUIsOFVDbEI5Qiwya0VBNENBOzJGRDFCYSxpQkFBaUI7a0JBVDdCLFNBQVM7K0JBQ0UsZUFBZSxRQUVuQjt3QkFDSixLQUFLLEVBQUUsYUFBYTt3QkFDcEIsdUNBQXVDLEVBQUUsWUFBWTtxQkFDdEQsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3FhTGlzdEl0ZW1Db25maWcgfSBmcm9tICcuL2l0ZW0tbGlzdC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1pdGVtLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vaXRlbS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAnY3FhLXVpLXJvb3QnLFxuICAgICdbY2xhc3MuY3FhLWl0ZW0tbGlzdC1zY3JvbGxhYmxlLWhvc3RdJzogJ3Njcm9sbGFibGUnLFxuICB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSXRlbUxpc3RDb21wb25lbnQge1xuICAvKiogTGlzdCBpdGVtcyB0byBkaXNwbGF5IChlLmcuIG1hcHBlZCBmcm9tIFBhcmFtZXRlciwgRW52aXJvbm1lbnQsIG9yIGFueSBkb21haW4gbW9kZWwpICovXG4gIEBJbnB1dCgpIGl0ZW1zOiBDcWFMaXN0SXRlbUNvbmZpZ1tdID0gW107XG5cbiAgLyoqIElkIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbTsgdXNlZCBmb3IgaGlnaGxpZ2h0IGFuZCB0byBzaG93IGVkaXQgaWNvbiB3aGVuIHNob3dFZGl0IGlzIHRydWUgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIE1lc3NhZ2Ugc2hvd24gd2hlbiBpdGVtcyBhcnJheSBpcyBlbXB0eSAoZS5nLiBcIk5vIHBhcmFtZXRlcnMgbWF0Y2ggeW91ciBzZWFyY2guXCIpICovXG4gIEBJbnB1dCgpIGVtcHR5TWVzc2FnZSA9ICdObyBpdGVtcyB0byBkaXNwbGF5Lic7XG5cbiAgLyoqIFdoZW4gdHJ1ZSAoZGVmYXVsdCksIHRoZSBsaXN0IGNvbnRhaW5lciBpcyBzY3JvbGxhYmxlIChmbGV4LTEgbWluLWgtMCBvdmVyZmxvdy15LWF1dG8pLiAqL1xuICBASW5wdXQoKSBzY3JvbGxhYmxlID0gdHJ1ZTtcblxuICAvKiogRW1pdHRlZCB3aGVuIGFuIGl0ZW0gcm93IGlzIGNsaWNrZWQgKHBhc3NlcyB0aGUgaXRlbSBpZCkuICovXG4gIEBPdXRwdXQoKSBpdGVtU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZWRpdCBpY29uIGlzIGNsaWNrZWQgKHBhc3NlcyB0aGUgaXRlbSBpZCkuIENhbGwgc3RvcFByb3BhZ2F0aW9uIGluIHBhcmVudCBpZiBuZWVkZWQuICovXG4gIEBPdXRwdXQoKSBpdGVtRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKiBOb3JtYWxpemVkIGl0ZW1zIChuZXZlciB1bmRlZmluZWQpIHNvIHRlbXBsYXRlIGlzIHNhZmUuICovXG4gIGdldCBkaXNwbGF5SXRlbXMoKTogQ3FhTGlzdEl0ZW1Db25maWdbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMgPz8gW107XG4gIH1cblxuICB0cmFja0J5SWQoX2luZGV4OiBudW1iZXIsIGl0ZW06IENxYUxpc3RJdGVtQ29uZmlnKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQoaXRlbTogQ3FhTGlzdEl0ZW1Db25maWcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZElkID09PSBpdGVtLmlkO1xuICB9XG5cbiAgb25JdGVtQ2xpY2soaXRlbTogQ3FhTGlzdEl0ZW1Db25maWcpOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1TZWxlY3QuZW1pdChpdGVtLmlkKTtcbiAgfVxuXG4gIG9uRWRpdENsaWNrKGV2ZW50OiBFdmVudCwgaXRlbTogQ3FhTGlzdEl0ZW1Db25maWcpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLml0ZW1FZGl0LmVtaXQoaXRlbS5pZCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xIGNxYS1taW4taC0wIGNxYS1tYXgtaC1bMjAwcHhdXCJcbiAgW2NsYXNzLmNxYS1mbGV4LTFdPVwic2Nyb2xsYWJsZVwiXG4gIFtjbGFzcy5jcWEtbWluLWgtMF09XCJzY3JvbGxhYmxlXCJcbiAgW2NsYXNzLmNxYS1vdmVyZmxvdy15LWF1dG9dPVwic2Nyb2xsYWJsZVwiXG4gIFtjbGFzcy5jcWEtaXRlbS1saXN0LXNjcm9sbC1oaWRlLXNjcm9sbGJhcl09XCJzY3JvbGxhYmxlXCI+XG4gIDxidXR0b25cbiAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkaXNwbGF5SXRlbXM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCJcbiAgICBbY2xhc3MuY3FhLWJnLVsjRDhEOUZDXV09XCJpc1NlbGVjdGVkKGl0ZW0pXCJcbiAgICBbY2xhc3MuY3FhLWJvcmRlcl09XCJpc1NlbGVjdGVkKGl0ZW0pXCJcbiAgICBbY2xhc3MuY3FhLWJvcmRlci1zb2xpZF09XCJpc1NlbGVjdGVkKGl0ZW0pXCJcbiAgICBbY2xhc3MuY3FhLWJvcmRlci1bIzNGNDNFRV1dPVwiaXNTZWxlY3RlZChpdGVtKVwiXG4gICAgY2xhc3M9XCJjcWEtaXRlbS1saXN0LXJvdyBjcWEtdy1mdWxsIGNxYS10ZXh0LWxlZnQgY3FhLXJvdW5kZWQtbGcgY3FhLXAtMSBjcWEtdHJhbnNpdGlvbi1jb2xvcnMgY3FhLWJnLXdoaXRlIGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLTIgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy1bI0Q4RDlGQ11cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtbWluLXctMFwiPlxuICAgICAgICA8cCBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTAgY3FhLXRydW5jYXRlXCI+XG4gICAgICAgICAge3sgaXRlbS50aXRsZSB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwICpuZ0lmPVwiaXRlbS5zdWJ0aXRsZVwiIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW0tMCBjcWEtbXQtMC41IGNxYS10cnVuY2F0ZVwiPlxuICAgICAgICAgIHt7IGl0ZW0uc3VidGl0bGUgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1lbmQgY3FhLWdhcC0xIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS5iYWRnZVwiIGNsYXNzPVwiY3FhLWl0ZW0tbGlzdC1iYWRnZVwiPlxuICAgICAgICAgIHt7IGl0ZW0uYmFkZ2UgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgKm5nSWY9XCJpdGVtLnNob3dFZGl0XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib25FZGl0Q2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtcC0xIGNxYS1yb3VuZGVkIGNxYS10ZXh0LVsjMTQ0N0U2XSBob3ZlcjpjcWEtYmctWyNFNUU3RUJdIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICB0aXRsZT1cIkVkaXRcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJFZGl0XCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XVwiPmVkaXQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2J1dHRvbj5cbiAgPHAgKm5nSWY9XCJkaXNwbGF5SXRlbXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbS0wIGNxYS1weS00IGNxYS10ZXh0LWNlbnRlclwiPlxuICAgIHt7IGVtcHR5TWVzc2FnZSB9fVxuICA8L3A+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -32,6 +32,11 @@ export class StepBuilderActionComponent {
|
|
|
32
32
|
this.description = '';
|
|
33
33
|
this.advancedExpanded = false;
|
|
34
34
|
this.templateVariables = [];
|
|
35
|
+
// Cache for select configs to avoid recalculating on every change detection
|
|
36
|
+
this.selectConfigCache = new Map();
|
|
37
|
+
this.formValidCache = false;
|
|
38
|
+
this.lastFormValidationTime = 0;
|
|
39
|
+
this.FORM_VALIDATION_CACHE_MS = 100; // Cache for 100ms
|
|
35
40
|
this.variablesForm = this.fb.group({});
|
|
36
41
|
}
|
|
37
42
|
ngOnInit() {
|
|
@@ -77,16 +82,36 @@ export class StepBuilderActionComponent {
|
|
|
77
82
|
}
|
|
78
83
|
this.templateChanged.emit(template);
|
|
79
84
|
this.selectedTemplate = template;
|
|
85
|
+
// Clear cache when template changes
|
|
86
|
+
this.selectConfigCache.clear();
|
|
87
|
+
this.formValidCache = false;
|
|
80
88
|
if (this.setTemplateVariables && template.variables) {
|
|
81
|
-
|
|
82
|
-
|
|
89
|
+
// Use setTimeout to defer heavy operations and prevent UI freezing
|
|
90
|
+
// This allows the UI to update first, then process the template variables
|
|
91
|
+
setTimeout(() => {
|
|
92
|
+
try {
|
|
93
|
+
this.templateVariables = this.setTemplateVariables(template);
|
|
94
|
+
this.buildVariablesForm();
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
console.error('Error processing template variables:', error);
|
|
98
|
+
}
|
|
99
|
+
}, 0);
|
|
83
100
|
}
|
|
84
101
|
}
|
|
85
102
|
buildVariablesForm() {
|
|
86
103
|
// Clear existing form controls
|
|
87
|
-
Object.keys(this.variablesForm.controls)
|
|
104
|
+
const controlKeys = Object.keys(this.variablesForm.controls);
|
|
105
|
+
controlKeys.forEach(key => {
|
|
88
106
|
this.variablesForm.removeControl(key);
|
|
89
107
|
});
|
|
108
|
+
// Clear cache when form is rebuilt
|
|
109
|
+
this.selectConfigCache.clear();
|
|
110
|
+
this.formValidCache = false;
|
|
111
|
+
// Unsubscribe from previous subscription if it exists
|
|
112
|
+
if (this.formValueChangesSubscription) {
|
|
113
|
+
this.formValueChangesSubscription.unsubscribe();
|
|
114
|
+
}
|
|
90
115
|
// Add form controls for each variable
|
|
91
116
|
this.templateVariables.forEach(variable => {
|
|
92
117
|
// Handle boolean variables - use boolean value, others use string
|
|
@@ -95,15 +120,31 @@ export class StepBuilderActionComponent {
|
|
|
95
120
|
: (variable.value || '');
|
|
96
121
|
this.variablesForm.addControl(variable.name, new FormControl(defaultValue));
|
|
97
122
|
});
|
|
123
|
+
// Subscribe to form value changes to invalidate cache (only when user actually changes values)
|
|
124
|
+
// Note: We use emitEvent: false when programmatically setting values, so this won't fire unnecessarily
|
|
125
|
+
this.formValueChangesSubscription = this.variablesForm.valueChanges.subscribe(() => {
|
|
126
|
+
this.formValidCache = false;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
ngOnDestroy() {
|
|
130
|
+
// Clean up subscription to prevent memory leaks
|
|
131
|
+
if (this.formValueChangesSubscription) {
|
|
132
|
+
this.formValueChangesSubscription.unsubscribe();
|
|
133
|
+
}
|
|
98
134
|
}
|
|
99
135
|
getSelectConfig(variable) {
|
|
136
|
+
// Use cache to avoid recalculating on every change detection
|
|
137
|
+
const cacheKey = `${variable.name}_${variable.options?.join(',') || ''}`;
|
|
138
|
+
if (this.selectConfigCache.has(cacheKey)) {
|
|
139
|
+
return this.selectConfigCache.get(cacheKey);
|
|
140
|
+
}
|
|
100
141
|
const options = (variable.options || []).map((opt) => ({
|
|
101
142
|
id: opt,
|
|
102
143
|
value: opt,
|
|
103
144
|
name: opt,
|
|
104
145
|
label: opt
|
|
105
146
|
}));
|
|
106
|
-
|
|
147
|
+
const config = {
|
|
107
148
|
key: variable.name,
|
|
108
149
|
placeholder: `Select ${variable.label}`,
|
|
109
150
|
multiple: false,
|
|
@@ -113,6 +154,8 @@ export class StepBuilderActionComponent {
|
|
|
113
154
|
this.onVariableValueChange(variable.name, value);
|
|
114
155
|
}
|
|
115
156
|
};
|
|
157
|
+
this.selectConfigCache.set(cacheKey, config);
|
|
158
|
+
return config;
|
|
116
159
|
}
|
|
117
160
|
onVariableValueChange(variableName, value) {
|
|
118
161
|
// Update the variable in templateVariables array
|
|
@@ -120,10 +163,12 @@ export class StepBuilderActionComponent {
|
|
|
120
163
|
if (variable) {
|
|
121
164
|
variable.value = value;
|
|
122
165
|
}
|
|
123
|
-
// Also update form control
|
|
166
|
+
// Also update form control (use emitEvent: false to prevent triggering valueChanges)
|
|
124
167
|
if (this.variablesForm.get(variableName)) {
|
|
125
|
-
this.variablesForm.get(variableName)?.setValue(value);
|
|
168
|
+
this.variablesForm.get(variableName)?.setValue(value, { emitEvent: false });
|
|
126
169
|
}
|
|
170
|
+
// Invalidate form validation cache
|
|
171
|
+
this.formValidCache = false;
|
|
127
172
|
}
|
|
128
173
|
onVariableBooleanChange(variableName, value) {
|
|
129
174
|
// Update the variable in templateVariables array
|
|
@@ -131,14 +176,16 @@ export class StepBuilderActionComponent {
|
|
|
131
176
|
if (variable) {
|
|
132
177
|
variable.value = value;
|
|
133
178
|
}
|
|
134
|
-
// Also update form control
|
|
179
|
+
// Also update form control (use emitEvent: false to prevent triggering valueChanges)
|
|
135
180
|
if (this.variablesForm.get(variableName)) {
|
|
136
|
-
this.variablesForm.get(variableName)?.setValue(value);
|
|
181
|
+
this.variablesForm.get(variableName)?.setValue(value, { emitEvent: false });
|
|
137
182
|
}
|
|
138
183
|
else {
|
|
139
184
|
// Create form control if it doesn't exist
|
|
140
185
|
this.variablesForm.addControl(variableName, new FormControl(value));
|
|
141
186
|
}
|
|
187
|
+
// Invalidate form validation cache
|
|
188
|
+
this.formValidCache = false;
|
|
142
189
|
}
|
|
143
190
|
onBack() {
|
|
144
191
|
this.selectedTemplate = null;
|
|
@@ -161,9 +208,15 @@ export class StepBuilderActionComponent {
|
|
|
161
208
|
if (!this.selectedTemplate) {
|
|
162
209
|
return false;
|
|
163
210
|
}
|
|
211
|
+
// Use cached result if available and recent
|
|
212
|
+
const now = Date.now();
|
|
213
|
+
if (this.formValidCache && (now - this.lastFormValidationTime) < this.FORM_VALIDATION_CACHE_MS) {
|
|
214
|
+
return this.formValidCache;
|
|
215
|
+
}
|
|
164
216
|
// Check if all required variables are filled
|
|
217
|
+
let isValid = true;
|
|
165
218
|
if (this.templateVariables && this.templateVariables.length > 0) {
|
|
166
|
-
|
|
219
|
+
isValid = this.templateVariables.every(variable => {
|
|
167
220
|
// Boolean variables are always valid (they have a default value)
|
|
168
221
|
if (variable.type === 'boolean') {
|
|
169
222
|
return true;
|
|
@@ -173,7 +226,16 @@ export class StepBuilderActionComponent {
|
|
|
173
226
|
return value !== null && value !== undefined && value !== '';
|
|
174
227
|
});
|
|
175
228
|
}
|
|
176
|
-
|
|
229
|
+
// Cache the result
|
|
230
|
+
this.formValidCache = isValid;
|
|
231
|
+
this.lastFormValidationTime = now;
|
|
232
|
+
return isValid;
|
|
233
|
+
}
|
|
234
|
+
trackByTemplate(index, template) {
|
|
235
|
+
return template.id || template.displayName || index;
|
|
236
|
+
}
|
|
237
|
+
trackByVariable(index, variable) {
|
|
238
|
+
return variable.name || index;
|
|
177
239
|
}
|
|
178
240
|
onCreateStep() {
|
|
179
241
|
if (!this.isFormValid()) {
|
|
@@ -202,10 +264,10 @@ export class StepBuilderActionComponent {
|
|
|
202
264
|
}
|
|
203
265
|
}
|
|
204
266
|
StepBuilderActionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
|
|
205
|
-
StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", templates: "templates", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", preventSelectTemplate: "preventSelectTemplate" }, outputs: { templateChanged: "templateChanged", createStep: "createStep", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4 cqa-py-2': showHeader}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates\"\n class=\"cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap\">\n <!-- Elements -->\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"variablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"(variable.name === 'type'||variable.name === 'scrollTo'); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"variablesForm\" [config]=\"getSelectConfig(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n\n\n\n\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Elements\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- Test Data -->\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- </div>\n <div class=\"cqa-flex cqa-gap-6\"> -->\n <!-- Metadata -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"description = $event\">\n </cqa-custom-input>\n </div>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <!-- Advanced fields can be added here -->\n </div>\n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
267
|
+
StepBuilderActionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StepBuilderActionComponent, selector: "cqa-step-builder-action", inputs: { showHeader: "showHeader", templates: "templates", searchPlaceholder: "searchPlaceholder", setTemplateVariables: "setTemplateVariables", preventSelectTemplate: "preventSelectTemplate" }, outputs: { templateChanged: "templateChanged", createStep: "createStep", cancelled: "cancelled" }, host: { classAttribute: "cqa-ui-root" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4 cqa-py-2': showHeader}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-2\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap\">\n <!-- Elements -->\n <ng-container *ngFor=\"let variable of templateVariables; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"variablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"(variable.name === 'type'||variable.name === 'scrollTo'); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"variablesForm\" [config]=\"getSelectConfig(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n\n\n\n\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Elements\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- Test Data -->\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- </div>\n <div class=\"cqa-flex cqa-gap-6\"> -->\n <!-- Metadata -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"description = $event\">\n </cqa-custom-input>\n </div>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <!-- Advanced fields can be added here -->\n </div>\n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", components: [{ type: i2.SearchBarComponent, selector: "cqa-search-bar", inputs: ["placeholder", "value", "disabled", "showClear", "ariaLabel", "autoFocus", "size", "fullWidth"], outputs: ["valueChange", "search", "cleared"] }, { type: i3.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: i4.DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: ["form", "config"], outputs: ["selectionChange", "selectClick", "searchChange", "loadMore", "addCustomValue"] }, { type: i5.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
206
268
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StepBuilderActionComponent, decorators: [{
|
|
207
269
|
type: Component,
|
|
208
|
-
args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4 cqa-py-2': showHeader}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates\"\n class=\"cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap\">\n <!-- Elements -->\n <ng-container *ngFor=\"let variable of templateVariables\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"variablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"(variable.name === 'type'||variable.name === 'scrollTo'); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"variablesForm\" [config]=\"getSelectConfig(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n\n\n\n\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Elements\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- Test Data -->\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- </div>\n <div class=\"cqa-flex cqa-gap-6\"> -->\n <!-- Metadata -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"description = $event\">\n </cqa-custom-input>\n </div>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <!-- Advanced fields can be added here -->\n </div>\n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", styles: [] }]
|
|
270
|
+
args: [{ selector: 'cqa-step-builder-action', host: { class: 'cqa-ui-root' }, template: "<div class=\"cqa-flex cqa-flex-col cqa-h-full cqa-bg-white\" [ngClass]=\"{'cqa-px-4 cqa-py-2': showHeader}\">\n <!-- Header -->\n <h2 *ngIf=\"showHeader\" class=\"cqa-text-[12px] cqa-font-semibold cqa-text-black-100 cqa-mb-1\">\n Create an action step\n </h2>\n <div *ngIf=\"!selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full cqa-flex-1\"\n [ngClass]=\"{'cqa-px-3': showHeader}\">\n\n <!-- Search Bar -->\n <div class=\"cqa-pb-1\">\n <div class=\"cqa-pb-1\" *ngIf=\"showHeader\">\n <p class=\"cqa-text-[12px] cqa-text-gray-500\">\n Template library\n </p>\n </div>\n <cqa-search-bar [placeholder]=\"searchPlaceholder\" [fullWidth]=\"true\" [value]=\"searchValue\"\n (valueChange)=\"onSearchChange($event)\" (search)=\"onSearchSubmit($event)\" (cleared)=\"onSearchCleared()\">\n </cqa-search-bar>\n </div>\n\n <!-- Template List -->\n <div class=\"cqa-flex-1 cqa-overflow-y-auto cqa-px-2\">\n <div class=\"cqa-py-2\">\n <div *ngFor=\"let template of filteredTemplates; trackBy: trackByTemplate\"\n class=\"cqa-bg-white cqa-cursor-pointer cqa-transition-all hover:cqa-border-blue-500 hover:cqa-shadow-sm mb-2\"\n (click)=\"selectTemplate(template)\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"template.htmlGrammar || template.naturalText || ''\">\n </div>\n </div>\n\n <div *ngIf=\"filteredTemplates.length === 0\" class=\"cqa-text-center cqa-py-8 cqa-text-gray-400 cqa-text-[12px]\">\n No templates found\n </div>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"selectedTemplate\" class=\"cqa-flex cqa-flex-col cqa-h-full\">\n <!-- Instruction Text with Element Buttons -->\n <div class=\"cqa-mb-4 cqa-flex cqa-items-center cqa-flex-wrap cqa-gap-1 cqa-text-sm cqa-text-gray-700\">\n <div class=\"cqa-text-[12px] cqa-leading-[23px] cqa-text-black-100\"\n [innerHTML]=\"selectedTemplate.htmlGrammar || selectedTemplate.naturalText || ''\">\n </div>\n </div>\n\n <!-- Form Fields in Two Columns -->\n <div class=\"cqa-flex cqa-overflow-y-auto\">\n <div class=\"cqa-flex-1 cqa-flex cqa-flex-col cqa-gap-1\">\n <div class=\"cqa-flex cqa-gap-x-6 cqa-flex-wrap\">\n <!-- Elements -->\n <ng-container *ngFor=\"let variable of templateVariables; trackBy: trackByVariable\">\n <!-- Boolean variables with mat-slide-toggle -->\n <ng-container *ngIf=\"variable.type === 'boolean'\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700\">\n {{ variable.label }}\n </label>\n <mat-slide-toggle\n [checked]=\"variablesForm.get(variable.name)?.value || variable.value || false\"\n (change)=\"onVariableBooleanChange(variable.name, $event.checked)\"\n color=\"primary\">\n </mat-slide-toggle>\n </div>\n </ng-container>\n \n <!-- Non-boolean, non-custom_code variables -->\n <ng-container *ngIf=\"variable.name !== 'custom_code' && variable.type !== 'boolean'\">\n <ng-container *ngIf=\"(variable.name === 'type'||variable.name === 'scrollTo'); else defaultInput\">\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-dynamic-select [form]=\"variablesForm\" [config]=\"getSelectConfig(variable)\">\n </cqa-dynamic-select>\n </div>\n </ng-container>\n <ng-template #defaultInput>\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n {{ variable.label }}\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"variable.value\" [fullWidth]=\"true\"\n (valueChange)=\"onVariableValueChange(variable.name, $event)\">\n </cqa-custom-input>\n </div>\n </ng-template>\n </ng-container>\n </ng-container>\n\n\n\n\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Elements\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- Test Data -->\n <!-- <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Test Data\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div> -->\n\n <!-- </div>\n <div class=\"cqa-flex cqa-gap-6\"> -->\n <!-- Metadata -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Metadata\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"metadata\" [fullWidth]=\"true\"\n (valueChange)=\"metadata = $event\">\n </cqa-custom-input>\n </div>\n\n <!-- Description -->\n <div class=\"cqa-flex cqa-flex-col\" style=\"width: calc(50% - 12px);\">\n <label class=\"cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-mb-1\">\n Description\n </label>\n <cqa-custom-input [placeholder]=\"'Text Input'\" [value]=\"description\" [fullWidth]=\"true\"\n (valueChange)=\"description = $event\">\n </cqa-custom-input>\n </div>\n </div>\n\n <!-- Advanced (Expandable) -->\n <div class=\"cqa-flex cqa-flex-col cqa-w-full\">\n <button type=\"button\"\n class=\"cqa-flex cqa-w-full cqa-items-center cqa-justify-between cqa-gap-2 cqa-text-sm cqa-font-medium cqa-text-gray-700 cqa-bg-transparent cqa-border-none cqa-cursor-pointer cqa-p-0 cqa-mb-1.5\"\n (click)=\"toggleAdvanced()\">\n <span class=\"cqa-text-[10px]\">Advanced</span>\n <mat-icon class=\"cqa-text-base\" [class.cqa-rotate-180]=\"advancedExpanded\">\n expand_more\n </mat-icon>\n </button>\n <div *ngIf=\"advancedExpanded\" class=\"cqa-mt-2\">\n <!-- Advanced fields can be added here -->\n </div>\n </div>\n </div>\n\n\n </div>\n\n <!-- Action Buttons -->\n <div class=\"cqa-flex cqa-w-full cqa-gap-2 cqa-border-t cqa-border-gray-200\">\n <cqa-button class=\"cqa-w-1/2\" variant=\"outlined\" text=\"Cancel\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n (clicked)=\"onCancel()\">\n </cqa-button>\n <cqa-button class=\"cqa-w-1/2\" variant=\"filled\" text=\"Create Step\" [customClass]=\"'cqa-flex-1 cqa-w-full'\"\n [disabled]=\"!isFormValid()\"\n (clicked)=\"onCreateStep()\">\n </cqa-button>\n </div>\n </div>\n</div>", styles: [] }]
|
|
209
271
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { showHeader: [{
|
|
210
272
|
type: Input
|
|
211
273
|
}], templates: [{
|
|
@@ -223,4 +285,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
223
285
|
}], cancelled: [{
|
|
224
286
|
type: Output
|
|
225
287
|
}] } });
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW9DLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBMEIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFvQ3JFLE1BQU0sT0FBTywwQkFBMEI7SUE0QnJDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBM0IxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLDBDQUEwQztRQUNqQyxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQUUxQyx3Q0FBd0M7UUFDL0Isc0JBQWlCLEdBQVcsZ0JBQWdCLENBQUM7UUFFdEQsbUdBQW1HO1FBQzFGLHlCQUFvQixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU5RSwwQkFBcUIsR0FBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUMvRCxnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFL0MsMEJBQTBCO1FBQ2hCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRS9DLHNCQUFpQixHQUFxQixFQUFFLENBQUM7UUFDekMsZ0JBQVcsR0FBVyxFQUFF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QUFDOzt1SEEzTlUsMEJBQTBCOzJHQUExQiwwQkFBMEIsb2FDckN2Qyw2a1BBcUtNOzJGRGhJTywwQkFBMEI7a0JBTnRDLFNBQVM7K0JBQ0UseUJBQXlCLFFBRzdCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRTtrR0FHckIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUcscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFHRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZywgU2VsZWN0T3B0aW9uIH0gZnJvbSAnLi4vLi4vZHluYW1pYy1zZWxlY3QvZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZURlZmluaXRpb24ge1xuICBwYXRoOiBzdHJpbmc7XG4gIGRlZmF1bHQ6IHN0cmluZyB8IGJvb2xlYW47XG4gIG11dGFibGU6IGJvb2xlYW47XG4gIHR5cGU/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UZW1wbGF0ZSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYXR1cmFsVGV4dD86IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIGh0bWxHcmFtbWFyPzogc3RyaW5nO1xuICBzZWFyY2hhYmxlR3JhbW1hcj86IHN0cmluZztcbiAgd29ya3NwYWNlVHlwZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBpc0FkZG9uPzogYm9vbGVhbjtcbiAgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVmFyaWFibGVEZWZpbml0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RmllbGQge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgdHlwZTogJ2VsZW1lbnQnIHwgJ3Rlc3QtZGF0YScgfCAnYXR0cmlidXRlJztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG4gIC8qKiBMaXN0IG9mIGFjdGlvbiB0ZW1wbGF0ZXMgdG8gZGlzcGxheSAqL1xuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3Igc2VhcmNoIGlucHV0ICovXG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoIGxpYnJhcnknO1xuXG4gIC8qKiBGdW5jdGlvbiB0byBoYW5kbGUgdmFyaWFibGUgcHJvY2Vzc2luZyBvciBjdXN0b20gbG9naWMuIENhbiBiZSBwYXNzZWQgZnJvbSBwYXJlbnQgY29tcG9uZW50LiAqL1xuICBASW5wdXQoKSBzZXRUZW1wbGF0ZVZhcmlhYmxlczogKHZhcmlhYmxlczogQWN0aW9uVGVtcGxhdGUpID0+IGFueSA9ICgpID0+IHsgcmV0dXJuIFtdfTtcblxuICBASW5wdXQoKSBwcmV2ZW50U2VsZWN0VGVtcGxhdGU6IHN0cmluZ1tdID0gWydkYXRhYmFzZXZlcmlmaWNhdGlvbiddO1xuICBAT3V0cHV0KCkgdGVtcGxhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxBY3Rpb25UZW1wbGF0ZT4oKTtcbiAgLyoqIEVtaXQgd2hlbiBzdGVwIGlzIGNyZWF0ZWQgKi9cbiAgQE91dHB1dCgpIGNyZWF0ZVN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKiogRW1pdCB3aGVuIGNhbmNlbGxlZCAqL1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGZpbHRlcmVkVGVtcGxhdGVzOiBBY3Rpb25UZW1wbGF0ZVtdID0gW107XG4gIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRUZW1wbGF0ZTogQWN0aW9uVGVtcGxhdGUgfCBudWxsID0gbnVsbDtcbiAgbWV0YWRhdGE6IHN0cmluZyA9ICcnO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nID0gJyc7XG4gIGFkdmFuY2VkRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGVtcGxhdGVWYXJpYWJsZXM6IGFueVtdID0gW107XG4gIHZhcmlhYmxlc0Zvcm06IEZvcm1Hcm91cDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge1xuICAgIHRoaXMudmFyaWFibGVzRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe30pO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyA9IFsuLi50aGlzLnRlbXBsYXRlc107XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3RlbXBsYXRlcyddKSB7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgb25TZWFyY2hDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvblNlYXJjaFN1Ym1pdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIG9uU2VhcmNoQ2xlYXJlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaFZhbHVlIHx8IHRoaXMuc2VhcmNoVmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyA9IFsuLi50aGlzLnRlbXBsYXRlc107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoVGVybSA9IHRoaXMuc2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgdGhpcy5maWx0ZXJlZFRlbXBsYXRlcyA9IHRoaXMudGVtcGxhdGVzLmZpbHRlcih0ZW1wbGF0ZSA9PiB7XG4gICAgICBjb25zdCBuYXR1cmFsVGV4dCA9IHRlbXBsYXRlLm5hdHVyYWxUZXh0Py50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSB0ZW1wbGF0ZS5kaXNwbGF5TmFtZT8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGNvbnN0IHNlYXJjaGFibGVHcmFtbWFyID0gdGVtcGxhdGUuc2VhcmNoYWJsZUdyYW1tYXI/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBcbiAgICAgIHJldHVybiBuYXR1cmFsVGV4dC5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBcbiAgICAgICAgICAgICBkaXNwbGF5TmFtZS5pbmNsdWRlcyhzZWFyY2hUZXJtKSB8fCBcbiAgICAgICAgICAgICBzZWFyY2hhYmxlR3JhbW1hci5pbmNsdWRlcyhzZWFyY2hUZXJtKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhcImZpbHRlcmVkVGVtcGxhdGVzXCIsIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMpO1xuICB9XG5cbiAgc2VsZWN0VGVtcGxhdGUodGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlKTogdm9pZCB7XG4gICAgaWYodGhpcy5wcmV2ZW50U2VsZWN0VGVtcGxhdGUuaW5jbHVkZXModGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgJycpKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlQ2hhbmdlZC5lbWl0KHRlbXBsYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50ZW1wbGF0ZUNoYW5nZWQuZW1pdCh0ZW1wbGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgaWYodGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSB0aGlzLnNldFRlbXBsYXRlVmFyaWFibGVzKHRlbXBsYXRlKTtcbiAgICAgIHRoaXMuYnVpbGRWYXJpYWJsZXNGb3JtKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFZhcmlhYmxlc0Zvcm0oKTogdm9pZCB7XG4gICAgLy8gQ2xlYXIgZXhpc3RpbmcgZm9ybSBjb250cm9sc1xuICAgIE9iamVjdC5rZXlzKHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnJlbW92ZUNvbnRyb2woa2V5KTtcbiAgICB9KTtcblxuICAgIC8vIEFkZCBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIHZhcmlhYmxlcyAtIHVzZSBib29sZWFuIHZhbHVlLCBvdGhlcnMgdXNlIHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uYWRkQ29udHJvbCh2YXJpYWJsZS5uYW1lLCBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgY29uc3Qgb3B0aW9uczogU2VsZWN0T3B0aW9uW10gPSAodmFyaWFibGUub3B0aW9ucyB8fCBbXSkubWFwKChvcHQ6IHN0cmluZykgPT4gKHtcbiAgICAgIGlkOiBvcHQsXG4gICAgICB2YWx1ZTogb3B0LFxuICAgICAgbmFtZTogb3B0LFxuICAgICAgbGFiZWw6IG9wdFxuICAgIH0pKTtcblxuICAgIHJldHVybiB7XG4gICAgICBrZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICBpZiAodGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvblZhcmlhYmxlQm9vbGVhbkNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgdGhlIHZhcmlhYmxlIGluIHRlbXBsYXRlVmFyaWFibGVzIGFycmF5XG4gICAgY29uc3QgdmFyaWFibGUgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmZpbmQodiA9PiB2Lm5hbWUgPT09IHZhcmlhYmxlTmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICB2YXJpYWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvLyBBbHNvIHVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICBpZiAodGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGZvcm0gY29udHJvbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uYWRkQ29udHJvbCh2YXJpYWJsZU5hbWUsIG5ldyBGb3JtQ29udHJvbCh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgIHRoaXMubWV0YWRhdGEgPSAnJztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5hZHZhbmNlZEV4cGFuZGVkID0gZmFsc2U7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIC8vIENsZWFyIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG4gICAgLy8gUmVhcHBseSBmaWx0ZXIgdG8gbWFpbnRhaW4gc2VhcmNoIHN0YXRlXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5vbkJhY2soKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiBhbGwgcmVxdWlyZWQgdmFyaWFibGVzIGFyZSBmaWxsZWRcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmV2ZXJ5KHZhcmlhYmxlID0+IHtcbiAgICAgICAgLy8gQm9vbGVhbiB2YXJpYWJsZXMgYXJlIGFsd2F5cyB2YWxpZCAodGhleSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSlcbiAgICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHZhcmlhYmxlIGhhcyBhIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwRGF0YSA9IHtcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlXCIgW25nQ2xhc3NdPVwieydjcWEtcHgtNCBjcWEtcHktMic6IHNob3dIZWFkZXJ9XCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8aDIgKm5nSWY9XCJzaG93SGVhZGVyXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi0xXCI+XG4gICAgQ3JlYXRlIGFuIGFjdGlvbiBzdGVwXG4gIDwvaDI+XG4gIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWZsZXgtMVwiXG4gICAgW25nQ2xhc3NdPVwieydjcWEtcHgtMyc6IHNob3dIZWFkZXJ9XCI+XG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIiAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBsaWJyYXJ5XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNxYS1zZWFyY2gtYmFyIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgkZXZlbnQpXCIgKHNlYXJjaCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCIgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcmVkKClcIj5cbiAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRlbXBsYXRlIExpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHgtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weS0yXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIGZpbHRlcmVkVGVtcGxhdGVzXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tYWxsIGhvdmVyOmNxYS1ib3JkZXItYmx1ZS01MDAgaG92ZXI6Y3FhLXNoYWRvdy1zbVwiXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIzcHhdIGNxYS10ZXh0LWJsYWNrLTEwMFwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHRlbXBsYXRlLm5hdHVyYWxUZXh0IHx8ICcnXCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZFRlbXBsYXRlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNxYS10ZXh0LWNlbnRlciBjcWEtcHktOCBjcWEtdGV4dC1ncmF5LTQwMCBjcWEtdGV4dC1bMTJweF1cIj5cbiAgICAgICAgICBObyB0ZW1wbGF0ZXMgZm91bmRcbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cInNlbGVjdGVkVGVtcGxhdGVcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaC1mdWxsXCI+XG4gICAgPCEtLSBJbnN0cnVjdGlvbiBUZXh0IHdpdGggRWxlbWVudCBCdXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtbWItNCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0xIGNxYS10ZXh0LXNtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICBbaW5uZXJIVE1MXT1cInNlbGVjdGVkVGVtcGxhdGUuaHRtbEdyYW1tYXIgfHwgc2VsZWN0ZWRUZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEZvcm0gRmllbGRzIGluIFR3byBDb2x1bW5zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtMSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLXgtNiBjcWEtZmxleC13cmFwXCI+XG4gICAgICAgICAgPCEtLSBFbGVtZW50cyAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YXJpYWJsZSBvZiB0ZW1wbGF0ZVZhcmlhYmxlc1wiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIHN0eWxlPVwid2lkdGg6IGNhbGMoNTAlIC0gMTJweCk7XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gTm9uLWJvb2xlYW4sIG5vbi1jdXN0b21fY29kZSB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJyAmJiB2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbidcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih2YXJpYWJsZS5uYW1lID09PSAndHlwZSd8fHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycpOyBlbHNlIGRlZmF1bHRJbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJ2YXJpYWJsZXNGb3JtXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcodmFyaWFibGUpXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgIEVsZW1lbnRzXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJtZXRhZGF0YSA9ICRldmVudFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gVGVzdCBEYXRhIC0tPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwid2lkdGg6IGNhbGMoNTAlIC0gMTJweCk7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgVGVzdCBEYXRhXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJtZXRhZGF0YSA9ICRldmVudFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTZcIj4gLS0+XG4gICAgICAgICAgPCEtLSBNZXRhZGF0YSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJ3aWR0aDogY2FsYyg1MCUgLSAxMnB4KTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBNZXRhZGF0YVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwibWV0YWRhdGFcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGEgPSAkZXZlbnRcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwid2lkdGg6IGNhbGMoNTAlIC0gMTJweCk7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRlc2NyaXB0aW9uID0gJGV2ZW50XCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgKEV4cGFuZGFibGUpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiAgY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1tYi0xLjVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkdmFuY2VkKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1iYXNlXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICA8IS0tIEFkdmFuY2VkIGZpZWxkcyBjYW4gYmUgYWRkZWQgaGVyZSAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuXG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgdGV4dD1cIkNyZWF0ZSBTdGVwXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3N0ZXAtYnVpbGRlci9zdGVwLWJ1aWxkZXItYWN0aW9uL3N0ZXAtYnVpbGRlci1hY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zdGVwLWJ1aWxkZXIvc3RlcC1idWlsZGVyLWFjdGlvbi9zdGVwLWJ1aWxkZXItYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBMEIsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFxQ3JFLE1BQU0sT0FBTywwQkFBMEI7SUFtQ3JDLFlBQW9CLEVBQWU7UUFBZixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBbEMxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBQ3BDLDBDQUEwQztRQUNqQyxjQUFTLEdBQXFCLEVBQUUsQ0FBQztRQUUxQyx3Q0FBd0M7UUFDL0Isc0JBQWlCLEdBQVcsZ0JBQWdCLENBQUM7UUFFdEQsbUdBQW1HO1FBQzFGLHlCQUFvQixHQUF1QyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQSxDQUFBLENBQUMsQ0FBQztRQUU5RSwwQkFBcUIsR0FBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUMvRCxnQ0FBZ0M7UUFDdEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFL0MsMEJBQTBCO1FBQ2hCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRS9DLHNCQUFpQixHQUFxQixFQUFFLENBQUM7UUFDekMsZ0JBQVcsR0FBVyxFQUFF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QUM7SUFDMUIsQ0FBQztJQUVELHFCQUFxQixDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7O3VIQXZTVSwwQkFBMEI7MkdBQTFCLDBCQUEwQixvYUN0Q3ZDLHNvUEFxS007MkZEL0hPLDBCQUEwQjtrQkFOdEMsU0FBUzsrQkFDRSx5QkFBeUIsUUFHN0IsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO2tHQUdyQixVQUFVO3NCQUFsQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUdHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0ksZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYWJsZURlZmluaXRpb24ge1xuICBwYXRoOiBzdHJpbmc7XG4gIGRlZmF1bHQ6IHN0cmluZyB8IGJvb2xlYW47XG4gIG11dGFibGU6IGJvb2xlYW47XG4gIHR5cGU/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY3Rpb25UZW1wbGF0ZSB7XG4gIGlkPzogbnVtYmVyO1xuICBuYXR1cmFsVGV4dD86IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIGh0bWxHcmFtbWFyPzogc3RyaW5nO1xuICBzZWFyY2hhYmxlR3JhbW1hcj86IHN0cmluZztcbiAgd29ya3NwYWNlVHlwZT86IHN0cmluZztcbiAgYWN0aW9uPzogc3RyaW5nO1xuICBpc0FkZG9uPzogYm9vbGVhbjtcbiAgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgVmFyaWFibGVEZWZpbml0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RmllbGQge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbiAgdHlwZTogJ2VsZW1lbnQnIHwgJ3Rlc3QtZGF0YScgfCAnYXR0cmlidXRlJztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLXN0ZXAtYnVpbGRlci1hY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC1idWlsZGVyLWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfVxufSlcbmV4cG9ydCBjbGFzcyBTdGVwQnVpbGRlckFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBzaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqIExpc3Qgb2YgYWN0aW9uIHRlbXBsYXRlcyB0byBkaXNwbGF5ICovXG4gIEBJbnB1dCgpIHRlbXBsYXRlczogQWN0aW9uVGVtcGxhdGVbXSA9IFtdO1xuXG4gIC8qKiBQbGFjZWhvbGRlciB0ZXh0IGZvciBzZWFyY2ggaW5wdXQgKi9cbiAgQElucHV0KCkgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2ggbGlicmFyeSc7XG5cbiAgLyoqIEZ1bmN0aW9uIHRvIGhhbmRsZSB2YXJpYWJsZSBwcm9jZXNzaW5nIG9yIGN1c3RvbSBsb2dpYy4gQ2FuIGJlIHBhc3NlZCBmcm9tIHBhcmVudCBjb21wb25lbnQuICovXG4gIEBJbnB1dCgpIHNldFRlbXBsYXRlVmFyaWFibGVzOiAodmFyaWFibGVzOiBBY3Rpb25UZW1wbGF0ZSkgPT4gYW55ID0gKCkgPT4geyByZXR1cm4gW119O1xuXG4gIEBJbnB1dCgpIHByZXZlbnRTZWxlY3RUZW1wbGF0ZTogc3RyaW5nW10gPSBbJ2RhdGFiYXNldmVyaWZpY2F0aW9uJ107XG4gIEBPdXRwdXQoKSB0ZW1wbGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFjdGlvblRlbXBsYXRlPigpO1xuICAvKiogRW1pdCB3aGVuIHN0ZXAgaXMgY3JlYXRlZCAqL1xuICBAT3V0cHV0KCkgY3JlYXRlU3RlcCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8qKiBFbWl0IHdoZW4gY2FuY2VsbGVkICovXG4gIEBPdXRwdXQoKSBjYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZmlsdGVyZWRUZW1wbGF0ZXM6IEFjdGlvblRlbXBsYXRlW10gPSBbXTtcbiAgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuICBzZWxlY3RlZFRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSB8IG51bGwgPSBudWxsO1xuICBtZXRhZGF0YTogc3RyaW5nID0gJyc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgYWR2YW5jZWRFeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICB0ZW1wbGF0ZVZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgdmFyaWFibGVzRm9ybTogRm9ybUdyb3VwO1xuICBcbiAgLy8gQ2FjaGUgZm9yIHNlbGVjdCBjb25maWdzIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICBwcml2YXRlIHNlbGVjdENvbmZpZ0NhY2hlOiBNYXA8c3RyaW5nLCBEeW5hbWljU2VsZWN0RmllbGRDb25maWc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGZvcm1WYWxpZENhY2hlOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdEZvcm1WYWxpZGF0aW9uVGltZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBGT1JNX1ZBTElEQVRJT05fQ0FDSEVfTVMgPSAxMDA7IC8vIENhY2hlIGZvciAxMDBtc1xuICBwcml2YXRlIGZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyd0ZW1wbGF0ZXMnXSkge1xuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25TZWFyY2hTdWJtaXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmFwcGx5RmlsdGVyKCk7XG4gIH1cblxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWFyY2hWYWx1ZSB8fCB0aGlzLnNlYXJjaFZhbHVlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSBbLi4udGhpcy50ZW1wbGF0ZXNdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHRoaXMuZmlsdGVyZWRUZW1wbGF0ZXMgPSB0aGlzLnRlbXBsYXRlcy5maWx0ZXIodGVtcGxhdGUgPT4ge1xuICAgICAgY29uc3QgbmF0dXJhbFRleHQgPSB0ZW1wbGF0ZS5uYXR1cmFsVGV4dD8udG9Mb3dlckNhc2UoKSB8fCAnJztcbiAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdGVtcGxhdGUuZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICBjb25zdCBzZWFyY2hhYmxlR3JhbW1hciA9IHRlbXBsYXRlLnNlYXJjaGFibGVHcmFtbWFyPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgICAgXG4gICAgICByZXR1cm4gbmF0dXJhbFRleHQuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgXG4gICAgICAgICAgICAgZGlzcGxheU5hbWUuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgXG4gICAgICAgICAgICAgc2VhcmNoYWJsZUdyYW1tYXIuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coXCJmaWx0ZXJlZFRlbXBsYXRlc1wiLCB0aGlzLmZpbHRlcmVkVGVtcGxhdGVzKTtcbiAgfVxuXG4gIHNlbGVjdFRlbXBsYXRlKHRlbXBsYXRlOiBBY3Rpb25UZW1wbGF0ZSk6IHZvaWQge1xuICAgIGlmKHRoaXMucHJldmVudFNlbGVjdFRlbXBsYXRlLmluY2x1ZGVzKHRlbXBsYXRlLmRpc3BsYXlOYW1lIHx8ICcnKSkge1xuICAgICAgdGhpcy50ZW1wbGF0ZUNoYW5nZWQuZW1pdCh0ZW1wbGF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGVtcGxhdGVDaGFuZ2VkLmVtaXQodGVtcGxhdGUpO1xuICAgIHRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIFxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gdGVtcGxhdGUgY2hhbmdlc1xuICAgIHRoaXMuc2VsZWN0Q29uZmlnQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLmZvcm1WYWxpZENhY2hlID0gZmFsc2U7XG4gICAgXG4gICAgaWYodGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyAmJiB0ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGRlZmVyIGhlYXZ5IG9wZXJhdGlvbnMgYW5kIHByZXZlbnQgVUkgZnJlZXppbmdcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBVSSB0byB1cGRhdGUgZmlyc3QsIHRoZW4gcHJvY2VzcyB0aGUgdGVtcGxhdGUgdmFyaWFibGVzXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gdGhpcy5zZXRUZW1wbGF0ZVZhcmlhYmxlcyh0ZW1wbGF0ZSk7XG4gICAgICAgICAgdGhpcy5idWlsZFZhcmlhYmxlc0Zvcm0oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIHRlbXBsYXRlIHZhcmlhYmxlczonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRWYXJpYWJsZXNGb3JtKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGV4aXN0aW5nIGZvcm0gY29udHJvbHNcbiAgICBjb25zdCBjb250cm9sS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMudmFyaWFibGVzRm9ybS5jb250cm9scyk7XG4gICAgY29udHJvbEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgdGhpcy52YXJpYWJsZXNGb3JtLnJlbW92ZUNvbnRyb2woa2V5KTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIGNhY2hlIHdoZW4gZm9ybSBpcyByZWJ1aWx0XG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcblxuICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXMgc3Vic2NyaXB0aW9uIGlmIGl0IGV4aXN0c1xuICAgIGlmICh0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIEFkZCBmb3JtIGNvbnRyb2xzIGZvciBlYWNoIHZhcmlhYmxlXG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIC8vIEhhbmRsZSBib29sZWFuIHZhcmlhYmxlcyAtIHVzZSBib29sZWFuIHZhbHVlLCBvdGhlcnMgdXNlIHN0cmluZ1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nIFxuICAgICAgICA/ICh2YXJpYWJsZS52YWx1ZSA9PT0gdHJ1ZSB8fCB2YXJpYWJsZS52YWx1ZSA9PT0gJ3RydWUnIHx8IHZhcmlhYmxlLnZhbHVlID09PSAxKVxuICAgICAgICA6ICh2YXJpYWJsZS52YWx1ZSB8fCAnJyk7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uYWRkQ29udHJvbCh2YXJpYWJsZS5uYW1lLCBuZXcgRm9ybUNvbnRyb2woZGVmYXVsdFZhbHVlKSk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gU3Vic2NyaWJlIHRvIGZvcm0gdmFsdWUgY2hhbmdlcyB0byBpbnZhbGlkYXRlIGNhY2hlIChvbmx5IHdoZW4gdXNlciBhY3R1YWxseSBjaGFuZ2VzIHZhbHVlcylcbiAgICAvLyBOb3RlOiBXZSB1c2UgZW1pdEV2ZW50OiBmYWxzZSB3aGVuIHByb2dyYW1tYXRpY2FsbHkgc2V0dGluZyB2YWx1ZXMsIHNvIHRoaXMgd29uJ3QgZmlyZSB1bm5lY2Vzc2FyaWx5XG4gICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy52YXJpYWJsZXNGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBzdWJzY3JpcHRpb24gdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICBpZiAodGhpcy5mb3JtVmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBnZXRTZWxlY3RDb25maWcodmFyaWFibGU6IGFueSk6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyB7XG4gICAgLy8gVXNlIGNhY2hlIHRvIGF2b2lkIHJlY2FsY3VsYXRpbmcgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7dmFyaWFibGUubmFtZX1fJHt2YXJpYWJsZS5vcHRpb25zPy5qb2luKCcsJykgfHwgJyd9YDtcbiAgICBpZiAodGhpcy5zZWxlY3RDb25maWdDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RDb25maWdDYWNoZS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9ICh2YXJpYWJsZS5vcHRpb25zIHx8IFtdKS5tYXAoKG9wdDogc3RyaW5nKSA9PiAoe1xuICAgICAgaWQ6IG9wdCxcbiAgICAgIHZhbHVlOiBvcHQsXG4gICAgICBuYW1lOiBvcHQsXG4gICAgICBsYWJlbDogb3B0XG4gICAgfSkpO1xuXG4gICAgY29uc3QgY29uZmlnOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IHZhcmlhYmxlLm5hbWUsXG4gICAgICBwbGFjZWhvbGRlcjogYFNlbGVjdCAke3ZhcmlhYmxlLmxhYmVsfWAsXG4gICAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgdGhpcy5zZWxlY3RDb25maWdDYWNoZS5zZXQoY2FjaGVLZXksIGNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIG9uVmFyaWFibGVWYWx1ZUNoYW5nZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgdmFyaWFibGUgaW4gdGVtcGxhdGVWYXJpYWJsZXMgYXJyYXlcbiAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMudGVtcGxhdGVWYXJpYWJsZXMuZmluZCh2ID0+IHYubmFtZSA9PT0gdmFyaWFibGVOYW1lKTtcbiAgICBpZiAodmFyaWFibGUpIHtcbiAgICAgIHZhcmlhYmxlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8vIEFsc28gdXBkYXRlIGZvcm0gY29udHJvbCAodXNlIGVtaXRFdmVudDogZmFsc2UgdG8gcHJldmVudCB0cmlnZ2VyaW5nIHZhbHVlQ2hhbmdlcylcbiAgICBpZiAodGhpcy52YXJpYWJsZXNGb3JtLmdldCh2YXJpYWJsZU5hbWUpKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlTmFtZSk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICAgIC8vIEludmFsaWRhdGUgZm9ybSB2YWxpZGF0aW9uIGNhY2hlXG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGZhbHNlO1xuICB9XG5cbiAgb25WYXJpYWJsZUJvb2xlYW5DaGFuZ2UodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gVXBkYXRlIHRoZSB2YXJpYWJsZSBpbiB0ZW1wbGF0ZVZhcmlhYmxlcyBhcnJheVxuICAgIGNvbnN0IHZhcmlhYmxlID0gdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcy5maW5kKHYgPT4gdi5uYW1lID09PSB2YXJpYWJsZU5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgdmFyaWFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLy8gQWxzbyB1cGRhdGUgZm9ybSBjb250cm9sICh1c2UgZW1pdEV2ZW50OiBmYWxzZSB0byBwcmV2ZW50IHRyaWdnZXJpbmcgdmFsdWVDaGFuZ2VzKVxuICAgIGlmICh0aGlzLnZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlTmFtZSkpIHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5nZXQodmFyaWFibGVOYW1lKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIGZvcm0gY29udHJvbCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICB0aGlzLnZhcmlhYmxlc0Zvcm0uYWRkQ29udHJvbCh2YXJpYWJsZU5hbWUsIG5ldyBGb3JtQ29udHJvbCh2YWx1ZSkpO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkYXRlIGZvcm0gdmFsaWRhdGlvbiBjYWNoZVxuICAgIHRoaXMuZm9ybVZhbGlkQ2FjaGUgPSBmYWxzZTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVGVtcGxhdGUgPSBudWxsO1xuICAgIHRoaXMubWV0YWRhdGEgPSAnJztcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gJyc7XG4gICAgdGhpcy5hZHZhbmNlZEV4cGFuZGVkID0gZmFsc2U7XG4gICAgdGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyA9IFtdO1xuICAgIC8vIENsZWFyIGZvcm0gY29udHJvbHNcbiAgICBPYmplY3Qua2V5cyh0aGlzLnZhcmlhYmxlc0Zvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHRoaXMudmFyaWFibGVzRm9ybS5yZW1vdmVDb250cm9sKGtleSk7XG4gICAgfSk7XG4gICAgLy8gUmVhcHBseSBmaWx0ZXIgdG8gbWFpbnRhaW4gc2VhcmNoIHN0YXRlXG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5vbkJhY2soKTtcbiAgICB0aGlzLmNhbmNlbGxlZC5lbWl0KCk7XG4gIH1cblxuICBpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgY2FjaGVkIHJlc3VsdCBpZiBhdmFpbGFibGUgYW5kIHJlY2VudFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuZm9ybVZhbGlkQ2FjaGUgJiYgKG5vdyAtIHRoaXMubGFzdEZvcm1WYWxpZGF0aW9uVGltZSkgPCB0aGlzLkZPUk1fVkFMSURBVElPTl9DQUNIRV9NUykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybVZhbGlkQ2FjaGU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIGZpbGxlZFxuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy50ZW1wbGF0ZVZhcmlhYmxlcyAmJiB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlzVmFsaWQgPSB0aGlzLnRlbXBsYXRlVmFyaWFibGVzLmV2ZXJ5KHZhcmlhYmxlID0+IHtcbiAgICAgICAgLy8gQm9vbGVhbiB2YXJpYWJsZXMgYXJlIGFsd2F5cyB2YWxpZCAodGhleSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSlcbiAgICAgICAgaWYgKHZhcmlhYmxlLnR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHZhcmlhYmxlIGhhcyBhIHZhbHVlXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGUudmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSAnJztcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgdGhpcy5mb3JtVmFsaWRDYWNoZSA9IGlzVmFsaWQ7XG4gICAgdGhpcy5sYXN0Rm9ybVZhbGlkYXRpb25UaW1lID0gbm93O1xuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG4gIFxuICB0cmFja0J5VGVtcGxhdGUoaW5kZXg6IG51bWJlciwgdGVtcGxhdGU6IEFjdGlvblRlbXBsYXRlKTogYW55IHtcbiAgICByZXR1cm4gdGVtcGxhdGUuaWQgfHwgdGVtcGxhdGUuZGlzcGxheU5hbWUgfHwgaW5kZXg7XG4gIH1cbiAgXG4gIHRyYWNrQnlWYXJpYWJsZShpbmRleDogbnVtYmVyLCB2YXJpYWJsZTogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmFyaWFibGUubmFtZSB8fCBpbmRleDtcbiAgfVxuXG4gIG9uQ3JlYXRlU3RlcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNGb3JtVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzdGVwRGF0YSA9IHtcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnNlbGVjdGVkVGVtcGxhdGUsXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgdGVtcGxhdGVWYXJpYWJsZXM6IHRoaXMudGVtcGxhdGVWYXJpYWJsZXNcbiAgICB9O1xuICAgIHRoaXMuY3JlYXRlU3RlcC5lbWl0KHN0ZXBEYXRhKTtcbiAgfVxuXG4gIHRvZ2dsZUFkdmFuY2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRFeHBhbmRlZCA9ICF0aGlzLmFkdmFuY2VkRXhwYW5kZWQ7XG4gIH1cblxuXG4gIG9uRWxlbWVudENsaWNrKGVsZW1lbnRLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEZvY3VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IGZpZWxkXG4gICAgLy8gVGhpcyBjYW4gYmUgZW5oYW5jZWQgdG8gc2Nyb2xsIHRvIG9yIGhpZ2hsaWdodCB0aGUgZmllbGRcbiAgfVxuXG4gIG9uRWxlbWVudFZhbHVlQ2hhbmdlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coa2V5LCB2YWx1ZSk7XG4gIH1cblxuICBvblRlc3REYXRhVmFsdWVDaGFuZ2Uoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWJnLXdoaXRlXCIgW25nQ2xhc3NdPVwieydjcWEtcHgtNCBjcWEtcHktMic6IHNob3dIZWFkZXJ9XCI+XG4gIDwhLS0gSGVhZGVyIC0tPlxuICA8aDIgKm5nSWY9XCJzaG93SGVhZGVyXCIgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtYmxhY2stMTAwIGNxYS1tYi0xXCI+XG4gICAgQ3JlYXRlIGFuIGFjdGlvbiBzdGVwXG4gIDwvaDI+XG4gIDxkaXYgKm5nSWY9XCIhc2VsZWN0ZWRUZW1wbGF0ZVwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1oLWZ1bGwgY3FhLWZsZXgtMVwiXG4gICAgW25nQ2xhc3NdPVwieydjcWEtcHgtMyc6IHNob3dIZWFkZXJ9XCI+XG5cbiAgICA8IS0tIFNlYXJjaCBCYXIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1wYi0xXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY3FhLXBiLTFcIiAqbmdJZj1cInNob3dIZWFkZXJcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICBUZW1wbGF0ZSBsaWJyYXJ5XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGNxYS1zZWFyY2gtYmFyIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZWhvbGRlclwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiIFt2YWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaENoYW5nZSgkZXZlbnQpXCIgKHNlYXJjaCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCIgKGNsZWFyZWQpPVwib25TZWFyY2hDbGVhcmVkKClcIj5cbiAgICAgIDwvY3FhLXNlYXJjaC1iYXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRlbXBsYXRlIExpc3QgLS0+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW92ZXJmbG93LXktYXV0byBjcWEtcHgtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1weS0yXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRlbXBsYXRlIG9mIGZpbHRlcmVkVGVtcGxhdGVzOyB0cmFja0J5OiB0cmFja0J5VGVtcGxhdGVcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWJnLXdoaXRlIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdHJhbnNpdGlvbi1hbGwgaG92ZXI6Y3FhLWJvcmRlci1ibHVlLTUwMCBob3ZlcjpjcWEtc2hhZG93LXNtIG1iLTJcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUZW1wbGF0ZSh0ZW1wbGF0ZSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyM3B4XSBjcWEtdGV4dC1ibGFjay0xMDBcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCJ0ZW1wbGF0ZS5odG1sR3JhbW1hciB8fCB0ZW1wbGF0ZS5uYXR1cmFsVGV4dCB8fCAnJ1wiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWRUZW1wbGF0ZXMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjcWEtdGV4dC1jZW50ZXIgY3FhLXB5LTggY3FhLXRleHQtZ3JheS00MDAgY3FhLXRleHQtWzEycHhdXCI+XG4gICAgICAgICAgTm8gdGVtcGxhdGVzIGZvdW5kXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nSWY9XCJzZWxlY3RlZFRlbXBsYXRlXCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWgtZnVsbFwiPlxuICAgIDwhLS0gSW5zdHJ1Y3Rpb24gVGV4dCB3aXRoIEVsZW1lbnQgQnV0dG9ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLW1iLTQgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZmxleC13cmFwIGNxYS1nYXAtMSBjcWEtdGV4dC1zbSBjcWEtdGV4dC1ncmF5LTcwMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjNweF0gY3FhLXRleHQtYmxhY2stMTAwXCJcbiAgICAgICAgW2lubmVySFRNTF09XCJzZWxlY3RlZFRlbXBsYXRlLmh0bWxHcmFtbWFyIHx8IHNlbGVjdGVkVGVtcGxhdGUubmF0dXJhbFRleHQgfHwgJydcIj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGb3JtIEZpZWxkcyBpbiBUd28gQ29sdW1ucyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWdhcC14LTYgY3FhLWZsZXgtd3JhcFwiPlxuICAgICAgICAgIDwhLS0gRWxlbWVudHMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFyaWFibGUgb2YgdGVtcGxhdGVWYXJpYWJsZXM7IHRyYWNrQnk6IHRyYWNrQnlWYXJpYWJsZVwiPlxuICAgICAgICAgICAgPCEtLSBCb29sZWFuIHZhcmlhYmxlcyB3aXRoIG1hdC1zbGlkZS10b2dnbGUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUudHlwZSA9PT0gJ2Jvb2xlYW4nXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMlwiIHN0eWxlPVwid2lkdGg6IGNhbGMoNTAlIC0gMTJweCk7XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgICB7eyB2YXJpYWJsZS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cInZhcmlhYmxlc0Zvcm0uZ2V0KHZhcmlhYmxlLm5hbWUpPy52YWx1ZSB8fCB2YXJpYWJsZS52YWx1ZSB8fCBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVmFyaWFibGVCb29sZWFuQ2hhbmdlKHZhcmlhYmxlLm5hbWUsICRldmVudC5jaGVja2VkKVwiXG4gICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDwhLS0gTm9uLWJvb2xlYW4sIG5vbi1jdXN0b21fY29kZSB2YXJpYWJsZXMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFyaWFibGUubmFtZSAhPT0gJ2N1c3RvbV9jb2RlJyAmJiB2YXJpYWJsZS50eXBlICE9PSAnYm9vbGVhbidcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIih2YXJpYWJsZS5uYW1lID09PSAndHlwZSd8fHZhcmlhYmxlLm5hbWUgPT09ICdzY3JvbGxUbycpOyBlbHNlIGRlZmF1bHRJbnB1dFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGNxYS1keW5hbWljLXNlbGVjdCBbZm9ybV09XCJ2YXJpYWJsZXNGb3JtXCIgW2NvbmZpZ109XCJnZXRTZWxlY3RDb25maWcodmFyaWFibGUpXCI+XG4gICAgICAgICAgICAgICAgICA8L2NxYS1keW5hbWljLXNlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHZhcmlhYmxlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJ2YXJpYWJsZS52YWx1ZVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblZhcmlhYmxlVmFsdWVDaGFuZ2UodmFyaWFibGUubmFtZSwgJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG5cbiAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2xcIiBzdHlsZT1cIndpZHRoOiBjYWxjKDUwJSAtIDEycHgpO1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LWdyYXktNzAwIGNxYS1tYi0xXCI+XG4gICAgICAgICAgICAgIEVsZW1lbnRzXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJtZXRhZGF0YSA9ICRldmVudFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gVGVzdCBEYXRhIC0tPlxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwid2lkdGg6IGNhbGMoNTAlIC0gMTJweCk7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgVGVzdCBEYXRhXG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGNxYS1jdXN0b20taW5wdXQgW3BsYWNlaG9sZGVyXT1cIidUZXh0IElucHV0J1wiIFt2YWx1ZV09XCJtZXRhZGF0YVwiIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJtZXRhZGF0YSA9ICRldmVudFwiPlxuICAgICAgICAgICAgPC9jcWEtY3VzdG9tLWlucHV0PlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZ2FwLTZcIj4gLS0+XG4gICAgICAgICAgPCEtLSBNZXRhZGF0YSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sXCIgc3R5bGU9XCJ3aWR0aDogY2FsYyg1MCUgLSAxMnB4KTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtbWItMVwiPlxuICAgICAgICAgICAgICBNZXRhZGF0YVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxjcWEtY3VzdG9tLWlucHV0IFtwbGFjZWhvbGRlcl09XCInVGV4dCBJbnB1dCdcIiBbdmFsdWVdPVwibWV0YWRhdGFcIiBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwibWV0YWRhdGEgPSAkZXZlbnRcIj5cbiAgICAgICAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRGVzY3JpcHRpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiIHN0eWxlPVwid2lkdGg6IGNhbGMoNTAlIC0gMTJweCk7XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtZ3JheS03MDAgY3FhLW1iLTFcIj5cbiAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1RleHQgSW5wdXQnXCIgW3ZhbHVlXT1cImRlc2NyaXB0aW9uXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRlc2NyaXB0aW9uID0gJGV2ZW50XCI+XG4gICAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgKEV4cGFuZGFibGUpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS13LWZ1bGxcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiAgY3FhLWdhcC0yIGNxYS10ZXh0LXNtIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1ncmF5LTcwMCBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci1ub25lIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtcC0wIGNxYS1tYi0xLjVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkdmFuY2VkKClcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEwcHhdXCI+QWR2YW5jZWQ8L3NwYW4+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjcWEtdGV4dC1iYXNlXCIgW2NsYXNzLmNxYS1yb3RhdGUtMTgwXT1cImFkdmFuY2VkRXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgZXhwYW5kX21vcmVcbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImFkdmFuY2VkRXhwYW5kZWRcIiBjbGFzcz1cImNxYS1tdC0yXCI+XG4gICAgICAgICAgICA8IS0tIEFkdmFuY2VkIGZpZWxkcyBjYW4gYmUgYWRkZWQgaGVyZSAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuXG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1nYXAtMiBjcWEtYm9yZGVyLXQgY3FhLWJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwib3V0bGluZWRcIiB0ZXh0PVwiQ2FuY2VsXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gY2xhc3M9XCJjcWEtdy0xLzJcIiB2YXJpYW50PVwiZmlsbGVkXCIgdGV4dD1cIkNyZWF0ZSBTdGVwXCIgW2N1c3RvbUNsYXNzXT1cIidjcWEtZmxleC0xIGNxYS13LWZ1bGwnXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0Zvcm1WYWxpZCgpXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DcmVhdGVTdGVwKClcIj5cbiAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
|