@decaf-ts/for-angular 0.0.25 → 0.0.27
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/fesm2022/decaf-ts-for-angular.mjs +1486 -1505
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/index.d.ts +7482 -3
- package/package.json +15 -18
- package/components/component-renderer/component-renderer.component.d.ts +0 -278
- package/components/crud-field/crud-field.component.d.ts +0 -611
- package/components/crud-form/constants.d.ts +0 -5
- package/components/crud-form/crud-form.component.d.ts +0 -288
- package/components/crud-form/types.d.ts +0 -17
- package/components/empty-state/empty-state.component.d.ts +0 -300
- package/components/fieldset/fieldset.component.d.ts +0 -555
- package/components/filter/filter.component.d.ts +0 -514
- package/components/for-angular-components.module.d.ts +0 -20
- package/components/index.d.ts +0 -16
- package/components/layout/layout.component.d.ts +0 -110
- package/components/list/list.component.d.ts +0 -848
- package/components/list-item/list-item.component.d.ts +0 -390
- package/components/model-renderer/model-renderer.component.d.ts +0 -97
- package/components/pagination/constants.d.ts +0 -7
- package/components/pagination/pagination.component.d.ts +0 -264
- package/components/searchbar/searchbar.component.d.ts +0 -407
- package/components/stepped-form/stepped-form.component.d.ts +0 -255
- package/directives/collapsable.directive.d.ts +0 -9
- package/directives/index.d.ts +0 -1
- package/engine/DynamicModule.d.ts +0 -17
- package/engine/NgxBaseComponent.d.ts +0 -541
- package/engine/NgxCrudFormField.d.ts +0 -123
- package/engine/NgxFormService.d.ts +0 -601
- package/engine/NgxRenderingEngine.d.ts +0 -282
- package/engine/ValidatorFactory.d.ts +0 -15
- package/engine/constants.d.ts +0 -168
- package/engine/decorators.d.ts +0 -25
- package/engine/index.d.ts +0 -18
- package/engine/interfaces.d.ts +0 -271
- package/engine/types.d.ts +0 -200
- package/esm2022/components/component-renderer/component-renderer.component.mjs +0 -321
- package/esm2022/components/crud-field/crud-field.component.mjs +0 -518
- package/esm2022/components/crud-form/constants.mjs +0 -14
- package/esm2022/components/crud-form/crud-form.component.mjs +0 -259
- package/esm2022/components/crud-form/types.mjs +0 -2
- package/esm2022/components/empty-state/empty-state.component.mjs +0 -345
- package/esm2022/components/fieldset/fieldset.component.mjs +0 -677
- package/esm2022/components/filter/filter.component.mjs +0 -700
- package/esm2022/components/for-angular-components.module.mjs +0 -84
- package/esm2022/components/index.mjs +0 -20
- package/esm2022/components/layout/layout.component.mjs +0 -150
- package/esm2022/components/list/list.component.mjs +0 -1238
- package/esm2022/components/list-item/list-item.component.mjs +0 -405
- package/esm2022/components/model-renderer/model-renderer.component.mjs +0 -144
- package/esm2022/components/pagination/constants.mjs +0 -2
- package/esm2022/components/pagination/pagination.component.mjs +0 -321
- package/esm2022/components/searchbar/searchbar.component.mjs +0 -491
- package/esm2022/components/stepped-form/stepped-form.component.mjs +0 -306
- package/esm2022/decaf-ts-for-angular.mjs +0 -5
- package/esm2022/directives/collapsable.directive.mjs +0 -29
- package/esm2022/directives/index.mjs +0 -2
- package/esm2022/engine/DynamicModule.mjs +0 -18
- package/esm2022/engine/NgxBaseComponent.mjs +0 -541
- package/esm2022/engine/NgxCrudFormField.mjs +0 -137
- package/esm2022/engine/NgxFormService.mjs +0 -917
- package/esm2022/engine/NgxRenderingEngine.mjs +0 -376
- package/esm2022/engine/ValidatorFactory.mjs +0 -106
- package/esm2022/engine/constants.mjs +0 -170
- package/esm2022/engine/decorators.mjs +0 -38
- package/esm2022/engine/index.mjs +0 -19
- package/esm2022/engine/interfaces.mjs +0 -4
- package/esm2022/engine/types.mjs +0 -2
- package/esm2022/for-angular-common.module.mjs +0 -84
- package/esm2022/helpers/index.mjs +0 -13
- package/esm2022/helpers/utils.mjs +0 -436
- package/esm2022/i18n/Loader.mjs +0 -86
- package/esm2022/i18n/data/en.json +0 -85
- package/esm2022/public-apis.mjs +0 -15
- package/for-angular-common.module.d.ts +0 -50
- package/helpers/index.d.ts +0 -12
- package/helpers/utils.d.ts +0 -279
- package/i18n/Loader.d.ts +0 -43
- package/public-apis.d.ts +0 -14
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export const CssClasses = {
|
|
2
|
-
BUTTONS_CONTAINER: 'buttons-container',
|
|
3
|
-
};
|
|
4
|
-
export const DefaultFormReactiveOptions = {
|
|
5
|
-
buttons: {
|
|
6
|
-
submit: {
|
|
7
|
-
text: 'Submit',
|
|
8
|
-
},
|
|
9
|
-
clear: {
|
|
10
|
-
text: 'Clear',
|
|
11
|
-
},
|
|
12
|
-
},
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NydWQtZm9ybS9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLGlCQUFpQixFQUFFLG1CQUFtQjtDQUN2QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQW9CO0lBQ3pELE9BQU8sRUFBRTtRQUNQLE1BQU0sRUFBRTtZQUNOLElBQUksRUFBRSxRQUFRO1NBQ2Y7UUFDRCxLQUFLLEVBQUU7WUFDTCxJQUFJLEVBQUUsT0FBTztTQUNkO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3J1ZEZvcm1PcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBDc3NDbGFzc2VzID0ge1xuICBCVVRUT05TX0NPTlRBSU5FUjogJ2J1dHRvbnMtY29udGFpbmVyJyxcbn07XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9uczogQ3J1ZEZvcm1PcHRpb25zID0ge1xuICBidXR0b25zOiB7XG4gICAgc3VibWl0OiB7XG4gICAgICB0ZXh0OiAnU3VibWl0JyxcbiAgICB9LFxuICAgIGNsZWFyOiB7XG4gICAgICB0ZXh0OiAnQ2xlYXInLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
|
|
@@ -1,259 +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 { ReactiveFormsModule } from '@angular/forms';
|
|
5
|
-
import { NgxFormService } from '../../engine/NgxFormService';
|
|
6
|
-
import { Dynamic, EventConstants } from '../../engine';
|
|
7
|
-
import { OperationKeys } from '@decaf-ts/db-decorators';
|
|
8
|
-
import { DefaultFormReactiveOptions } from './constants';
|
|
9
|
-
import { generateRandomValue } from '../../helpers';
|
|
10
|
-
import { getLogger } from '../../for-angular-common.module';
|
|
11
|
-
import { IonButton, IonIcon } from '@ionic/angular/standalone';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/forms";
|
|
14
|
-
/**
|
|
15
|
-
* @component CrudFormComponent
|
|
16
|
-
* @example <ngx-decaf-crud-form
|
|
17
|
-
* action="create"
|
|
18
|
-
* operation="create"
|
|
19
|
-
* formGroup="formGroup"
|
|
20
|
-
* rendererId="rendererId"
|
|
21
|
-
* submitEvent="submitEvent"
|
|
22
|
-
* target="_self"
|
|
23
|
-
* method="event">
|
|
24
|
-
* </ngx-decaf-crud-form>
|
|
25
|
-
*
|
|
26
|
-
* @param {string} action - The action to be performed (create, read, update, delete)
|
|
27
|
-
* @param {CrudOperations} operation - The CRUD operation being performed (create, read, update, delete)
|
|
28
|
-
* @param {FormGroup} formGroup - The form group
|
|
29
|
-
* @param {string} rendererId - The renderer id
|
|
30
|
-
* @param {SubmitEvent} submitEvent - The submit event
|
|
31
|
-
* @param {string} target - The target
|
|
32
|
-
* @param {string} method - The method
|
|
33
|
-
*/
|
|
34
|
-
let CrudFormComponent = class CrudFormComponent {
|
|
35
|
-
constructor() {
|
|
36
|
-
/**
|
|
37
|
-
* @description Field update trigger mode for form validation.
|
|
38
|
-
* @summary Determines when form field validation should be triggered. Options include
|
|
39
|
-
* 'change', 'blur', or 'submit'. This affects the user experience by controlling
|
|
40
|
-
* when validation feedback is shown to the user during form interaction.
|
|
41
|
-
*
|
|
42
|
-
* @type {FieldUpdateMode}
|
|
43
|
-
* @default 'change'
|
|
44
|
-
* @memberOf CrudFormComponent
|
|
45
|
-
*/
|
|
46
|
-
this.updateOn = 'change';
|
|
47
|
-
/**
|
|
48
|
-
* @description Form submission target specification.
|
|
49
|
-
* @summary Specifies where to display the response after form submission, similar
|
|
50
|
-
* to the HTML form target attribute. Options include '_self', '_blank', '_parent',
|
|
51
|
-
* '_top', or a named frame. Controls the browser behavior for form responses.
|
|
52
|
-
*
|
|
53
|
-
* @type {HTMLFormTarget}
|
|
54
|
-
* @default '_self'
|
|
55
|
-
* @memberOf CrudFormComponent
|
|
56
|
-
*/
|
|
57
|
-
this.target = '_self';
|
|
58
|
-
/**
|
|
59
|
-
* @description HTTP method or submission strategy for the form.
|
|
60
|
-
* @summary Defines how the form should be submitted. 'get' and 'post' correspond
|
|
61
|
-
* to standard HTTP methods for traditional form submission, while 'event' uses
|
|
62
|
-
* Angular event-driven submission for single-page application workflows.
|
|
63
|
-
*
|
|
64
|
-
* @type {'get' | 'post' | 'event'}
|
|
65
|
-
* @default 'event'
|
|
66
|
-
* @memberOf CrudFormComponent
|
|
67
|
-
*/
|
|
68
|
-
this.method = 'event';
|
|
69
|
-
/**
|
|
70
|
-
* @description Unique identifier for the current record.
|
|
71
|
-
* @summary A unique identifier for the current record being displayed or manipulated.
|
|
72
|
-
* This is typically used in conjunction with the primary key for operations on specific records.
|
|
73
|
-
*
|
|
74
|
-
* @type {string | number}
|
|
75
|
-
* @memberOf CrudFormComponent
|
|
76
|
-
*/
|
|
77
|
-
this.uid = generateRandomValue(12);
|
|
78
|
-
/**
|
|
79
|
-
* @description Unique identifier for the current record instance.
|
|
80
|
-
* @summary This property holds a unique string value that identifies the specific record being managed by the form.
|
|
81
|
-
* It is automatically generated if not provided, ensuring each form instance has a distinct identifier.
|
|
82
|
-
* The uid is used for tracking, referencing, and emitting events related to the current record, and may be used
|
|
83
|
-
* in conjunction with the primary key for CRUD operations.
|
|
84
|
-
*
|
|
85
|
-
* @type {string}
|
|
86
|
-
* @default Randomly generated 12-character string
|
|
87
|
-
* @memberOf CrudFormComponent
|
|
88
|
-
*/
|
|
89
|
-
this.allowClear = true;
|
|
90
|
-
/**
|
|
91
|
-
* @description Reference to CRUD operation constants for template usage.
|
|
92
|
-
* @summary Exposes the OperationKeys enum to the component template, enabling
|
|
93
|
-
* conditional rendering and behavior based on operation types. This protected
|
|
94
|
-
* readonly property ensures that template logic can access operation constants
|
|
95
|
-
* while maintaining encapsulation and preventing accidental modification.
|
|
96
|
-
*
|
|
97
|
-
* @protected
|
|
98
|
-
* @readonly
|
|
99
|
-
* @memberOf CrudFormComponent
|
|
100
|
-
*/
|
|
101
|
-
this.OperationKeys = OperationKeys;
|
|
102
|
-
/**
|
|
103
|
-
* @description Event emitter for form submission events.
|
|
104
|
-
* @summary Emits CrudFormEvent objects when the form is submitted, providing
|
|
105
|
-
* form data, component information, and any associated handlers to parent
|
|
106
|
-
* components. This enables decoupled handling of form submission logic.
|
|
107
|
-
*
|
|
108
|
-
* @type {EventEmitter<CrudFormEvent>}
|
|
109
|
-
* @memberOf CrudFormComponent
|
|
110
|
-
*/
|
|
111
|
-
this.submitEvent = new EventEmitter();
|
|
112
|
-
/**
|
|
113
|
-
* @description Angular Location service.
|
|
114
|
-
* @summary Injected service that provides access to the browser's URL and history.
|
|
115
|
-
* This service is used for interacting with the browser's history API, allowing
|
|
116
|
-
* for back navigation and URL manipulation outside of Angular's router.
|
|
117
|
-
*
|
|
118
|
-
* @private
|
|
119
|
-
* @type {Location}
|
|
120
|
-
* @memberOf CrudFormComponent
|
|
121
|
-
*/
|
|
122
|
-
this.location = inject(Location);
|
|
123
|
-
}
|
|
124
|
-
// ngAfterViewInit() {
|
|
125
|
-
// if (![OperationKeys.READ, OperationKeys.DELETE].includes(this.operation))
|
|
126
|
-
// NgxFormService.formAfterViewInit(this, this.rendererId);
|
|
127
|
-
// }
|
|
128
|
-
/**
|
|
129
|
-
* @description Component initialization lifecycle method.
|
|
130
|
-
* @summary Initializes the component by setting up the logger, configuring form state
|
|
131
|
-
* based on the operation type, and merging configuration options. For READ and DELETE
|
|
132
|
-
* operations, the formGroup is set to undefined since these operations don't require
|
|
133
|
-
* form input. Configuration options are merged with default settings.
|
|
134
|
-
*
|
|
135
|
-
* @returns {Promise<void>}
|
|
136
|
-
* @memberOf CrudFormComponent
|
|
137
|
-
*/
|
|
138
|
-
async ngOnInit() {
|
|
139
|
-
if (!this.logger)
|
|
140
|
-
this.logger = getLogger(this);
|
|
141
|
-
if (this.operation === OperationKeys.READ || this.operation === OperationKeys.DELETE)
|
|
142
|
-
this.formGroup = undefined;
|
|
143
|
-
this.options = Object.assign({}, DefaultFormReactiveOptions, this.options || {});
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* @description Component cleanup lifecycle method.
|
|
147
|
-
* @summary Performs cleanup operations when the component is destroyed.
|
|
148
|
-
* Unregisters the FormGroup from the NgxFormService to prevent memory leaks
|
|
149
|
-
* and ensure proper resource cleanup.
|
|
150
|
-
*
|
|
151
|
-
* @returns {void}
|
|
152
|
-
* @memberOf CrudFormComponent
|
|
153
|
-
*/
|
|
154
|
-
ngOnDestroy() {
|
|
155
|
-
if (this.formGroup)
|
|
156
|
-
NgxFormService.unregister(this.formGroup);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* @description Handles form submission with validation and event emission.
|
|
160
|
-
* @summary Processes form submission by first preventing default browser behavior,
|
|
161
|
-
* then validating all form fields using NgxFormService. If validation passes,
|
|
162
|
-
* extracts form data and emits a submitEvent with the data, component information,
|
|
163
|
-
* and any associated handlers. Returns false if validation fails.
|
|
164
|
-
*
|
|
165
|
-
* @param {SubmitEvent} event - The browser's native form submit event
|
|
166
|
-
* @returns {Promise<boolean | void>} Returns false if validation fails, void if successful
|
|
167
|
-
* @memberOf CrudFormComponent
|
|
168
|
-
*/
|
|
169
|
-
async submit(event) {
|
|
170
|
-
event.preventDefault();
|
|
171
|
-
event.stopImmediatePropagation();
|
|
172
|
-
if (!NgxFormService.validateFields(this.formGroup))
|
|
173
|
-
return false;
|
|
174
|
-
const data = NgxFormService.getFormData(this.formGroup);
|
|
175
|
-
this.submitEvent.emit({
|
|
176
|
-
data,
|
|
177
|
-
component: 'CrudFormComponent',
|
|
178
|
-
name: this.action || EventConstants.SUBMIT,
|
|
179
|
-
handlers: this.handlers,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* @description Handles form reset or navigation back functionality.
|
|
184
|
-
* @summary Provides different reset behavior based on the current operation.
|
|
185
|
-
* For CREATE and UPDATE operations, resets the form to its initial state.
|
|
186
|
-
* For READ and DELETE operations, navigates back in the browser history
|
|
187
|
-
* since these operations don't have modifiable form data to reset.
|
|
188
|
-
*
|
|
189
|
-
* @returns {void}
|
|
190
|
-
* @memberOf CrudFormComponent
|
|
191
|
-
*/
|
|
192
|
-
handleReset() {
|
|
193
|
-
if (![OperationKeys.DELETE, OperationKeys.READ].includes(this.operation) && this.allowClear)
|
|
194
|
-
return NgxFormService.reset(this.formGroup);
|
|
195
|
-
this.location.back();
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* @description Handles delete operations by emitting delete events.
|
|
199
|
-
* @summary Processes delete requests by emitting a submit event with the
|
|
200
|
-
* record's unique identifier as data. This allows parent components to
|
|
201
|
-
* handle the actual deletion logic while maintaining separation of concerns.
|
|
202
|
-
* The event includes the uid and standard component identification.
|
|
203
|
-
*
|
|
204
|
-
* @returns {void}
|
|
205
|
-
* @memberOf CrudFormComponent
|
|
206
|
-
*/
|
|
207
|
-
handleDelete() {
|
|
208
|
-
this.submitEvent.emit({
|
|
209
|
-
data: this.modelId,
|
|
210
|
-
component: 'CrudFormComponent',
|
|
211
|
-
name: EventConstants.SUBMIT,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CrudFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
215
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CrudFormComponent, isStandalone: true, selector: "ngx-decaf-crud-form", inputs: { model: "model", modelId: "modelId", updateOn: "updateOn", target: "target", method: "method", options: "options", action: "action", operation: "operation", handlers: "handlers", formGroup: "formGroup", childOf: "childOf", rendererId: "rendererId", uid: "uid", allowClear: "allowClear" }, outputs: { submitEvent: "submitEvent" }, host: { properties: { "attr.id": "uid" } }, 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 class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button type=\"submit\" [expand]=\"action ? 'block' : 'default'\">\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 @if(!action) {\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 Back\n </ion-button>\n </div>\n }\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" [id]=\"uid\">\n @if(operation === OperationKeys.READ && modelId) {\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\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 {{ [OperationKeys.DELETE, OperationKeys.READ, OperationKeys.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: 768px){.dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 767px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}form{padding:2rem 1rem}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
216
|
-
};
|
|
217
|
-
CrudFormComponent = __decorate([
|
|
218
|
-
Dynamic()
|
|
219
|
-
], CrudFormComponent);
|
|
220
|
-
export { CrudFormComponent };
|
|
221
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CrudFormComponent, decorators: [{
|
|
222
|
-
type: Component,
|
|
223
|
-
args: [{ standalone: true, selector: 'ngx-decaf-crud-form', imports: [ReactiveFormsModule, IonButton, IonIcon], host: { '[attr.id]': 'uid' }, 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 class=\"dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left\">\n <div>\n <ion-button type=\"submit\" [expand]=\"action ? 'block' : 'default'\">\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 @if(!action) {\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 Back\n </ion-button>\n </div>\n }\n </div>\n </form>\n} @else {\n <div [class]=\"'dcf-buttons-container dcf-grid dcf-grid-collapse dcf-flex dcf-flex-left ' + operation\" [id]=\"uid\">\n @if(operation === OperationKeys.READ && modelId) {\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\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 {{ [OperationKeys.DELETE, OperationKeys.READ, OperationKeys.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: 768px){.dcf-buttons-container.dcf-flex{flex-direction:row-reverse}}@media (max-width: 767px){.dcf-buttons-container.dcf-flex div{width:100%}.dcf-buttons-container.dcf-flex ion-button{width:100%;margin-bottom:1rem}}form{padding:2rem 1rem}\n"] }]
|
|
224
|
-
}], propDecorators: { model: [{
|
|
225
|
-
type: Input
|
|
226
|
-
}], modelId: [{
|
|
227
|
-
type: Input
|
|
228
|
-
}], updateOn: [{
|
|
229
|
-
type: Input
|
|
230
|
-
}], component: [{
|
|
231
|
-
type: ViewChild,
|
|
232
|
-
args: ['reactiveForm', { static: false, read: ElementRef }]
|
|
233
|
-
}], target: [{
|
|
234
|
-
type: Input
|
|
235
|
-
}], method: [{
|
|
236
|
-
type: Input
|
|
237
|
-
}], options: [{
|
|
238
|
-
type: Input
|
|
239
|
-
}], action: [{
|
|
240
|
-
type: Input
|
|
241
|
-
}], operation: [{
|
|
242
|
-
type: Input,
|
|
243
|
-
args: [{ required: true }]
|
|
244
|
-
}], handlers: [{
|
|
245
|
-
type: Input
|
|
246
|
-
}], formGroup: [{
|
|
247
|
-
type: Input
|
|
248
|
-
}], childOf: [{
|
|
249
|
-
type: Input
|
|
250
|
-
}], rendererId: [{
|
|
251
|
-
type: Input
|
|
252
|
-
}], uid: [{
|
|
253
|
-
type: Input
|
|
254
|
-
}], allowClear: [{
|
|
255
|
-
type: Input
|
|
256
|
-
}], submitEvent: [{
|
|
257
|
-
type: Output
|
|
258
|
-
}] } });
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZvcm0vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQWEsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFpQixPQUFPLEVBQUUsY0FBYyxFQUErRCxNQUFNLGNBQWMsQ0FBQztBQUVuSSxPQUFPLEVBQWtCLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQUcvRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQStESSxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFpQjtJQUF2QjtRQTJCTDs7Ozs7Ozs7O1dBU0c7UUFFSCxhQUFRLEdBQW9CLFFBQVEsQ0FBQztRQWNyQzs7Ozs7Ozs7O1dBU0c7UUFFSCxXQUFNLEdBQW1C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T0FBTzs7QUF3RHRDLGlCQUFpQjtJQTlEN0IsT0FBTyxFQUFFO0dBOERHLGlCQUFpQixDQXFWN0I7OzRGQXJWWSxpQkFBaUI7a0JBN0Q3QixTQUFTO2lDQUNJLElBQUksWUFDTixxQkFBcUIsV0FHdEIsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQzVDLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBQzs4QkFrRTFCLEtBQUs7c0JBREosS0FBSztnQkFlTixPQUFPO3NCQUROLEtBQUs7Z0JBY04sUUFBUTtzQkFEUCxLQUFLO2dCQWFOLFNBQVM7c0JBRFIsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBYzlELE1BQU07c0JBREwsS0FBSztnQkFjTixNQUFNO3NCQURMLEtBQUs7Z0JBYU4sT0FBTztzQkFETixLQUFLO2dCQWFOLE1BQU07c0JBREwsS0FBSztnQkFjTixTQUFTO3NCQURSLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQWF6QixRQUFRO3NCQURQLEtBQUs7Z0JBYU4sU0FBUztzQkFEUixLQUFLO2dCQVdOLE9BQU87c0JBRE4sS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBWU4sR0FBRztzQkFERixLQUFLO2dCQWdCTixVQUFVO3NCQURULEtBQUs7Z0JBMkJOLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSUZvcm1FbGVtZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTmd4Rm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4Rm9ybVNlcnZpY2UnO1xuaW1wb3J0IHsgQ3J1ZEZvcm1FdmVudCwgRHluYW1pYywgRXZlbnRDb25zdGFudHMsIEZpZWxkVXBkYXRlTW9kZSwgSGFuZGxlckxpa2UsIEhUTUxGb3JtVGFyZ2V0LCBSZW5kZXJlZE1vZGVsIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IENydWRGb3JtT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ3J1ZE9wZXJhdGlvbnMsIE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBEZWZhdWx0Rm9ybVJlYWN0aXZlT3B0aW9ucyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BkZWNhZi10cy9sb2dnaW5nJztcbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tVmFsdWUgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gJy4uLy4uL2Zvci1hbmd1bGFyLWNvbW1vbi5tb2R1bGUnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5cblxuLyoqXG4gKiBAY29tcG9uZW50IENydWRGb3JtQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8bmd4LWRlY2FmLWNydWQtZm9ybVxuICogICBhY3Rpb249XCJjcmVhdGVcIlxuICogICBvcGVyYXRpb249XCJjcmVhdGVcIlxuICogICBmb3JtR3JvdXA9XCJmb3JtR3JvdXBcIlxuICogICByZW5kZXJlcklkPVwicmVuZGVyZXJJZFwiXG4gKiAgIHN1Ym1pdEV2ZW50PVwic3VibWl0RXZlbnRcIlxuICogICB0YXJnZXQ9XCJfc2VsZlwiXG4gKiAgIG1ldGhvZD1cImV2ZW50XCI+XG4gKiA8L25neC1kZWNhZi1jcnVkLWZvcm0+XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbiAtIFRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtDcnVkT3BlcmF0aW9uc30gb3BlcmF0aW9uIC0gVGhlIENSVUQgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAoY3JlYXRlLCByZWFkLCB1cGRhdGUsIGRlbGV0ZSlcbiAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgZm9ybSBncm91cFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbmRlcmVySWQgLSBUaGUgcmVuZGVyZXIgaWRcbiAqIEBwYXJhbSB7U3VibWl0RXZlbnR9IHN1Ym1pdEV2ZW50IC0gVGhlIHN1Ym1pdCBldmVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldCAtIFRoZSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSBUaGUgbWV0aG9kXG4gKi9cbkBEeW5hbWljKClcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ25neC1kZWNhZi1jcnVkLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtSZWFjdGl2ZUZvcm1zTW9kdWxlLCBJb25CdXR0b24sIElvbkljb25dLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICd1aWQnfSxcbn0pXG4vKipcbiAqIEBjbGFzcyBDcnVkRm9ybUNvbXBvbmVudFxuICogQGltcGxlbWVudHMgT25Jbml0LCBJRm9ybUVsZW1lbnQsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbFxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIGBDcnVkRm9ybUNvbXBvbmVudGAgaXMgYW4gQW5ndWxhciBjb21wb25lbnQgZGVzaWduZWQgdG8gcHJvdmlkZSBhIGZsZXhpYmxlIGFuZCBleHRlbnNpYmxlIGZvcm0gaW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIENSVUQgKENyZWF0ZSwgUmVhZCwgVXBkYXRlLCBEZWxldGUpIG9wZXJhdGlvbnMgb24gYSBkYXRhIG1vZGVsLiBJdCBpbnRlZ3JhdGVzIHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGZvcm1zIGFuZCBzdXBwb3J0cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uLCB2YWxpZGF0aW9uLCBhbmQgZXZlbnQgaGFuZGxpbmcgZm9yIGEgd2lkZSByYW5nZSBvZiB1c2UgY2FzZXMuXG4gKlxuICogQHN1bW1hcnlcbiAqIC0gU3VwcG9ydHMgZHluYW1pYyBmb3JtIHJlbmRlcmluZyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZGF0YSBtb2RlbCBhbmQgb3BlcmF0aW9uIHR5cGUuXG4gKiAtIEhhbmRsZXMgZm9ybSB2YWxpZGF0aW9uLCBzdWJtaXNzaW9uLCBhbmQgcmVzZXQgbG9naWMgd2l0aCBjdXN0b21pemFibGUgYmVoYXZpb3IuXG4gKiAtIEVtaXRzIHN0cnVjdHVyZWQgZXZlbnRzIGZvciBmb3JtIGFjdGlvbnMsIGVuYWJsaW5nIGRlY291cGxlZCBidXNpbmVzcyBsb2dpYy5cbiAqIC0gSW50ZWdyYXRlcyB3aXRoIGV4dGVybmFsIHNlcnZpY2VzIGZvciBsb2dnaW5nLCBmb3JtIG1hbmFnZW1lbnQsIGFuZCBuYXZpZ2F0aW9uLlxuICogLSBQcm92aWRlcyBleHRlbnNpdmUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBmb3JtIGFwcGVhcmFuY2UgYW5kIGJlaGF2aW9yLlxuICpcbiAqIEBpbnB1dHNcbiAqIC0gYG1vZGVsYDogVGhlIHJlcG9zaXRvcnkgbW9kZWwgZm9yIGRhdGEgb3BlcmF0aW9ucy5cbiAqIC0gYG1vZGVsSWRgOiBUaGUgcHJpbWFyeSBkYXRhIG1vZGVsIGluc3RhbmNlIGZvciBDUlVEIG9wZXJhdGlvbnMuXG4gKiAtIGB1cGRhdGVPbmA6IERldGVybWluZXMgd2hlbiBmb3JtIGZpZWxkIHZhbGlkYXRpb24gaXMgdHJpZ2dlcmVkIChgY2hhbmdlYCwgYGJsdXJgLCBvciBgc3VibWl0YCkuXG4gKiAtIGBjb21wb25lbnRgOiBSZWZlcmVuY2UgdG8gdGhlIHJlYWN0aXZlIGZvcm0gRE9NIGVsZW1lbnQuXG4gKiAtIGB0YXJnZXRgOiBTcGVjaWZpZXMgdGhlIGZvcm0gc3VibWlzc2lvbiB0YXJnZXQgKGUuZy4sIGBfc2VsZmAsIGBfYmxhbmtgKS5cbiAqIC0gYG1ldGhvZGA6IERlZmluZXMgdGhlIGZvcm0gc3VibWlzc2lvbiBzdHJhdGVneSAoYGdldGAsIGBwb3N0YCwgb3IgYGV2ZW50YCkuXG4gKiAtIGBvcHRpb25zYDogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBmb3JtIGJlaGF2aW9yIGFuZCByZW5kZXJpbmcuXG4gKiAtIGBhY3Rpb25gOiBPcHRpb25hbCBjdXN0b20gYWN0aW9uIGlkZW50aWZpZXIgZm9yIHN1Ym1pc3Npb24gY29udGV4dC5cbiAqIC0gYG9wZXJhdGlvbmA6IFRoZSBjdXJyZW50IENSVUQgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZCAocmVxdWlyZWQpLlxuICogLSBgaGFuZGxlcnNgOiBDdXN0b20gZXZlbnQgaGFuZGxlcnMgZm9yIGZvcm0gYWN0aW9ucy5cbiAqIC0gYGZvcm1Hcm91cGA6IEFuZ3VsYXIgRm9ybUdyb3VwIGZvciBmb3JtIHN0YXRlIG1hbmFnZW1lbnQuXG4gKiAtIGBjaGlsZE9mYDogUGF0aCB0byB0aGUgcGFyZW50IEZvcm1Hcm91cCBpZiBuZXN0ZWQuXG4gKiAtIGByZW5kZXJlcklkYDogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBmb3JtIHJlbmRlcmVyLlxuICogLSBgdWlkYDogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIC0gYGFsbG93Q2xlYXJgOiBFbmFibGVzIG9yIGRpc2FibGVzIGZvcm0gY2xlYXJpbmcgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBAb3V0cHV0c1xuICogLSBgc3VibWl0RXZlbnRgOiBFbWl0cyBgQ3J1ZEZvcm1FdmVudGAgb2JqZWN0cyBvbiBmb3JtIHN1Ym1pc3Npb24uXG4gKlxuICogQHByb3RlY3RlZFxuICogLSBgT3BlcmF0aW9uS2V5c2A6IFJlZmVyZW5jZSB0byBDUlVEIG9wZXJhdGlvbiBjb25zdGFudHMgZm9yIHRlbXBsYXRlIHVzYWdlLlxuICpcbiAqIEBwcml2YXRlXG4gKiAtIGBsb2dnZXJgOiBMb2dnZXIgaW5zdGFuY2UgZm9yIHN0cnVjdHVyZWQgbG9nZ2luZy5cbiAqIC0gYGxvY2F0aW9uYDogQW5ndWxhciBMb2NhdGlvbiBzZXJ2aWNlIGZvciBuYXZpZ2F0aW9uLlxuICpcbiAqIEBsaWZlY3ljbGVcbiAqIC0gYG5nT25Jbml0YDogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgY29uZmlndXJlcyBsb2dnZXIsIG1lcmdlcyBvcHRpb25zLCBhbmQgc2V0cyBmb3JtIHN0YXRlIGJhc2VkIG9uIG9wZXJhdGlvbi5cbiAqIC0gYG5nT25EZXN0cm95YDogQ2xlYW5zIHVwIHJlc291cmNlcyBhbmQgdW5yZWdpc3RlcnMgdGhlIEZvcm1Hcm91cC5cbiAqXG4gKiBAbWV0aG9kc1xuICogLSBgc3VibWl0KGV2ZW50OiBTdWJtaXRFdmVudClgOiBIYW5kbGVzIGZvcm0gc3VibWlzc2lvbiwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50IGVtaXNzaW9uLlxuICogLSBgaGFuZGxlUmVzZXQoKWA6IFJlc2V0cyB0aGUgZm9ybSBvciBuYXZpZ2F0ZXMgYmFjayBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uLlxuICogLSBgaGFuZGxlRGVsZXRlKClgOiBFbWl0cyBhIGRlbGV0ZSBldmVudCBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkLlxuICpcbiAqIEB1c2FnZVxuICogVXNlIHRoaXMgY29tcG9uZW50IHdpdGhpbiBBbmd1bGFyIHRlbXBsYXRlcyB0byBwcm92aWRlIGEgcm9idXN0IENSVUQgZm9ybSBpbnRlcmZhY2UuIENvbmZpZ3VyZSBpbnB1dHMgdG8gbWF0Y2ggeW91ciBkYXRhIG1vZGVsIGFuZCBkZXNpcmVkIGJlaGF2aW9yLCBhbmQgaGFuZGxlIG91dHB1dCBldmVudHMgdG8gaW1wbGVtZW50IGN1c3RvbSBidXNpbmVzcyBsb2dpYy5cbiAqL1xuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBJRm9ybUVsZW1lbnQsIE9uRGVzdHJveSwgUmVuZGVyZWRNb2RlbCB7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IG1vZGVsIGZvciBkYXRhIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFRoZSBkYXRhIG1vZGVsIHJlcG9zaXRvcnkgdGhhdCB0aGlzIGNvbXBvbmVudCB3aWxsIHVzZSBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBUaGlzIHByb3ZpZGVzIGEgY29ubmVjdGlvbiB0byB0aGUgZGF0YSBsYXllciBmb3IgcmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGVsITogTW9kZWwgfCB1bmRlZmluZWQ7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwcmltYXJ5IGRhdGEgbW9kZWwgdXNlZCBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBUaGlzIGlucHV0IHByb3ZpZGVzIHRoZSBtYWluIE1vZGVsIGluc3RhbmNlIHRoYXQgdGhlIGZvcm0gaW50ZXJhY3RzIHdpdGggZm9yXG4gICAqIGNyZWF0aW5nLCByZWFkaW5nLCB1cGRhdGluZywgb3IgZGVsZXRpbmcgcmVjb3Jkcy4gSXQgc2VydmVzIGFzIHRoZSBzb3VyY2Ugb2Ygc2NoZW1hXG4gICAqIGFuZCB2YWxpZGF0aW9uIHJ1bGVzIGZvciB0aGUgZm9ybSBmaWVsZHMsIGFuZCBpcyByZXF1aXJlZCBmb3IgbW9zdCBvcGVyYXRpb25zIGV4Y2VwdFxuICAgKiBmb3IgY2VydGFpbiByZWFkIG9yIGRlbGV0ZSBzY2VuYXJpb3MuXG4gICAqXG4gICAqIEB0eXBlIHtNb2RlbCB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBtb2RlbElkITogTW9kZWwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCB1cGRhdGUgdHJpZ2dlciBtb2RlIGZvciBmb3JtIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgd2hlbiBmb3JtIGZpZWxkIHZhbGlkYXRpb24gc2hvdWxkIGJlIHRyaWdnZXJlZC4gT3B0aW9ucyBpbmNsdWRlXG4gICAqICdjaGFuZ2UnLCAnYmx1cicsIG9yICdzdWJtaXQnLiBUaGlzIGFmZmVjdHMgdGhlIHVzZXIgZXhwZXJpZW5jZSBieSBjb250cm9sbGluZ1xuICAgKiB3aGVuIHZhbGlkYXRpb24gZmVlZGJhY2sgaXMgc2hvd24gdG8gdGhlIHVzZXIgZHVyaW5nIGZvcm0gaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtGaWVsZFVwZGF0ZU1vZGV9XG4gICAqIEBkZWZhdWx0ICdjaGFuZ2UnXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdXBkYXRlT246IEZpZWxkVXBkYXRlTW9kZSA9ICdjaGFuZ2UnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVmZXJlbmNlIHRvIHRoZSByZWFjdGl2ZSBmb3JtIERPTSBlbGVtZW50LlxuICAgKiBAc3VtbWFyeSBWaWV3Q2hpbGQgcmVmZXJlbmNlIHRoYXQgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgZm9ybSdzIERPTSBlbGVtZW50LlxuICAgKiBUaGlzIGVuYWJsZXMgcHJvZ3JhbW1hdGljIG1hbmlwdWxhdGlvbiBvZiB0aGUgZm9ybSBlbGVtZW50IGFuZCBhY2Nlc3MgdG8gbmF0aXZlXG4gICAqIEhUTUwgZm9ybSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHdoZW4gbmVlZGVkLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBAVmlld0NoaWxkKCdyZWFjdGl2ZUZvcm0nLCB7IHN0YXRpYzogZmFsc2UsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgY29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm0gc3VibWlzc2lvbiB0YXJnZXQgc3BlY2lmaWNhdGlvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRvIGRpc3BsYXkgdGhlIHJlc3BvbnNlIGFmdGVyIGZvcm0gc3VibWlzc2lvbiwgc2ltaWxhclxuICAgKiB0byB0aGUgSFRNTCBmb3JtIHRhcmdldCBhdHRyaWJ1dGUuIE9wdGlvbnMgaW5jbHVkZSAnX3NlbGYnLCAnX2JsYW5rJywgJ19wYXJlbnQnLFxuICAgKiAnX3RvcCcsIG9yIGEgbmFtZWQgZnJhbWUuIENvbnRyb2xzIHRoZSBicm93c2VyIGJlaGF2aW9yIGZvciBmb3JtIHJlc3BvbnNlcy5cbiAgICpcbiAgICogQHR5cGUge0hUTUxGb3JtVGFyZ2V0fVxuICAgKiBAZGVmYXVsdCAnX3NlbGYnXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdGFyZ2V0OiBIVE1MRm9ybVRhcmdldCA9ICdfc2VsZic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIVFRQIG1ldGhvZCBvciBzdWJtaXNzaW9uIHN0cmF0ZWd5IGZvciB0aGUgZm9ybS5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgdGhlIGZvcm0gc2hvdWxkIGJlIHN1Ym1pdHRlZC4gJ2dldCcgYW5kICdwb3N0JyBjb3JyZXNwb25kXG4gICAqIHRvIHN0YW5kYXJkIEhUVFAgbWV0aG9kcyBmb3IgdHJhZGl0aW9uYWwgZm9ybSBzdWJtaXNzaW9uLCB3aGlsZSAnZXZlbnQnIHVzZXNcbiAgICogQW5ndWxhciBldmVudC1kcml2ZW4gc3VibWlzc2lvbiBmb3Igc2luZ2xlLXBhZ2UgYXBwbGljYXRpb24gd29ya2Zsb3dzLlxuICAgKlxuICAgKiBAdHlwZSB7J2dldCcgfCAncG9zdCcgfCAnZXZlbnQnfVxuICAgKiBAZGVmYXVsdCAnZXZlbnQnXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdldmVudCcgPSAnZXZlbnQnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQ1JVRCBmb3JtIGJlaGF2aW9yLlxuICAgKiBAc3VtbWFyeSBDb250YWlucyB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdGhhdCBjb250cm9sIGZvcm0gcmVuZGVyaW5nLFxuICAgKiB2YWxpZGF0aW9uLCBhbmQgYmVoYXZpb3IuIFRoZXNlIG9wdGlvbnMgYXJlIG1lcmdlZCB3aXRoIGRlZmF1bHQgc2V0dGluZ3NcbiAgICogZHVyaW5nIGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiB0byBjdXN0b21pemUgdGhlIGZvcm0ncyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZEZvcm1PcHRpb25zfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnMhOiBDcnVkRm9ybU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25hbCBhY3Rpb24gaWRlbnRpZmllciBmb3IgZm9ybSBzdWJtaXNzaW9uIGNvbnRleHQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhIGN1c3RvbSBhY3Rpb24gbmFtZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHN1Ym1pdCBldmVudC5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBkZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgc3VibWl0IGV2ZW50IGNvbnN0YW50LiBVc2VkIHRvXG4gICAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IHR5cGVzIG9mIGZvcm0gc3VibWlzc2lvbnMgd2l0aGluIHRoZSBzYW1lIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBhY3Rpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBvcGVyYXRpb24gdGhpcyBmb3JtIGlzIGhhbmRsaW5nIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAgICogVGhpcyBpcyBhIHJlcXVpcmVkIGlucHV0IHRoYXQgZGV0ZXJtaW5lcyBmb3JtIGJlaGF2aW9yLCB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgYXZhaWxhYmxlIGFjdGlvbnMuXG4gICAqIFRoZSBvcGVyYXRpb24gYWZmZWN0cyBmb3JtIHN0YXRlLCBidXR0b24gdmlzaWJpbGl0eSwgYW5kIHN1Ym1pc3Npb24gbG9naWMuXG4gICAqXG4gICAqIEB0eXBlIHtDcnVkT3BlcmF0aW9uc31cbiAgICogQHJlcXVpcmVkXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgb3BlcmF0aW9uITogQ3J1ZE9wZXJhdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZXZlbnQgaGFuZGxlcnMgZm9yIGZvcm0gYWN0aW9ucy5cbiAgICogQHN1bW1hcnkgQSByZWNvcmQgb2YgZXZlbnQgaGFuZGxlciBmdW5jdGlvbnMga2V5ZWQgYnkgZXZlbnQgbmFtZXMgdGhhdCBjYW4gYmVcbiAgICogdHJpZ2dlcmVkIGR1cmluZyBmb3JtIG9wZXJhdGlvbnMuIFRoZXNlIGhhbmRsZXJzIHByb3ZpZGUgZXh0ZW5zaWJpbGl0eSBmb3JcbiAgICogY3VzdG9tIGJ1c2luZXNzIGxvZ2ljIGFuZCBjYW4gYmUgaW52b2tlZCBmb3IgdmFyaW91cyBmb3JtIGV2ZW50cyBhbmQgYWN0aW9ucy5cbiAgICpcbiAgICogQHR5cGUge0hhbmRsZXJMaWtlfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGhhbmRsZXJzITogSGFuZGxlckxpa2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBbmd1bGFyIHJlYWN0aXZlIEZvcm1Hcm91cCBmb3IgZm9ybSBzdGF0ZSBtYW5hZ2VtZW50LlxuICAgKiBAc3VtbWFyeSBUaGUgRm9ybUdyb3VwIGluc3RhbmNlIHRoYXQgbWFuYWdlcyBhbGwgZm9ybSBjb250cm9scywgdmFsaWRhdGlvbixcbiAgICogYW5kIGZvcm0gc3RhdGUuIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgZm9ybSB2YWx1ZXMgYW5kXG4gICAqIGNvbnRyb2xsaW5nIGZvcm0gYmVoYXZpb3IuIE1heSBiZSB1bmRlZmluZWQgZm9yIHJlYWQtb25seSBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZvcm1Hcm91cCE6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhdGggdG8gdGhlIHBhcmVudCBGb3JtR3JvdXAsIGlmIG5lc3RlZC5cbiAgICogQHN1bW1hcnkgRnVsbCBkb3QtZGVsaW1pdGVkIHBhdGggb2YgdGhlIHBhcmVudCBGb3JtR3JvdXAuIFNldCBvbmx5IHdoZW4gaXMgcGFydCBvZiBhIG5lc3RlZCBzdHJ1Y3R1cmUuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2hpbGRPZj86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZm9ybSByZW5kZXJlci5cbiAgICogQHN1bW1hcnkgQSB1bmlxdWUgc3RyaW5nIGlkZW50aWZpZXIgdXNlZCB0byByZWdpc3RlciBhbmQgbWFuYWdlIHRoaXMgZm9ybVxuICAgKiBpbnN0YW5jZSB3aXRoaW4gdGhlIE5neEZvcm1TZXJ2aWNlLiBUaGlzIElEIGlzIGFsc28gdXNlZCBhcyB0aGUgSFRNTCBpZFxuICAgKiBhdHRyaWJ1dGUgZm9yIHRoZSBmb3JtIGVsZW1lbnQsIGVuYWJsaW5nIERPTSBxdWVyaWVzIGFuZCBmb3JtIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgcmVuZGVyZXJJZCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3IgbWFuaXB1bGF0ZWQuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJpbWFyeSBrZXkgZm9yIG9wZXJhdGlvbnMgb24gc3BlY2lmaWMgcmVjb3Jkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlcn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB1aWQ6IHN0cmluZyA9IGdlbmVyYXRlUmFuZG9tVmFsdWUoMTIpO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgcmVjb3JkIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIHByb3BlcnR5IGhvbGRzIGEgdW5pcXVlIHN0cmluZyB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIHJlY29yZCBiZWluZyBtYW5hZ2VkIGJ5IHRoZSBmb3JtLlxuICAgKiBJdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBpZiBub3QgcHJvdmlkZWQsIGVuc3VyaW5nIGVhY2ggZm9ybSBpbnN0YW5jZSBoYXMgYSBkaXN0aW5jdCBpZGVudGlmaWVyLlxuICAgKiBUaGUgdWlkIGlzIHVzZWQgZm9yIHRyYWNraW5nLCByZWZlcmVuY2luZywgYW5kIGVtaXR0aW5nIGV2ZW50cyByZWxhdGVkIHRvIHRoZSBjdXJyZW50IHJlY29yZCwgYW5kIG1heSBiZSB1c2VkXG4gICAqIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByaW1hcnkga2V5IGZvciBDUlVEIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0IFJhbmRvbWx5IGdlbmVyYXRlZCAxMi1jaGFyYWN0ZXIgc3RyaW5nXG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYWxsb3dDbGVhcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gQ1JVRCBvcGVyYXRpb24gY29uc3RhbnRzIGZvciB0ZW1wbGF0ZSB1c2FnZS5cbiAgICogQHN1bW1hcnkgRXhwb3NlcyB0aGUgT3BlcmF0aW9uS2V5cyBlbnVtIHRvIHRoZSBjb21wb25lbnQgdGVtcGxhdGUsIGVuYWJsaW5nXG4gICAqIGNvbmRpdGlvbmFsIHJlbmRlcmluZyBhbmQgYmVoYXZpb3IgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVzLiBUaGlzIHByb3RlY3RlZFxuICAgKiByZWFkb25seSBwcm9wZXJ0eSBlbnN1cmVzIHRoYXQgdGVtcGxhdGUgbG9naWMgY2FuIGFjY2VzcyBvcGVyYXRpb24gY29uc3RhbnRzXG4gICAqIHdoaWxlIG1haW50YWluaW5nIGVuY2Fwc3VsYXRpb24gYW5kIHByZXZlbnRpbmcgYWNjaWRlbnRhbCBtb2RpZmljYXRpb24uXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHJlYWRvbmx5XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IE9wZXJhdGlvbktleXMgPSBPcGVyYXRpb25LZXlzO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciBmb3JtIHN1Ym1pc3Npb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBFbWl0cyBDcnVkRm9ybUV2ZW50IG9iamVjdHMgd2hlbiB0aGUgZm9ybSBpcyBzdWJtaXR0ZWQsIHByb3ZpZGluZ1xuICAgKiBmb3JtIGRhdGEsIGNvbXBvbmVudCBpbmZvcm1hdGlvbiwgYW5kIGFueSBhc3NvY2lhdGVkIGhhbmRsZXJzIHRvIHBhcmVudFxuICAgKiBjb21wb25lbnRzLiBUaGlzIGVuYWJsZXMgZGVjb3VwbGVkIGhhbmRsaW5nIG9mIGZvcm0gc3VibWlzc2lvbiBsb2dpYy5cbiAgICpcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxDcnVkRm9ybUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxDcnVkRm9ybUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q3J1ZEZvcm1FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgbG9nZ2luZyBjYXBhYmlsaXRpZXMgZm9yIHRoZSBjb21wb25lbnQsIGFsbG93aW5nIGZvciBjb25zaXN0ZW50XG4gICAqIGFuZCBzdHJ1Y3R1cmVkIGxvZ2dpbmcgb2YgaW5mb3JtYXRpb24sIHdhcm5pbmdzLCBhbmQgZXJyb3JzLiBUaGlzIGxvZ2dlciBpcyBpbml0aWFsaXplZFxuICAgKiBpbiB0aGUgbmdPbkluaXQgbWV0aG9kIHVzaW5nIHRoZSBnZXRMb2dnZXIgZnVuY3Rpb24gZnJvbSB0aGUgRm9yQW5ndWxhckNvbW1vbk1vZHVsZS5cbiAgICpcbiAgICogVGhlIGxvZ2dlciBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGNvbXBvbmVudCB0byByZWNvcmQgaW1wb3J0YW50IGV2ZW50cywgZGVidWcgaW5mb3JtYXRpb24sXG4gICAqIGFuZCBwb3RlbnRpYWwgaXNzdWVzLiBJdCBoZWxwcyBpbiBtb25pdG9yaW5nIHRoZSBjb21wb25lbnQncyBiZWhhdmlvciwgdHJhY2tpbmcgdGhlIGZsb3dcbiAgICogb2Ygb3BlcmF0aW9ucywgYW5kIGZhY2lsaXRhdGluZyBlYXNpZXIgZGVidWdnaW5nIGFuZCBtYWludGVuYW5jZS5cbiAgICpcbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICogQHByaXZhdGVcbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGxvZ2dlciE6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFuZ3VsYXIgTG9jYXRpb24gc2VydmljZS5cbiAgICogQHN1bW1hcnkgSW5qZWN0ZWQgc2VydmljZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnJvd3NlcidzIFVSTCBhbmQgaGlzdG9yeS5cbiAgICogVGhpcyBzZXJ2aWNlIGlzIHVzZWQgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGJyb3dzZXIncyBoaXN0b3J5IEFQSSwgYWxsb3dpbmdcbiAgICogZm9yIGJhY2sgbmF2aWdhdGlvbiBhbmQgVVJMIG1hbmlwdWxhdGlvbiBvdXRzaWRlIG9mIEFuZ3VsYXIncyByb3V0ZXIuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtMb2NhdGlvbn1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbiA9IGluamVjdChMb2NhdGlvbik7XG5cbiAgLy8gbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIGlmICghW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSlcbiAgICAvLyAgIE5neEZvcm1TZXJ2aWNlLmZvcm1BZnRlclZpZXdJbml0KHRoaXMsIHRoaXMucmVuZGVyZXJJZCk7XG4gIC8vIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBpbml0aWFsaXphdGlvbiBsaWZlY3ljbGUgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGJ5IHNldHRpbmcgdXAgdGhlIGxvZ2dlciwgY29uZmlndXJpbmcgZm9ybSBzdGF0ZVxuICAgKiBiYXNlZCBvbiB0aGUgb3BlcmF0aW9uIHR5cGUsIGFuZCBtZXJnaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gRm9yIFJFQUQgYW5kIERFTEVURVxuICAgKiBvcGVyYXRpb25zLCB0aGUgZm9ybUdyb3VwIGlzIHNldCB0byB1bmRlZmluZWQgc2luY2UgdGhlc2Ugb3BlcmF0aW9ucyBkb24ndCByZXF1aXJlXG4gICAqIGZvcm0gaW5wdXQuIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgbWVyZ2VkIHdpdGggZGVmYXVsdCBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJPZiBDcnVkRm9ybUNvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmxvZ2dlcilcbiAgICAgIHRoaXMubG9nZ2VyID0gZ2V0TG9nZ2VyKHRoaXMpO1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5SRUFEIHx8IHRoaXMub3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkRFTEVURSlcbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gdW5kZWZpbmVkO1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIERlZmF1bHRGb3JtUmVhY3RpdmVPcHRpb25zLFxuICAgICAgdGhpcy5vcHRpb25zIHx8IHt9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBjbGVhbnVwIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGNsZWFudXAgb3BlcmF0aW9ucyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLlxuICAgKiBVbnJlZ2lzdGVycyB0aGUgRm9ybUdyb3VwIGZyb20gdGhlIE5neEZvcm1TZXJ2aWNlIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAqIGFuZCBlbnN1cmUgcHJvcGVyIHJlc291cmNlIGNsZWFudXAuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cClcbiAgICAgIE5neEZvcm1TZXJ2aWNlLnVucmVnaXN0ZXIodGhpcy5mb3JtR3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZvcm0gc3VibWlzc2lvbiB3aXRoIHZhbGlkYXRpb24gYW5kIGV2ZW50IGVtaXNzaW9uLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZm9ybSBzdWJtaXNzaW9uIGJ5IGZpcnN0IHByZXZlbnRpbmcgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yLFxuICAgKiB0aGVuIHZhbGlkYXRpbmcgYWxsIGZvcm0gZmllbGRzIHVzaW5nIE5neEZvcm1TZXJ2aWNlLiBJZiB2YWxpZGF0aW9uIHBhc3NlcyxcbiAgICogZXh0cmFjdHMgZm9ybSBkYXRhIGFuZCBlbWl0cyBhIHN1Ym1pdEV2ZW50IHdpdGggdGhlIGRhdGEsIGNvbXBvbmVudCBpbmZvcm1hdGlvbixcbiAgICogYW5kIGFueSBhc3NvY2lhdGVkIGhhbmRsZXJzLiBSZXR1cm5zIGZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3VibWl0RXZlbnR9IGV2ZW50IC0gVGhlIGJyb3dzZXIncyBuYXRpdmUgZm9ybSBzdWJtaXQgZXZlbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbiB8IHZvaWQ+fSBSZXR1cm5zIGZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMsIHZvaWQgaWYgc3VjY2Vzc2Z1bFxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGFzeW5jIHN1Ym1pdChldmVudDogU3VibWl0RXZlbnQpOiBQcm9taXNlPGJvb2xlYW4gfCB2b2lkPiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIU5neEZvcm1TZXJ2aWNlLnZhbGlkYXRlRmllbGRzKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCkpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGF0YSA9IE5neEZvcm1TZXJ2aWNlLmdldEZvcm1EYXRhKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCk7XG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHtcbiAgICAgIGRhdGEsXG4gICAgICBjb21wb25lbnQ6ICdDcnVkRm9ybUNvbXBvbmVudCcsXG4gICAgICBuYW1lOiB0aGlzLmFjdGlvbiB8fCBFdmVudENvbnN0YW50cy5TVUJNSVQsXG4gICAgICBoYW5kbGVyczogdGhpcy5oYW5kbGVycyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmb3JtIHJlc2V0IG9yIG5hdmlnYXRpb24gYmFjayBmdW5jdGlvbmFsaXR5LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBkaWZmZXJlbnQgcmVzZXQgYmVoYXZpb3IgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3BlcmF0aW9uLlxuICAgKiBGb3IgQ1JFQVRFIGFuZCBVUERBVEUgb3BlcmF0aW9ucywgcmVzZXRzIHRoZSBmb3JtIHRvIGl0cyBpbml0aWFsIHN0YXRlLlxuICAgKiBGb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMsIG5hdmlnYXRlcyBiYWNrIGluIHRoZSBicm93c2VyIGhpc3RvcnlcbiAgICogc2luY2UgdGhlc2Ugb3BlcmF0aW9ucyBkb24ndCBoYXZlIG1vZGlmaWFibGUgZm9ybSBkYXRhIHRvIHJlc2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIENydWRGb3JtQ29tcG9uZW50XG4gICAqL1xuICBoYW5kbGVSZXNldCgpOiB2b2lkIHtcbiAgICBpZighW09wZXJhdGlvbktleXMuREVMRVRFLCBPcGVyYXRpb25LZXlzLlJFQURdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSAmJiB0aGlzLmFsbG93Q2xlYXIpXG4gICAgICByZXR1cm4gTmd4Rm9ybVNlcnZpY2UucmVzZXQodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICB0aGlzLmxvY2F0aW9uLmJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBkZWxldGUgb3BlcmF0aW9ucyBieSBlbWl0dGluZyBkZWxldGUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZGVsZXRlIHJlcXVlc3RzIGJ5IGVtaXR0aW5nIGEgc3VibWl0IGV2ZW50IHdpdGggdGhlXG4gICAqIHJlY29yZCdzIHVuaXF1ZSBpZGVudGlmaWVyIGFzIGRhdGEuIFRoaXMgYWxsb3dzIHBhcmVudCBjb21wb25lbnRzIHRvXG4gICAqIGhhbmRsZSB0aGUgYWN0dWFsIGRlbGV0aW9uIGxvZ2ljIHdoaWxlIG1haW50YWluaW5nIHNlcGFyYXRpb24gb2YgY29uY2VybnMuXG4gICAqIFRoZSBldmVudCBpbmNsdWRlcyB0aGUgdWlkIGFuZCBzdGFuZGFyZCBjb21wb25lbnQgaWRlbnRpZmljYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZvcm1Db21wb25lbnRcbiAgICovXG4gIGhhbmRsZURlbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1Ym1pdEV2ZW50LmVtaXQoe1xuICAgICAgZGF0YTogdGhpcy5tb2RlbElkLFxuICAgICAgY29tcG9uZW50OiAnQ3J1ZEZvcm1Db21wb25lbnQnLFxuICAgICAgbmFtZTogRXZlbnRDb25zdGFudHMuU1VCTUlULFxuICAgIH0pO1xuICB9XG5cbn1cbiIsIkBpZihvcGVyYXRpb24gIT09ICdyZWFkJyAmJiBvcGVyYXRpb24gIT09ICdkZWxldGUnKSB7XG4gIDxmb3JtICNyZWFjdGl2ZUZvcm0gW2lkXT1cInJlbmRlcmVySWRcIiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiIChzdWJtaXQpPVwic3VibWl0KCRldmVudClcIiBub3ZhbGlkYXRlIFt0YXJnZXRdPVwidGFyZ2V0XCI+XG4gICAgPG5nLWNvbnRlbnQgI2Zvcm1Db250ZW50PjwvbmctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZGNmLWJ1dHRvbnMtY29udGFpbmVyIGRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LWxlZnRcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxpb24tYnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbZXhwYW5kXT1cImFjdGlvbiA/ICdibG9jaycgOiAnZGVmYXVsdCdcIj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3Nsb3RdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uU2xvdFwiIFtuYW1lXT1cIm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIHt7IGFjdGlvbiA/IGFjdGlvbiA6IG9wdGlvbnMuYnV0dG9ucy5zdWJtaXQudGV4dH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmKCFhY3Rpb24pIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwiaGFuZGxlUmVzZXQoKVwiPlxuICAgICAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvbikge1xuICAgICAgICAgICAgICA8aW9uLWljb24gIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtzbG90XT1cIm9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvblNsb3RcIiBbbmFtZV09XCJvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQmFja1xuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZm9ybT5cbn0gQGVsc2Uge1xuICA8ZGl2IFtjbGFzc109XCInZGNmLWJ1dHRvbnMtY29udGFpbmVyIGRjZi1ncmlkIGRjZi1ncmlkLWNvbGxhcHNlIGRjZi1mbGV4IGRjZi1mbGV4LWxlZnQgJyArIG9wZXJhdGlvblwiIFtpZF09XCJ1aWRcIj5cbiAgICBAaWYob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlJFQUQgJiYgbW9kZWxJZCkge1xuICAgICAgPGRpdj5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRGVsZXRlKClcIlxuICAgICAgICAgIGNvbG9yPVwiZGFuZ2VyXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCI+XG4gICAgICAgICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvbikge1xuICAgICAgICAgICAgPGlvbi1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtzbG90XT1cIm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvblNsb3RcIiBbbmFtZV09XCJvcHRpb25zLmJ1dHRvbnMuc3VibWl0Lmljb25cIj48L2lvbi1pY29uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBEZWxldGVcbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICB9XG4gICAgQGlmKG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUgfHwgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURSkge1xuXG4gICAgICA8ZGl2PlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICBAaWYob3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uKSB7XG4gICAgICAgICAgICA8aW9uLWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3Nsb3RdPVwib3B0aW9ucy5idXR0b25zLnN1Ym1pdC5pY29uU2xvdFwiIFtuYW1lXT1cIm9wdGlvbnMuYnV0dG9ucy5zdWJtaXQuaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIHt7b3B0aW9ucy5idXR0b25zLnN1Ym1pdC50ZXh0fX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgQGlmKG9wdGlvbnMuYnV0dG9ucy5jbGVhcikge1xuICAgICAgPGRpdj5cbiAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiAoY2xpY2spPVwiaGFuZGxlUmVzZXQoKVwiPlxuICAgICAgICAgIEBpZihvcHRpb25zLmJ1dHRvbnMuY2xlYXI/Lmljb24pIHtcbiAgICAgICAgICAgIDxpb24taWNvbiAgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3Nsb3RdPVwib3B0aW9ucy5idXR0b25zLmNsZWFyPy5pY29uU2xvdFwiIFtuYW1lXT1cIm9wdGlvbnMuYnV0dG9ucy5jbGVhcj8uaWNvblwiPjwvaW9uLWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIHt7IFtPcGVyYXRpb25LZXlzLkRFTEVURSwgT3BlcmF0aW9uS2V5cy5SRUFELCBPcGVyYXRpb25LZXlzLlVQREFURV0uaW5jbHVkZXMob3BlcmF0aW9uKSA/ICdCYWNrJyA6IG9wdGlvbnMuYnV0dG9ucy5jbGVhcj8udGV4dH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgfVxuICA8L2Rpdj5cbn1cblxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC1mb3JtL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEZvcm1SZWFjdGl2ZVN1Ym1pdEV2ZW50IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3J1ZEZvcm1PcHRpb25zIHtcbiAgYnV0dG9uczoge1xuICAgIHN1Ym1pdDoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICAgIGNsZWFyPzoge1xuICAgICAgaWNvbj86IHN0cmluZztcbiAgICAgIGljb25TbG90PzogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgdGV4dD86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuIl19
|