@decaf-ts/for-angular 0.0.11 → 0.0.13
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/package.json +19 -91
- package/LICENSE.md +0 -659
- package/dist/lib/README.md +0 -92
- package/dist/lib/assets/i18n/en.json +0 -140
- package/dist/lib/assets/images/angular-logo.svg +0 -45
- package/dist/lib/assets/images/decaf-logo-black.svg +0 -22
- package/dist/lib/assets/images/decaf-logo-lw.svg +0 -50
- package/dist/lib/assets/images/decaf-logo-white.svg +0 -22
- package/dist/lib/assets/images/decaf-logo.svg +0 -54
- package/dist/lib/components/component-renderer/component-renderer.component.d.ts +0 -276
- package/dist/lib/components/crud-field/crud-field.component.d.ts +0 -445
- package/dist/lib/components/crud-form/constants.d.ts +0 -5
- package/dist/lib/components/crud-form/crud-form.component.d.ts +0 -102
- package/dist/lib/components/crud-form/types.d.ts +0 -17
- package/dist/lib/components/empty-state/empty-state.component.d.ts +0 -301
- package/dist/lib/components/fieldset/fieldset.component.d.ts +0 -199
- package/dist/lib/components/filter/filter.component.d.ts +0 -505
- package/dist/lib/components/for-angular-components.module.d.ts +0 -20
- package/dist/lib/components/index.d.ts +0 -16
- package/dist/lib/components/layout/layout.component.d.ts +0 -133
- package/dist/lib/components/list/constants.d.ts +0 -29
- package/dist/lib/components/list/list.component.d.ts +0 -849
- package/dist/lib/components/list-item/list-item.component.d.ts +0 -390
- package/dist/lib/components/model-renderer/model-renderer.component.d.ts +0 -96
- package/dist/lib/components/pagination/constants.d.ts +0 -7
- package/dist/lib/components/pagination/pagination.component.d.ts +0 -264
- package/dist/lib/components/searchbar/searchbar.component.d.ts +0 -407
- package/dist/lib/directives/collapsable.directive.d.ts +0 -8
- package/dist/lib/directives/index.d.ts +0 -1
- package/dist/lib/engine/DynamicModule.d.ts +0 -17
- package/dist/lib/engine/NgxBaseComponent.d.ts +0 -541
- package/dist/lib/engine/NgxCrudFormField.d.ts +0 -118
- package/dist/lib/engine/NgxFormService.d.ts +0 -167
- package/dist/lib/engine/NgxRenderingEngine.d.ts +0 -127
- package/dist/lib/engine/NgxRenderingEngine2.d.ts +0 -250
- package/dist/lib/engine/ValidatorFactory.d.ts +0 -15
- package/dist/lib/engine/constants.d.ts +0 -151
- package/dist/lib/engine/decorators.d.ts +0 -25
- package/dist/lib/engine/index.d.ts +0 -16
- package/dist/lib/engine/types.d.ts +0 -381
- package/dist/lib/esm2022/components/component-renderer/component-renderer.component.mjs +0 -313
- package/dist/lib/esm2022/components/crud-field/crud-field.component.mjs +0 -301
- package/dist/lib/esm2022/components/crud-form/constants.mjs +0 -14
- package/dist/lib/esm2022/components/crud-form/crud-form.component.mjs +0 -139
- package/dist/lib/esm2022/components/crud-form/types.mjs +0 -2
- package/dist/lib/esm2022/components/empty-state/empty-state.component.mjs +0 -348
- package/dist/lib/esm2022/components/fieldset/fieldset.component.mjs +0 -225
- package/dist/lib/esm2022/components/filter/filter.component.mjs +0 -689
- package/dist/lib/esm2022/components/for-angular-components.module.mjs +0 -71
- package/dist/lib/esm2022/components/index.mjs +0 -20
- package/dist/lib/esm2022/components/layout/layout.component.mjs +0 -176
- package/dist/lib/esm2022/components/list/constants.mjs +0 -6
- package/dist/lib/esm2022/components/list/list.component.mjs +0 -1236
- package/dist/lib/esm2022/components/list-item/list-item.component.mjs +0 -408
- package/dist/lib/esm2022/components/model-renderer/model-renderer.component.mjs +0 -138
- package/dist/lib/esm2022/components/pagination/constants.mjs +0 -2
- package/dist/lib/esm2022/components/pagination/pagination.component.mjs +0 -323
- package/dist/lib/esm2022/components/searchbar/searchbar.component.mjs +0 -493
- package/dist/lib/esm2022/decaf-ts-for-angular.mjs +0 -5
- package/dist/lib/esm2022/directives/collapsable.directive.mjs +0 -28
- package/dist/lib/esm2022/directives/index.mjs +0 -2
- package/dist/lib/esm2022/engine/DynamicModule.mjs +0 -18
- package/dist/lib/esm2022/engine/NgxBaseComponent.mjs +0 -539
- package/dist/lib/esm2022/engine/NgxCrudFormField.mjs +0 -125
- package/dist/lib/esm2022/engine/NgxFormService.mjs +0 -315
- package/dist/lib/esm2022/engine/NgxRenderingEngine.mjs +0 -192
- package/dist/lib/esm2022/engine/NgxRenderingEngine2.mjs +0 -332
- package/dist/lib/esm2022/engine/ValidatorFactory.mjs +0 -102
- package/dist/lib/esm2022/engine/constants.mjs +0 -160
- package/dist/lib/esm2022/engine/decorators.mjs +0 -38
- package/dist/lib/esm2022/engine/index.mjs +0 -17
- package/dist/lib/esm2022/engine/types.mjs +0 -4
- package/dist/lib/esm2022/for-angular.module.mjs +0 -118
- package/dist/lib/esm2022/helpers/index.mjs +0 -13
- package/dist/lib/esm2022/helpers/utils.mjs +0 -415
- package/dist/lib/esm2022/interfaces.mjs +0 -2
- package/dist/lib/esm2022/public-apis.mjs +0 -14
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs +0 -7109
- package/dist/lib/fesm2022/decaf-ts-for-angular.mjs.map +0 -1
- package/dist/lib/for-angular.module.d.ts +0 -45
- package/dist/lib/helpers/index.d.ts +0 -12
- package/dist/lib/helpers/utils.d.ts +0 -253
- package/dist/lib/index.d.ts +0 -5
- package/dist/lib/interfaces.d.ts +0 -28
- package/dist/lib/public-apis.d.ts +0 -13
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { Component, ElementRef, EventEmitter, inject, Input, Output, ViewChild, } from '@angular/core';
|
|
3
|
-
import { Location } from '@angular/common';
|
|
4
|
-
import { NgxFormService } from '../../engine/NgxFormService';
|
|
5
|
-
import { Dynamic, EventConstants } from '../../engine';
|
|
6
|
-
import { OperationKeys } from '@decaf-ts/db-decorators';
|
|
7
|
-
import { DefaultFormReactiveOptions } from './constants';
|
|
8
|
-
import { ForAngularModule, getLogger } from '../../for-angular.module';
|
|
9
|
-
import { IonIcon } from '@ionic/angular/standalone';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@ionic/angular/standalone";
|
|
12
|
-
import * as i2 from "@angular/forms";
|
|
13
|
-
/**
|
|
14
|
-
* @component CrudFormComponent
|
|
15
|
-
* @example <ngx-decaf-crud-form
|
|
16
|
-
* action="create"
|
|
17
|
-
* operation="create"
|
|
18
|
-
* formGroup="formGroup"
|
|
19
|
-
* rendererId="rendererId"
|
|
20
|
-
* submitEvent="submitEvent"
|
|
21
|
-
* target="_self"
|
|
22
|
-
* method="event">
|
|
23
|
-
* </ngx-decaf-crud-form>
|
|
24
|
-
*
|
|
25
|
-
* @param {string} action - The action to be performed (create, read, update, delete)
|
|
26
|
-
* @param {CrudOperations} operation - The CRUD operation being performed (create, read, update, delete)
|
|
27
|
-
* @param {FormGroup} formGroup - The form group
|
|
28
|
-
* @param {string} rendererId - The renderer id
|
|
29
|
-
* @param {SubmitEvent} submitEvent - The submit event
|
|
30
|
-
* @param {string} target - The target
|
|
31
|
-
* @param {string} method - The method
|
|
32
|
-
*/
|
|
33
|
-
let CrudFormComponent = class CrudFormComponent {
|
|
34
|
-
constructor() {
|
|
35
|
-
this.updateOn = 'change';
|
|
36
|
-
this.target = '_self';
|
|
37
|
-
this.method = 'event';
|
|
38
|
-
this.submitEvent = new EventEmitter();
|
|
39
|
-
/**
|
|
40
|
-
* @description Angular Location service.
|
|
41
|
-
* @summary Injected service that provides access to the browser's URL and history.
|
|
42
|
-
* This service is used for interacting with the browser's history API, allowing
|
|
43
|
-
* for back navigation and URL manipulation outside of Angular's router.
|
|
44
|
-
*
|
|
45
|
-
* @private
|
|
46
|
-
* @type {Location}
|
|
47
|
-
* @memberOf CrudFormComponent
|
|
48
|
-
*/
|
|
49
|
-
this.location = inject(Location);
|
|
50
|
-
this.OperationKeys = OperationKeys;
|
|
51
|
-
}
|
|
52
|
-
// ngAfterViewInit() {
|
|
53
|
-
// if (![OperationKeys.READ, OperationKeys.DELETE].includes(this.operation))
|
|
54
|
-
// NgxFormService.formAfterViewInit(this, this.rendererId);
|
|
55
|
-
// }
|
|
56
|
-
async ngOnInit() {
|
|
57
|
-
if (!this.logger)
|
|
58
|
-
this.logger = getLogger(this);
|
|
59
|
-
if (this.operation === OperationKeys.READ || this.operation === OperationKeys.DELETE)
|
|
60
|
-
this.formGroup = undefined;
|
|
61
|
-
this.options = Object.assign({}, DefaultFormReactiveOptions, this.options || {});
|
|
62
|
-
}
|
|
63
|
-
ngOnDestroy() {
|
|
64
|
-
if (this.formGroup)
|
|
65
|
-
NgxFormService.unregister(this.formGroup);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* @param {SubmitEvent} event
|
|
69
|
-
*/
|
|
70
|
-
async submit(event) {
|
|
71
|
-
event.preventDefault();
|
|
72
|
-
event.stopImmediatePropagation();
|
|
73
|
-
event.stopPropagation();
|
|
74
|
-
if (!NgxFormService.validateFields(this.formGroup))
|
|
75
|
-
return false;
|
|
76
|
-
const data = NgxFormService.getFormData(this.formGroup);
|
|
77
|
-
this.submitEvent.emit({
|
|
78
|
-
data,
|
|
79
|
-
component: 'CrudFormComponent',
|
|
80
|
-
name: this.action || EventConstants.SUBMIT_EVENT,
|
|
81
|
-
handlers: this.handlers,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
handleReset() {
|
|
85
|
-
this.location.back();
|
|
86
|
-
// if(OperationKeys.DELETE !== this.operation)
|
|
87
|
-
// NgxFormService.reset(this.formGroup);
|
|
88
|
-
// else
|
|
89
|
-
// this.location.back();
|
|
90
|
-
}
|
|
91
|
-
handleDelete() {
|
|
92
|
-
this.submitEvent.emit({
|
|
93
|
-
data: this.uid,
|
|
94
|
-
component: 'CrudFormComponent',
|
|
95
|
-
name: EventConstants.SUBMIT_EVENT,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrudFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
99
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CrudFormComponent, isStandalone: true, selector: "ngx-decaf-crud-form", inputs: { model: "model", updateOn: "updateOn", target: "target", method: "method", options: "options", action: "action", operation: "operation", handlers: "handlers", formGroup: "formGroup", childOf: "childOf", rendererId: "rendererId", uid: "uid" }, outputs: { submitEvent: "submitEvent" }, viewQueries: [{ propertyName: "component", first: true, predicate: ["reactiveForm"], descendants: true, read: ElementRef }], ngImport: i0, template: "@if(operation !== 'read' && operation !== 'delete') {\n <form #reactiveForm [id]=\"rendererId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" novalidate [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div id=\"dcf-buttons-container\" class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{ action ? action : options.buttons.submit.text}}\n </ion-button>\n </div>\n <div>\n @if(options.buttons.clear) {\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['create', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" id=\"dcf-buttons-container\">\n\n @if(operation === 'delete' && uid) {\n <div>\n <ion-button\n (click)=\"handleDelete()\"\n color=\"danger\"\n type=\"button\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n Delete\n </ion-button>\n </div>\n\n }\n @if(operation === OperationKeys.CREATE || operation === OperationKeys.UPDATE) {\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n </div>\n }\n\n @if(options.buttons.clear) {\n <div>\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['delete', 'read', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n </div>\n\n }\n </div>\n}\n\n", styles: ["#dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 991px){#dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 990px){#dcf-buttons-container.dcf-flex div{width:100%}#dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
100
|
-
};
|
|
101
|
-
CrudFormComponent = __decorate([
|
|
102
|
-
Dynamic()
|
|
103
|
-
], CrudFormComponent);
|
|
104
|
-
export { CrudFormComponent };
|
|
105
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CrudFormComponent, decorators: [{
|
|
106
|
-
type: Component,
|
|
107
|
-
args: [{ standalone: true, selector: 'ngx-decaf-crud-form', imports: [ForAngularModule, IonIcon], template: "@if(operation !== 'read' && operation !== 'delete') {\n <form #reactiveForm [id]=\"rendererId\" [formGroup]=\"formGroup\" (submit)=\"submit($event)\" novalidate [target]=\"target\">\n <ng-content #formContent></ng-content>\n <div id=\"dcf-buttons-container\" class=\"dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{ action ? action : options.buttons.submit.text}}\n </ion-button>\n </div>\n <div>\n @if(options.buttons.clear) {\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['create', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n }\n </div>\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" id=\"dcf-buttons-container\">\n\n @if(operation === 'delete' && uid) {\n <div>\n <ion-button\n (click)=\"handleDelete()\"\n color=\"danger\"\n type=\"button\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n Delete\n </ion-button>\n </div>\n\n }\n @if(operation === OperationKeys.CREATE || operation === OperationKeys.UPDATE) {\n <div>\n <ion-button\n type=\"submit\">\n @if(options.buttons.submit.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.submit.iconSlot\" [name]=\"options.buttons.submit.icon\"></ion-icon>\n }\n {{options.buttons.submit.text}}\n </ion-button>\n </div>\n }\n\n @if(options.buttons.clear) {\n <div>\n <ion-button fill=\"clear\" (click)=\"handleReset()\">\n @if(options.buttons.clear?.icon) {\n <ion-icon aria-hidden=\"true\" [slot]=\"options.buttons.clear?.iconSlot\" [name]=\"options.buttons.clear?.icon\"></ion-icon>\n }\n {{ ['delete', 'read', 'update'].includes(operation) ? 'Back' : options.buttons.clear?.text}}\n </ion-button>\n </div>\n\n }\n </div>\n}\n\n", styles: ["#dcf-buttons-container{margin-top:1.8rem;margin-bottom:0}@media (min-width: 991px){#dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 990px){#dcf-buttons-container.dcf-flex div{width:100%}#dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}\n"] }]
|
|
108
|
-
}], propDecorators: { model: [{
|
|
109
|
-
type: Input
|
|
110
|
-
}], updateOn: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}], component: [{
|
|
113
|
-
type: ViewChild,
|
|
114
|
-
args: ['reactiveForm', { static: false, read: ElementRef }]
|
|
115
|
-
}], target: [{
|
|
116
|
-
type: Input
|
|
117
|
-
}], method: [{
|
|
118
|
-
type: Input
|
|
119
|
-
}], options: [{
|
|
120
|
-
type: Input
|
|
121
|
-
}], action: [{
|
|
122
|
-
type: Input
|
|
123
|
-
}], operation: [{
|
|
124
|
-
type: Input,
|
|
125
|
-
args: [{ required: true }]
|
|
126
|
-
}], handlers: [{
|
|
127
|
-
type: Input
|
|
128
|
-
}], formGroup: [{
|
|
129
|
-
type: Input
|
|
130
|
-
}], childOf: [{
|
|
131
|
-
type: Input
|
|
132
|
-
}], rendererId: [{
|
|
133
|
-
type: Input
|
|
134
|
-
}], uid: [{
|
|
135
|
-
type: Input
|
|
136
|
-
}], submitEvent: [{
|
|
137
|
-
type: Output
|
|
138
|
-
}] } });
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUczQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFpQixPQUFPLEVBQUUsY0FBYyxFQUFrRCxNQUFNLGNBQWMsQ0FBQztBQUV0SCxPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBS3BEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBU0ksSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBaUI7SUFBdkI7UUFhTCxhQUFRLEdBQW9CLFFBQVEsQ0FBQztRQU1yQyxXQUFNLEdBQW1CLE9BQU8sQ0FBQztRQUdqQyxXQUFNLEdBQTZCLE9BQU8sQ0FBQztRQTBDM0MsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQWtCaEQ7Ozs7Ozs7OztXQVNHO1FBQ0ssYUFBUSxHQUFhLE1BQU0sQ0FBQyxR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TixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFXTixHQUFHO3NCQURGLEtBQUs7Z0JBS04sV0FBVztzQkFEVixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4Rm9ybVNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1FdmVudCwgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEZpZWxkVXBkYXRlTW9kZSwgSFRNTEZvcm1UYXJnZXQsIFJlbmRlcmVkTW9kZWwgfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1PcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IERlZmF1bHRGb3JtUmVhY3RpdmVPcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRm9yQW5ndWxhck1vZHVsZSwgZ2V0TG9nZ2VyIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BkZWNhZi10cy9sb2dnaW5nJztcblxuXG4vKipcbiAqIEBjb21wb25lbnQgQ3J1ZEZvcm1Db21wb25lbnRcbiAqIEBleGFtcGxlIDxuZ3gtZGVjYWYtY3J1ZC1mb3JtXG4gKiAgIGFjdGlvbj1cImNyZWF0ZVwiXG4gKiAgIG9wZXJhdGlvbj1cImNyZWF0ZVwiXG4gKiAgIGZvcm1Hcm91cD1cImZvcm1Hcm91cFwiXG4gKiAgIHJlbmRlcmVySWQ9XCJyZW5kZXJlcklkXCJcbiAqICAgc3VibWl0RXZlbnQ9XCJzdWJtaXRFdmVudFwiXG4gKiAgIHRhcmdldD1cIl9zZWxmXCJcbiAqICAgbWV0aG9kPVwiZXZlbnRcIj5cbiAqIDwvbmd4LWRlY2FmLWNydWQtZm9ybT5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcGVyYXRpb24gLSBUaGUgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBmb3JtIGdyb3VwXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVuZGVyZXJJZCAtIFRoZSByZW5kZXJlciBpZFxuICogQHBhcmFtIHtTdWJtaXRFdmVudH0gc3VibWl0RXZlbnQgLSBUaGUgc3VibWl0IGV2ZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFyZ2V0IC0gVGhlIHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIFRoZSBtZXRob2RcbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWNydWQtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jcnVkLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jcnVkLWZvcm0uY29tcG9uZW50LnNjc3MnXSxcbiAgaW1wb3J0czogW0ZvckFuZ3VsYXJNb2R1bGUsIElvbkljb25dLFxufSlcbmV4cG9ydCBjbGFzcyBDcnVkRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRm9ybUVsZW1lbnQsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgQElucHV0KClcbiAgbW9kZWwhOiBNb2RlbCB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICB1cGRhdGVPbjogRmllbGRVcGRhdGVNb2RlID0gJ2NoYW5nZSc7XG5cbiAgQFZpZXdDaGlsZCgncmVhY3RpdmVGb3JtJywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgdGFyZ2V0OiBIVE1MRm9ybVRhcmdldCA9ICdfc2VsZic7XG5cbiAgQElucHV0KClcbiAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdldmVudCcgPSAnZXZlbnQnO1xuXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnMhOiBDcnVkRm9ybU9wdGlvbnM7XG5cbiAgQElucHV0KClcbiAgYWN0aW9uPzogc3RyaW5nO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4+O1xuXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdGggdG8gdGhlIHBhcmVudCBGb3JtR3JvdXAsIGlmIG5lc3RlZC5cbiAgICogQHN1bW1hcnkgRnVsbCBkb3QtZGVsaW1pdGVkIHBhdGggb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAuIFNldCBvbmx5IHdoZW4gaXMgcGFydCBvZiBhIG5lc3RlZCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2hpbGRPZj86IHN0cmluZztcblxuICBASW5wdXQoKVxuICByZW5kZXJlcklkITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZC5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkIGJlaW5nIGRpc3BsYXllZCBvciBtYW5pcHVsYXRlZC5cbiAgICogVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmltYXJ5IGtleSBmb3Igb3BlcmF0aW9ucyBvbiBzcGVjaWZpYyByZWNvcmRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgbnVtYmVyfVxuICAgKi9cbiAgQElucHV0KClcbiAgdWlkITogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG5cbiAgQE91dHB1dCgpXG4gIHN1Ym1pdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDcnVkRm9ybUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgY29tcG9uZW50LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBsb2dnaW5nIGNhcGFiaWxpdGllcyBmb3IgdGhlIGNvbXBvbmVudCwgYWxsb3dpbmcgZm9yIGNvbnNpc3RlbnRcbiAgICogYW5kIHN0cnVjdHVyZWQgbG9nZ2luZyBvZiBpbmZvcm1hdGlvbiwgd2FybmluZ3MsIGFuZCBlcnJvcnMuIFRoaXMgbG9nZ2VyIGlzIGluaXRpYWxpemVkXG4gICAqIGluIHRoZSBuZ09uSW5pdCBtZXRob2QgdXNpbmcgdGhlIGdldExvZ2dlciBmdW5jdGlvbiBmcm9tIHRoZSBGb3JBbmd1bGFyTW9kdWxlLlxuICAgKlxuICAgKiBUaGUgbG9nZ2VyIGlzIHVzZWQgdGhyb3VnaG91dCB0aGUgY29tcG9uZW50IHRvIHJlY29yZCBpbXBvcnRhbnQgZXZlbnRzLCBkZWJ1ZyBpbmZvcm1hdGlvbixcbiAgICogYW5kIHBvdGVudGlhbCBpc3N1ZXMuIEl0IGhlbHBzIGluIG1vbml0b3JpbmcgdGhlIGNvbXBvbmVudCdzIGJlaGF2aW9yLCB0cmFja2luZyB0aGUgZmxvd1xuICAgKiBvZiBvcGVyYXRpb25zLCBhbmQgZmFjaWxpdGF0aW5nIGVhc2llciBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLlxuICAgKlxuICAgKiBAdHlwZSB7TG9nZ2VyfVxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgbG9nZ2VyITogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBMb2NhdGlvbiBzZXJ2aWNlLlxuICAgKiBAc3VtbWFyeSBJbmplY3RlZCBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBicm93c2VyJ3MgVVJMIGFuZCBoaXN0b3J5LlxuICAgKiBUaGlzIHNlcnZpY2UgaXMgdXNlZCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYnJvd3NlcidzIGhpc3RvcnkgQVBJLCBhbGxvd2luZ1xuICAgKiBmb3IgYmFjayBuYXZpZ2F0aW9uIGFuZCBVUkwgbWFuaXB1bGF0aW9uIG91dHNpZGUgb2YgQW5ndWxhcidzIHJvdXRlci5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uID0gaW5qZWN0KExvY2F0aW9uKTtcblxuICAvLyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gaWYgKCFbT3BlcmF0aW9uS2V5cy5SRUFELCBPcGVyYXRpb25LZXlzLkRFTEVURV0uaW5jbHVkZXModGhpcy5vcGVyYXRpb24pKVxuICAgIC8vICAgTmd4Rm9ybVNlcnZpY2UuZm9ybUFmdGVyVmlld0luaXQodGhpcywgdGhpcy5yZW5kZXJlcklkKTtcbiAgLy8gfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5sb2dnZXIpXG4gICAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcih0aGlzKTtcbiAgICBpZiAodGhpcy5vcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuUkVBRCB8fCB0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpXG4gICAgICB0aGlzLmZvcm1Hcm91cCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9ucyxcbiAgICAgIHRoaXMub3B0aW9ucyB8fCB7fSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwKVxuICAgICAgTmd4Rm9ybVNlcnZpY2UudW5yZWdpc3Rlcih0aGlzLmZvcm1Hcm91cCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtICB7U3VibWl0RXZlbnR9IGV2ZW50XG4gICAqL1xuICBhc3luYyBzdWJtaXQoZXZlbnQ6IFN1Ym1pdEV2ZW50KTogUHJvbWlzZTxib29sZWFuIHwgdm9pZD4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoIU5neEZvcm1TZXJ2aWNlLnZhbGlkYXRlRmllbGRzKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBkYXRhID0gTmd4Rm9ybVNlcnZpY2UuZ2V0Rm9ybURhdGEodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQoe1xuICAgICAgZGF0YSxcbiAgICAgIGNvbXBvbmVudDogJ0NydWRGb3JtQ29tcG9uZW50JyxcbiAgICAgIG5hbWU6IHRoaXMuYWN0aW9uIHx8IEV2ZW50Q29uc3RhbnRzLlNVQk1JVF9FVkVOVCxcbiAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgaGFuZGxlUmVzZXQoKSB7XG4gICAgdGhpcy5sb2NhdGlvbi5iYWNrKCk7XG4gICAgLy8gaWYoT3BlcmF0aW9uS2V5cy5ERUxFVEUgIT09IHRoaXMub3BlcmF0aW9uKVxuICAgIC8vICAgTmd4Rm9ybVNlcnZpY2UucmVzZXQodGhpcy5mb3JtR3JvdXApO1xuICAgIC8vIGVsc2VcbiAgICAvLyAgIHRoaXMubG9jYXRpb24uYmFjaygpO1xuICB9XG5cbiAgaGFuZGxlRGVsZXRlKCkge1xuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh7XG4gICAgICBkYXRhOiB0aGlzLnVpZCxcbiAgICAgIGNvbXBvbmVudDogJ0NydWRGb3JtQ29tcG9uZW50JyxcbiAgICAgIG5hbWU6IEV2ZW50Q29uc3RhbnRzLlNVQk1JVF9FVkVOVCxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBPcGVyYXRpb25LZXlzID0gT3BlcmF0aW9uS2V5cztcbn1cbiIsIkBpZihvcGVyYXRpb24gIT09ICdyZWFkJyAmJiBvcGVyYXRpb24gIT09ICdkZWxldGUnKSB7XG4gIDxmb3JtICNyZWFjdGl2ZUZvcm0gW2lkXT1cInJlbmRlcmVySWRcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChzdWJtaXQpPVwic3VibWl0KCRldmVudClcIiBub3ZhbGlkYXRlIFt0YXJnZXRdPVwidGFyZ2V0XCI+XG4gICAgPG5nLWNvbnRlbnQgI2Zvcm1Db250ZW50PjwvbmctY29udGVudD5cbiAgICA8ZGl2IGlkPVwiZGNmLWJ1dHRvbnMtY29udGFpbmVyXCIgY2xhc3M9XCJkY2YtZ3JpZCBkY2YtZ3JpZC1jb2xsYXBzZSBkY2YtZmxleCBkY2YtZmxleC1sZWZ0XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3Nsb3RdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uU2xvdFwiIFtuYW1lXT1cIm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIHt7IGFjdGlvbiA/IGFjdGlvbiA6IG9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudGV4dH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwiaGFuZGxlUmVzZXQoKVwiPlxuICAgICAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uICBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB7eyBbJ2NyZWF0ZScsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pID8gJ0JhY2snIDogb3B0aW9ucy5idXR0b25zLmNsZWFyPy50ZXh0fX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG59IEBlbHNlIHtcbiAgPGRpdiBbY2xhc3NdPVwiJ2RjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LWxlZnQgJyArIG9wZXJhdGlvblwiIGlkPVwiZGNmLWJ1dHRvbnMtY29udGFpbmVyXCI+XG5cbiAgICBAaWYob3BlcmF0aW9uID09PSAnZGVsZXRlJyAmJiB1aWQpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgKGNsaWNrKT1cImhhbmRsZURlbGV0ZSgpXCJcbiAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgRGVsZXRlXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgfVxuICAgIEBpZihvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFIHx8IG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpIHtcbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgdHlwZT1cInN1Ym1pdFwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge3tvcHRpb25zLmJ1dHRvbnMuc3VibWl0LnRleHR9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICBAaWYob3B0aW9ucy5idXR0b25zLmNsZWFyKSB7XG4gICAgICA8ZGl2PlxuICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIChjbGljayk9XCJoYW5kbGVSZXNldCgpXCI+XG4gICAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvbikge1xuICAgICAgICAgICAgPGlvbi1pY29uICBhcmlhLWhpZGRlbj1cInRydWVcIiBbc2xvdF09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25TbG90XCIgW25hbWVdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uXCI+PC9pb24taWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgICAge3sgWydkZWxldGUnLCAncmVhZCcsICd1cGRhdGUnXS5pbmNsdWRlcyhvcGVyYXRpb24pID8gJ0JhY2snIDogb3B0aW9ucy5idXR0b25zLmNsZWFyPy50ZXh0fX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICB9XG4gIDwvZGl2PlxufVxuXG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC1mb3JtL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEZvcm1SZWFjdGl2ZVN1Ym1pdEV2ZW50IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3J1ZEZvcm1PcHRpb25zIHtcbiAgYnV0dG9uczoge1xuICAgIHN1Ym1pdDoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICAgIGNsZWFyPzoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuIl19
|
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { Component, inject, Input } from '@angular/core';
|
|
3
|
-
import { IonCard, IonCardContent, IonIcon, IonTitle, NavController } from '@ionic/angular/standalone';
|
|
4
|
-
import * as allIcons from 'ionicons/icons';
|
|
5
|
-
import { addIcons } from 'ionicons';
|
|
6
|
-
import { ForAngularModule } from '../../for-angular.module';
|
|
7
|
-
import { Dynamic } from '../../engine';
|
|
8
|
-
import { stringToBoolean } from '../../helpers';
|
|
9
|
-
import { NgxBaseComponent } from '../../engine/NgxBaseComponent';
|
|
10
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
11
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@ionic/angular/standalone";
|
|
14
|
-
import * as i2 from "@angular/common";
|
|
15
|
-
/**
|
|
16
|
-
* @description Component for displaying empty state messages with optional actions.
|
|
17
|
-
* @summary This component provides a standardized way to display empty state messages
|
|
18
|
-
* when no data is available or when a user needs to take an action to populate content.
|
|
19
|
-
* It includes customizable title, subtitle, icon, and action button elements that can be
|
|
20
|
-
* styled and configured through input properties. The component supports localization
|
|
21
|
-
* and can trigger navigation or custom actions when the button is clicked.
|
|
22
|
-
*
|
|
23
|
-
* @mermaid
|
|
24
|
-
* classDiagram
|
|
25
|
-
* class EmptyStateComponent {
|
|
26
|
-
* +string title
|
|
27
|
-
* +string titleColor
|
|
28
|
-
* +string subtitle
|
|
29
|
-
* +string subtitleColor
|
|
30
|
-
* +StringOrBoolean showIcon
|
|
31
|
-
* +string icon
|
|
32
|
-
* +string iconSize
|
|
33
|
-
* +PredefinedColors iconColor
|
|
34
|
-
* +string|Function buttonLink
|
|
35
|
-
* +string buttonText
|
|
36
|
-
* +string buttonFill
|
|
37
|
-
* +Color buttonColor
|
|
38
|
-
* +string buttonSize
|
|
39
|
-
* +string searchValue
|
|
40
|
-
* -NavController navController
|
|
41
|
-
* +ngOnInit()
|
|
42
|
-
* +handleClick()
|
|
43
|
-
* }
|
|
44
|
-
* EmptyStateComponent --|> NgxBaseComponent
|
|
45
|
-
* EmptyStateComponent --|> OnInit
|
|
46
|
-
*
|
|
47
|
-
* @extends {NgxBaseComponent}
|
|
48
|
-
* @implements {OnInit}
|
|
49
|
-
*/
|
|
50
|
-
let EmptyStateComponent = class EmptyStateComponent extends NgxBaseComponent {
|
|
51
|
-
/**
|
|
52
|
-
* @description Creates an instance of EmptyStateComponent.
|
|
53
|
-
* @summary Initializes a new EmptyStateComponent by calling the parent class constructor
|
|
54
|
-
* with the component name for logging and identification purposes. This component provides
|
|
55
|
-
* a standardized way to display empty state messages with optional icons and action buttons.
|
|
56
|
-
*
|
|
57
|
-
* @memberOf EmptyStateComponent
|
|
58
|
-
*/
|
|
59
|
-
constructor() {
|
|
60
|
-
super("EmptyStateComponent");
|
|
61
|
-
/**
|
|
62
|
-
* @description The main title displayed in the empty state.
|
|
63
|
-
* @summary Specifies the primary message to show in the empty state component.
|
|
64
|
-
* This text is typically used to inform the user about why they're seeing an empty view.
|
|
65
|
-
* If translatable is true, this will be processed through the localization system.
|
|
66
|
-
*
|
|
67
|
-
* @type {string}
|
|
68
|
-
* @default "title"
|
|
69
|
-
* @memberOf EmptyStateComponent
|
|
70
|
-
*/
|
|
71
|
-
this.title = "title";
|
|
72
|
-
/**
|
|
73
|
-
* @description The color of the title text.
|
|
74
|
-
* @summary Specifies the color for the title text using the application's color system.
|
|
75
|
-
* The value should correspond to a color variable defined in the application's theme.
|
|
76
|
-
* The component will automatically prefix this with "color-" to create the CSS class.
|
|
77
|
-
*
|
|
78
|
-
* @type {string}
|
|
79
|
-
* @default 'gray-6'
|
|
80
|
-
* @memberOf EmptyStateComponent
|
|
81
|
-
*/
|
|
82
|
-
this.titleColor = 'gray-6';
|
|
83
|
-
/**
|
|
84
|
-
* @description The secondary message displayed in the empty state.
|
|
85
|
-
* @summary Provides additional context or instructions below the main title.
|
|
86
|
-
* This text is typically used to guide the user on what actions they can take.
|
|
87
|
-
* If translatable is true, this will be processed through the localization system.
|
|
88
|
-
*
|
|
89
|
-
* @type {string | undefined}
|
|
90
|
-
* @memberOf EmptyStateComponent
|
|
91
|
-
*/
|
|
92
|
-
this.subtitle = "";
|
|
93
|
-
/**
|
|
94
|
-
* @description The color of the subtitle text.
|
|
95
|
-
* @summary Specifies the color for the subtitle text using the application's color system.
|
|
96
|
-
* The value should correspond to a color variable defined in the application's theme.
|
|
97
|
-
* The component will automatically prefix this with "color-" to create the CSS class.
|
|
98
|
-
*
|
|
99
|
-
* @type {string}
|
|
100
|
-
* @default 'gray-4'
|
|
101
|
-
* @memberOf EmptyStateComponent
|
|
102
|
-
*/
|
|
103
|
-
this.subtitleColor = 'gray-4';
|
|
104
|
-
/**
|
|
105
|
-
* @description Controls whether the icon is displayed.
|
|
106
|
-
* @summary Determines if the visual icon should be shown in the empty state.
|
|
107
|
-
* This can be provided as a boolean or a string that will be converted to a boolean.
|
|
108
|
-
* Icons help visually communicate the empty state context to users.
|
|
109
|
-
*
|
|
110
|
-
* @type {StringOrBoolean}
|
|
111
|
-
* @default true
|
|
112
|
-
* @memberOf EmptyStateComponent
|
|
113
|
-
*/
|
|
114
|
-
this.showIcon = true;
|
|
115
|
-
/**
|
|
116
|
-
* @description The name of the icon to display.
|
|
117
|
-
* @summary Specifies which icon to show when showIcon is true.
|
|
118
|
-
* The component uses the icon system defined in the application,
|
|
119
|
-
* and this value should correspond to an available icon name.
|
|
120
|
-
*
|
|
121
|
-
* @type {string}
|
|
122
|
-
* @default "ti-info-square-rounded"
|
|
123
|
-
* @memberOf EmptyStateComponent
|
|
124
|
-
*/
|
|
125
|
-
this.icon = "ti-info-square-rounded";
|
|
126
|
-
/**
|
|
127
|
-
* @description The size of the displayed icon.
|
|
128
|
-
* @summary Controls the size of the icon shown in the empty state.
|
|
129
|
-
* Can be either 'large' or 'small' to accommodate different layout needs.
|
|
130
|
-
*
|
|
131
|
-
* @type {'large' | 'small' | undefined}
|
|
132
|
-
* @default 'large'
|
|
133
|
-
* @memberOf EmptyStateComponent
|
|
134
|
-
*/
|
|
135
|
-
this.iconSize = 'large';
|
|
136
|
-
/**
|
|
137
|
-
* @description The color of the displayed icon.
|
|
138
|
-
* @summary Specifies the color for the icon using Ionic's predefined color system.
|
|
139
|
-
* This allows the icon to match the application's color scheme.
|
|
140
|
-
*
|
|
141
|
-
* @type {PredefinedColors | undefined}
|
|
142
|
-
* @default 'medium'
|
|
143
|
-
* @memberOf EmptyStateComponent
|
|
144
|
-
*/
|
|
145
|
-
this.iconColor = 'medium';
|
|
146
|
-
/**
|
|
147
|
-
* @description The fill style of the action button.
|
|
148
|
-
* @summary Controls the visual style of the button using Ionic's button fill options.
|
|
149
|
-
* 'solid' creates a button with a solid background, 'outline' creates a button with
|
|
150
|
-
* just a border, and 'clear' creates a button with no background or border.
|
|
151
|
-
*
|
|
152
|
-
* @type {'clear' | 'solid' | 'outline'}
|
|
153
|
-
* @default 'solid'
|
|
154
|
-
* @memberOf EmptyStateComponent
|
|
155
|
-
*/
|
|
156
|
-
this.buttonFill = 'solid';
|
|
157
|
-
/**
|
|
158
|
-
* @description The color of the action button.
|
|
159
|
-
* @summary Specifies the color for the button using Ionic's color system.
|
|
160
|
-
* This allows the button to match the application's color scheme.
|
|
161
|
-
*
|
|
162
|
-
* @type {Color}
|
|
163
|
-
* @default 'primary'
|
|
164
|
-
* @memberOf EmptyStateComponent
|
|
165
|
-
*/
|
|
166
|
-
this.buttonColor = 'primary';
|
|
167
|
-
/**
|
|
168
|
-
* @description The size of the action button.
|
|
169
|
-
* @summary Controls the size of the button shown in the empty state.
|
|
170
|
-
* Can be 'large', 'small', or 'default' to accommodate different layout needs.
|
|
171
|
-
*
|
|
172
|
-
* @type {'large' | 'small' | 'default'}
|
|
173
|
-
* @default 'default'
|
|
174
|
-
* @memberOf EmptyStateComponent
|
|
175
|
-
*/
|
|
176
|
-
this.buttonSize = 'default';
|
|
177
|
-
/**
|
|
178
|
-
* @description Service for handling navigation operations.
|
|
179
|
-
* @summary Injected service that provides methods for navigating between routes.
|
|
180
|
-
* This service is used when the buttonLink is a string URL to navigate to that location.
|
|
181
|
-
*
|
|
182
|
-
* @private
|
|
183
|
-
* @type {NavController}
|
|
184
|
-
* @memberOf EmptyStateComponent
|
|
185
|
-
*/
|
|
186
|
-
this.navController = inject(NavController);
|
|
187
|
-
this.sanitizer = inject(DomSanitizer);
|
|
188
|
-
this.translate = inject(TranslateService);
|
|
189
|
-
addIcons(allIcons);
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* @description Initializes the component after Angular first displays the data-bound properties.
|
|
193
|
-
* @summary Sets up the component by processing boolean inputs, applying localization to text
|
|
194
|
-
* elements if translation is enabled, and formatting CSS classes for title and subtitle colors.
|
|
195
|
-
* This method prepares the component for user interaction by ensuring all properties are
|
|
196
|
-
* properly initialized and localized.
|
|
197
|
-
*
|
|
198
|
-
* @mermaid
|
|
199
|
-
* sequenceDiagram
|
|
200
|
-
* participant A as Angular Lifecycle
|
|
201
|
-
* participant E as EmptyStateComponent
|
|
202
|
-
*
|
|
203
|
-
* A->>E: ngOnInit()
|
|
204
|
-
* E->>E: Process translatable flag
|
|
205
|
-
* E->>E: Process showIcon flag
|
|
206
|
-
* E->>E: Get locale settings
|
|
207
|
-
* alt translatable is true
|
|
208
|
-
* E->>E: Localize title
|
|
209
|
-
* E->>E: Localize subtitle
|
|
210
|
-
* E->>E: Localize buttonText
|
|
211
|
-
* end
|
|
212
|
-
* E->>E: Format title CSS class
|
|
213
|
-
* E->>E: Format subtitle CSS class
|
|
214
|
-
*
|
|
215
|
-
* @return {Promise<void>}
|
|
216
|
-
* @memberOf EmptyStateComponent
|
|
217
|
-
*/
|
|
218
|
-
async ngOnInit() {
|
|
219
|
-
this.parseProps(this);
|
|
220
|
-
this.translatable = stringToBoolean(this.translatable);
|
|
221
|
-
this.showIcon = stringToBoolean(this.showIcon);
|
|
222
|
-
this.locale = this.getLocale(this.translatable);
|
|
223
|
-
// if(this.translatable) {
|
|
224
|
-
// this.title = generateLocaleFromString(this.locale, this.title);
|
|
225
|
-
// this.subtitle = generateLocaleFromString(this.locale, this.subtitle);
|
|
226
|
-
// this.buttonText = generateLocaleFromString(this.locale, this.buttonText);
|
|
227
|
-
// }
|
|
228
|
-
this.titleColor = `dcf-title color-${this.titleColor}`;
|
|
229
|
-
this.subtitleColor = `dcf-subtitle color-${this.titleColor}`;
|
|
230
|
-
if (this.searchValue && this.translatable)
|
|
231
|
-
this.searchSubtitle = await this.getSearchSubtitle(this.subtitle);
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* @description Handles click events on the action button.
|
|
235
|
-
* @summary This method is triggered when the user clicks the action button in the empty state
|
|
236
|
-
* component. It supports three navigation patterns: 1) no action when buttonLink is not provided,
|
|
237
|
-
* 2) custom function execution when buttonLink is a function, and 3) navigation to a specific URL
|
|
238
|
-
* when buttonLink is a string. This flexibility allows the empty state to trigger various actions
|
|
239
|
-
* based on the context in which it's used.
|
|
240
|
-
*
|
|
241
|
-
* @mermaid
|
|
242
|
-
* sequenceDiagram
|
|
243
|
-
* participant U as User
|
|
244
|
-
* participant E as EmptyStateComponent
|
|
245
|
-
* participant N as NavController
|
|
246
|
-
*
|
|
247
|
-
* U->>E: Click action button
|
|
248
|
-
* E->>E: handleClick()
|
|
249
|
-
* alt buttonLink is not provided
|
|
250
|
-
* E-->>U: Return false (no action)
|
|
251
|
-
* else buttonLink is a function
|
|
252
|
-
* E->>E: Execute buttonLink function
|
|
253
|
-
* E-->>U: Return function result
|
|
254
|
-
* else buttonLink is a URL string
|
|
255
|
-
* E->>N: navigateForward(buttonLink)
|
|
256
|
-
* N-->>E: Return navigation result
|
|
257
|
-
* E-->>U: Return navigation result
|
|
258
|
-
* end
|
|
259
|
-
*
|
|
260
|
-
* @return {boolean | void | Promise<boolean>}
|
|
261
|
-
* - false if no action is taken
|
|
262
|
-
* - The result of the buttonLink function if it's a function
|
|
263
|
-
* - A Promise resolving to the navigation result if buttonLink is a URL
|
|
264
|
-
* @memberOf EmptyStateComponent
|
|
265
|
-
*/
|
|
266
|
-
handleClick() {
|
|
267
|
-
const fn = this.buttonLink;
|
|
268
|
-
if (!fn)
|
|
269
|
-
return false;
|
|
270
|
-
if (fn instanceof Function)
|
|
271
|
-
return fn();
|
|
272
|
-
return this.navController.navigateForward(fn);
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* @description Generates a localized and sanitized subtitle for search results.
|
|
276
|
-
* @summary This method takes a content string, typically the subtitle, and processes it
|
|
277
|
-
* through the translation service. It replaces a placeholder ('value0') with the actual
|
|
278
|
-
* search value, then sanitizes the result to safely use as HTML. This is particularly
|
|
279
|
-
* useful for displaying dynamic, localized messages in the empty state when a search
|
|
280
|
-
* yields no results.
|
|
281
|
-
*
|
|
282
|
-
* @param {string} content - The content string to be translated and processed
|
|
283
|
-
* @return {Promise<SafeHtml>} A promise that resolves to a sanitized HTML string
|
|
284
|
-
*
|
|
285
|
-
* @mermaid
|
|
286
|
-
* sequenceDiagram
|
|
287
|
-
* participant E as EmptyStateComponent
|
|
288
|
-
* participant T as TranslateService
|
|
289
|
-
* participant S as DomSanitizer
|
|
290
|
-
*
|
|
291
|
-
* E->>T: instant(content, {'value0': searchValue})
|
|
292
|
-
* T-->>E: Return translated string
|
|
293
|
-
* E->>S: bypassSecurityTrustHtml(translatedString)
|
|
294
|
-
* S-->>E: Return sanitized SafeHtml
|
|
295
|
-
*
|
|
296
|
-
* @memberOf EmptyStateComponent
|
|
297
|
-
*/
|
|
298
|
-
async getSearchSubtitle(content) {
|
|
299
|
-
const result = await this.translate.instant(content, { 'value0': this.searchValue });
|
|
300
|
-
return this.sanitizer.bypassSecurityTrustHtml(result);
|
|
301
|
-
}
|
|
302
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EmptyStateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
303
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: EmptyStateComponent, isStandalone: true, selector: "ngx-decaf-empty-state", inputs: { title: "title", titleColor: "titleColor", subtitle: "subtitle", subtitleColor: "subtitleColor", showIcon: "showIcon", icon: "icon", iconSize: "iconSize", iconColor: "iconColor", buttonLink: "buttonLink", buttonText: "buttonText", buttonFill: "buttonFill", buttonColor: "buttonColor", buttonSize: "buttonSize", searchValue: "searchValue" }, usesInheritance: true, ngImport: i0, template: "\n<ion-card id=\"dcf-card-empty-state\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--ion-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
304
|
-
};
|
|
305
|
-
EmptyStateComponent = __decorate([
|
|
306
|
-
Dynamic(),
|
|
307
|
-
__metadata("design:paramtypes", [])
|
|
308
|
-
], EmptyStateComponent);
|
|
309
|
-
export { EmptyStateComponent };
|
|
310
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EmptyStateComponent, decorators: [{
|
|
311
|
-
type: Component,
|
|
312
|
-
args: [{ selector: 'ngx-decaf-empty-state', standalone: true, imports: [
|
|
313
|
-
ForAngularModule,
|
|
314
|
-
IonCard,
|
|
315
|
-
IonCardContent,
|
|
316
|
-
IonTitle,
|
|
317
|
-
IonIcon
|
|
318
|
-
], template: "\n<ion-card id=\"dcf-card-empty-state\" [ngClass]=\"className\">\n <ion-card-content>\n @if(icon && showIcon) {\n <div class=\"dcf-icon-container\">\n <ion-icon\n name=\"alert-circle-outline\"\n size=\"large\"\n color=\"danger\"\n />\n </div>\n }\n @if(title) {\n <h5 [class]=\"titleColor\" [innerHTML]=\"title\"></h5>\n }\n @if(subtitle) {\n @if(!searchValue) {\n <p [class]=\"subtitleColor\" [innerHTML]=\"subtitle\"></p>\n } @else {\n <p [class]=\"subtitleColor\" [innerHTML]=\"searchSubtitle\"></p>\n }\n }\n @if(buttonLink && buttonText) {\n <div>\n <ion-button\n [size]=\"buttonSize\"\n [fill]=\"buttonFill\"\n [color]=\"buttonColor\"\n (click)=\"handleClick()\">\n {{ buttonText }}\n </ion-button>\n </div>\n }\n </ion-card-content>\n</ion-card>\n", styles: ["ion-card{text-align:center}ion-card ion-button{margin-top:.75rem}ion-card ion-icon{font-size:2.5rem}ion-card .dcf-icon-container{transform:scale(1.25);opacity:.75;margin-top:1.25rem!important;margin-bottom:.5rem!important}ion-card .dcf-ititle{font-weight:600!important;color:var(--ion-color-gray-6)!important}ion-card .dcf-isubtitle{font-weight:500!important}\n"] }]
|
|
319
|
-
}], ctorParameters: () => [], propDecorators: { title: [{
|
|
320
|
-
type: Input
|
|
321
|
-
}], titleColor: [{
|
|
322
|
-
type: Input
|
|
323
|
-
}], subtitle: [{
|
|
324
|
-
type: Input
|
|
325
|
-
}], subtitleColor: [{
|
|
326
|
-
type: Input
|
|
327
|
-
}], showIcon: [{
|
|
328
|
-
type: Input
|
|
329
|
-
}], icon: [{
|
|
330
|
-
type: Input
|
|
331
|
-
}], iconSize: [{
|
|
332
|
-
type: Input
|
|
333
|
-
}], iconColor: [{
|
|
334
|
-
type: Input
|
|
335
|
-
}], buttonLink: [{
|
|
336
|
-
type: Input
|
|
337
|
-
}], buttonText: [{
|
|
338
|
-
type: Input
|
|
339
|
-
}], buttonFill: [{
|
|
340
|
-
type: Input
|
|
341
|
-
}], buttonColor: [{
|
|
342
|
-
type: Input
|
|
343
|
-
}], buttonSize: [{
|
|
344
|
-
type: Input
|
|
345
|
-
}], searchValue: [{
|
|
346
|
-
type: Input
|
|
347
|
-
}] } });
|
|
348
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHktc3RhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2VtcHR5LXN0YXRlL2VtcHR5LXN0YXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFDTCxPQUFPLEVBQ1AsY0FBYyxFQUNkLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNkLE1BQ0ksMkJBQTJCLENBQUM7QUFDakMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBSXZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBZ0JJLElBQU0sbUJBQW1CLEdBQXpCLE1BQU0sbUJBQW9CLFNBQVEsZ0JBQWdCO0lBa012RDs7Ozs7OztPQU9HO0lBQ0g7UUFDRSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQXpNL0I7Ozs7Ozs7OztXQVNHO1FBRUgsVUFBSyxHQUFXLE9BQU8sQ0FBQztRQUV4Qjs7Ozs7Ozs7O1dBU0c7UUFFSCxlQUFVLEdBQUcsUUFBUSxDQUFDO1FBRXRCOzs7Ozs7OztXQVFHO1FBRUgsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUV0Qjs7Ozs7Ozs7O1dBU0c7UUFFSCxrQkFBYSxHQUFXLFFBQVEsQ0FBQztRQUVqQzs7Ozs7Ozs7O1dBU0c7UUFFSCxhQUFRLEdBQW9CLElBQUksQ0FBQztRQUVqQzs7Ozs7Ozs7O1dBU0c7UUFFSCxTQUFJLEdBQVcsd0JBQXdCLENBQUM7UUFFeEM7Ozs7Ozs7O1dBUUc7UUFFSCxhQUFRLEdBQXVCLE9BQU8sQ0FBQztRQUV2Qzs7Ozs7Ozs7V0FRRztRQUVILGNBQVMsR0FBc0IsUUFBUSxDQUFDO1FBMEJ4Qzs7Ozs7Ozs7O1dBU0c7UUFFSCxlQUFVLEdBQW1DLE9BQU8sQ0FBQztRQUVyRDs7Ozs7Ozs7V0FRRztRQUVILGdCQUFXLEdBQVcsU0FBUyxDQUFDO1FBRWhDOzs7Ozs7OztXQVFHO1FBRUgsZUFBVSxHQUFtQyxTQUFTLENBQUM7UUFjdkQ7Ozs7Ozs7O1dBUUc7UUFDSyxrQkFBYSxHQUFrQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckQsY0FBUyxHQUFpQixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFL0MsY0FBUyxHQUFxQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQWU3RCxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBCRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEQsMEJBQTBCO1FBQzFCLG9FQUFvRTtRQUNwRSwwRUFBMEU7UUFDMUUsOEVBQThFO1FBQzlFLElBQUk7UUFFSixJQUFJLENBQUMsVUFBVSxHQUFHLG1CQUFtQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRTdELElBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFrQixDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWdDRztJQUNILFdBQVc7UUFDVCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzNCLElBQUcsQ0FBQyxFQUFFO1lBQ0osT0FBTyxLQUFLLENBQUM7UUFDZixJQUFHLEVBQUUsWUFBWSxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEVBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFHRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUF1Qkk7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBZTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQzsrR0FuVVUsbUJBQW1CO21HQUFuQixtQkFBbUIsc2NDdkVoQywyNkJBbUNBLGthRDRCSSxnQkFBZ0IsNlhBQ2hCLE9BQU8seUxBQ1AsY0FBYywrRUFFZCxPQUFPOztBQUlFLG1CQUFtQjtJQWYvQixPQUFPLEVBQUU7O0dBZUcsbUJBQW1CLENBb1UvQjs7NEZBcFVZLG1CQUFtQjtrQkFkL0IsU0FBUzsrQkFDRSx1QkFBdUIsY0FHckIsSUFBSSxXQUNQO3dCQUNQLGdCQUFnQjt3QkFDaEIsT0FBTzt3QkFDUCxjQUFjO3dCQUNkLFFBQVE7d0JBQ1IsT0FBTztxQkFDUjt3REFnQkQsS0FBSztzQkFESixLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSztnQkFhTixRQUFRO3NCQURQLEtBQUs7Z0JBY04sYUFBYTtzQkFEWixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsS0FBSztnQkFjTixJQUFJO3NCQURILEtBQUs7Z0JBYU4sUUFBUTtzQkFEUCxLQUFLO2dCQWFOLFNBQVM7c0JBRFIsS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBYU4sVUFBVTtzQkFEVCxLQUFLO2dCQWNOLFVBQVU7c0JBRFQsS0FBSztnQkFhTixXQUFXO3NCQURWLEtBQUs7Z0JBYU4sVUFBVTtzQkFEVCxLQUFLO2dCQWFOLFdBQVc7c0JBRFYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0ICB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29sb3IsIFByZWRlZmluZWRDb2xvcnMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge1xuICBJb25DYXJkLFxuICBJb25DYXJkQ29udGVudCxcbiAgSW9uSWNvbixcbiAgSW9uVGl0bGUsXG4gIE5hdkNvbnRyb2xsZXJcbn1cbmZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0ICogYXMgYWxsSWNvbnMgZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBGb3JBbmd1bGFyTW9kdWxlIH0gZnJvbSAnLi4vLi4vZm9yLWFuZ3VsYXIubW9kdWxlJztcbmltcG9ydCB7IER5bmFtaWMsIFN0cmluZ09yQm9vbGVhbiB9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBzdHJpbmdUb0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IE5neEJhc2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4QmFzZUNvbXBvbmVudCc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBGdW5jdGlvbkxpa2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvdHlwZXMnO1xuXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBmb3IgZGlzcGxheWluZyBlbXB0eSBzdGF0ZSBtZXNzYWdlcyB3aXRoIG9wdGlvbmFsIGFjdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZGlzcGxheSBlbXB0eSBzdGF0ZSBtZXNzYWdlc1xuICogd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSBvciB3aGVuIGEgdXNlciBuZWVkcyB0byB0YWtlIGFuIGFjdGlvbiB0byBwb3B1bGF0ZSBjb250ZW50LlxuICogSXQgaW5jbHVkZXMgY3VzdG9taXphYmxlIHRpdGxlLCBzdWJ0aXRsZSwgaWNvbiwgYW5kIGFjdGlvbiBidXR0b24gZWxlbWVudHMgdGhhdCBjYW4gYmVcbiAqIHN0eWxlZCBhbmQgY29uZmlndXJlZCB0aHJvdWdoIGlucHV0IHByb3BlcnRpZXMuIFRoZSBjb21wb25lbnQgc3VwcG9ydHMgbG9jYWxpemF0aW9uXG4gKiBhbmQgY2FuIHRyaWdnZXIgbmF2aWdhdGlvbiBvciBjdXN0b20gYWN0aW9ucyB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cbiAqXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIEVtcHR5U3RhdGVDb21wb25lbnQge1xuICogICAgICtzdHJpbmcgdGl0bGVcbiAqICAgICArc3RyaW5nIHRpdGxlQ29sb3JcbiAqICAgICArc3RyaW5nIHN1YnRpdGxlXG4gKiAgICAgK3N0cmluZyBzdWJ0aXRsZUNvbG9yXG4gKiAgICAgK1N0cmluZ09yQm9vbGVhbiBzaG93SWNvblxuICogICAgICtzdHJpbmcgaWNvblxuICogICAgICtzdHJpbmcgaWNvblNpemVcbiAqICAgICArUHJlZGVmaW5lZENvbG9ycyBpY29uQ29sb3JcbiAqICAgICArc3RyaW5nfEZ1bmN0aW9uIGJ1dHRvbkxpbmtcbiAqICAgICArc3RyaW5nIGJ1dHRvblRleHRcbiAqICAgICArc3RyaW5nIGJ1dHRvbkZpbGxcbiAqICAgICArQ29sb3IgYnV0dG9uQ29sb3JcbiAqICAgICArc3RyaW5nIGJ1dHRvblNpemVcbiAqICAgICArc3RyaW5nIHNlYXJjaFZhbHVlXG4gKiAgICAgLU5hdkNvbnRyb2xsZXIgbmF2Q29udHJvbGxlclxuICogICAgICtuZ09uSW5pdCgpXG4gKiAgICAgK2hhbmRsZUNsaWNrKClcbiAqICAgfVxuICogICBFbXB0eVN0YXRlQ29tcG9uZW50IC0tfD4gTmd4QmFzZUNvbXBvbmVudFxuICogICBFbXB0eVN0YXRlQ29tcG9uZW50IC0tfD4gT25Jbml0XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtZW1wdHktc3RhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1wdHktc3RhdGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbXB0eS1zdGF0ZS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRm9yQW5ndWxhck1vZHVsZSxcbiAgICBJb25DYXJkLFxuICAgIElvbkNhcmRDb250ZW50LFxuICAgIElvblRpdGxlLFxuICAgIElvbkljb25cbiAgXVxuXG59KVxuZXhwb3J0IGNsYXNzIEVtcHR5U3RhdGVDb21wb25lbnQgZXh0ZW5kcyBOZ3hCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYWluIHRpdGxlIGRpc3BsYXllZCBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgcHJpbWFyeSBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGVtcHR5IHN0YXRlIGNvbXBvbmVudC5cbiAgICogVGhpcyB0ZXh0IGlzIHR5cGljYWxseSB1c2VkIHRvIGluZm9ybSB0aGUgdXNlciBhYm91dCB3aHkgdGhleSdyZSBzZWVpbmcgYW4gZW1wdHkgdmlldy5cbiAgICogSWYgdHJhbnNsYXRhYmxlIGlzIHRydWUsIHRoaXMgd2lsbCBiZSBwcm9jZXNzZWQgdGhyb3VnaCB0aGUgbG9jYWxpemF0aW9uIHN5c3RlbS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgXCJ0aXRsZVwiXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB0aXRsZTogc3RyaW5nID0gXCJ0aXRsZVwiO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSB0aXRsZSB0ZXh0LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbG9yIGZvciB0aGUgdGl0bGUgdGV4dCB1c2luZyB0aGUgYXBwbGljYXRpb24ncyBjb2xvciBzeXN0ZW0uXG4gICAqIFRoZSB2YWx1ZSBzaG91bGQgY29ycmVzcG9uZCB0byBhIGNvbG9yIHZhcmlhYmxlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgdGhlbWUuXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHByZWZpeCB0aGlzIHdpdGggXCJjb2xvci1cIiB0byBjcmVhdGUgdGhlIENTUyBjbGFzcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQGRlZmF1bHQgJ2dyYXktNidcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHRpdGxlQ29sb3IgPSAnZ3JheS02JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzZWNvbmRhcnkgbWVzc2FnZSBkaXNwbGF5ZWQgaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRleHQgb3IgaW5zdHJ1Y3Rpb25zIGJlbG93IHRoZSBtYWluIHRpdGxlLlxuICAgKiBUaGlzIHRleHQgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZ3VpZGUgdGhlIHVzZXIgb24gd2hhdCBhY3Rpb25zIHRoZXkgY2FuIHRha2UuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJ0aXRsZTogc3RyaW5nID0gXCJcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjb2xvciBvZiB0aGUgc3VidGl0bGUgdGV4dC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIHN1YnRpdGxlIHRleHQgdXNpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc3lzdGVtLlxuICAgKiBUaGUgdmFsdWUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gYSBjb2xvciB2YXJpYWJsZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHRoZW1lLlxuICAgKiBUaGUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBwcmVmaXggdGhpcyB3aXRoIFwiY29sb3ItXCIgdG8gY3JlYXRlIHRoZSBDU1MgY2xhc3MuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICdncmF5LTQnXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzdWJ0aXRsZUNvbG9yOiBzdHJpbmcgPSAnZ3JheS00JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGljb24gaXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIHRoZSB2aXN1YWwgaWNvbiBzaG91bGQgYmUgc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIGJvb2xlYW4gb3IgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4uXG4gICAqIEljb25zIGhlbHAgdmlzdWFsbHkgY29tbXVuaWNhdGUgdGhlIGVtcHR5IHN0YXRlIGNvbnRleHQgdG8gdXNlcnMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dJY29uOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG5hbWUgb2YgdGhlIGljb24gdG8gZGlzcGxheS5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoaWNoIGljb24gdG8gc2hvdyB3aGVuIHNob3dJY29uIGlzIHRydWUuXG4gICAqIFRoZSBjb21wb25lbnQgdXNlcyB0aGUgaWNvbiBzeXN0ZW0gZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24sXG4gICAqIGFuZCB0aGlzIHZhbHVlIHNob3VsZCBjb3JyZXNwb25kIHRvIGFuIGF2YWlsYWJsZSBpY29uIG5hbWUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFwidGktaW5mby1zcXVhcmUtcm91bmRlZFwiXG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpY29uOiBzdHJpbmcgPSBcInRpLWluZm8tc3F1YXJlLXJvdW5kZWRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBkaXNwbGF5ZWQgaWNvbi5cbiAgICogQHN1bW1hcnkgQ29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlLlxuICAgKiBDYW4gYmUgZWl0aGVyICdsYXJnZScgb3IgJ3NtYWxsJyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgbGF5b3V0IG5lZWRzLlxuICAgKlxuICAgKiBAdHlwZSB7J2xhcmdlJyB8ICdzbWFsbCcgfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0ICdsYXJnZSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb25TaXplPzogJ2xhcmdlJyB8ICdzbWFsbCcgPSAnbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGNvbG9yIG9mIHRoZSBkaXNwbGF5ZWQgaWNvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBjb2xvciBmb3IgdGhlIGljb24gdXNpbmcgSW9uaWMncyBwcmVkZWZpbmVkIGNvbG9yIHN5c3RlbS5cbiAgICogVGhpcyBhbGxvd3MgdGhlIGljb24gdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc2NoZW1lLlxuICAgKlxuICAgKiBAdHlwZSB7UHJlZGVmaW5lZENvbG9ycyB8IHVuZGVmaW5lZH1cbiAgICogQGRlZmF1bHQgJ21lZGl1bSdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGljb25Db2xvcj86IFByZWRlZmluZWRDb2xvcnMgPSAnbWVkaXVtJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYXZpZ2F0aW9uIHRhcmdldCBvciBhY3Rpb24gZm9yIHRoZSBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGVyZSB0aGUgYnV0dG9uIHNob3VsZCBuYXZpZ2F0ZSB0byB3aGVuIGNsaWNrZWQgb3Igd2hhdCBmdW5jdGlvblxuICAgKiBpdCBzaG91bGQgZXhlY3V0ZS4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgVVJMIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBuYXZpZ2F0aW9uLlxuICAgKiBXaGVuIG5vdCBwcm92aWRlZCwgdGhlIGJ1dHRvbiB3aWxsIG5vdCBwZXJmb3JtIGFueSBhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2UgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBidXR0b25MaW5rPzogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGxhYmVsIGZvciB0aGUgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgZW1wdHkgc3RhdGUuXG4gICAqIElmIHRyYW5zbGF0YWJsZSBpcyB0cnVlLCB0aGlzIHdpbGwgYmUgcHJvY2Vzc2VkIHRocm91Z2ggdGhlIGxvY2FsaXphdGlvbiBzeXN0ZW0uXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdGhlIGJ1dHRvbiB3aWxsIG5vdCBkaXNwbGF5IGFueSB0ZXh0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmaWxsIHN0eWxlIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgdmlzdWFsIHN0eWxlIG9mIHRoZSBidXR0b24gdXNpbmcgSW9uaWMncyBidXR0b24gZmlsbCBvcHRpb25zLlxuICAgKiAnc29saWQnIGNyZWF0ZXMgYSBidXR0b24gd2l0aCBhIHNvbGlkIGJhY2tncm91bmQsICdvdXRsaW5lJyBjcmVhdGVzIGEgYnV0dG9uIHdpdGhcbiAgICoganVzdCBhIGJvcmRlciwgYW5kICdjbGVhcicgY3JlYXRlcyBhIGJ1dHRvbiB3aXRoIG5vIGJhY2tncm91bmQgb3IgYm9yZGVyLlxuICAgKlxuICAgKiBAdHlwZSB7J2NsZWFyJyB8ICdzb2xpZCcgfCAnb3V0bGluZSd9XG4gICAqIEBkZWZhdWx0ICdzb2xpZCdcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGJ1dHRvbkZpbGw6ICdjbGVhcicgfCAnc29saWQnIHwgJ291dGxpbmUnID0gICdzb2xpZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY29sb3Igb2YgdGhlIGFjdGlvbiBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgY29sb3IgZm9yIHRoZSBidXR0b24gdXNpbmcgSW9uaWMncyBjb2xvciBzeXN0ZW0uXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBidXR0b24gdG8gbWF0Y2ggdGhlIGFwcGxpY2F0aW9uJ3MgY29sb3Igc2NoZW1lLlxuICAgKlxuICAgKiBAdHlwZSB7Q29sb3J9XG4gICAqIEBkZWZhdWx0ICdwcmltYXJ5J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uQ29sb3I6IENvbG9yID0gICdwcmltYXJ5JztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaXplIG9mIHRoZSBhY3Rpb24gYnV0dG9uLlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgc2l6ZSBvZiB0aGUgYnV0dG9uIHNob3duIGluIHRoZSBlbXB0eSBzdGF0ZS5cbiAgICogQ2FuIGJlICdsYXJnZScsICdzbWFsbCcsIG9yICdkZWZhdWx0JyB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgbGF5b3V0IG5lZWRzLlxuICAgKlxuICAgKiBAdHlwZSB7J2xhcmdlJyB8ICdzbWFsbCcgfCAnZGVmYXVsdCd9XG4gICAqIEBkZWZhdWx0ICdkZWZhdWx0J1xuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYnV0dG9uU2l6ZTogJ2xhcmdlJyB8ICdzbWFsbCcgfCAnZGVmYXVsdCcgPSAgJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlYXJjaCB2YWx1ZSB0aGF0IHJlc3VsdGVkIGluIG5vIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdGhlIGVtcHR5IHN0YXRlIGlzIHNob3duIGR1ZSB0byBhIHNlYXJjaCB3aXRoIG5vIHJlc3VsdHMsXG4gICAqIHRoaXMgcHJvcGVydHkgY2FuIGhvbGQgdGhlIHNlYXJjaCB0ZXJtIHRoYXQgd2FzIHVzZWQuIFRoaXMgY2FuIGJlIGRpc3BsYXllZFxuICAgKiBpbiB0aGUgZW1wdHkgc3RhdGUgbWVzc2FnZSB0byBwcm92aWRlIGNvbnRleHQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzZWFyY2hWYWx1ZSE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlcnZpY2UgZm9yIGhhbmRsaW5nIG5hdmlnYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIG5hdmlnYXRpbmcgYmV0d2VlbiByb3V0ZXMuXG4gICAqIFRoaXMgc2VydmljZSBpcyB1c2VkIHdoZW4gdGhlIGJ1dHRvbkxpbmsgaXMgYSBzdHJpbmcgVVJMIHRvIG5hdmlnYXRlIHRvIHRoYXQgbG9jYXRpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtOYXZDb250cm9sbGVyfVxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyID0gaW5qZWN0KE5hdkNvbnRyb2xsZXIpO1xuXG4gIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcblxuICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBzZWFyY2hTdWJ0aXRsZSE6IFNhZmVIdG1sXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRW1wdHlTdGF0ZUNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgRW1wdHlTdGF0ZUNvbXBvbmVudCBieSBjYWxsaW5nIHRoZSBwYXJlbnQgY2xhc3MgY29uc3RydWN0b3JcbiAgICogd2l0aCB0aGUgY29tcG9uZW50IG5hbWUgZm9yIGxvZ2dpbmcgYW5kIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzLiBUaGlzIGNvbXBvbmVudCBwcm92aWRlc1xuICAgKiBhIHN0YW5kYXJkaXplZCB3YXkgdG8gZGlzcGxheSBlbXB0eSBzdGF0ZSBtZXNzYWdlcyB3aXRoIG9wdGlvbmFsIGljb25zIGFuZCBhY3Rpb24gYnV0dG9ucy5cbiAgICpcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiRW1wdHlTdGF0ZUNvbXBvbmVudFwiKTtcbiAgICBhZGRJY29ucyhhbGxJY29ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBmaXJzdCBkaXNwbGF5cyB0aGUgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgcHJvY2Vzc2luZyBib29sZWFuIGlucHV0cywgYXBwbHlpbmcgbG9jYWxpemF0aW9uIHRvIHRleHRcbiAgICogZWxlbWVudHMgaWYgdHJhbnNsYXRpb24gaXMgZW5hYmxlZCwgYW5kIGZvcm1hdHRpbmcgQ1NTIGNsYXNzZXMgZm9yIHRpdGxlIGFuZCBzdWJ0aXRsZSBjb2xvcnMuXG4gICAqIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXIgaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlXG4gICAqIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBsb2NhbGl6ZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICpcbiAgICogICBBLT4+RTogbmdPbkluaXQoKVxuICAgKiAgIEUtPj5FOiBQcm9jZXNzIHRyYW5zbGF0YWJsZSBmbGFnXG4gICAqICAgRS0+PkU6IFByb2Nlc3Mgc2hvd0ljb24gZmxhZ1xuICAgKiAgIEUtPj5FOiBHZXQgbG9jYWxlIHNldHRpbmdzXG4gICAqICAgYWx0IHRyYW5zbGF0YWJsZSBpcyB0cnVlXG4gICAqICAgICBFLT4+RTogTG9jYWxpemUgdGl0bGVcbiAgICogICAgIEUtPj5FOiBMb2NhbGl6ZSBzdWJ0aXRsZVxuICAgKiAgICAgRS0+PkU6IExvY2FsaXplIGJ1dHRvblRleHRcbiAgICogICBlbmRcbiAgICogICBFLT4+RTogRm9ybWF0IHRpdGxlIENTUyBjbGFzc1xuICAgKiAgIEUtPj5FOiBGb3JtYXQgc3VidGl0bGUgQ1NTIGNsYXNzXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBFbXB0eVN0YXRlQ29tcG9uZW50XG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBhcnNlUHJvcHModGhpcyk7XG4gICAgdGhpcy50cmFuc2xhdGFibGUgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy50cmFuc2xhdGFibGUpO1xuICAgIHRoaXMuc2hvd0ljb24gPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93SWNvbik7XG4gICAgdGhpcy5sb2NhbGUgPSB0aGlzLmdldExvY2FsZSh0aGlzLnRyYW5zbGF0YWJsZSk7XG5cbiAgICAvLyBpZih0aGlzLnRyYW5zbGF0YWJsZSkge1xuICAgIC8vICAgdGhpcy50aXRsZSA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy50aXRsZSk7XG4gICAgLy8gICB0aGlzLnN1YnRpdGxlID0gZ2VuZXJhdGVMb2NhbGVGcm9tU3RyaW5nKHRoaXMubG9jYWxlLCB0aGlzLnN1YnRpdGxlKTtcbiAgICAvLyAgIHRoaXMuYnV0dG9uVGV4dCA9IGdlbmVyYXRlTG9jYWxlRnJvbVN0cmluZyh0aGlzLmxvY2FsZSwgdGhpcy5idXR0b25UZXh0KTtcbiAgICAvLyB9XG5cbiAgICB0aGlzLnRpdGxlQ29sb3IgPSBgZGNmLXRpdGxlIGNvbG9yLSR7dGhpcy50aXRsZUNvbG9yfWA7XG4gICAgdGhpcy5zdWJ0aXRsZUNvbG9yID0gYGRjZi1zdWJ0aXRsZSBjb2xvci0ke3RoaXMudGl0bGVDb2xvcn1gO1xuXG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSAmJiB0aGlzLnRyYW5zbGF0YWJsZSlcbiAgICAgIHRoaXMuc2VhcmNoU3VidGl0bGUgPSBhd2FpdCB0aGlzLmdldFNlYXJjaFN1YnRpdGxlKHRoaXMuc3VidGl0bGUgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgb24gdGhlIGFjdGlvbiBidXR0b24uXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgYWN0aW9uIGJ1dHRvbiBpbiB0aGUgZW1wdHkgc3RhdGVcbiAgICogY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aHJlZSBuYXZpZ2F0aW9uIHBhdHRlcm5zOiAxKSBubyBhY3Rpb24gd2hlbiBidXR0b25MaW5rIGlzIG5vdCBwcm92aWRlZCxcbiAgICogMikgY3VzdG9tIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aGVuIGJ1dHRvbkxpbmsgaXMgYSBmdW5jdGlvbiwgYW5kIDMpIG5hdmlnYXRpb24gdG8gYSBzcGVjaWZpYyBVUkxcbiAgICogd2hlbiBidXR0b25MaW5rIGlzIGEgc3RyaW5nLiBUaGlzIGZsZXhpYmlsaXR5IGFsbG93cyB0aGUgZW1wdHkgc3RhdGUgdG8gdHJpZ2dlciB2YXJpb3VzIGFjdGlvbnNcbiAgICogYmFzZWQgb24gdGhlIGNvbnRleHQgaW4gd2hpY2ggaXQncyB1c2VkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBFIGFzIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBOIGFzIE5hdkNvbnRyb2xsZXJcbiAgICpcbiAgICogICBVLT4+RTogQ2xpY2sgYWN0aW9uIGJ1dHRvblxuICAgKiAgIEUtPj5FOiBoYW5kbGVDbGljaygpXG4gICAqICAgYWx0IGJ1dHRvbkxpbmsgaXMgbm90IHByb3ZpZGVkXG4gICAqICAgICBFLS0+PlU6IFJldHVybiBmYWxzZSAobm8gYWN0aW9uKVxuICAgKiAgIGVsc2UgYnV0dG9uTGluayBpcyBhIGZ1bmN0aW9uXG4gICAqICAgICBFLT4+RTogRXhlY3V0ZSBidXR0b25MaW5rIGZ1bmN0aW9uXG4gICAqICAgICBFLS0+PlU6IFJldHVybiBmdW5jdGlvbiByZXN1bHRcbiAgICogICBlbHNlIGJ1dHRvbkxpbmsgaXMgYSBVUkwgc3RyaW5nXG4gICAqICAgICBFLT4+TjogbmF2aWdhdGVGb3J3YXJkKGJ1dHRvbkxpbmspXG4gICAqICAgICBOLS0+PkU6IFJldHVybiBuYXZpZ2F0aW9uIHJlc3VsdFxuICAgKiAgICAgRS0tPj5VOiBSZXR1cm4gbmF2aWdhdGlvbiByZXN1bHRcbiAgICogICBlbmRcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+fVxuICAgKiAgIC0gZmFsc2UgaWYgbm8gYWN0aW9uIGlzIHRha2VuXG4gICAqICAgLSBUaGUgcmVzdWx0IG9mIHRoZSBidXR0b25MaW5rIGZ1bmN0aW9uIGlmIGl0J3MgYSBmdW5jdGlvblxuICAgKiAgIC0gQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbmF2aWdhdGlvbiByZXN1bHQgaWYgYnV0dG9uTGluayBpcyBhIFVSTFxuICAgKiBAbWVtYmVyT2YgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlQ2xpY2soKTogYm9vbGVhbiB8IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuYnV0dG9uTGluaztcbiAgICBpZighZm4pXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYoZm4gaW5zdGFuY2VvZiBGdW5jdGlvbilcbiAgICAgIHJldHVybiBmbigpO1xuICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVGb3J3YXJkKGZuIGFzIHN0cmluZyk7XG4gIH1cblxuXG4gLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBsb2NhbGl6ZWQgYW5kIHNhbml0aXplZCBzdWJ0aXRsZSBmb3Igc2VhcmNoIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHRha2VzIGEgY29udGVudCBzdHJpbmcsIHR5cGljYWxseSB0aGUgc3VidGl0bGUsIGFuZCBwcm9jZXNzZXMgaXRcbiAgICogdGhyb3VnaCB0aGUgdHJhbnNsYXRpb24gc2VydmljZS4gSXQgcmVwbGFjZXMgYSBwbGFjZWhvbGRlciAoJ3ZhbHVlMCcpIHdpdGggdGhlIGFjdHVhbFxuICAgKiBzZWFyY2ggdmFsdWUsIHRoZW4gc2FuaXRpemVzIHRoZSByZXN1bHQgdG8gc2FmZWx5IHVzZSBhcyBIVE1MLiBUaGlzIGlzIHBhcnRpY3VsYXJseVxuICAgKiB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgZHluYW1pYywgbG9jYWxpemVkIG1lc3NhZ2VzIGluIHRoZSBlbXB0eSBzdGF0ZSB3aGVuIGEgc2VhcmNoXG4gICAqIHlpZWxkcyBubyByZXN1bHRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIFRoZSBjb250ZW50IHN0cmluZyB0byBiZSB0cmFuc2xhdGVkIGFuZCBwcm9jZXNzZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxTYWZlSHRtbD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgc2FuaXRpemVkIEhUTUwgc3RyaW5nXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRW1wdHlTdGF0ZUNvbXBvbmVudFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgVHJhbnNsYXRlU2VydmljZVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgRG9tU2FuaXRpemVyXG4gICAqXG4gICAqICAgRS0+PlQ6IGluc3RhbnQoY29udGVudCwgeyd2YWx1ZTAnOiBzZWFyY2hWYWx1ZX0pXG4gICAqICAgVC0tPj5FOiBSZXR1cm4gdHJhbnNsYXRlZCBzdHJpbmdcbiAgICogICBFLT4+UzogYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodHJhbnNsYXRlZFN0cmluZylcbiAgICogICBTLS0+PkU6IFJldHVybiBzYW5pdGl6ZWQgU2FmZUh0bWxcbiAgICpcbiAgICogQG1lbWJlck9mIEVtcHR5U3RhdGVDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGdldFNlYXJjaFN1YnRpdGxlKGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8U2FmZUh0bWw+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGNvbnRlbnQsIHsndmFsdWUwJzogdGhpcy5zZWFyY2hWYWx1ZX0pO1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChyZXN1bHQpO1xuICB9XG59XG4iLCJcbjxpb24tY2FyZCBpZD1cImRjZi1jYXJkLWVtcHR5LXN0YXRlXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxpb24tY2FyZC1jb250ZW50PlxuICAgIEBpZihpY29uICYmIHNob3dJY29uKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZGNmLWljb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxpb24taWNvblxuICAgICAgICAgIG5hbWU9XCJhbGVydC1jaXJjbGUtb3V0bGluZVwiXG4gICAgICAgICAgc2l6ZT1cImxhcmdlXCJcbiAgICAgICAgICBjb2xvcj1cImRhbmdlclwiXG4gICAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYodGl0bGUpIHtcbiAgICAgIDxoNSBbY2xhc3NdPVwidGl0bGVDb2xvclwiIFtpbm5lckhUTUxdPVwidGl0bGVcIj48L2g1PlxuICAgIH1cbiAgICBAaWYoc3VidGl0bGUpIHtcbiAgICAgIEBpZighc2VhcmNoVmFsdWUpIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cInN1YnRpdGxlQ29sb3JcIiBbaW5uZXJIVE1MXT1cInN1YnRpdGxlXCI+PC9wPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJzdWJ0aXRsZUNvbG9yXCIgW2lubmVySFRNTF09XCJzZWFyY2hTdWJ0aXRsZVwiPjwvcD5cbiAgICAgIH1cbiAgICB9XG4gICAgQGlmKGJ1dHRvbkxpbmsgJiYgYnV0dG9uVGV4dCkge1xuICAgICAgPGRpdj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICBbc2l6ZV09XCJidXR0b25TaXplXCJcbiAgICAgICAgICBbZmlsbF09XCJidXR0b25GaWxsXCJcbiAgICAgICAgICBbY29sb3JdPVwiYnV0dG9uQ29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygpXCI+XG4gICAgICAgICAge3sgIGJ1dHRvblRleHQgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG48L2lvbi1jYXJkPlxuIl19
|