@decaf-ts/for-angular 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/components/crud-form/crud-form.component.d.ts +1 -1
- package/components/fieldset/fieldset.component.d.ts +1 -1
- package/components/filter/filter.component.d.ts +1 -1
- package/components/for-angular-components.module.d.ts +1 -2
- package/components/list/constants.d.ts +5 -9
- package/components/list-item/list-item.component.d.ts +1 -1
- package/engine/NgxBaseComponent.d.ts +1 -1
- package/esm2022/components/component-renderer/component-renderer.component.mjs +7 -7
- package/esm2022/components/crud-field/crud-field.component.mjs +13 -12
- package/esm2022/components/crud-form/crud-form.component.mjs +9 -9
- package/esm2022/components/empty-state/empty-state.component.mjs +8 -12
- package/esm2022/components/fieldset/fieldset.component.mjs +27 -19
- package/esm2022/components/filter/filter.component.mjs +14 -13
- package/esm2022/components/for-angular-components.module.mjs +17 -9
- package/esm2022/components/layout/layout.component.mjs +6 -7
- package/esm2022/components/list/constants.mjs +1 -1
- package/esm2022/components/list/list.component.mjs +8 -11
- package/esm2022/components/list-item/list-item.component.mjs +9 -12
- package/esm2022/components/model-renderer/model-renderer.component.mjs +5 -7
- package/esm2022/components/pagination/pagination.component.mjs +7 -9
- package/esm2022/components/searchbar/searchbar.component.mjs +5 -7
- package/esm2022/directives/collapsable.directive.mjs +3 -3
- package/esm2022/engine/NgxBaseComponent.mjs +11 -10
- package/esm2022/engine/NgxFormService.mjs +12 -3
- package/esm2022/engine/NgxRenderingEngine.mjs +3 -2
- package/esm2022/for-angular-common.module.mjs +82 -0
- package/esm2022/helpers/utils.mjs +2 -2
- package/esm2022/i18n/Loader.mjs +10 -6
- package/esm2022/i18n/data/en.json +80 -0
- package/esm2022/public-apis.mjs +3 -2
- package/fesm2022/decaf-ts-for-angular.mjs +255 -170
- package/fesm2022/decaf-ts-for-angular.mjs.map +1 -1
- package/for-angular-common.module.d.ts +44 -0
- package/package.json +6 -3
- package/public-apis.d.ts +2 -1
- package/esm2022/for-angular.module.mjs +0 -118
- package/for-angular.module.d.ts +0 -45
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, HostListener, Input, ViewChild, } from '@angular/core';
|
|
3
|
-
import { FormControl } from '@angular/forms';
|
|
3
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { OperationKeys } from '@decaf-ts/db-decorators';
|
|
5
5
|
import { NgxCrudFormField } from '../../engine/NgxCrudFormField';
|
|
6
6
|
import { Dynamic } from '../../engine/decorators';
|
|
7
|
-
import { ForAngularModule } from '../../for-angular.module';
|
|
8
7
|
import { IonCheckbox, IonIcon, IonInput, IonItem, IonLabel, IonRadio, IonRadioGroup, IonSelect, IonSelectOption, IonText, IonTextarea, } from '@ionic/angular/standalone';
|
|
9
8
|
import { HTML5InputTypes } from '@decaf-ts/ui-decorators';
|
|
10
9
|
import { addIcons } from 'ionicons';
|
|
@@ -13,10 +12,9 @@ import { generateRandomValue } from '../../helpers';
|
|
|
13
12
|
import { NgxFormService } from '../../engine/NgxFormService';
|
|
14
13
|
import { EventConstants } from '../../engine/constants';
|
|
15
14
|
import { getLocaleContextByKey } from '../../i18n/Loader';
|
|
15
|
+
import { TranslatePipe } from '@ngx-translate/core';
|
|
16
16
|
import * as i0 from "@angular/core";
|
|
17
|
-
import * as i1 from "@
|
|
18
|
-
import * as i2 from "@angular/forms";
|
|
19
|
-
import * as i3 from "@ngx-translate/core";
|
|
17
|
+
import * as i1 from "@angular/forms";
|
|
20
18
|
/**
|
|
21
19
|
* @description A dynamic form field component for CRUD operations.
|
|
22
20
|
* @summary The CrudFieldComponent is a versatile form field component that adapts to different
|
|
@@ -254,6 +252,7 @@ let CrudFieldComponent = class CrudFieldComponent extends NgxCrudFormField {
|
|
|
254
252
|
if (this.multiple) {
|
|
255
253
|
this.formGroup = this.getActiveFormGroup;
|
|
256
254
|
this.formGroupArray = this.formGroup.parent;
|
|
255
|
+
this.formControl = this.formGroup.get(this.name);
|
|
257
256
|
}
|
|
258
257
|
if (this.type === HTML5InputTypes.RADIO && !this.value)
|
|
259
258
|
this.formGroup?.get(this.name)?.setValue(this.options[0].value); // TODO: migrate to RenderingEngine
|
|
@@ -303,14 +302,14 @@ let CrudFieldComponent = class CrudFieldComponent extends NgxCrudFormField {
|
|
|
303
302
|
const parentFormGroup = this.formGroup?.parent;
|
|
304
303
|
const isValid = NgxFormService.validateFields(formGroup);
|
|
305
304
|
const indexToCheck = operation === OperationKeys.CREATE ?
|
|
306
|
-
index === 0 ? index : parentFormGroup.length - 1 : index
|
|
305
|
+
index === 0 ? index : parentFormGroup.length - 1 : index;
|
|
307
306
|
const isUnique = NgxFormService.isUniqueOnGroup(formGroup, indexToCheck, operation || OperationKeys.CREATE);
|
|
308
307
|
event = new CustomEvent(EventConstants.FIELDSET_ADD_GROUP, {
|
|
309
308
|
detail: { isValid: isValid && isUnique, value: formGroup.value, formGroup: parentFormGroup, formService: NgxFormService },
|
|
310
309
|
});
|
|
311
310
|
component.dispatchEvent(event);
|
|
312
311
|
if (isValid && isUnique) {
|
|
313
|
-
const newIndex = parentFormGroup
|
|
312
|
+
const newIndex = parentFormGroup?.length;
|
|
314
313
|
if (operation === OperationKeys.CREATE) {
|
|
315
314
|
NgxFormService.addGroupToParent(parentFormGroup?.parent, parent, newIndex);
|
|
316
315
|
this.activeFormGroup = newIndex;
|
|
@@ -344,6 +343,7 @@ let CrudFieldComponent = class CrudFieldComponent extends NgxCrudFormField {
|
|
|
344
343
|
this.activeFormGroup = index;
|
|
345
344
|
this.formGroup = this.getActiveFormGroup;
|
|
346
345
|
this.formControl = this.formGroup.get(this.name);
|
|
346
|
+
this.value = this.formControl.value;
|
|
347
347
|
}
|
|
348
348
|
/**
|
|
349
349
|
* @description Handles fieldset group removal events from parent fieldsets.
|
|
@@ -368,17 +368,18 @@ let CrudFieldComponent = class CrudFieldComponent extends NgxCrudFormField {
|
|
|
368
368
|
});
|
|
369
369
|
component.dispatchEvent(event);
|
|
370
370
|
}
|
|
371
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.
|
|
372
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CrudFieldComponent, isStandalone: true, selector: "ngx-decaf-crud-field", inputs: { operation: "operation", name: "name", path: "path", childOf: "childOf", type: "type", value: "value", disabled: "disabled", label: "label", placeholder: "placeholder", format: "format", hidden: "hidden", max: "max", maxlength: "maxlength", min: "min", minlength: "minlength", pattern: "pattern", readonly: "readonly", required: "required", step: "step", equals: "equals", different: "different", lessThan: "lessThan", lessThanOrEqual: "lessThanOrEqual", greaterThan: "greaterThan", greaterThanOrEqual: "greaterThanOrEqual", cols: "cols", rows: "rows", alignment: "alignment", checked: "checked", justify: "justify", cancelText: "cancelText", interface: "interface", options: "options", mode: "mode", spellcheck: "spellcheck", inputmode: "inputmode", autocomplete: "autocomplete", fill: "fill", labelPlacement: "labelPlacement", updateOn: "updateOn", formGroup: "formGroup", formControl: "formControl", multiple: "multiple", uid: "uid", translatable: "translatable", activeFormGroup: "activeFormGroup", pk: "pk" }, host: { listeners: { "window:fieldsetAddGroupEvent": "handleFieldsetCreateGroupEvent($event)", "window:fieldsetUpdateGroupEvent": "handleFieldsetUpdateGroupEvent($event)", "window:fieldsetRemoveGroupEvent": "handleFieldsetRemoveGroupEvent($event)" }, properties: { "attr.id": "uid" } }, viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "@if(operation === 'read' || operation === 'delete') {\n <ng-container #component>\n <div [class]=\"'dcf-input-item ' + operation\">\n <ion-item>\n <ion-label>\n {{ label | translate }}<br />\n @if(value) {\n <ion-text [innerHTML]=\"type === 'password' ? '********' : value\"></ion-text>\n } @else {\n <br />\n }\n </ion-label>\n </ion-item>\n </div>\n </ng-container>\n} @else {\n <ng-container [formGroup]=\"getActiveFormGroup\">\n <div #container [class]=\"'dcf-input-item ' + (operation || 'create')\" (createGroupEvent)=\"multiple ? handleFieldsetCreateGroupEvent($event) : ''\">\n @if(type === 'textarea') {\n <ion-textarea\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [autoGrow]=\"true\"\n [required]=\"required !== undefined ? required : null\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [inputmode]=\"inputmode\"\n [spellcheck]=\"spellcheck\"\n [rows]=\"rows\"\n [labelPlacement]=\"labelPlacement\"\n [value]=\"value\"\n [fill]=\"fill\"\n [errorText]=\"getErrors(container)\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [label]=\"translatable ? (label | translate) : label\"\n #component>\n </ion-textarea>\n }\n @else if(type === 'checkbox') {\n <ion-item>\n <ion-checkbox\n #checkboxElement\n\n [mode]=\"mode\"\n [errorText]=\"getErrors(container)\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [justify]=\"justify\"\n [value]=\"value\"\n [checked]=\"checked\"\n [readonly]=\"readonly\"\n (ionChange)=\"checked = !checked\"\n [formControlName]=\"name\"\n #component>\n <span [innerHTML]=\"label | translate\"></span>\n </ion-checkbox>\n </ion-item>\n }\n @else if(type === 'radio') {\n <ion-radio-group [formControlName]=\"name\" [value]=\"value\" #component>\n <label class=\"dcf-radio-group-label\" [for]=\"path\">{{label | translate}}</label>\n @for(option of options; track option) {\n <ion-item>\n <ion-radio\n [errorText]=\"getErrors(container)\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [alignment]=\"alignment\"\n [justify]=\"justify\"\n [readonly]=\"readonly\"\n [value]=\"option.value\"\n >{{ translatable ? (option?.text | translate) : option?.text }}</ion-radio>\n </ion-item>\n }\n </ion-radio-group>\n }\n @else if(type === 'select') {\n <ion-select\n toggleIcon=\"chevron-down-outline\"\n expandedIcon=\"chevron-up-outline\"\n\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [label]=\"translatable ? (label | translate) : label\"\n [value]=\"value\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [interface]=\"interface\" #component>\n @for(option of options; track option.value) {\n <ion-select-option [value]=\"option.value\">\n {{ option.text | translate }}\n </ion-select-option>\n }\n </ion-select>\n }\n @else {\n <ion-input\n [type]=\"type\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [inputmode]=\"inputmode\"\n [labelPlacement]=\"labelPlacement\"\n [required]=\"required !== undefined ? required : false\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [max]=\"max !== undefined ? max : null\"\n [min]=\"min !== undefined ? min : null\"\n [pattern]=\"pattern !== undefined ? pattern : null\"\n [step]=\"step !== undefined ? step : null\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [label]=\"translatable ? (label | translate) : label\" #component />\n }\n </div>\n </ng-container>\n}\n\n", styles: [".dcf-input-item.create,.dcf-input-item.update{margin-bottom:1.8rem;margin-top:0!important}.dcf-input-item.create.checkbox+.checkbox,.dcf-input-item.update.checkbox+.checkbox{margin-top:-.25rem!important}.dcf-input-item.create ion-item,.dcf-input-item.update ion-item{--border-color: transparent}.dcf-input-item.create ion-item.dcf-text-wrap ion-label>*,.dcf-input-item.update ion-item.dcf-text-wrap ion-label>*{white-space:wrap!important;word-break:break-all!important}.dcf-input-item.read ion-label,.dcf-input-item.delete ion-label{font-weight:600}@media (prefers-color-scheme: light){.dcf-input-item.read ion-label,.dcf-input-item.delete ion-label{color:var(--dcf-color-gray-7)}}.dcf-input-item.read ion-text,.dcf-input-item.delete ion-text{display:block;margin-top:.5rem!important}.dcf-input-item ion-item{--padding-end: 0rem;--padding-start: 0px !important;--padding-top: 0px !important;--background: transparent;--background-hover-opacity: .1;--background-activated-opacity: .15;--background-focused-opacity: .15}@media (prefers-color-scheme: dark){.dcf-input-item ion-item{--border-color: var(--dcf-color-gray-6)}}@media (prefers-color-scheme: light){.dcf-input-item ion-item{--background-hover: var(--dcf-color-primary);--background-focused: var(--dcf-color-primary);--border-color: var(--dcf-color-gray-2)}}.dcf-input-item ion-item span,.dcf-input-item ion-item ion-text{font-weight:400!important;font-size:.925rem;min-height:.5rem!important}.dcf-input-item ion-item span:not(.dcf-display-block),.dcf-input-item ion-item ion-text:not(.dcf-display-block){display:inline-block}.dcf-input-item ion-item span.dcf-display-block,.dcf-input-item ion-item ion-text.dcf-display-block{display:block!important}ion-textarea textarea{scrollbar-width:thin!important;margin-bottom:.5rem!important}ion-select.dcf-select-label-placement-floating::part(label){line-height:1.2rem!important}.dcf-proccessing,.dcf-proccessing *{pointer-events:none;touch-action:none;cursor:text}ion-checkbox{--size: 1.5rem;--checkbox-background-checked: var(--dcf-color-primary);--checkmark-width: 2px}ion-item{--inner-padding-start: .75rem}ion-checkbox::part(container){border-radius:50%;padding:3px}@media (prefers-color-scheme: light){ion-checkbox::part(container){border:2px solid var(--dcf-color-primary)}}ion-item .dcf-radio-group-label,ion-radio-group .dcf-radio-group-label{font-weight:600}ion-item .dcf-radio-group-label~ion-item,ion-radio-group .dcf-radio-group-label~ion-item{margin-top:.5rem;--inner-padding-start: .75rem}ion-item+.dcf-helper,ion-radio-group+.dcf-helper{padding-left:.75rem;position:relative}.dcf-error{position:absolute;color:var(--dcf-color-danger)!important;font-size:.8rem!important;font-weight:600!important;line-height:1.1rem;box-sizing:border-box;z-index:9999;margin-top:0;animation-duration:.1s;animation-timing-function:ease-out;animation-fill-mode:both;animation-name:fadeTopSmallAnimation;display:flex;align-items:flex-start;gap:.25rem}.dcf-error .ti,.dcf-error ion-icon{position:relative;top:2px!important;min-width:20px;font-size:1rem!important;text-align:left}.dcf-helper{font-size:.875rem!important;font-weight:500;margin-top:.25rem;margin-bottom:-.75rem}.dcf-helper.dcf-has-action{cursor:pointer;color:var(--dcf-color-gray-7)!important;text-decoration:underline}.dcf-error+.dcf-helper{padding-top:1rem}@keyframes fadeTopSmallAnimation{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeBottomSmallAnimation{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeTopMediumAnimation{0%{opacity:0;transform:translateY(-50px)}to{opacity:1;transform:translateY(0)}}::ng-deep ion-textarea{min-height:80px!important;scrollbar-color:#888 #f0f0f0;scrollbar-width:thin}\n"], dependencies: [{ kind: "ngmodule", type: ForAngularModule }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "compareWith", "errorText", "helperText", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
|
|
371
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CrudFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
372
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: CrudFieldComponent, isStandalone: true, selector: "ngx-decaf-crud-field", inputs: { operation: "operation", name: "name", path: "path", childOf: "childOf", type: "type", value: "value", disabled: "disabled", label: "label", placeholder: "placeholder", format: "format", hidden: "hidden", max: "max", maxlength: "maxlength", min: "min", minlength: "minlength", pattern: "pattern", readonly: "readonly", required: "required", step: "step", equals: "equals", different: "different", lessThan: "lessThan", lessThanOrEqual: "lessThanOrEqual", greaterThan: "greaterThan", greaterThanOrEqual: "greaterThanOrEqual", cols: "cols", rows: "rows", alignment: "alignment", checked: "checked", justify: "justify", cancelText: "cancelText", interface: "interface", options: "options", mode: "mode", spellcheck: "spellcheck", inputmode: "inputmode", autocomplete: "autocomplete", fill: "fill", labelPlacement: "labelPlacement", updateOn: "updateOn", formGroup: "formGroup", formControl: "formControl", multiple: "multiple", uid: "uid", translatable: "translatable", activeFormGroup: "activeFormGroup", pk: "pk" }, host: { listeners: { "window:fieldsetAddGroupEvent": "handleFieldsetCreateGroupEvent($event)", "window:fieldsetUpdateGroupEvent": "handleFieldsetUpdateGroupEvent($event)", "window:fieldsetRemoveGroupEvent": "handleFieldsetRemoveGroupEvent($event)" }, properties: { "attr.id": "uid" } }, viewQueries: [{ propertyName: "component", first: true, predicate: ["component"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "@if(operation === 'read' || operation === 'delete') {\n <ng-container #component>\n <div [class]=\"'dcf-input-item ' + operation\">\n <ion-item>\n <ion-label>\n {{ label | translate }}<br />\n @if(value) {\n <ion-text [innerHTML]=\"type === 'password' ? '********' : value\"></ion-text>\n } @else {\n <br />\n }\n </ion-label>\n </ion-item>\n </div>\n </ng-container>\n} @else {\n <ng-container [formGroup]=\"getActiveFormGroup\">\n <div #container [class]=\"'dcf-input-item ' + (operation || 'create')\" (createGroupEvent)=\"multiple ? handleFieldsetCreateGroupEvent($event) : ''\">\n @if(type === 'textarea') {\n <ion-textarea\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [autoGrow]=\"true\"\n [required]=\"required !== undefined ? required : null\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [inputmode]=\"inputmode\"\n [spellcheck]=\"spellcheck\"\n [rows]=\"rows\"\n [labelPlacement]=\"labelPlacement\"\n [value]=\"value\"\n [fill]=\"fill\"\n [errorText]=\"getErrors(container)\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [label]=\"translatable ? (label | translate) : label\"\n #component>\n </ion-textarea>\n }\n @else if(type === 'checkbox') {\n <ion-item>\n <ion-checkbox\n #checkboxElement\n\n [mode]=\"mode\"\n [errorText]=\"getErrors(container)\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [justify]=\"justify\"\n [value]=\"value\"\n [checked]=\"checked\"\n [readonly]=\"readonly\"\n (ionChange)=\"checked = !checked\"\n [formControlName]=\"name\"\n #component>\n <span [innerHTML]=\"label | translate\"></span>\n </ion-checkbox>\n </ion-item>\n }\n @else if(type === 'radio') {\n <ion-radio-group [formControlName]=\"name\" [value]=\"value\" #component>\n <label class=\"dcf-radio-group-label\" [for]=\"path\">{{label | translate}}</label>\n @for(option of options; track option) {\n <ion-item>\n <ion-radio\n [errorText]=\"getErrors(container)\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [alignment]=\"alignment\"\n [justify]=\"justify\"\n [readonly]=\"readonly\"\n [value]=\"option.value\"\n >{{ translatable ? (option?.text | translate) : option?.text }}</ion-radio>\n </ion-item>\n }\n </ion-radio-group>\n }\n @else if(type === 'select') {\n <ion-select\n toggleIcon=\"chevron-down-outline\"\n expandedIcon=\"chevron-up-outline\"\n\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [labelPlacement]=\"labelPlacement\"\n [label]=\"translatable ? (label | translate) : label\"\n [value]=\"value\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [interface]=\"interface\" #component>\n @for(option of options; track option.value) {\n <ion-select-option [value]=\"option.value\">\n {{ option.text | translate }}\n </ion-select-option>\n }\n </ion-select>\n }\n @else {\n <ion-input\n [type]=\"type\"\n [mode]=\"mode\"\n [hidden]=\"hidden\"\n [inputmode]=\"inputmode\"\n [labelPlacement]=\"labelPlacement\"\n [required]=\"required !== undefined ? required : false\"\n [minlength]=\"minlength !== undefined ? minlength : null\"\n [maxlength]=\"maxlength !== undefined ? maxlength : null\"\n [readonly]=\"readonly !== undefined ? readonly : null\"\n [max]=\"max !== undefined ? max : null\"\n [min]=\"min !== undefined ? min : null\"\n [pattern]=\"pattern !== undefined ? pattern : null\"\n [step]=\"step !== undefined ? step : null\"\n [fill]=\"fill\"\n [placeholder]=\"translatable ? (placeholder | translate) : placeholder\"\n [formControlName]=\"name\"\n [errorText]=\"getErrors(container)\"\n [label]=\"translatable ? (label | translate) : label\" #component />\n }\n </div>\n </ng-container>\n}\n\n", styles: [".dcf-input-item.create,.dcf-input-item.update{margin-bottom:1.8rem;margin-top:0!important}.dcf-input-item.create.checkbox+.checkbox,.dcf-input-item.update.checkbox+.checkbox{margin-top:-.25rem!important}.dcf-input-item.create ion-item,.dcf-input-item.update ion-item{--border-color: transparent}.dcf-input-item.create ion-item.dcf-text-wrap ion-label>*,.dcf-input-item.update ion-item.dcf-text-wrap ion-label>*{white-space:wrap!important;word-break:break-all!important}.dcf-input-item.read ion-label,.dcf-input-item.delete ion-label{font-weight:600}@media (prefers-color-scheme: light){.dcf-input-item.read ion-label,.dcf-input-item.delete ion-label{color:var(--dcf-color-gray-7)}}.dcf-input-item.read ion-text,.dcf-input-item.delete ion-text{display:block;margin-top:.5rem!important}.dcf-input-item ion-item{--padding-end: 0rem;--padding-start: 0px !important;--padding-top: 0px !important;--background: transparent;--background-hover-opacity: .1;--background-activated-opacity: .15;--background-focused-opacity: .15}@media (prefers-color-scheme: dark){.dcf-input-item ion-item{--border-color: var(--dcf-color-gray-6)}}@media (prefers-color-scheme: light){.dcf-input-item ion-item{--background-hover: var(--dcf-color-primary);--background-focused: var(--dcf-color-primary);--border-color: var(--dcf-color-gray-2)}}.dcf-input-item ion-item span,.dcf-input-item ion-item ion-text{font-weight:400!important;font-size:.925rem;min-height:.5rem!important}.dcf-input-item ion-item span:not(.dcf-display-block),.dcf-input-item ion-item ion-text:not(.dcf-display-block){display:inline-block}.dcf-input-item ion-item span.dcf-display-block,.dcf-input-item ion-item ion-text.dcf-display-block{display:block!important}ion-textarea textarea{scrollbar-width:thin!important;margin-bottom:.5rem!important}ion-select.dcf-select-label-placement-floating::part(label){line-height:1.2rem!important}.dcf-proccessing,.dcf-proccessing *{pointer-events:none;touch-action:none;cursor:text}ion-checkbox{--size: 1.5rem;--checkbox-background-checked: var(--dcf-color-primary);--checkmark-width: 2px}ion-item{--inner-padding-start: .75rem}ion-checkbox::part(container){border-radius:50%;padding:3px}@media (prefers-color-scheme: light){ion-checkbox::part(container){border:2px solid var(--dcf-color-primary)}}ion-item .dcf-radio-group-label,ion-radio-group .dcf-radio-group-label{font-weight:600}ion-item .dcf-radio-group-label~ion-item,ion-radio-group .dcf-radio-group-label~ion-item{margin-top:.5rem;--inner-padding-start: .75rem}ion-item+.dcf-helper,ion-radio-group+.dcf-helper{padding-left:.75rem;position:relative}.dcf-error{position:absolute;color:var(--dcf-color-danger)!important;font-size:.8rem!important;font-weight:600!important;line-height:1.1rem;box-sizing:border-box;z-index:9999;margin-top:0;animation-duration:.1s;animation-timing-function:ease-out;animation-fill-mode:both;animation-name:fadeTopSmallAnimation;display:flex;align-items:flex-start;gap:.25rem}.dcf-error .ti,.dcf-error ion-icon{position:relative;top:2px!important;min-width:20px;font-size:1rem!important;text-align:left}.dcf-helper{font-size:.875rem!important;font-weight:500;margin-top:.25rem;margin-bottom:-.75rem}.dcf-helper.dcf-has-action{cursor:pointer;color:var(--dcf-color-gray-7)!important;text-decoration:underline}.dcf-error+.dcf-helper{padding-top:1rem}@keyframes fadeTopSmallAnimation{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeBottomSmallAnimation{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeTopMediumAnimation{0%{opacity:0;transform:translateY(-50px)}to{opacity:1;transform:translateY(0)}}::ng-deep ion-textarea{min-height:80px!important;scrollbar-color:#888 #f0f0f0;scrollbar-width:thin}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonRadioGroup, selector: "ion-radio-group", inputs: ["allowEmptySelection", "compareWith", "errorText", "helperText", "name", "value"] }, { kind: "component", type: IonRadio, selector: "ion-radio", inputs: ["alignment", "color", "disabled", "justify", "labelPlacement", "mode", "name", "value"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
|
|
373
373
|
};
|
|
374
374
|
CrudFieldComponent = __decorate([
|
|
375
375
|
Dynamic()
|
|
376
376
|
], CrudFieldComponent);
|
|
377
377
|
export { CrudFieldComponent };
|
|
378
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.
|
|
378
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CrudFieldComponent, decorators: [{
|
|
379
379
|
type: Component,
|
|
380
380
|
args: [{ standalone: true, imports: [
|
|
381
|
-
|
|
381
|
+
ReactiveFormsModule,
|
|
382
|
+
TranslatePipe,
|
|
382
383
|
IonInput,
|
|
383
384
|
IonItem,
|
|
384
385
|
IonCheckbox,
|
|
@@ -503,4 +504,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
503
504
|
type: HostListener,
|
|
504
505
|
args: ['window:fieldsetRemoveGroupEvent', ['$event']]
|
|
505
506
|
}] } });
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC1maWVsZC9jcnVkLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZpZWxkL2NydWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1Qsc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkUsT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUNMLFdBQVcsRUFDWCxPQUFPLEVBQ1AsUUFBUSxFQUNSLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsZUFBZSxFQUNmLE9BQU8sRUFDUCxXQUFXLEdBQ1osTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNB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QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQVluQyxTQUFTO3NCQURqQixLQUFLO2dCQWNHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBY0csUUFBUTtzQkFEaEIsS0FBSztnQkFXRyxHQUFHO3NCQURYLEtBQUs7Z0JBY04sWUFBWTtzQkFEWCxLQUFLO2dCQWdCTixlQUFlO3NCQURkLEtBQUs7Z0JBd0JOLEVBQUU7c0JBREQsS0FBSztnQkEwR04sOEJBQThCO3NCQUQ3QixZQUFZO3VCQUFDLDhCQUE4QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdEeEQsOEJBQThCO3NCQUQ3QixZQUFZO3VCQUFDLGlDQUFpQyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW9CM0QsOEJBQThCO3NCQUQ3QixZQUFZO3VCQUFDLGlDQUFpQyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVR5cGVzLCBTZWxlY3RJbnRlcmZhY2UgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5neENydWRGb3JtRmllbGQgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4Q3J1ZEZvcm1GaWVsZCc7XG5pbXBvcnQgeyBEeW5hbWljIH0gZnJvbSAnLi4vLi4vZW5naW5lL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ3J1ZEZpZWxkT3B0aW9uLCBGaWVsZFVwZGF0ZU1vZGUsIFBvc3NpYmxlSW5wdXRUeXBlcywgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7IEZvckFuZ3VsYXJNb2R1bGUgfSBmcm9tICcuLi8uLi9mb3ItYW5ndWxhci5tb2R1bGUnO1xuaW1wb3J0IHtcbiAgSW9uQ2hlY2tib3gsXG4gIElvbkljb24sXG4gIElvbklucHV0LFxuICBJb25JdGVtLFxuICBJb25MYWJlbCxcbiAgSW9uUmFkaW8sXG4gIElvblJhZGlvR3JvdXAsXG4gIElvblNlbGVjdCxcbiAgSW9uU2VsZWN0T3B0aW9uLFxuICBJb25UZXh0LFxuICBJb25UZXh0YXJlYSxcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBIVE1MNUlucHV0VHlwZXMgfSBmcm9tICdAZGVjYWYtdHMvdWktZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoZXZyb25Eb3duT3V0bGluZSwgY2hldnJvblVwT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tVmFsdWUgfSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IE5neEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZW5naW5lL05neEZvcm1TZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50Q29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vZW5naW5lL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRMb2NhbGVDb250ZXh0QnlLZXkgfSBmcm9tICcuLi8uLi9pMThuL0xvYWRlcic7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgZHluYW1pYyBmb3JtIGZpZWxkIGNvbXBvbmVudCBmb3IgQ1JVRCBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIENydWRGaWVsZENvbXBvbmVudCBpcyBhIHZlcnNhdGlsZSBmb3JtIGZpZWxkIGNvbXBvbmVudCB0aGF0IGFkYXB0cyB0byBkaWZmZXJlbnRcbiAqIGlucHV0IHR5cGVzIGFuZCBDUlVEIG9wZXJhdGlvbnMuIEl0IGV4dGVuZHMgTmd4Q3J1ZEZvcm1GaWVsZCB0byBpbmhlcml0IGZvcm0gaGFuZGxpbmcgY2FwYWJpbGl0aWVzXG4gKiBhbmQgaW1wbGVtZW50cyBsaWZlY3ljbGUgaG9va3MgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZSwgcmVuZGVyLCBhbmQgY2xlYW4gdXAuIFRoaXMgY29tcG9uZW50XG4gKiBzdXBwb3J0cyB2YXJpb3VzIGlucHV0IHR5cGVzICh0ZXh0LCBudW1iZXIsIGRhdGUsIHNlbGVjdCwgZXRjLiksIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBzdHlsaW5nXG4gKiBvcHRpb25zLCBtYWtpbmcgaXQgc3VpdGFibGUgZm9yIGJ1aWxkaW5nIGR5bmFtaWMgZm9ybXMgZm9yIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlXG4gKiBvcGVyYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7Q3J1ZE9wZXJhdGlvbnN9IG9wZXJhdGlvbiAtIFRoZSBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBmaWVsZCBuYW1lLCB1c2VkIGFzIGZvcm0gY29udHJvbCBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge1Bvc3NpYmxlSW5wdXRUeXBlc30gdHlwZSAtIFRoZSBpbnB1dCB0eXBlICh0ZXh0LCBudW1iZXIsIGRhdGUsIHNlbGVjdCwgZXRjLilcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxEYXRlfSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBmaWVsZFxuICogQHBhcmFtIHtib29sZWFufSBkaXNhYmxlZCAtIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGRpc2FibGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgLSBUaGUgZGlzcGxheSBsYWJlbCBmb3IgdGhlIGZpZWxkXG4gKiBAcGFyYW0ge3N0cmluZ30gcGxhY2Vob2xkZXIgLSBQbGFjZWhvbGRlciB0ZXh0IHdoZW4gZmllbGQgaXMgZW1wdHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXQgLSBGb3JtYXQgcGF0dGVybiBmb3IgdGhlIGZpZWxkIHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGhpZGRlbiAtIFdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSBoaWRkZW5cbiAqIEBwYXJhbSB7bnVtYmVyfERhdGV9IG1heCAtIE1heGltdW0gYWxsb3dlZCB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IG1heGxlbmd0aCAtIE1heGltdW0gYWxsb3dlZCBsZW5ndGhcbiAqIEBwYXJhbSB7bnVtYmVyfERhdGV9IG1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZVxuICogQHBhcmFtIHtudW1iZXJ9IG1pbmxlbmd0aCAtIE1pbmltdW0gYWxsb3dlZCBsZW5ndGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIC0gVmFsaWRhdGlvbiBwYXR0ZXJuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlYWRvbmx5IC0gV2hldGhlciB0aGUgZmllbGQgaXMgcmVhZC1vbmx5XG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkIC0gV2hldGhlciB0aGUgZmllbGQgaXMgcmVxdWlyZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIC0gU3RlcCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0c1xuICogQHBhcmFtIHtGb3JtR3JvdXB9IGZvcm1Hcm91cCAtIFRoZSBwYXJlbnQgZm9ybSBncm91cFxuICogQHBhcmFtIHtTdHJpbmdPckJvb2xlYW59IHRyYW5zbGF0YWJsZSAtIFdoZXRoZXIgZmllbGQgbGFiZWxzIHNob3VsZCBiZSB0cmFuc2xhdGVkXG4gKlxuICogQGNvbXBvbmVudCBDcnVkRmllbGRDb21wb25lbnRcbiAqIEBleGFtcGxlXG4gKiA8bmd4LWRlY2FmLWNydWQtZmllbGRcbiAqICAgb3BlcmF0aW9uPVwiY3JlYXRlXCJcbiAqICAgbmFtZT1cImZpcnN0TmFtZVwiXG4gKiAgIHR5cGU9XCJ0ZXh0XCJcbiAqICAgbGFiZWw9XCI8TkFNRT5cIlxuICogICBwbGFjZWhvbGRlcj1cIjxOQU1FPlwiXG4gKiAgIFt2YWx1ZV09XCJtb2RlbC5maXJzdE5hbWVcIlxuICogICBbZGlzYWJsZWRdPVwibW9kZWwucmVhZE9ubHlcIj5cbiAqXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItYW5ndWxhclxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIEZvckFuZ3VsYXJNb2R1bGUsXG4gICAgSW9uSW5wdXQsXG4gICAgSW9uSXRlbSxcbiAgICBJb25DaGVja2JveCxcbiAgICBJb25SYWRpb0dyb3VwLFxuICAgIElvblJhZGlvLFxuICAgIElvblNlbGVjdCxcbiAgICBJb25TZWxlY3RPcHRpb24sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25UZXh0YXJlYSxcbiAgICBJb25JY29uXG4gIF0sXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWNydWQtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jcnVkLWZpZWxkLmNvbXBvbmVudC5zY3NzJyxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICd1aWQnfSxcbn0pXG5leHBvcnQgY2xhc3MgQ3J1ZEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgTmd4Q3J1ZEZvcm1GaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBDUlVEIG9wZXJhdGlvbiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgdGhlIGZpZWxkIGlzIGJlaW5nIHVzZWQgZm9yLlxuICAgKiBUaGlzIGFmZmVjdHMgaG93IHRoZSBmaWVsZCBiZWhhdmVzIGFuZCBpcyByZW5kZXJlZC4gRm9yIGV4YW1wbGUsIGZpZWxkcyBtaWdodCBiZSByZWFkLW9ubHkgaW5cbiAgICogJ3JlYWQnIG1vZGUgYnV0IGVkaXRhYmxlIGluICdjcmVhdGUnIG9yICd1cGRhdGUnIG1vZGVzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG92ZXJyaWRlIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSAgVGhlIGZsYXQgZmllbGQgbmFtZSB1c2VkIGFzIHRoZSBmb3JtIGNvbnRyb2wgaWRlbnRpZmllciBpbiBpbW1lZGlhdGUgcGFyZW50IEZvcm1Hcm91cC5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIEZvcm1Db250cm9sIGlkZW50aWZpZXIgaW4gaW1tZWRpYXRlIHBhcmVudCBGb3JtR3JvdXAuXG4gICAqIFRoaXMgdmFsdWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBpbW1lZGlhdGUgcGFyZW50IEZvcm1Hcm91cCBjb250ZXh0IGFuZCBzaG91bGQgbm90IGNvbnRhaW4gZG90cyBvciBuZXN0aW5nLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBvdmVycmlkZSBuYW1lITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFRoZSBmdWxsIGZpZWxkIHBhdGggdXNlZCBmb3IgZm9ybSBjb250cm9sIHJlc29sdXRpb24uXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGhpZXJhcmNoaWNhbCBwYXRoIG9mIHRoZSBmaWVsZCwgdXNlZCB0byByZXNvbHZlIGl0cyBsb2NhdGlvbiB3aXRoaW4gdGhlIHBhcmVudCBGb3JtR3JvdXAgKG9yIG5lc3RlZCBGb3JtR3JvdXBzKS5cbiAgICogSXQgaXMgdXNlZCBhcyB0aGUgaWRlbnRpZmllciBpbiB0aGUgcmVuZGVyZWQgSFRNTCwgYW5kIG1heSBpbmNsdWRlIG5lc3RpbmcgKGUuZy4sICdhZGRyZXNzLmJpbGxpbmcuc3RyZWV0JykgYW5kXG4gICAqIHNob3VsZCBtYXRjaCB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhIG1vZGVsXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG92ZXJyaWRlIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGZpZWxkIHBhdGgsIGlmIHRoaXMgZmllbGQgaXMgbmVzdGVkLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGZ1bGwgZG90LWRlbGltaXRlZCBwYXRoIG9mIHRoZSBwYXJlbnQgZmllbGQuIFRoaXMgaXMgb25seSBzZXQgd2hlbiB0aGUgZmllbGQgaXMgbmVzdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgZmllbGQgcGF0aCBmb3IgbmVzdGVkIGZpZWxkIHN0cnVjdHVyZXMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgZnVsbCBkb3QtZGVsaW1pdGVkIHBhdGggb2YgdGhlIHBhcmVudCBmaWVsZCB3aGVuIHRoaXMgZmllbGRcbiAgICogaXMgcGFydCBvZiBhIG5lc3RlZCBzdHJ1Y3R1cmUuIFRoaXMgaXMgdXNlZCBmb3IgaGllcmFyY2hpY2FsIGZvcm0gb3JnYW5pemF0aW9uXG4gICAqIGFuZCBwcm9wZXIgZm9ybSBjb250cm9sIHJlc29sdXRpb24gaW4gY29tcGxleCBmb3JtIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICcnXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGNoaWxkT2Y6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGlucHV0IHR5cGUgb2YgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSB0eXBlIG9mIGlucHV0IHRvIHJlbmRlciwgc3VjaCBhcyB0ZXh0LCBudW1iZXIsIGRhdGUsIHNlbGVjdCwgZXRjLlxuICAgKiBUaGlzIGRldGVybWluZXMgd2hpY2ggSW9uaWMgZm9ybSBjb21wb25lbnQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZmllbGQgYW5kIGhvd1xuICAgKiB0aGUgZGF0YSB3aWxsIGJlIGZvcm1hdHRlZCBhbmQgdmFsaWRhdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7UG9zc2libGVJbnB1dFR5cGVzfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBvdmVycmlkZSB0eXBlITogUG9zc2libGVJbnB1dFR5cGVzO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkLiBUaGlzIGNhbiBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBEYXRlXG4gICAqIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4gRm9yIHNlbGVjdCBmaWVsZHMsIHRoaXMgc2hvdWxkIG1hdGNoIG9uZSBvZiB0aGUgb3B0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlciB8IERhdGV9XG4gICAqIEBkZWZhdWx0ICcnXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIGRpc2FibGVkIHN0YXRlLCBwcmV2ZW50aW5nIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqIERpc2FibGVkIGZpZWxkcyBhcmUgc3RpbGwgaW5jbHVkZWQgaW4gdGhlIGZvcm0gbW9kZWwgYnV0IGNhbm5vdCBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBsYWJlbCBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBUaGUgdGV4dCBsYWJlbCBkaXNwbGF5ZWQgYWxvbmdzaWRlIHRoZSBmaWVsZCB0byBpZGVudGlmeSBpdCB0byB0aGUgdXNlci5cbiAgICogVGhpcyBsYWJlbCBjYW4gYmUgdHJhbnNsYXRlZCBpZiB0aGUgdHJhbnNsYXRhYmxlIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBsYWJlbCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBsYWNlaG9sZGVyIHRleHQgd2hlbiBmaWVsZCBpcyBlbXB0eS5cbiAgICogQHN1bW1hcnkgVGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIGlucHV0IHdoZW4gaXQgaGFzIG5vIHZhbHVlLiBUaGlzIHByb3ZpZGVzIGEgaGludCB0byB0aGUgdXNlclxuICAgKiBhYm91dCB3aGF0IGtpbmQgb2YgZGF0YSBpcyBleHBlY3RlZC4gVGhlIHBsYWNlaG9sZGVyIGRpc2FwcGVhcnMgd2hlbiB0aGUgdXNlciBzdGFydHMgdHlwaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlciE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1hdCBwYXR0ZXJuIGZvciB0aGUgZmllbGQgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhIGZvcm1hdCBwYXR0ZXJuIGZvciB0aGUgZmllbGQgdmFsdWUsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkYXRlIGZvcm1hdHRpbmcsXG4gICAqIG51bWJlciBmb3JtYXR0aW5nLCBvciBvdGhlciB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmcgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBmaWVsZCB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIHRoZSBVSSBidXQgd2lsbCBzdGlsbCBiZSBwYXJ0IG9mIHRoZSBmb3JtIG1vZGVsLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHRoYXQgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiBmb3JtIHN1Ym1pc3Npb24gYnV0IHNob3VsZCBub3QgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgaGlkZGVuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBGb3IgbnVtYmVyIGlucHV0cywgdGhpcyBzZXRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtZXJpYyB2YWx1ZS5cbiAgICogRm9yIGRhdGUgaW5wdXRzLCB0aGlzIHNldHMgdGhlIGxhdGVzdCBhbGxvd2VkIGRhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXIgfCBEYXRlfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBtYXg/OiBudW1iZXIgfCBEYXRlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWF4aW11bSBhbGxvd2VkIGxlbmd0aCBmb3IgdGV4dCBpbnB1dC5cbiAgICogQHN1bW1hcnkgRm9yIHRleHQgaW5wdXRzLCB0aGlzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZC5cbiAgICogVGhpcyBpcyB1c2VkIGZvciB2YWxpZGF0aW9uIGFuZCBtYXkgYWxzbyBiZSB1c2VkIHRvIGxpbWl0IGlucHV0IGluIHRoZSBVSS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbWF4bGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWluaW11bSBhbGxvd2VkIHZhbHVlIGZvciB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IEZvciBudW1iZXIgaW5wdXRzLCB0aGlzIHNldHMgdGhlIG1pbmltdW0gYWxsb3dlZCBudW1lcmljIHZhbHVlLlxuICAgKiBGb3IgZGF0ZSBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgZWFybGllc3QgYWxsb3dlZCBkYXRlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyIHwgRGF0ZX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbWluPzogbnVtYmVyIHwgRGF0ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1pbmltdW0gYWxsb3dlZCBsZW5ndGggZm9yIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEZvciB0ZXh0IGlucHV0cywgdGhpcyBzZXRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkLlxuICAgKiBUaGlzIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoZSBpbnB1dCBtZWV0cyBhIG1pbmltdW0gbGVuZ3RoIHJlcXVpcmVtZW50LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBtaW5sZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0aW9uIHBhdHRlcm4gZm9yIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdXNlZCB0byB2YWxpZGF0ZSB0ZXh0IGlucHV0LlxuICAgKiBUaGUgaW5wdXQgdmFsdWUgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm4gdG8gYmUgY29uc2lkZXJlZCB2YWxpZC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlYWQtb25seS5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIHJlYWQtb25seSBzdGF0ZS4gVW5saWtlIGRpc2FibGVkIGZpZWxkcyxcbiAgICogcmVhZC1vbmx5IGZpZWxkcyBhcmUgc3RpbGwgZm9jdXNhYmxlIGJ1dCBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSByZWFkb25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZC5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgbXVzdCBoYXZlIGEgdmFsdWUgZm9yIHRoZSBmb3JtIHRvIGJlIHZhbGlkLlxuICAgKiBSZXF1aXJlZCBmaWVsZHMgYXJlIHR5cGljYWxseSBtYXJrZWQgd2l0aCBhbiBpbmRpY2F0b3IgaW4gdGhlIFVJLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgcmVxdWlyZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RlcCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgRm9yIG51bWJlciBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgaW5jcmVtZW50L2RlY3JlbWVudCBzdGVwIHdoZW4gdXNpbmdcbiAgICogdGhlIHVwL2Rvd24gYXJyb3dzIG9yIHdoZW4gdXNpbmcgYSByYW5nZSBzbGlkZXIuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHN0ZXA/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uIGNvbXBhcmlzb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhbm90aGVyIGZpZWxkIG5hbWUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBlcXVhbCB0byBmb3IgdmFsaWRhdGlvbi5cbiAgICogVGhpcyBpcyBjb21tb25seSB1c2VkIGZvciBwYXNzd29yZCBjb25maXJtYXRpb24gZmllbGRzIG9yIG90aGVyIHNjZW5hcmlvcyB3aGVyZVxuICAgKiB0d28gZmllbGRzIG11c3QgY29udGFpbiB0aGUgc2FtZSB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgZXF1YWxzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgaW5lcXVhbGl0eSB2YWxpZGF0aW9uIGNvbXBhcmlzb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhbm90aGVyIGZpZWxkIG5hbWUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBmb3IgdmFsaWRhdGlvbi5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHR3byBmaWVsZHMgZG8gbm90IGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHdoaWNoIG1pZ2h0IGJlXG4gICAqIHJlcXVpcmVkIGZvciBjZXJ0YWluIGJ1c2luZXNzIHJ1bGVzIG9yIHNlY3VyaXR5IGNvbnN0cmFpbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBkaWZmZXJlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBsZXNzLXRoYW4gdmFsaWRhdGlvbiBjb21wYXJpc29uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYW5vdGhlciBmaWVsZCBuYW1lIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGZvciB2YWxpZGF0aW9uLlxuICAgKiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgZm9yIGRhdGUgcmFuZ2VzLCBudW1lcmljIHJhbmdlcywgb3Igb3RoZXIgc2NlbmFyaW9zIHdoZXJlXG4gICAqIG9uZSBmaWVsZCBtdXN0IGhhdmUgYSBzbWFsbGVyIHZhbHVlIHRoYW4gYW5vdGhlci5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbGVzc1RoYW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBsZXNzLXRoYW4tb3ItZXF1YWwgdmFsaWRhdGlvbiBjb21wYXJpc29uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYW5vdGhlciBmaWVsZCBuYW1lIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAqIGZvciB2YWxpZGF0aW9uLiBUaGlzIHByb3ZpZGVzIGluY2x1c2l2ZSB1cHBlciBib3VuZCB2YWxpZGF0aW9uIGZvciBudW1lcmljIG9yIGRhdGUgY29tcGFyaXNvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGxlc3NUaGFuT3JFcXVhbD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpZWxkIG5hbWUgZm9yIGdyZWF0ZXItdGhhbiB2YWxpZGF0aW9uIGNvbXBhcmlzb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhbm90aGVyIGZpZWxkIG5hbWUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gZm9yIHZhbGlkYXRpb24uXG4gICAqIFRoaXMgaXMgY29tbW9ubHkgdXNlZCBmb3IgZGF0ZSByYW5nZXMsIG51bWVyaWMgcmFuZ2VzLCBvciBvdGhlciBzY2VuYXJpb3Mgd2hlcmVcbiAgICogb25lIGZpZWxkIG11c3QgaGF2ZSBhIGxhcmdlciB2YWx1ZSB0aGFuIGFub3RoZXIuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGdyZWF0ZXJUaGFuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgZ3JlYXRlci10aGFuLW9yLWVxdWFsIHZhbGlkYXRpb24gY29tcGFyaXNvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGFub3RoZXIgZmllbGQgbmFtZSB0aGF0IHRoaXMgZmllbGQncyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgKiBmb3IgdmFsaWRhdGlvbi4gVGhpcyBwcm92aWRlcyBpbmNsdXNpdmUgbG93ZXIgYm91bmQgdmFsaWRhdGlvbiBmb3IgbnVtZXJpYyBvciBkYXRlIGNvbXBhcmlzb25zLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBncmVhdGVyVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOdW1iZXIgb2YgY29sdW1ucyBmb3IgdGV4dGFyZWEgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBGb3IgdGV4dGFyZWEgaW5wdXRzLCB0aGlzIHNldHMgdGhlIHZpc2libGUgd2lkdGggb2YgdGhlIHRleHQgYXJlYSBpbiBhdmVyYWdlIGNoYXJhY3RlciB3aWR0aHMuXG4gICAqIFRoaXMgaXMgdXNlZCBhbG9uZ3NpZGUgcm93cyB0byBkZWZpbmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRleHRhcmVhLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjb2xzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTnVtYmVyIG9mIHJvd3MgZm9yIHRleHRhcmVhIGlucHV0cy5cbiAgICogQHN1bW1hcnkgRm9yIHRleHRhcmVhIGlucHV0cywgdGhpcyBzZXRzIHRoZSB2aXNpYmxlIGhlaWdodCBvZiB0aGUgdGV4dCBhcmVhIGluIGxpbmVzIG9mIHRleHQuXG4gICAqIFRoaXMgaXMgdXNlZCBhbG9uZ3NpZGUgY29scyB0byBkZWZpbmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRleHRhcmVhLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWxpZ25tZW50IG9mIHRoZSBmaWVsZCBjb250ZW50LlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQgb2YgdGhlIGZpZWxkIGNvbnRlbnQuXG4gICAqIFRoaXMgYWZmZWN0cyBob3cgdGhlIGNvbnRlbnQgaXMgcG9zaXRpb25lZCB3aXRoaW4gdGhlIGZpZWxkIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHR5cGUgeydzdGFydCcgfCAnY2VudGVyJ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYWxpZ25tZW50PzogJ3N0YXJ0JyB8ICdjZW50ZXInO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbCBjaGVja2VkIHN0YXRlIGZvciBjaGVja2JveCBvciB0b2dnbGUgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBGb3IgY2hlY2tib3ggb3IgdG9nZ2xlIGlucHV0cywgdGhpcyBzZXRzIHRoZSBpbml0aWFsIGNoZWNrZWQgc3RhdGUuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGNoZWNrYm94IG9yIHRvZ2dsZSB3aWxsIGJlIGluaXRpYWxseSBjaGVja2VkLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2hlY2tlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBKdXN0aWZpY2F0aW9uIG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIGhvdyBpdGVtcyBhcmUganVzdGlmaWVkIHdpdGhpbiB0aGUgZmllbGQgY29udGFpbmVyLlxuICAgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGZpZWxkcyB3aXRoIG11bHRpcGxlIGVsZW1lbnRzLCBzdWNoIGFzIHJhZGlvIGdyb3Vwcy5cbiAgICpcbiAgICogQHR5cGUgeydzdGFydCcgfCAnZW5kJyB8ICdzcGFjZS1iZXR3ZWVuJ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAganVzdGlmeT86ICdzdGFydCcgfCAnZW5kJyB8ICdzcGFjZS1iZXR3ZWVuJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uIGluIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEZvciBzZWxlY3QgaW5wdXRzIHdpdGggYSBjYW5jZWwgYnV0dG9uLCB0aGlzIHNldHMgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSBjYW5jZWwgYnV0dG9uLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIHNlbGVjdCBkaWFsb2dzIHRvIHByb3ZpZGUgYSB3YXkgZm9yIHVzZXJzIHRvIGRpc21pc3MgdGhlIHNlbGVjdGlvbiB3aXRob3V0IG1ha2luZyBhIGNoYW5nZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2FuY2VsVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBpbnRlcmZhY2Ugc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMsIHN1Y2ggYXMgJ2FsZXJ0JywgJ2FjdGlvbi1zaGVldCcsIG9yICdwb3BvdmVyJy5cbiAgICogVGhpcyBkZXRlcm1pbmVzIGhvdyB0aGUgc2VsZWN0IG9wdGlvbnMgYXJlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHR5cGUge1NlbGVjdEludGVyZmFjZX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW50ZXJmYWNlOiBTZWxlY3RJbnRlcmZhY2UgPSAncG9wb3Zlcic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25zIGZvciBzZWxlY3Qgb3IgcmFkaW8gaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgbGlzdCBvZiBvcHRpb25zIGZvciBzZWxlY3Qgb3IgcmFkaW8gaW5wdXRzLiBFYWNoIG9wdGlvbiBjYW4gaGF2ZSBhIHZhbHVlIGFuZCBhIGxhYmVsLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGRyb3Bkb3duIG9yIHJhZGlvIGdyb3VwIHdpdGggY2hvaWNlcy5cbiAgICpcbiAgICogQHR5cGUge0NydWRGaWVsZE9wdGlvbltdfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcHRpb25zITogQ3J1ZEZpZWxkT3B0aW9uW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNb2RlIG9mIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB2aXN1YWwgbW9kZSBvZiB0aGUgZmllbGQsIHN1Y2ggYXMgJ2lvcycgb3IgJ21kJy5cbiAgICogVGhpcyBhZmZlY3RzIHRoZSBzdHlsaW5nIGFuZCBhcHBlYXJhbmNlIG9mIHRoZSBmaWVsZCB0byBtYXRjaCB0aGUgcGxhdGZvcm0gc3R5bGUuXG4gICAqXG4gICAqIEB0eXBlIHsnaW9zJyB8ICdtZCd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGU/OiAnaW9zJyB8ICdtZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVsbGNoZWNrIGF0dHJpYnV0ZSBmb3IgdGV4dCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEVuYWJsZXMgb3IgZGlzYWJsZXMgc3BlbGxjaGVja2luZyBmb3IgdGV4dCBpbnB1dHMuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGJyb3dzZXIgd2lsbCBjaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGlucHV0IHRleHQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzcGVsbGNoZWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnB1dCBtb2RlIGZvciB0ZXh0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgSGludHMgYXQgdGhlIHR5cGUgb2YgZGF0YSB0aGF0IG1pZ2h0IGJlIGVudGVyZWQgYnkgdGhlIHVzZXIgd2hpbGUgZWRpdGluZyB0aGUgZWxlbWVudC5cbiAgICogVGhpcyBjYW4gYWZmZWN0IHRoZSB2aXJ0dWFsIGtleWJvYXJkIGxheW91dCBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICpcbiAgICogQHR5cGUgeydub25lJyB8ICd0ZXh0JyB8ICd0ZWwnIHwgJ3VybCcgfCAnZW1haWwnIHwgJ251bWVyaWMnIHwgJ2RlY2ltYWwnIHwgJ3NlYXJjaCd9XG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpbnB1dG1vZGU6XG4gICAgfCAnbm9uZSdcbiAgICB8ICd0ZXh0J1xuICAgIHwgJ3RlbCdcbiAgICB8ICd1cmwnXG4gICAgfCAnZW1haWwnXG4gICAgfCAnbnVtZXJpYydcbiAgICB8ICdkZWNpbWFsJ1xuICAgIHwgJ3NlYXJjaCcgPSAnbm9uZSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBdXRvY29tcGxldGUgYmVoYXZpb3IgZm9yIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXRoZXIgYW5kIGhvdyB0aGUgYnJvd3NlciBzaG91bGQgYXV0b21hdGljYWxseSBjb21wbGV0ZSB0aGUgaW5wdXQuXG4gICAqIFRoaXMgY2FuIGltcHJvdmUgdXNlciBleHBlcmllbmNlIGJ5IHN1Z2dlc3RpbmcgcHJldmlvdXNseSBlbnRlcmVkIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge0F1dG9jb21wbGV0ZVR5cGVzfVxuICAgKiBAZGVmYXVsdCAnb2ZmJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBhdXRvY29tcGxldGU6IEF1dG9jb21wbGV0ZVR5cGVzID0gJ29mZic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWxsIHN0eWxlIGZvciB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGZpbGwgc3R5bGUgb2YgdGhlIGZpZWxkLCBzdWNoIGFzICdvdXRsaW5lJyBvciAnc29saWQnLlxuICAgKiBUaGlzIGFmZmVjdHMgdGhlIGJvcmRlciBhbmQgYmFja2dyb3VuZCBvZiB0aGUgZmllbGQuXG4gICAqXG4gICAqIEB0eXBlIHsnb3V0bGluZScgfCAnc29saWQnfVxuICAgKiBAZGVmYXVsdCAnb3V0bGluZSdcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZmlsbDogJ291dGxpbmUnIHwgJ3NvbGlkJyA9ICdvdXRsaW5lJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBsYWNlbWVudCBvZiB0aGUgbGFiZWwgcmVsYXRpdmUgdG8gdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWQgcmVsYXRpdmUgdG8gdGhlIGZpZWxkLlxuICAgKiBPcHRpb25zIGluY2x1ZGUgJ3N0YXJ0JywgJ2VuZCcsICdmbG9hdGluZycsICdzdGFja2VkJywgYW5kICdmaXhlZCcuXG4gICAqXG4gICAqIEB0eXBlIHsnc3RhcnQnIHwgJ2VuZCcgfCAnZmxvYXRpbmcnIHwgJ3N0YWNrZWQnIHwgJ2ZpeGVkJ31cbiAgICogQGRlZmF1bHQgJ2Zsb2F0aW5nJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsYWJlbFBsYWNlbWVudDogJ3N0YXJ0JyB8ICdlbmQnIHwgJ2Zsb2F0aW5nJyB8ICdzdGFja2VkJyB8ICdmaXhlZCcgPVxuICAgICdmbG9hdGluZyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgbW9kZSBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZW4gdGhlIGZpZWxkIHZhbHVlIHNob3VsZCBiZSB1cGRhdGVkIGluIHRoZSBmb3JtIG1vZGVsLlxuICAgKiBPcHRpb25zIGluY2x1ZGUgJ2NoYW5nZScsICdibHVyJywgYW5kICdzdWJtaXQnLlxuICAgKlxuICAgKiBAdHlwZSB7RmllbGRVcGRhdGVNb2RlfVxuICAgKiBAZGVmYXVsdCAnY2hhbmdlJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB1cGRhdGVPbjogRmllbGRVcGRhdGVNb2RlID0gJ2NoYW5nZSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGNvbXBvbmVudCBlbGVtZW50LCBhbGxvd2luZyBkaXJlY3QgYWNjZXNzIHRvIGl0cyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIG92ZXJyaWRlIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJlbnQgZm9ybSBncm91cC5cbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgcGFyZW50IGZvcm0gZ3JvdXAgdG8gd2hpY2ggdGhpcyBmaWVsZCBiZWxvbmdzLlxuICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgaW50ZWdyYXRpbmcgdGhlIGZpZWxkIHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGZvcm1zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBGb3JtQ29udHJvbCBpbnN0YW5jZSBmb3IgdGhpcyBmaWVsZC5cbiAgICogQHN1bW1hcnkgVGhlIHNwZWNpZmljIEZvcm1Db250cm9sIGluc3RhbmNlIHRoYXQgbWFuYWdlcyB0aGlzIGZpZWxkJ3Mgc3RhdGUsIHZhbGlkYXRpb24sXG4gICAqIGFuZCB2YWx1ZS4gVGhpcyBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIEFuZ3VsYXIncyByZWFjdGl2ZSBmb3JtcyBmdW5jdGlvbmFsaXR5XG4gICAqIGZvciB0aGlzIGluZGl2aWR1YWwgZmllbGQgd2l0aGluIHRoZSBicm9hZGVyIGZvcm0gc3RydWN0dXJlLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUNvbnRyb2x9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGZvcm1Db250cm9sITogRm9ybUNvbnRyb2w7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgaWYgdGhpcyBmaWVsZCBzdXBwb3J0cyBtdWx0aXBsZSB2YWx1ZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBjYW4gaGFuZGxlIG11bHRpcGxlIHZhbHVlcywgdHlwaWNhbGx5IHVzZWQgaW5cbiAgICogbXVsdGktc2VsZWN0IHNjZW5hcmlvcyBvciB3aGVuIHRoZSBmaWVsZCBpcyBwYXJ0IG9mIGEgZm9ybSBhcnJheSBzdHJ1Y3R1cmVcbiAgICogdGhhdCBhbGxvd3MgbXVsdGlwbGUgZW50cmllcyBvZiB0aGUgc2FtZSBmaWVsZCB0eXBlLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3IgbWFuaXB1bGF0ZWQuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJpbWFyeSBrZXkgZm9yIG9wZXJhdGlvbnMgb24gc3BlY2lmaWMgcmVjb3Jkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlcn1cbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHVpZDogc3RyaW5nID0gZ2VuZXJhdGVSYW5kb21WYWx1ZSgxMik7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0YWJpbGl0eSBvZiBmaWVsZCBsYWJlbHMuXG4gICAqIEBzdW1tYXJ5IEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBsYWJlbHMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbGFuZ3VhZ2Ugc2V0dGluZ3MuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgc3VwcG9ydGluZyBtdWx0aXBsZSBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZvcm0gZ3JvdXAgaW4gYSBmb3JtIGFycmF5LlxuICAgKiBAc3VtbWFyeSBXaGVuIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBmb3JtIGdyb3VwcyAoZm9ybSBhcnJheXMpLCB0aGlzIGluZGljYXRlc1xuICAgKiB3aGljaCBmb3JtIGdyb3VwIGlzIGN1cnJlbnRseSBhY3RpdmUgb3IgYmVpbmcgZWRpdGVkLiBUaGlzIGlzIHVzZWQgdG8gbWFuYWdlXG4gICAqIGZvY3VzIGFuZCBkYXRhIGJpbmRpbmcgaW4gbXVsdGktZW50cnkgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUZvcm1Hcm91cDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1BcnJheSBjb250YWluaW5nIG11bHRpcGxlIGZvcm0gZ3JvdXBzIGZvciB0aGlzIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRoaXMgZmllbGQgaXMgcGFydCBvZiBhIG11bHRpLWVudHJ5IHN0cnVjdHVyZSwgdGhpcyBGb3JtQXJyYXlcbiAgICogY29udGFpbnMgYWxsIHRoZSBmb3JtIGdyb3Vwcy4gVGhpcyBlbmFibGVzIG1hbmFnZW1lbnQgb2YgbXVsdGlwbGUgaW5zdGFuY2VzXG4gICAqIG9mIHRoZSBzYW1lIGZpZWxkIHN0cnVjdHVyZSB3aXRoaW4gYSBzaW5nbGUgZm9ybS5cbiAgICpcbiAgICogQHR5cGUge0Zvcm1BcnJheX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgZm9ybUdyb3VwQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBmaWVsZCBuYW1lIGZvciB1bmlxdWVuZXNzIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgZmllbGQgbmFtZSB0aGF0IHNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHVuaXF1ZW5lc3NcbiAgICogdmFsaWRhdGlvbiB3aXRoaW4gZm9ybSBhcnJheXMuIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBlbnRyaWVzXG4gICAqIGFuZCBlbnN1cmUgZGF0YSBpbnRlZ3JpdHkgaW4gbXVsdGktZW50cnkgZm9ybXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBrITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZvcm0gZ3JvdXAgYmFzZWQgb24gY29udGV4dC5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgRm9ybUdyb3VwIGJhc2VkIG9uIHdoZXRoZXIgdGhpcyBmaWVsZCBzdXBwb3J0c1xuICAgKiBtdWx0aXBsZSB2YWx1ZXMuIEZvciBzaW5nbGUtdmFsdWUgZmllbGRzLCByZXR1cm5zIHRoZSBtYWluIGZvcm0gZ3JvdXAuXG4gICAqIEZvciBtdWx0aS12YWx1ZSBmaWVsZHMsIHJldHVybnMgdGhlIGZvcm0gZ3JvdXAgYXQgdGhlIGFjdGl2ZSBpbmRleCBmcm9tIHRoZSBwYXJlbnQgRm9ybUFycmF5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Rm9ybUdyb3VwfSBUaGUgY3VycmVudGx5IGFjdGl2ZSBGb3JtR3JvdXAgZm9yIHRoaXMgZmllbGRcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgZ2V0IGdldEFjdGl2ZUZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cDtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZVxuICAgICAgPyAoKGZvcm1Hcm91cC5wYXJlbnQgYXMgRm9ybUFycmF5KT8uYXQodGhpcy5hY3RpdmVGb3JtR3JvdXApIGFzIEZvcm1Hcm91cClcbiAgICAgIDogZm9ybUdyb3VwO1xuXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2Ygb3B0aW9ucyBmb3Igc2VsZWN0IG9yIHJhZGlvIGlucHV0cywgd2l0aCB0aGVpciBgdGV4dGAgcHJvcGVydHlcbiAgICogbG9jYWxpemVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgaW5jbHVkZSB0aGUgd29yZCAnb3B0aW9ucycuIFRoZSBsb2NhbGl6YXRpb24ga2V5XG4gICAqIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBjb21wb25lbnQncyBsYWJlbCwgcmVwbGFjaW5nICdsYWJlbCcgd2l0aCAnb3B0aW9ucycuXG4gICAqXG4gICAqIEByZXR1cm5zIHtDcnVkRmllbGRPcHRpb25bXX0gVGhlIGFycmF5IG9mIHBhcnNlZCBhbmQgbG9jYWxpemVkIG9wdGlvbnMuXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIGdldCBwYXJzZWRPcHRpb25zKCk6IENydWRGaWVsZE9wdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgIHRleHQ6ICFvcHRpb24udGV4dC5pbmNsdWRlcygnb3B0aW9ucycpID9cbiAgICAgICAgICBnZXRMb2NhbGVDb250ZXh0QnlLZXkoYCR7dGhpcy5sYWJlbC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ2xhYmVsJywgJ29wdGlvbnMnKX1gLCBvcHRpb24udGV4dCkgOiBvcHRpb24udGV4dFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGluaXRpYWxpemF0aW9uIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBmaWVsZCBjb21wb25lbnQgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlIGFuZCBmaWVsZCBjb25maWd1cmF0aW9uLlxuICAgKiBGb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMsIHJlbW92ZXMgdGhlIGZvcm0gZ3JvdXAgdG8gbWFrZSBmaWVsZHMgcmVhZC1vbmx5LlxuICAgKiBGb3Igb3RoZXIgb3BlcmF0aW9ucywgc2V0cyB1cCBpY29ucywgY29uZmlndXJlcyBtdWx0aS12YWx1ZSBzdXBwb3J0IGlmIG5lZWRlZCxcbiAgICogYW5kIHNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIHJhZGlvIGJ1dHRvbnMgaWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm9wdGlvbnM/Lmxlbmd0aClcbiAgICAgIHRoaXMub3B0aW9ucyA9IHRoaXMucGFyc2VkT3B0aW9ucztcbiAgICBpZiAoW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEljb25zKHtjaGV2cm9uRG93bk91dGxpbmUsIGNoZXZyb25VcE91dGxpbmV9KVxuICAgICAgaWYodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZ2V0QWN0aXZlRm9ybUdyb3VwIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBBcnJheSA9IHRoaXMuZm9ybUdyb3VwLnBhcmVudCBhcyBGb3JtQXJyYXk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50eXBlID09PSBIVE1MNUlucHV0VHlwZXMuUkFESU8gJiYgIXRoaXMudmFsdWUpXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwPy5nZXQodGhpcy5uYW1lKT8uc2V0VmFsdWUodGhpcy5vcHRpb25zWzBdLnZhbHVlKTsgLy8gVE9ETzogbWlncmF0ZSB0byBSZW5kZXJpbmdFbmdpbmVcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGFmdGVyIHZpZXcgaW5pdGlhbGl6YXRpb24gbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBhZnRlclZpZXdJbml0IG1ldGhvZCBmb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMuXG4gICAqIFRoaXMgZW5zdXJlcyBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgcmVhZC1vbmx5IGZpZWxkcyB0aGF0IGRvbid0IHJlcXVpcmVcbiAgICogZm9ybSBmdW5jdGlvbmFsaXR5IGJ1dCBzdGlsbCBuZWVkIHZpZXcgc2V0dXAuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKFtPcGVyYXRpb25LZXlzLlJFQUQsIE9wZXJhdGlvbktleXMuREVMRVRFXS5pbmNsdWRlcyh0aGlzLm9wZXJhdGlvbikpXG4gICAgICBzdXBlci5hZnRlclZpZXdJbml0KCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbXBvbmVudCBjbGVhbnVwIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGNsZWFudXAgb3BlcmF0aW9ucyBmb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMgYnkgY2FsbGluZ1xuICAgKiB0aGUgcGFyZW50IG9uRGVzdHJveSBtZXRob2QuIFRoaXMgZW5zdXJlcyBwcm9wZXIgcmVzb3VyY2UgY2xlYW51cCBmb3JcbiAgICogcmVhZC1vbmx5IGZpZWxkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAoW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSlcbiAgICAgIHRoaXMub25EZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZmllbGRzZXQgZ3JvdXAgY3JlYXRpb24gZXZlbnRzIGZyb20gcGFyZW50IGZpZWxkc2V0cy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGV2ZW50cyB0cmlnZ2VyZWQgd2hlbiBhIG5ldyBncm91cCBuZWVkcyB0byBiZSBhZGRlZCB0byBhIGZpZWxkc2V0LlxuICAgKiBWYWxpZGF0ZXMgdGhlIGN1cnJlbnQgZm9ybSBncm91cCwgY2hlY2tzIGZvciB1bmlxdWVuZXNzIGlmIGFwcGxpY2FibGUsIGFuZCBlaXRoZXJcbiAgICogY3JlYXRlcyBhIG5ldyBncm91cCBvciBwcm92aWRlcyB2YWxpZGF0aW9uIGZlZWRiYWNrLiBVcGRhdGVzIHRoZSBhY3RpdmUgZm9ybSBncm91cFxuICAgKiBhbmQgcmVzZXRzIHRoZSBmaWVsZCBmb3IgbmV3IGlucHV0IGFmdGVyIHN1Y2Nlc3NmdWwgY3JlYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGZpZWxkc2V0IGNyZWF0ZSBncm91cCBldmVudCBjb250YWluaW5nIGdyb3VwIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmaWVsZHNldEFkZEdyb3VwRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVGaWVsZHNldENyZWF0ZUdyb3VwRXZlbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgeyBwYXJlbnQsIGNvbXBvbmVudCwgaW5kZXgsIG9wZXJhdGlvbiB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cDtcbiAgICBjb25zdCBwYXJlbnRGb3JtR3JvdXAgPSB0aGlzLmZvcm1Hcm91cD8ucGFyZW50IGFzIEZvcm1BcnJheTtcbiAgICBjb25zdCBpc1ZhbGlkID0gTmd4Rm9ybVNlcnZpY2UudmFsaWRhdGVGaWVsZHMoZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCk7XG4gICAgY29uc3QgaW5kZXhUb0NoZWNrID0gb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSA/XG4gICAgICBpbmRleCA9PT0gMCA/IGluZGV4IDogcGFyZW50Rm9ybUdyb3VwLmxlbmd0aCAtIDEgOiBpbmRleCAtIDE7XG5cbiAgICBjb25zdCBpc1VuaXF1ZSA9IE5neEZvcm1TZXJ2aWNlLmlzVW5pcXVlT25Hcm91cChmb3JtR3JvdXAsIGluZGV4VG9DaGVjaywgb3BlcmF0aW9uIHx8IE9wZXJhdGlvbktleXMuQ1JFQVRFKTtcbiAgICBldmVudCA9IG5ldyBDdXN0b21FdmVudChFdmVudENvbnN0YW50cy5GSUVMRFNFVF9BRERfR1JPVVAsIHtcbiAgICAgIGRldGFpbDoge2lzVmFsaWQ6IGlzVmFsaWQgJiYgaXNVbmlxdWUsIHZhbHVlOiBmb3JtR3JvdXAudmFsdWUsIGZvcm1Hcm91cDogcGFyZW50Rm9ybUdyb3VwLCBmb3JtU2VydmljZTogTmd4Rm9ybVNlcnZpY2V9LFxuICAgIH0pO1xuICAgIGNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmKGlzVmFsaWQgJiYgaXNVbmlxdWUpIHtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gcGFyZW50Rm9ybUdyb3VwLmxlbmd0aDtcblxuICAgICAgaWYob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSkge1xuICAgICAgICBOZ3hGb3JtU2VydmljZS5hZGRHcm91cFRvUGFyZW50KHBhcmVudEZvcm1Hcm91cD8ucGFyZW50IGFzIEZvcm1Hcm91cCwgcGFyZW50LCBuZXdJbmRleCk7XG4gICAgICAgIHRoaXMuYWN0aXZlRm9ybUdyb3VwID0gbmV3SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFjdGl2ZUZvcm1Hcm91cCA9IG5ld0luZGV4IC0gMTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5nZXRBY3RpdmVGb3JtR3JvdXA7XG4gICAgICAvLyBOZ3hGb3JtU2VydmljZS5yZXNldCh0aGlzLmZvcm1Hcm91cCBhcyBGb3JtR3JvdXApO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbCA9ICh0aGlzLmZvcm1Hcm91cCBhcyBGb3JtR3JvdXApLmdldCh0aGlzLm5hbWUpIGFzIEZvcm1Db250cm9sO1xuICAgICAgLy8gTmd4Rm9ybVNlcnZpY2UucmVzZXQodGhpcy5mb3JtQ29udHJvbCk7XG4gICAgICAvLyB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LnNldEZvY3VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKGlzVW5pcXVlKVxuICAgICAgICB0aGlzLmNvbXBvbmVudC5uYXRpdmVFbGVtZW50LnNldEZvY3VzKCk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZmllbGRzZXQgZ3JvdXAgdXBkYXRlIGV2ZW50cyBmcm9tIHBhcmVudCBmaWVsZHNldHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBldmVudHMgdHJpZ2dlcmVkIHdoZW4gYW4gZXhpc3RpbmcgZ3JvdXAgbmVlZHMgdG8gYmUgdXBkYXRlZC5cbiAgICogVXBkYXRlcyB0aGUgYWN0aXZlIGZvcm0gZ3JvdXAgaW5kZXggYW5kIHJlZnJlc2hlcyB0aGUgZm9ybSBncm91cCBhbmQgZm9ybSBjb250cm9sXG4gICAqIHJlZmVyZW5jZXMgdG8gcG9pbnQgdG8gdGhlIGdyb3VwIGJlaW5nIGVkaXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgZmllbGRzZXQgdXBkYXRlIGdyb3VwIGV2ZW50IGNvbnRhaW5pbmcgdXBkYXRlIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmaWVsZHNldFVwZGF0ZUdyb3VwRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVGaWVsZHNldFVwZGF0ZUdyb3VwRXZlbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qge2luZGV4fSA9IGV2ZW50LmRldGFpbDtcbiAgICB0aGlzLmFjdGl2ZUZvcm1Hcm91cCA9IGluZGV4O1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5nZXRBY3RpdmVGb3JtR3JvdXA7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldCh0aGlzLm5hbWUpIGFzIEZvcm1Db250cm9sO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZmllbGRzZXQgZ3JvdXAgcmVtb3ZhbCBldmVudHMgZnJvbSBwYXJlbnQgZmllbGRzZXRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZXZlbnRzIHRyaWdnZXJlZCB3aGVuIGEgZ3JvdXAgbmVlZHMgdG8gYmUgcmVtb3ZlZCBmcm9tIGEgZmllbGRzZXQuXG4gICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBncm91cCBmcm9tIHRoZSBmb3JtIGFycmF5LCB1cGRhdGVzIHRoZSBhY3RpdmUgZm9ybSBncm91cCBpbmRleCxcbiAgICogYW5kIHJlZnJlc2hlcyB0aGUgZm9ybSByZWZlcmVuY2VzLiBEaXNwYXRjaGVzIGEgY29uZmlybWF0aW9uIGV2ZW50IGJhY2sgdG8gdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgZmllbGRzZXQgcmVtb3ZlIGdyb3VwIGV2ZW50IGNvbnRhaW5pbmcgcmVtb3ZhbCBkZXRhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6ZmllbGRzZXRSZW1vdmVHcm91cEV2ZW50JywgWyckZXZlbnQnXSlcbiAgaGFuZGxlRmllbGRzZXRSZW1vdmVHcm91cEV2ZW50KGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHsgY29tcG9uZW50LCBpbmRleCB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIGNvbnN0IGZvcm1BcnJheSA9IHRoaXMuZm9ybUdyb3VwPy5wYXJlbnQgYXMgRm9ybUFycmF5O1xuICAgIGZvcm1BcnJheS5yZW1vdmVBdChpbmRleCk7XG4gICAgdGhpcy5hY3RpdmVGb3JtR3JvdXAgPSBmb3JtQXJyYXkubGVuZ3RoID09PSAxID8gMCA6IGZvcm1BcnJheS5sZW5ndGggLSAxO1xuICAgIHRoaXMuZm9ybUdyb3VwID0gdGhpcy5nZXRBY3RpdmVGb3JtR3JvdXA7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUdyb3VwLmdldCh0aGlzLm5hbWUpIGFzIEZvcm1Db250cm9sO1xuICAgIHRoaXMuZm9ybUdyb3VwQXJyYXkgPSBmb3JtQXJyYXlcbiAgICBldmVudCA9IG5ldyBDdXN0b21FdmVudChFdmVudENvbnN0YW50cy5GSUVMRFNFVF9SRU1PVkVfR1JPVVAsIHtcbiAgICAgIGRldGFpbDoge3ZhbHVlOiB0cnVlfSxcbiAgICB9KTtcbiAgICBjb21wb25lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cbn1cbiIsIkBpZihvcGVyYXRpb24gPT09ICdyZWFkJyB8fCBvcGVyYXRpb24gPT09ICdkZWxldGUnKSB7XG4gIDxuZy1jb250YWluZXIgI2NvbXBvbmVudD5cbiAgICA8ZGl2IFtjbGFzc109XCInZGNmLWlucHV0LWl0ZW0gJyArIG9wZXJhdGlvblwiPlxuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgIHt7IGxhYmVsIHwgdHJhbnNsYXRlIH19PGJyIC8+XG4gICAgICAgICAgQGlmKHZhbHVlKSB7XG4gICAgICAgICAgICA8aW9uLXRleHQgIFtpbm5lckhUTUxdPVwidHlwZSA9PT0gJ3Bhc3N3b3JkJyA/ICcqKioqKioqKicgOiB2YWx1ZVwiPjwvaW9uLXRleHQ+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG59IEBlbHNlIHtcbiAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImdldEFjdGl2ZUZvcm1Hcm91cFwiPlxuICAgIDxkaXYgI2NvbnRhaW5lciBbY2xhc3NdPVwiJ2RjZi1pbnB1dC1pdGVtICcgKyAob3BlcmF0aW9uIHx8ICdjcmVhdGUnKVwiIChjcmVhdGVHcm91cEV2ZW50KT1cIm11bHRpcGxlID8gaGFuZGxlRmllbGRzZXRDcmVhdGVHcm91cEV2ZW50KCRldmVudCkgOiAnJ1wiPlxuICAgICAgICBAaWYodHlwZSA9PT0gJ3RleHRhcmVhJykge1xuICAgICAgICAgIDxpb24tdGV4dGFyZWFcbiAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW5cIlxuICAgICAgICAgICAgW2F1dG9Hcm93XT1cInRydWVcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkICE9PSB1bmRlZmluZWQgPyByZXF1aXJlZCA6IG51bGxcIlxuICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGggIT09IHVuZGVmaW5lZCA/IG1pbmxlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGggIT09IHVuZGVmaW5lZCA/IG1heGxlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5ICE9PSB1bmRlZmluZWQgPyByZWFkb25seSA6IG51bGxcIlxuICAgICAgICAgICAgW2lucHV0bW9kZV09XCJpbnB1dG1vZGVcIlxuICAgICAgICAgICAgW3NwZWxsY2hlY2tdPVwic3BlbGxjaGVja1wiXG4gICAgICAgICAgICBbcm93c109XCJyb3dzXCJcbiAgICAgICAgICAgIFtsYWJlbFBsYWNlbWVudF09XCJsYWJlbFBsYWNlbWVudFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgW2ZpbGxdPVwiZmlsbFwiXG4gICAgICAgICAgICBbZXJyb3JUZXh0XT1cImdldEVycm9ycyhjb250YWluZXIpXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0cmFuc2xhdGFibGUgPyAocGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUpIDogcGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJ0cmFuc2xhdGFibGUgPyAobGFiZWwgfCB0cmFuc2xhdGUpIDogbGFiZWxcIlxuICAgICAgICAgICAjY29tcG9uZW50PlxuICAgICAgICAgIDwvaW9uLXRleHRhcmVhPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIGlmKHR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICA8aW9uLWNoZWNrYm94XG4gICAgICAgICAgICAgICNjaGVja2JveEVsZW1lbnRcblxuICAgICAgICAgICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgICAgICAgICAgW2Vycm9yVGV4dF09XCJnZXRFcnJvcnMoY29udGFpbmVyKVwiXG4gICAgICAgICAgICAgIFtoaWRkZW5dPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50XT1cImxhYmVsUGxhY2VtZW50XCJcbiAgICAgICAgICAgICAgW2p1c3RpZnldPVwianVzdGlmeVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImNoZWNrZWRcIlxuICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAoaW9uQ2hhbmdlKT1cImNoZWNrZWQgPSAhY2hlY2tlZFwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgI2NvbXBvbmVudD5cbiAgICAgICAgICAgICAgPHNwYW4gW2lubmVySFRNTF09XCJsYWJlbCB8IHRyYW5zbGF0ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvaW9uLWNoZWNrYm94PlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIDxpb24tcmFkaW8tZ3JvdXAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCIgW3ZhbHVlXT1cInZhbHVlXCIgI2NvbXBvbmVudD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImRjZi1yYWRpby1ncm91cC1sYWJlbFwiIFtmb3JdPVwicGF0aFwiPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICBAZm9yKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgICAgPGlvbi1pdGVtPlxuICAgICAgICAgICAgICAgIDxpb24tcmFkaW9cbiAgICAgICAgICAgICAgICAgIFtlcnJvclRleHRdPVwiZ2V0RXJyb3JzKGNvbnRhaW5lcilcIlxuICAgICAgICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlblwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxQbGFjZW1lbnRdPVwibGFiZWxQbGFjZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgW2FsaWdubWVudF09XCJhbGlnbm1lbnRcIlxuICAgICAgICAgICAgICAgICAgW2p1c3RpZnldPVwianVzdGlmeVwiXG4gICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICAgICAgPnt7IHRyYW5zbGF0YWJsZSA/ICAob3B0aW9uPy50ZXh0IHwgdHJhbnNsYXRlKSA6IG9wdGlvbj8udGV4dCB9fTwvaW9uLXJhZGlvPlxuICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvaW9uLXJhZGlvLWdyb3VwPlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIGlmKHR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICA8aW9uLXNlbGVjdFxuICAgICAgICAgICAgICB0b2dnbGVJY29uPVwiY2hldnJvbi1kb3duLW91dGxpbmVcIlxuICAgICAgICAgICAgICBleHBhbmRlZEljb249XCJjaGV2cm9uLXVwLW91dGxpbmVcIlxuXG4gICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlblwiXG4gICAgICAgICAgICAgIFtsYWJlbFBsYWNlbWVudF09XCJsYWJlbFBsYWNlbWVudFwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJ0cmFuc2xhdGFibGUgPyAobGFiZWwgfCB0cmFuc2xhdGUpIDogbGFiZWxcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0YWJsZSA/IChwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICAgIFtlcnJvclRleHRdPVwiZ2V0RXJyb3JzKGNvbnRhaW5lcilcIlxuICAgICAgICAgICAgICBbaW50ZXJmYWNlXT1cImludGVyZmFjZVwiICAjY29tcG9uZW50PlxuICAgICAgICAgICAgICBAZm9yKG9wdGlvbiBvZiBvcHRpb25zOyB0cmFjayBvcHRpb24udmFsdWUpIHtcbiAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIm9wdGlvbi52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLnRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1zZWxlY3Q+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2Uge1xuICAgICAgICAgIDxpb24taW5wdXRcbiAgICAgICAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlblwiXG4gICAgICAgICAgICBbaW5wdXRtb2RlXT1cImlucHV0bW9kZVwiXG4gICAgICAgICAgICBbbGFiZWxQbGFjZW1lbnRdPVwibGFiZWxQbGFjZW1lbnRcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkICE9PSB1bmRlZmluZWQgPyByZXF1aXJlZCA6IGZhbHNlXCJcbiAgICAgICAgICAgIFttaW5sZW5ndGhdPVwibWlubGVuZ3RoICE9PSB1bmRlZmluZWQgPyBtaW5sZW5ndGggOiBudWxsXCJcbiAgICAgICAgICAgIFttYXhsZW5ndGhdPVwibWF4bGVuZ3RoICE9PSB1bmRlZmluZWQgPyBtYXhsZW5ndGggOiBudWxsXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSAhPT0gdW5kZWZpbmVkID8gcmVhZG9ubHkgOiBudWxsXCJcbiAgICAgICAgICAgIFttYXhdPVwibWF4ICE9PSB1bmRlZmluZWQgPyBtYXggOiBudWxsXCJcbiAgICAgICAgICAgIFttaW5dPVwibWluICE9PSB1bmRlZmluZWQgPyBtaW4gOiBudWxsXCJcbiAgICAgICAgICAgIFtwYXR0ZXJuXT1cInBhdHRlcm4gIT09IHVuZGVmaW5lZCA/IHBhdHRlcm4gOiBudWxsXCJcbiAgICAgICAgICAgIFtzdGVwXT1cInN0ZXAgIT09IHVuZGVmaW5lZCA/IHN0ZXAgOiBudWxsXCJcbiAgICAgICAgICAgIFtmaWxsXT1cImZpbGxcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0YWJsZSA/IChwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgW2Vycm9yVGV4dF09XCJnZXRFcnJvcnMoY29udGFpbmVyKVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwidHJhbnNsYXRhYmxlID8gKGxhYmVsIHwgdHJhbnNsYXRlKSA6IGxhYmVsXCIgI2NvbXBvbmVudCAvPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxufVxuXG4iXX0=
|
|
507
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvY3J1ZC1maWVsZC9jcnVkLWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9jcnVkLWZpZWxkL2NydWQtZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1Qsc0JBQXNCLEVBQ3RCLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsV0FBVyxFQUFhLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEYsT0FBTyxFQUFrQixhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbEQsT0FBTyxFQUNMLFdBQVcsRUFDWCxPQUFPLEVBQ1AsUUFBUSxFQUNSLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsZUFBZSxFQUNmLE9BQU8sRUFDUCxXQUFXLEdBQ1osTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9B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QUk7c0JBREgsS0FBSztnQkFhTixVQUFVO3NCQURULEtBQUs7Z0JBYU4sU0FBUztzQkFEUixLQUFLO2dCQXFCTixZQUFZO3NCQURYLEtBQUs7Z0JBYU4sSUFBSTtzQkFESCxLQUFLO2dCQWFOLGNBQWM7c0JBRGIsS0FBSztnQkFjTixRQUFRO3NCQURQLEtBQUs7Z0JBV0csU0FBUztzQkFEakIsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQVluQyxTQUFTO3NCQURqQixLQUFLO2dCQWNHLFdBQVc7c0JBRG5CLEtBQUs7Z0JBY0csUUFBUTtzQkFEaEIsS0FBSztnQkFXRyxHQUFHO3NCQURYLEtBQUs7Z0JBY04sWUFBWTtzQkFEWCxLQUFLO2dCQWdCTixlQUFlO3NCQURkLEtBQUs7Z0JBd0JOLEVBQUU7c0JBREQsS0FBSztnQkEyR04sOEJBQThCO3NCQUQ3QixZQUFZO3VCQUFDLDhCQUE4QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdEeEQsOEJBQThCO3NCQUQ3QixZQUFZO3VCQUFDLGlDQUFpQyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXFCM0QsOEJBQThCO3NCQUQ3QixZQUFZO3VCQUFDLGlDQUFpQyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVR5cGVzLCBTZWxlY3RJbnRlcmZhY2UgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBDcnVkT3BlcmF0aW9ucywgT3BlcmF0aW9uS2V5cyB9IGZyb20gJ0BkZWNhZi10cy9kYi1kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5neENydWRGb3JtRmllbGQgfSBmcm9tICcuLi8uLi9lbmdpbmUvTmd4Q3J1ZEZvcm1GaWVsZCc7XG5pbXBvcnQgeyBEeW5hbWljIH0gZnJvbSAnLi4vLi4vZW5naW5lL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgQ3J1ZEZpZWxkT3B0aW9uLCBGaWVsZFVwZGF0ZU1vZGUsIFBvc3NpYmxlSW5wdXRUeXBlcywgU3RyaW5nT3JCb29sZWFuIH0gZnJvbSAnLi4vLi4vZW5naW5lL3R5cGVzJztcbmltcG9ydCB7XG4gIElvbkNoZWNrYm94LFxuICBJb25JY29uLFxuICBJb25JbnB1dCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvblJhZGlvLFxuICBJb25SYWRpb0dyb3VwLFxuICBJb25TZWxlY3QsXG4gIElvblNlbGVjdE9wdGlvbixcbiAgSW9uVGV4dCxcbiAgSW9uVGV4dGFyZWEsXG59IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgSFRNTDVJbnB1dFR5cGVzIH0gZnJvbSAnQGRlY2FmLXRzL3VpLWRlY29yYXRvcnMnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjaGV2cm9uRG93bk91dGxpbmUsIGNoZXZyb25VcE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJhbmRvbVZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBOZ3hGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uL2VuZ2luZS9OZ3hGb3JtU2VydmljZSc7XG5pbXBvcnQgeyBFdmVudENvbnN0YW50cyB9IGZyb20gJy4uLy4uL2VuZ2luZS9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0TG9jYWxlQ29udGV4dEJ5S2V5IH0gZnJvbSAnLi4vLi4vaTE4bi9Mb2FkZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGR5bmFtaWMgZm9ybSBmaWVsZCBjb21wb25lbnQgZm9yIENSVUQgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBDcnVkRmllbGRDb21wb25lbnQgaXMgYSB2ZXJzYXRpbGUgZm9ybSBmaWVsZCBjb21wb25lbnQgdGhhdCBhZGFwdHMgdG8gZGlmZmVyZW50XG4gKiBpbnB1dCB0eXBlcyBhbmQgQ1JVRCBvcGVyYXRpb25zLiBJdCBleHRlbmRzIE5neENydWRGb3JtRmllbGQgdG8gaW5oZXJpdCBmb3JtIGhhbmRsaW5nIGNhcGFiaWxpdGllc1xuICogYW5kIGltcGxlbWVudHMgbGlmZWN5Y2xlIGhvb2tzIHRvIHByb3Blcmx5IGluaXRpYWxpemUsIHJlbmRlciwgYW5kIGNsZWFuIHVwLiBUaGlzIGNvbXBvbmVudFxuICogc3VwcG9ydHMgdmFyaW91cyBpbnB1dCB0eXBlcyAodGV4dCwgbnVtYmVyLCBkYXRlLCBzZWxlY3QsIGV0Yy4pLCB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgc3R5bGluZ1xuICogb3B0aW9ucywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBidWlsZGluZyBkeW5hbWljIGZvcm1zIGZvciBjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgYW5kIGRlbGV0ZVxuICogb3BlcmF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcGVyYXRpb24gLSBUaGUgQ1JVRCBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIChjcmVhdGUsIHJlYWQsIHVwZGF0ZSwgZGVsZXRlKVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgZmllbGQgbmFtZSwgdXNlZCBhcyBmb3JtIGNvbnRyb2wgaWRlbnRpZmllclxuICogQHBhcmFtIHtQb3NzaWJsZUlucHV0VHlwZXN9IHR5cGUgLSBUaGUgaW5wdXQgdHlwZSAodGV4dCwgbnVtYmVyLCBkYXRlLCBzZWxlY3QsIGV0Yy4pXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8RGF0ZX0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZmllbGRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQgLSBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIC0gVGhlIGRpc3BsYXkgbGFiZWwgZm9yIHRoZSBmaWVsZFxuICogQHBhcmFtIHtzdHJpbmd9IHBsYWNlaG9sZGVyIC0gUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGZpZWxkIGlzIGVtcHR5XG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IC0gRm9ybWF0IHBhdHRlcm4gZm9yIHRoZSBmaWVsZCB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFufSBoaWRkZW4gLSBXaGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXhsZW5ndGggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcnxEYXRlfSBtaW4gLSBNaW5pbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaW5sZW5ndGggLSBNaW5pbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVybiAtIFZhbGlkYXRpb24gcGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSByZWFkb25seSAtIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlYWQtb25seVxuICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZCAtIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCAtIFN0ZXAgdmFsdWUgZm9yIG51bWJlciBpbnB1dHNcbiAqIEBwYXJhbSB7Rm9ybUdyb3VwfSBmb3JtR3JvdXAgLSBUaGUgcGFyZW50IGZvcm0gZ3JvdXBcbiAqIEBwYXJhbSB7U3RyaW5nT3JCb29sZWFufSB0cmFuc2xhdGFibGUgLSBXaGV0aGVyIGZpZWxkIGxhYmVscyBzaG91bGQgYmUgdHJhbnNsYXRlZFxuICpcbiAqIEBjb21wb25lbnQgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gKiBAZXhhbXBsZVxuICogPG5neC1kZWNhZi1jcnVkLWZpZWxkXG4gKiAgIG9wZXJhdGlvbj1cImNyZWF0ZVwiXG4gKiAgIG5hbWU9XCJmaXJzdE5hbWVcIlxuICogICB0eXBlPVwidGV4dFwiXG4gKiAgIGxhYmVsPVwiPE5BTUU+XCJcbiAqICAgcGxhY2Vob2xkZXI9XCI8TkFNRT5cIlxuICogICBbdmFsdWVdPVwibW9kZWwuZmlyc3ROYW1lXCJcbiAqICAgW2Rpc2FibGVkXT1cIm1vZGVsLnJlYWRPbmx5XCI+XG4gKlxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWFuZ3VsYXJcbiAqL1xuQER5bmFtaWMoKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFRyYW5zbGF0ZVBpcGUsXG4gICAgSW9uSW5wdXQsXG4gICAgSW9uSXRlbSxcbiAgICBJb25DaGVja2JveCxcbiAgICBJb25SYWRpb0dyb3VwLFxuICAgIElvblJhZGlvLFxuICAgIElvblNlbGVjdCxcbiAgICBJb25TZWxlY3RPcHRpb24sXG4gICAgSW9uTGFiZWwsXG4gICAgSW9uVGV4dCxcbiAgICBJb25UZXh0YXJlYSxcbiAgICBJb25JY29uXG4gIF0sXG4gIHNlbGVjdG9yOiAnbmd4LWRlY2FmLWNydWQtZmllbGQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY3J1ZC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jcnVkLWZpZWxkLmNvbXBvbmVudC5zY3NzJyxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICBob3N0OiB7J1thdHRyLmlkXSc6ICd1aWQnfSxcbn0pXG5leHBvcnQgY2xhc3MgQ3J1ZEZpZWxkQ29tcG9uZW50IGV4dGVuZHMgTmd4Q3J1ZEZvcm1GaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBDUlVEIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB3aGljaCBDUlVEIG9wZXJhdGlvbiAoQ3JlYXRlLCBSZWFkLCBVcGRhdGUsIERlbGV0ZSkgdGhlIGZpZWxkIGlzIGJlaW5nIHVzZWQgZm9yLlxuICAgKiBUaGlzIGFmZmVjdHMgaG93IHRoZSBmaWVsZCBiZWhhdmVzIGFuZCBpcyByZW5kZXJlZC4gRm9yIGV4YW1wbGUsIGZpZWxkcyBtaWdodCBiZSByZWFkLW9ubHkgaW5cbiAgICogJ3JlYWQnIG1vZGUgYnV0IGVkaXRhYmxlIGluICdjcmVhdGUnIG9yICd1cGRhdGUnIG1vZGVzLlxuICAgKlxuICAgKiBAdHlwZSB7Q3J1ZE9wZXJhdGlvbnN9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG92ZXJyaWRlIG9wZXJhdGlvbiE6IENydWRPcGVyYXRpb25zO1xuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSAgVGhlIGZsYXQgZmllbGQgbmFtZSB1c2VkIGFzIHRoZSBmb3JtIGNvbnRyb2wgaWRlbnRpZmllciBpbiBpbW1lZGlhdGUgcGFyZW50IEZvcm1Hcm91cC5cbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIEZvcm1Db250cm9sIGlkZW50aWZpZXIgaW4gaW1tZWRpYXRlIHBhcmVudCBGb3JtR3JvdXAuXG4gICAqIFRoaXMgdmFsdWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBpbW1lZGlhdGUgcGFyZW50IEZvcm1Hcm91cCBjb250ZXh0IGFuZCBzaG91bGQgbm90IGNvbnRhaW4gZG90cyBvciBuZXN0aW5nLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBvdmVycmlkZSBuYW1lITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFRoZSBmdWxsIGZpZWxkIHBhdGggdXNlZCBmb3IgZm9ybSBjb250cm9sIHJlc29sdXRpb24uXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGhpZXJhcmNoaWNhbCBwYXRoIG9mIHRoZSBmaWVsZCwgdXNlZCB0byByZXNvbHZlIGl0cyBsb2NhdGlvbiB3aXRoaW4gdGhlIHBhcmVudCBGb3JtR3JvdXAgKG9yIG5lc3RlZCBGb3JtR3JvdXBzKS5cbiAgICogSXQgaXMgdXNlZCBhcyB0aGUgaWRlbnRpZmllciBpbiB0aGUgcmVuZGVyZWQgSFRNTCwgYW5kIG1heSBpbmNsdWRlIG5lc3RpbmcgKGUuZy4sICdhZGRyZXNzLmJpbGxpbmcuc3RyZWV0JykgYW5kXG4gICAqIHNob3VsZCBtYXRjaCB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhIG1vZGVsXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIG92ZXJyaWRlIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcGFyZW50IGZpZWxkIHBhdGgsIGlmIHRoaXMgZmllbGQgaXMgbmVzdGVkLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGZ1bGwgZG90LWRlbGltaXRlZCBwYXRoIG9mIHRoZSBwYXJlbnQgZmllbGQuIFRoaXMgaXMgb25seSBzZXQgd2hlbiB0aGUgZmllbGQgaXMgbmVzdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBwYXJlbnQgZmllbGQgcGF0aCBmb3IgbmVzdGVkIGZpZWxkIHN0cnVjdHVyZXMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgZnVsbCBkb3QtZGVsaW1pdGVkIHBhdGggb2YgdGhlIHBhcmVudCBmaWVsZCB3aGVuIHRoaXMgZmllbGRcbiAgICogaXMgcGFydCBvZiBhIG5lc3RlZCBzdHJ1Y3R1cmUuIFRoaXMgaXMgdXNlZCBmb3IgaGllcmFyY2hpY2FsIGZvcm0gb3JnYW5pemF0aW9uXG4gICAqIGFuZCBwcm9wZXIgZm9ybSBjb250cm9sIHJlc29sdXRpb24gaW4gY29tcGxleCBmb3JtIHN0cnVjdHVyZXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBkZWZhdWx0ICcnXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGNoaWxkT2Y6IHN0cmluZyA9ICcnO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGlucHV0IHR5cGUgb2YgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSB0eXBlIG9mIGlucHV0IHRvIHJlbmRlciwgc3VjaCBhcyB0ZXh0LCBudW1iZXIsIGRhdGUsIHNlbGVjdCwgZXRjLlxuICAgKiBUaGlzIGRldGVybWluZXMgd2hpY2ggSW9uaWMgZm9ybSBjb21wb25lbnQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZmllbGQgYW5kIGhvd1xuICAgKiB0aGUgZGF0YSB3aWxsIGJlIGZvcm1hdHRlZCBhbmQgdmFsaWRhdGVkLlxuICAgKlxuICAgKiBAdHlwZSB7UG9zc2libGVJbnB1dFR5cGVzfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBvdmVycmlkZSB0eXBlITogUG9zc2libGVJbnB1dFR5cGVzO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBmb3JtIGZpZWxkLiBUaGlzIGNhbiBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBEYXRlXG4gICAqIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4gRm9yIHNlbGVjdCBmaWVsZHMsIHRoaXMgc2hvdWxkIG1hdGNoIG9uZSBvZiB0aGUgb3B0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlciB8IERhdGV9XG4gICAqIEBkZWZhdWx0ICcnXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlID0gJyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBpcyBkaXNhYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIGRpc2FibGVkIHN0YXRlLCBwcmV2ZW50aW5nIHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqIERpc2FibGVkIGZpZWxkcyBhcmUgc3RpbGwgaW5jbHVkZWQgaW4gdGhlIGZvcm0gbW9kZWwgYnV0IGNhbm5vdCBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBsYWJlbCBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBUaGUgdGV4dCBsYWJlbCBkaXNwbGF5ZWQgYWxvbmdzaWRlIHRoZSBmaWVsZCB0byBpZGVudGlmeSBpdCB0byB0aGUgdXNlci5cbiAgICogVGhpcyBsYWJlbCBjYW4gYmUgdHJhbnNsYXRlZCBpZiB0aGUgdHJhbnNsYXRhYmxlIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBsYWJlbCE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBsYWNlaG9sZGVyIHRleHQgd2hlbiBmaWVsZCBpcyBlbXB0eS5cbiAgICogQHN1bW1hcnkgVGV4dCB0aGF0IGFwcGVhcnMgaW4gdGhlIGlucHV0IHdoZW4gaXQgaGFzIG5vIHZhbHVlLiBUaGlzIHByb3ZpZGVzIGEgaGludCB0byB0aGUgdXNlclxuICAgKiBhYm91dCB3aGF0IGtpbmQgb2YgZGF0YSBpcyBleHBlY3RlZC4gVGhlIHBsYWNlaG9sZGVyIGRpc2FwcGVhcnMgd2hlbiB0aGUgdXNlciBzdGFydHMgdHlwaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlciE6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1hdCBwYXR0ZXJuIGZvciB0aGUgZmllbGQgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhIGZvcm1hdCBwYXR0ZXJuIGZvciB0aGUgZmllbGQgdmFsdWUsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBkYXRlIGZvcm1hdHRpbmcsXG4gICAqIG51bWJlciBmb3JtYXR0aW5nLCBvciBvdGhlciB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmcgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgaGlkZGVuLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBmaWVsZCB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIHRoZSBVSSBidXQgd2lsbCBzdGlsbCBiZSBwYXJ0IG9mIHRoZSBmb3JtIG1vZGVsLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHRoYXQgbmVlZCB0byBiZSBpbmNsdWRlZCBpbiBmb3JtIHN1Ym1pc3Npb24gYnV0IHNob3VsZCBub3QgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgaGlkZGVuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBGb3IgbnVtYmVyIGlucHV0cywgdGhpcyBzZXRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbnVtZXJpYyB2YWx1ZS5cbiAgICogRm9yIGRhdGUgaW5wdXRzLCB0aGlzIHNldHMgdGhlIGxhdGVzdCBhbGxvd2VkIGRhdGUuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXIgfCBEYXRlfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBtYXg/OiBudW1iZXIgfCBEYXRlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWF4aW11bSBhbGxvd2VkIGxlbmd0aCBmb3IgdGV4dCBpbnB1dC5cbiAgICogQHN1bW1hcnkgRm9yIHRleHQgaW5wdXRzLCB0aGlzIHNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZC5cbiAgICogVGhpcyBpcyB1c2VkIGZvciB2YWxpZGF0aW9uIGFuZCBtYXkgYWxzbyBiZSB1c2VkIHRvIGxpbWl0IGlucHV0IGluIHRoZSBVSS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbWF4bGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTWluaW11bSBhbGxvd2VkIHZhbHVlIGZvciB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IEZvciBudW1iZXIgaW5wdXRzLCB0aGlzIHNldHMgdGhlIG1pbmltdW0gYWxsb3dlZCBudW1lcmljIHZhbHVlLlxuICAgKiBGb3IgZGF0ZSBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgZWFybGllc3QgYWxsb3dlZCBkYXRlLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyIHwgRGF0ZX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbWluPzogbnVtYmVyIHwgRGF0ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE1pbmltdW0gYWxsb3dlZCBsZW5ndGggZm9yIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEZvciB0ZXh0IGlucHV0cywgdGhpcyBzZXRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkLlxuICAgKiBUaGlzIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24gdG8gZW5zdXJlIHRoZSBpbnB1dCBtZWV0cyBhIG1pbmltdW0gbGVuZ3RoIHJlcXVpcmVtZW50LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBtaW5sZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0aW9uIHBhdHRlcm4gZm9yIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdXNlZCB0byB2YWxpZGF0ZSB0ZXh0IGlucHV0LlxuICAgKiBUaGUgaW5wdXQgdmFsdWUgbXVzdCBtYXRjaCB0aGlzIHBhdHRlcm4gdG8gYmUgY29uc2lkZXJlZCB2YWxpZC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlYWQtb25seS5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgd2lsbCBiZSByZW5kZXJlZCBpbiBhIHJlYWQtb25seSBzdGF0ZS4gVW5saWtlIGRpc2FibGVkIGZpZWxkcyxcbiAgICogcmVhZC1vbmx5IGZpZWxkcyBhcmUgc3RpbGwgZm9jdXNhYmxlIGJ1dCBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSByZWFkb25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZC5cbiAgICogQHN1bW1hcnkgV2hlbiB0cnVlLCB0aGUgZmllbGQgbXVzdCBoYXZlIGEgdmFsdWUgZm9yIHRoZSBmb3JtIHRvIGJlIHZhbGlkLlxuICAgKiBSZXF1aXJlZCBmaWVsZHMgYXJlIHR5cGljYWxseSBtYXJrZWQgd2l0aCBhbiBpbmRpY2F0b3IgaW4gdGhlIFVJLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgcmVxdWlyZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RlcCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgRm9yIG51bWJlciBpbnB1dHMsIHRoaXMgc2V0cyB0aGUgaW5jcmVtZW50L2RlY3JlbWVudCBzdGVwIHdoZW4gdXNpbmdcbiAgICogdGhlIHVwL2Rvd24gYXJyb3dzIG9yIHdoZW4gdXNpbmcgYSByYW5nZSBzbGlkZXIuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHN0ZXA/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uIGNvbXBhcmlzb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhbm90aGVyIGZpZWxkIG5hbWUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBlcXVhbCB0byBmb3IgdmFsaWRhdGlvbi5cbiAgICogVGhpcyBpcyBjb21tb25seSB1c2VkIGZvciBwYXNzd29yZCBjb25maXJtYXRpb24gZmllbGRzIG9yIG90aGVyIHNjZW5hcmlvcyB3aGVyZVxuICAgKiB0d28gZmllbGRzIG11c3QgY29udGFpbiB0aGUgc2FtZSB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgZXF1YWxzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgaW5lcXVhbGl0eSB2YWxpZGF0aW9uIGNvbXBhcmlzb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhbm90aGVyIGZpZWxkIG5hbWUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBmb3IgdmFsaWRhdGlvbi5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHR3byBmaWVsZHMgZG8gbm90IGNvbnRhaW4gdGhlIHNhbWUgdmFsdWUsIHdoaWNoIG1pZ2h0IGJlXG4gICAqIHJlcXVpcmVkIGZvciBjZXJ0YWluIGJ1c2luZXNzIHJ1bGVzIG9yIHNlY3VyaXR5IGNvbnN0cmFpbnRzLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBkaWZmZXJlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBsZXNzLXRoYW4gdmFsaWRhdGlvbiBjb21wYXJpc29uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYW5vdGhlciBmaWVsZCBuYW1lIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIGZvciB2YWxpZGF0aW9uLlxuICAgKiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgZm9yIGRhdGUgcmFuZ2VzLCBudW1lcmljIHJhbmdlcywgb3Igb3RoZXIgc2NlbmFyaW9zIHdoZXJlXG4gICAqIG9uZSBmaWVsZCBtdXN0IGhhdmUgYSBzbWFsbGVyIHZhbHVlIHRoYW4gYW5vdGhlci5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbGVzc1RoYW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWVsZCBuYW1lIGZvciBsZXNzLXRoYW4tb3ItZXF1YWwgdmFsaWRhdGlvbiBjb21wYXJpc29uLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYW5vdGhlciBmaWVsZCBuYW1lIHRoYXQgdGhpcyBmaWVsZCdzIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAqIGZvciB2YWxpZGF0aW9uLiBUaGlzIHByb3ZpZGVzIGluY2x1c2l2ZSB1cHBlciBib3VuZCB2YWxpZGF0aW9uIGZvciBudW1lcmljIG9yIGRhdGUgY29tcGFyaXNvbnMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGxlc3NUaGFuT3JFcXVhbD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZpZWxkIG5hbWUgZm9yIGdyZWF0ZXItdGhhbiB2YWxpZGF0aW9uIGNvbXBhcmlzb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyBhbm90aGVyIGZpZWxkIG5hbWUgdGhhdCB0aGlzIGZpZWxkJ3MgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gZm9yIHZhbGlkYXRpb24uXG4gICAqIFRoaXMgaXMgY29tbW9ubHkgdXNlZCBmb3IgZGF0ZSByYW5nZXMsIG51bWVyaWMgcmFuZ2VzLCBvciBvdGhlciBzY2VuYXJpb3Mgd2hlcmVcbiAgICogb25lIGZpZWxkIG11c3QgaGF2ZSBhIGxhcmdlciB2YWx1ZSB0aGFuIGFub3RoZXIuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGdyZWF0ZXJUaGFuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmllbGQgbmFtZSBmb3IgZ3JlYXRlci10aGFuLW9yLWVxdWFsIHZhbGlkYXRpb24gY29tcGFyaXNvbi5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGFub3RoZXIgZmllbGQgbmFtZSB0aGF0IHRoaXMgZmllbGQncyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1xuICAgKiBmb3IgdmFsaWRhdGlvbi4gVGhpcyBwcm92aWRlcyBpbmNsdXNpdmUgbG93ZXIgYm91bmQgdmFsaWRhdGlvbiBmb3IgbnVtZXJpYyBvciBkYXRlIGNvbXBhcmlzb25zLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBncmVhdGVyVGhhbk9yRXF1YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOdW1iZXIgb2YgY29sdW1ucyBmb3IgdGV4dGFyZWEgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBGb3IgdGV4dGFyZWEgaW5wdXRzLCB0aGlzIHNldHMgdGhlIHZpc2libGUgd2lkdGggb2YgdGhlIHRleHQgYXJlYSBpbiBhdmVyYWdlIGNoYXJhY3RlciB3aWR0aHMuXG4gICAqIFRoaXMgaXMgdXNlZCBhbG9uZ3NpZGUgcm93cyB0byBkZWZpbmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRleHRhcmVhLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBjb2xzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTnVtYmVyIG9mIHJvd3MgZm9yIHRleHRhcmVhIGlucHV0cy5cbiAgICogQHN1bW1hcnkgRm9yIHRleHRhcmVhIGlucHV0cywgdGhpcyBzZXRzIHRoZSB2aXNpYmxlIGhlaWdodCBvZiB0aGUgdGV4dCBhcmVhIGluIGxpbmVzIG9mIHRleHQuXG4gICAqIFRoaXMgaXMgdXNlZCBhbG9uZ3NpZGUgY29scyB0byBkZWZpbmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHRleHRhcmVhLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICByb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWxpZ25tZW50IG9mIHRoZSBmaWVsZCBjb250ZW50LlxuICAgKiBAc3VtbWFyeSBDb250cm9scyB0aGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQgb2YgdGhlIGZpZWxkIGNvbnRlbnQuXG4gICAqIFRoaXMgYWZmZWN0cyBob3cgdGhlIGNvbnRlbnQgaXMgcG9zaXRpb25lZCB3aXRoaW4gdGhlIGZpZWxkIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHR5cGUgeydzdGFydCcgfCAnY2VudGVyJ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgYWxpZ25tZW50PzogJ3N0YXJ0JyB8ICdjZW50ZXInO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbCBjaGVja2VkIHN0YXRlIGZvciBjaGVja2JveCBvciB0b2dnbGUgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBGb3IgY2hlY2tib3ggb3IgdG9nZ2xlIGlucHV0cywgdGhpcyBzZXRzIHRoZSBpbml0aWFsIGNoZWNrZWQgc3RhdGUuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGNoZWNrYm94IG9yIHRvZ2dsZSB3aWxsIGJlIGluaXRpYWxseSBjaGVja2VkLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2hlY2tlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBKdXN0aWZpY2F0aW9uIG9mIGl0ZW1zIHdpdGhpbiB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IENvbnRyb2xzIGhvdyBpdGVtcyBhcmUganVzdGlmaWVkIHdpdGhpbiB0aGUgZmllbGQgY29udGFpbmVyLlxuICAgKiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGZpZWxkcyB3aXRoIG11bHRpcGxlIGVsZW1lbnRzLCBzdWNoIGFzIHJhZGlvIGdyb3Vwcy5cbiAgICpcbiAgICogQHR5cGUgeydzdGFydCcgfCAnZW5kJyB8ICdzcGFjZS1iZXR3ZWVuJ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAganVzdGlmeT86ICdzdGFydCcgfCAnZW5kJyB8ICdzcGFjZS1iZXR3ZWVuJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uIGluIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEZvciBzZWxlY3QgaW5wdXRzIHdpdGggYSBjYW5jZWwgYnV0dG9uLCB0aGlzIHNldHMgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSBjYW5jZWwgYnV0dG9uLlxuICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGluIHNlbGVjdCBkaWFsb2dzIHRvIHByb3ZpZGUgYSB3YXkgZm9yIHVzZXJzIHRvIGRpc21pc3MgdGhlIHNlbGVjdGlvbiB3aXRob3V0IG1ha2luZyBhIGNoYW5nZS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgY2FuY2VsVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEludGVyZmFjZSBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSBpbnRlcmZhY2Ugc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMsIHN1Y2ggYXMgJ2FsZXJ0JywgJ2FjdGlvbi1zaGVldCcsIG9yICdwb3BvdmVyJy5cbiAgICogVGhpcyBkZXRlcm1pbmVzIGhvdyB0aGUgc2VsZWN0IG9wdGlvbnMgYXJlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHR5cGUge1NlbGVjdEludGVyZmFjZX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW50ZXJmYWNlOiBTZWxlY3RJbnRlcmZhY2UgPSAncG9wb3Zlcic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBPcHRpb25zIGZvciBzZWxlY3Qgb3IgcmFkaW8gaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgbGlzdCBvZiBvcHRpb25zIGZvciBzZWxlY3Qgb3IgcmFkaW8gaW5wdXRzLiBFYWNoIG9wdGlvbiBjYW4gaGF2ZSBhIHZhbHVlIGFuZCBhIGxhYmVsLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGRyb3Bkb3duIG9yIHJhZGlvIGdyb3VwIHdpdGggY2hvaWNlcy5cbiAgICpcbiAgICogQHR5cGUge0NydWRGaWVsZE9wdGlvbltdfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvcHRpb25zITogQ3J1ZEZpZWxkT3B0aW9uW107XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBNb2RlIG9mIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB2aXN1YWwgbW9kZSBvZiB0aGUgZmllbGQsIHN1Y2ggYXMgJ2lvcycgb3IgJ21kJy5cbiAgICogVGhpcyBhZmZlY3RzIHRoZSBzdHlsaW5nIGFuZCBhcHBlYXJhbmNlIG9mIHRoZSBmaWVsZCB0byBtYXRjaCB0aGUgcGxhdGZvcm0gc3R5bGUuXG4gICAqXG4gICAqIEB0eXBlIHsnaW9zJyB8ICdtZCd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG1vZGU/OiAnaW9zJyB8ICdtZCc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTcGVsbGNoZWNrIGF0dHJpYnV0ZSBmb3IgdGV4dCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IEVuYWJsZXMgb3IgZGlzYWJsZXMgc3BlbGxjaGVja2luZyBmb3IgdGV4dCBpbnB1dHMuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIGJyb3dzZXIgd2lsbCBjaGVjayB0aGUgc3BlbGxpbmcgb2YgdGhlIGlucHV0IHRleHQuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzcGVsbGNoZWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnB1dCBtb2RlIGZvciB0ZXh0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgSGludHMgYXQgdGhlIHR5cGUgb2YgZGF0YSB0aGF0IG1pZ2h0IGJlIGVudGVyZWQgYnkgdGhlIHVzZXIgd2hpbGUgZWRpdGluZyB0aGUgZWxlbWVudC5cbiAgICogVGhpcyBjYW4gYWZmZWN0IHRoZSB2aXJ0dWFsIGtleWJvYXJkIGxheW91dCBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICpcbiAgICogQHR5cGUgeydub25lJyB8ICd0ZXh0JyB8ICd0ZWwnIHwgJ3VybCcgfCAnZW1haWwnIHwgJ251bWVyaWMnIHwgJ2RlY2ltYWwnIHwgJ3NlYXJjaCd9XG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBpbnB1dG1vZGU6XG4gICAgfCAnbm9uZSdcbiAgICB8ICd0ZXh0J1xuICAgIHwgJ3RlbCdcbiAgICB8ICd1cmwnXG4gICAgfCAnZW1haWwnXG4gICAgfCAnbnVtZXJpYydcbiAgICB8ICdkZWNpbWFsJ1xuICAgIHwgJ3NlYXJjaCcgPSAnbm9uZSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBdXRvY29tcGxldGUgYmVoYXZpb3IgZm9yIHRoZSBmaWVsZC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXRoZXIgYW5kIGhvdyB0aGUgYnJvd3NlciBzaG91bGQgYXV0b21hdGljYWxseSBjb21wbGV0ZSB0aGUgaW5wdXQuXG4gICAqIFRoaXMgY2FuIGltcHJvdmUgdXNlciBleHBlcmllbmNlIGJ5IHN1Z2dlc3RpbmcgcHJldmlvdXNseSBlbnRlcmVkIHZhbHVlcy5cbiAgICpcbiAgICogQHR5cGUge0F1dG9jb21wbGV0ZVR5cGVzfVxuICAgKiBAZGVmYXVsdCAnb2ZmJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBhdXRvY29tcGxldGU6IEF1dG9jb21wbGV0ZVR5cGVzID0gJ29mZic7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaWxsIHN0eWxlIGZvciB0aGUgZmllbGQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGZpbGwgc3R5bGUgb2YgdGhlIGZpZWxkLCBzdWNoIGFzICdvdXRsaW5lJyBvciAnc29saWQnLlxuICAgKiBUaGlzIGFmZmVjdHMgdGhlIGJvcmRlciBhbmQgYmFja2dyb3VuZCBvZiB0aGUgZmllbGQuXG4gICAqXG4gICAqIEB0eXBlIHsnb3V0bGluZScgfCAnc29saWQnfVxuICAgKiBAZGVmYXVsdCAnb3V0bGluZSdcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZmlsbDogJ291dGxpbmUnIHwgJ3NvbGlkJyA9ICdvdXRsaW5lJztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBsYWNlbWVudCBvZiB0aGUgbGFiZWwgcmVsYXRpdmUgdG8gdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgd2hlcmUgdGhlIGxhYmVsIHNob3VsZCBiZSBwbGFjZWQgcmVsYXRpdmUgdG8gdGhlIGZpZWxkLlxuICAgKiBPcHRpb25zIGluY2x1ZGUgJ3N0YXJ0JywgJ2VuZCcsICdmbG9hdGluZycsICdzdGFja2VkJywgYW5kICdmaXhlZCcuXG4gICAqXG4gICAqIEB0eXBlIHsnc3RhcnQnIHwgJ2VuZCcgfCAnZmxvYXRpbmcnIHwgJ3N0YWNrZWQnIHwgJ2ZpeGVkJ31cbiAgICogQGRlZmF1bHQgJ2Zsb2F0aW5nJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsYWJlbFBsYWNlbWVudDogJ3N0YXJ0JyB8ICdlbmQnIHwgJ2Zsb2F0aW5nJyB8ICdzdGFja2VkJyB8ICdmaXhlZCcgPVxuICAgICdmbG9hdGluZyc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgbW9kZSBmb3IgdGhlIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZW4gdGhlIGZpZWxkIHZhbHVlIHNob3VsZCBiZSB1cGRhdGVkIGluIHRoZSBmb3JtIG1vZGVsLlxuICAgKiBPcHRpb25zIGluY2x1ZGUgJ2NoYW5nZScsICdibHVyJywgYW5kICdzdWJtaXQnLlxuICAgKlxuICAgKiBAdHlwZSB7RmllbGRVcGRhdGVNb2RlfVxuICAgKiBAZGVmYXVsdCAnY2hhbmdlJ1xuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICB1cGRhdGVPbjogRmllbGRVcGRhdGVNb2RlID0gJ2NoYW5nZSc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGNvbXBvbmVudCBlbGVtZW50LCBhbGxvd2luZyBkaXJlY3QgYWNjZXNzIHRvIGl0cyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxuICAgKlxuICAgKiBAdHlwZSB7RWxlbWVudFJlZn1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29tcG9uZW50JywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gIG92ZXJyaWRlIGNvbXBvbmVudCE6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJlbnQgZm9ybSBncm91cC5cbiAgICogQHN1bW1hcnkgUmVmZXJlbmNlcyB0aGUgcGFyZW50IGZvcm0gZ3JvdXAgdG8gd2hpY2ggdGhpcyBmaWVsZCBiZWxvbmdzLlxuICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgaW50ZWdyYXRpbmcgdGhlIGZpZWxkIHdpdGggQW5ndWxhcidzIHJlYWN0aXZlIGZvcm1zLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUdyb3VwfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBvdmVycmlkZSBmb3JtR3JvdXA6IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQW5ndWxhciBGb3JtQ29udHJvbCBpbnN0YW5jZSBmb3IgdGhpcyBmaWVsZC5cbiAgICogQHN1bW1hcnkgVGhlIHNwZWNpZmljIEZvcm1Db250cm9sIGluc3RhbmNlIHRoYXQgbWFuYWdlcyB0aGlzIGZpZWxkJ3Mgc3RhdGUsIHZhbGlkYXRpb24sXG4gICAqIGFuZCB2YWx1ZS4gVGhpcyBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHRvIEFuZ3VsYXIncyByZWFjdGl2ZSBmb3JtcyBmdW5jdGlvbmFsaXR5XG4gICAqIGZvciB0aGlzIGluZGl2aWR1YWwgZmllbGQgd2l0aGluIHRoZSBicm9hZGVyIGZvcm0gc3RydWN0dXJlLlxuICAgKlxuICAgKiBAdHlwZSB7Rm9ybUNvbnRyb2x9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIGZvcm1Db250cm9sITogRm9ybUNvbnRyb2w7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgaWYgdGhpcyBmaWVsZCBzdXBwb3J0cyBtdWx0aXBsZSB2YWx1ZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBjYW4gaGFuZGxlIG11bHRpcGxlIHZhbHVlcywgdHlwaWNhbGx5IHVzZWQgaW5cbiAgICogbXVsdGktc2VsZWN0IHNjZW5hcmlvcyBvciB3aGVuIHRoZSBmaWVsZCBpcyBwYXJ0IG9mIGEgZm9ybSBhcnJheSBzdHJ1Y3R1cmVcbiAgICogdGhhdCBhbGxvd3MgbXVsdGlwbGUgZW50cmllcyBvZiB0aGUgc2FtZSBmaWVsZCB0eXBlLlxuICAgKlxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY3VycmVudCByZWNvcmQuXG4gICAqIEBzdW1tYXJ5IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHJlY29yZCBiZWluZyBkaXNwbGF5ZWQgb3IgbWFuaXB1bGF0ZWQuXG4gICAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJpbWFyeSBrZXkgZm9yIG9wZXJhdGlvbnMgb24gc3BlY2lmaWMgcmVjb3Jkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IG51bWJlcn1cbiAgICovXG4gIEBJbnB1dCgpXG4gIG92ZXJyaWRlIHVpZDogc3RyaW5nID0gZ2VuZXJhdGVSYW5kb21WYWx1ZSgxMik7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0YWJpbGl0eSBvZiBmaWVsZCBsYWJlbHMuXG4gICAqIEBzdW1tYXJ5IEluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBsYWJlbHMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbGFuZ3VhZ2Ugc2V0dGluZ3MuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBhcHBsaWNhdGlvbnMgc3VwcG9ydGluZyBtdWx0aXBsZSBsYW5ndWFnZXMuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZvcm0gZ3JvdXAgaW4gYSBmb3JtIGFycmF5LlxuICAgKiBAc3VtbWFyeSBXaGVuIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBmb3JtIGdyb3VwcyAoZm9ybSBhcnJheXMpLCB0aGlzIGluZGljYXRlc1xuICAgKiB3aGljaCBmb3JtIGdyb3VwIGlzIGN1cnJlbnRseSBhY3RpdmUgb3IgYmVpbmcgZWRpdGVkLiBUaGlzIGlzIHVzZWQgdG8gbWFuYWdlXG4gICAqIGZvY3VzIGFuZCBkYXRhIGJpbmRpbmcgaW4gbXVsdGktZW50cnkgc2NlbmFyaW9zLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAwXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGFjdGl2ZUZvcm1Hcm91cDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZvcm1BcnJheSBjb250YWluaW5nIG11bHRpcGxlIGZvcm0gZ3JvdXBzIGZvciB0aGlzIGZpZWxkLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRoaXMgZmllbGQgaXMgcGFydCBvZiBhIG11bHRpLWVudHJ5IHN0cnVjdHVyZSwgdGhpcyBGb3JtQXJyYXlcbiAgICogY29udGFpbnMgYWxsIHRoZSBmb3JtIGdyb3Vwcy4gVGhpcyBlbmFibGVzIG1hbmFnZW1lbnQgb2YgbXVsdGlwbGUgaW5zdGFuY2VzXG4gICAqIG9mIHRoZSBzYW1lIGZpZWxkIHN0cnVjdHVyZSB3aXRoaW4gYSBzaW5nbGUgZm9ybS5cbiAgICpcbiAgICogQHR5cGUge0Zvcm1BcnJheX1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgZm9ybUdyb3VwQXJyYXkhOiBGb3JtQXJyYXk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmltYXJ5IGtleSBmaWVsZCBuYW1lIGZvciB1bmlxdWVuZXNzIHZhbGlkYXRpb24uXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgZmllbGQgbmFtZSB0aGF0IHNlcnZlcyBhcyB0aGUgcHJpbWFyeSBrZXkgZm9yIHVuaXF1ZW5lc3NcbiAgICogdmFsaWRhdGlvbiB3aXRoaW4gZm9ybSBhcnJheXMuIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBlbnRyaWVzXG4gICAqIGFuZCBlbnN1cmUgZGF0YSBpbnRlZ3JpdHkgaW4gbXVsdGktZW50cnkgZm9ybXMuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHBrITogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGZvcm0gZ3JvdXAgYmFzZWQgb24gY29udGV4dC5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgRm9ybUdyb3VwIGJhc2VkIG9uIHdoZXRoZXIgdGhpcyBmaWVsZCBzdXBwb3J0c1xuICAgKiBtdWx0aXBsZSB2YWx1ZXMuIEZvciBzaW5nbGUtdmFsdWUgZmllbGRzLCByZXR1cm5zIHRoZSBtYWluIGZvcm0gZ3JvdXAuXG4gICAqIEZvciBtdWx0aS12YWx1ZSBmaWVsZHMsIHJldHVybnMgdGhlIGZvcm0gZ3JvdXAgYXQgdGhlIGFjdGl2ZSBpbmRleCBmcm9tIHRoZSBwYXJlbnQgRm9ybUFycmF5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Rm9ybUdyb3VwfSBUaGUgY3VycmVudGx5IGFjdGl2ZSBGb3JtR3JvdXAgZm9yIHRoaXMgZmllbGRcbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgZ2V0IGdldEFjdGl2ZUZvcm1Hcm91cCgpOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cDtcbiAgICByZXR1cm4gdGhpcy5tdWx0aXBsZVxuICAgICAgPyAoKGZvcm1Hcm91cC5wYXJlbnQgYXMgRm9ybUFycmF5KT8uYXQodGhpcy5hY3RpdmVGb3JtR3JvdXApIGFzIEZvcm1Hcm91cClcbiAgICAgIDogZm9ybUdyb3VwO1xuXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2Ygb3B0aW9ucyBmb3Igc2VsZWN0IG9yIHJhZGlvIGlucHV0cywgd2l0aCB0aGVpciBgdGV4dGAgcHJvcGVydHlcbiAgICogbG9jYWxpemVkIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgaW5jbHVkZSB0aGUgd29yZCAnb3B0aW9ucycuIFRoZSBsb2NhbGl6YXRpb24ga2V5XG4gICAqIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBjb21wb25lbnQncyBsYWJlbCwgcmVwbGFjaW5nICdsYWJlbCcgd2l0aCAnb3B0aW9ucycuXG4gICAqXG4gICAqIEByZXR1cm5zIHtDcnVkRmllbGRPcHRpb25bXX0gVGhlIGFycmF5IG9mIHBhcnNlZCBhbmQgbG9jYWxpemVkIG9wdGlvbnMuXG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIGdldCBwYXJzZWRPcHRpb25zKCk6IENydWRGaWVsZE9wdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb24sXG4gICAgICAgIHRleHQ6ICFvcHRpb24udGV4dC5pbmNsdWRlcygnb3B0aW9ucycpID9cbiAgICAgICAgICBnZXRMb2NhbGVDb250ZXh0QnlLZXkoYCR7dGhpcy5sYWJlbC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ2xhYmVsJywgJ29wdGlvbnMnKX1gLCBvcHRpb24udGV4dCkgOiBvcHRpb24udGV4dFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGluaXRpYWxpemF0aW9uIGxpZmVjeWNsZSBtZXRob2QuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBmaWVsZCBjb21wb25lbnQgYmFzZWQgb24gdGhlIG9wZXJhdGlvbiB0eXBlIGFuZCBmaWVsZCBjb25maWd1cmF0aW9uLlxuICAgKiBGb3IgUkVBRCBhbmQgREVMRVRFIG9wZXJhdGlvbnMsIHJlbW92ZXMgdGhlIGZvcm0gZ3JvdXAgdG8gbWFrZSBmaWVsZHMgcmVhZC1vbmx5LlxuICAgKiBGb3Igb3RoZXIgb3BlcmF0aW9ucywgc2V0cyB1cCBpY29ucywgY29uZmlndXJlcyBtdWx0aS12YWx1ZSBzdXBwb3J0IGlmIG5lZWRlZCxcbiAgICogYW5kIHNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIHJhZGlvIGJ1dHRvbnMgaWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgQ3J1ZEZpZWxkQ29tcG9uZW50XG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLm9wdGlvbnM/Lmxlbmd0aClcbiAgICAgIHRoaXMub3B0aW9ucyA9IHRoaXMucGFyc2VkT3B0aW9ucztcbiAgICBpZiAoW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSkge1xuICAgICAgdGhpcy5mb3JtR3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEljb25zKHtjaGV2cm9uRG93bk91dGxpbmUsIGNoZXZyb25VcE91dGxpbmV9KVxuICAgICAgaWYodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuZ2V0QWN0aXZlRm9ybUdyb3VwIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXBBcnJheSA9IHRoaXMuZm9ybUdyb3VwLnBhcmVudCBhcyBGb3JtQXJyYXk7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wgPSAodGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwKS5nZXQodGhpcy5uYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnR5cGUgPT09IEhUTUw1SW5wdXRUeXBlcy5SQURJTyAmJiAhdGhpcy52YWx1ZSlcbiAgICAgICAgdGhpcy5mb3JtR3JvdXA/LmdldCh0aGlzLm5hbWUpPy5zZXRWYWx1ZSh0aGlzLm9wdGlvbnNbMF0udmFsdWUpOyAvLyBUT0RPOiBtaWdyYXRlIHRvIFJlbmRlcmluZ0VuZ2luZVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnQgYWZ0ZXIgdmlldyBpbml0aWFsaXphdGlvbiBsaWZlY3ljbGUgbWV0aG9kLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGFmdGVyVmlld0luaXQgbWV0aG9kIGZvciBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucy5cbiAgICogVGhpcyBlbnN1cmVzIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiByZWFkLW9ubHkgZmllbGRzIHRoYXQgZG9uJ3QgcmVxdWlyZVxuICAgKiBmb3JtIGZ1bmN0aW9uYWxpdHkgYnV0IHN0aWxsIG5lZWQgdmlldyBzZXR1cC5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoW09wZXJhdGlvbktleXMuUkVBRCwgT3BlcmF0aW9uS2V5cy5ERUxFVEVdLmluY2x1ZGVzKHRoaXMub3BlcmF0aW9uKSlcbiAgICAgIHN1cGVyLmFmdGVyVmlld0luaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50IGNsZWFudXAgbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIGZvciBSRUFEIGFuZCBERUxFVEUgb3BlcmF0aW9ucyBieSBjYWxsaW5nXG4gICAqIHRoZSBwYXJlbnQgb25EZXN0cm95IG1ldGhvZC4gVGhpcyBlbnN1cmVzIHByb3BlciByZXNvdXJjZSBjbGVhbnVwIGZvclxuICAgKiByZWFkLW9ubHkgZmllbGQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmIChbT3BlcmF0aW9uS2V5cy5SRUFELCBPcGVyYXRpb25LZXlzLkRFTEVURV0uaW5jbHVkZXModGhpcy5vcGVyYXRpb24pKVxuICAgICAgdGhpcy5vbkRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmaWVsZHNldCBncm91cCBjcmVhdGlvbiBldmVudHMgZnJvbSBwYXJlbnQgZmllbGRzZXRzLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgZXZlbnRzIHRyaWdnZXJlZCB3aGVuIGEgbmV3IGdyb3VwIG5lZWRzIHRvIGJlIGFkZGVkIHRvIGEgZmllbGRzZXQuXG4gICAqIFZhbGlkYXRlcyB0aGUgY3VycmVudCBmb3JtIGdyb3VwLCBjaGVja3MgZm9yIHVuaXF1ZW5lc3MgaWYgYXBwbGljYWJsZSwgYW5kIGVpdGhlclxuICAgKiBjcmVhdGVzIGEgbmV3IGdyb3VwIG9yIHByb3ZpZGVzIHZhbGlkYXRpb24gZmVlZGJhY2suIFVwZGF0ZXMgdGhlIGFjdGl2ZSBmb3JtIGdyb3VwXG4gICAqIGFuZCByZXNldHMgdGhlIGZpZWxkIGZvciBuZXcgaW5wdXQgYWZ0ZXIgc3VjY2Vzc2Z1bCBjcmVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgLSBUaGUgZmllbGRzZXQgY3JlYXRlIGdyb3VwIGV2ZW50IGNvbnRhaW5pbmcgZ3JvdXAgZGV0YWlsc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZpZWxkc2V0QWRkR3JvdXBFdmVudCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUZpZWxkc2V0Q3JlYXRlR3JvdXBFdmVudChldmVudDogQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCB7IHBhcmVudCwgY29tcG9uZW50LCBpbmRleCwgb3BlcmF0aW9uIH0gPSBldmVudC5kZXRhaWw7XG4gICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mb3JtR3JvdXAgYXMgRm9ybUdyb3VwO1xuICAgIGNvbnN0IHBhcmVudEZvcm1Hcm91cCA9IHRoaXMuZm9ybUdyb3VwPy5wYXJlbnQgYXMgRm9ybUFycmF5O1xuICAgIGNvbnN0IGlzVmFsaWQgPSBOZ3hGb3JtU2VydmljZS52YWxpZGF0ZUZpZWxkcyhmb3JtR3JvdXAgYXMgRm9ybUdyb3VwKTtcbiAgICBjb25zdCBpbmRleFRvQ2hlY2sgPSBvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFID9cbiAgICAgIGluZGV4ID09PSAwID8gaW5kZXggOiBwYXJlbnRGb3JtR3JvdXAubGVuZ3RoIC0gMSA6IGluZGV4O1xuXG4gICAgY29uc3QgaXNVbmlxdWUgPSBOZ3hGb3JtU2VydmljZS5pc1VuaXF1ZU9uR3JvdXAoZm9ybUdyb3VwLCBpbmRleFRvQ2hlY2ssIG9wZXJhdGlvbiB8fCBPcGVyYXRpb25LZXlzLkNSRUFURSk7XG4gICAgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoRXZlbnRDb25zdGFudHMuRklFTERTRVRfQUREX0dST1VQLCB7XG4gICAgICBkZXRhaWw6IHtpc1ZhbGlkOiBpc1ZhbGlkICYmIGlzVW5pcXVlLCB2YWx1ZTogZm9ybUdyb3VwLnZhbHVlLCBmb3JtR3JvdXA6IHBhcmVudEZvcm1Hcm91cCwgZm9ybVNlcnZpY2U6IE5neEZvcm1TZXJ2aWNlfSxcbiAgICB9KTtcbiAgICBjb21wb25lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cbiAgICBpZihpc1ZhbGlkICYmIGlzVW5pcXVlKSB7XG4gICAgICBjb25zdCBuZXdJbmRleCA9IHBhcmVudEZvcm1Hcm91cD8ubGVuZ3RoO1xuXG4gICAgICBpZihvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKSB7XG4gICAgICAgIE5neEZvcm1TZXJ2aWNlLmFkZEdyb3VwVG9QYXJlbnQocGFyZW50Rm9ybUdyb3VwPy5wYXJlbnQgYXMgRm9ybUdyb3VwLCBwYXJlbnQsIG5ld0luZGV4KTtcbiAgICAgICAgdGhpcy5hY3RpdmVGb3JtR3JvdXAgPSBuZXdJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlRm9ybUdyb3VwID0gbmV3SW5kZXggLSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmdldEFjdGl2ZUZvcm1Hcm91cDtcbiAgICAgIC8vIE5neEZvcm1TZXJ2aWNlLnJlc2V0KHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sID0gKHRoaXMuZm9ybUdyb3VwIGFzIEZvcm1Hcm91cCkuZ2V0KHRoaXMubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgICAvLyBOZ3hGb3JtU2VydmljZS5yZXNldCh0aGlzLmZvcm1Db250cm9sKTtcbiAgICAgIC8vIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQuc2V0Rm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoaXNVbmlxdWUpXG4gICAgICAgIHRoaXMuY29tcG9uZW50Lm5hdGl2ZUVsZW1lbnQuc2V0Rm9jdXMoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmaWVsZHNldCBncm91cCB1cGRhdGUgZXZlbnRzIGZyb20gcGFyZW50IGZpZWxkc2V0cy5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGV2ZW50cyB0cmlnZ2VyZWQgd2hlbiBhbiBleGlzdGluZyBncm91cCBuZWVkcyB0byBiZSB1cGRhdGVkLlxuICAgKiBVcGRhdGVzIHRoZSBhY3RpdmUgZm9ybSBncm91cCBpbmRleCBhbmQgcmVmcmVzaGVzIHRoZSBmb3JtIGdyb3VwIGFuZCBmb3JtIGNvbnRyb2xcbiAgICogcmVmZXJlbmNlcyB0byBwb2ludCB0byB0aGUgZ3JvdXAgYmVpbmcgZWRpdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBmaWVsZHNldCB1cGRhdGUgZ3JvdXAgZXZlbnQgY29udGFpbmluZyB1cGRhdGUgZGV0YWlsc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICogQG1lbWJlck9mIENydWRGaWVsZENvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZpZWxkc2V0VXBkYXRlR3JvdXBFdmVudCcsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUZpZWxkc2V0VXBkYXRlR3JvdXBFdmVudChldmVudDogQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7aW5kZXh9ID0gZXZlbnQuZGV0YWlsO1xuICAgIHRoaXMuYWN0aXZlRm9ybUdyb3VwID0gaW5kZXg7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmdldEFjdGl2ZUZvcm1Hcm91cDtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZm9ybUNvbnRyb2wudmFsdWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBmaWVsZHNldCBncm91cCByZW1vdmFsIGV2ZW50cyBmcm9tIHBhcmVudCBmaWVsZHNldHMuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBldmVudHMgdHJpZ2dlcmVkIHdoZW4gYSBncm91cCBuZWVkcyB0byBiZSByZW1vdmVkIGZyb20gYSBmaWVsZHNldC5cbiAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGdyb3VwIGZyb20gdGhlIGZvcm0gYXJyYXksIHVwZGF0ZXMgdGhlIGFjdGl2ZSBmb3JtIGdyb3VwIGluZGV4LFxuICAgKiBhbmQgcmVmcmVzaGVzIHRoZSBmb3JtIHJlZmVyZW5jZXMuIERpc3BhdGNoZXMgYSBjb25maXJtYXRpb24gZXZlbnQgYmFjayB0byB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBmaWVsZHNldCByZW1vdmUgZ3JvdXAgZXZlbnQgY29udGFpbmluZyByZW1vdmFsIGRldGFpbHNcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBDcnVkRmllbGRDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpmaWVsZHNldFJlbW92ZUdyb3VwRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVGaWVsZHNldFJlbW92ZUdyb3VwRXZlbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgeyBjb21wb25lbnQsIGluZGV4IH0gPSBldmVudC5kZXRhaWw7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gdGhpcy5mb3JtR3JvdXA/LnBhcmVudCBhcyBGb3JtQXJyYXk7XG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KGluZGV4KTtcbiAgICB0aGlzLmFjdGl2ZUZvcm1Hcm91cCA9IGZvcm1BcnJheS5sZW5ndGggPT09IDEgPyAwIDogZm9ybUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmdldEFjdGl2ZUZvcm1Hcm91cDtcbiAgICB0aGlzLmZvcm1Db250cm9sID0gdGhpcy5mb3JtR3JvdXAuZ2V0KHRoaXMubmFtZSkgYXMgRm9ybUNvbnRyb2w7XG4gICAgdGhpcy5mb3JtR3JvdXBBcnJheSA9IGZvcm1BcnJheVxuICAgIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KEV2ZW50Q29uc3RhbnRzLkZJRUxEU0VUX1JFTU9WRV9HUk9VUCwge1xuICAgICAgZGV0YWlsOiB7dmFsdWU6IHRydWV9LFxuICAgIH0pO1xuICAgIGNvbXBvbmVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfVxufVxuIiwiQGlmKG9wZXJhdGlvbiA9PT0gJ3JlYWQnIHx8IG9wZXJhdGlvbiA9PT0gJ2RlbGV0ZScpIHtcbiAgPG5nLWNvbnRhaW5lciAjY29tcG9uZW50PlxuICAgIDxkaXYgW2NsYXNzXT1cIidkY2YtaW5wdXQtaXRlbSAnICsgb3BlcmF0aW9uXCI+XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAge3sgbGFiZWwgfCB0cmFuc2xhdGUgfX08YnIgLz5cbiAgICAgICAgICBAaWYodmFsdWUpIHtcbiAgICAgICAgICAgIDxpb24tdGV4dCAgW2lubmVySFRNTF09XCJ0eXBlID09PSAncGFzc3dvcmQnID8gJyoqKioqKioqJyA6IHZhbHVlXCI+PC9pb24tdGV4dD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbn0gQGVsc2Uge1xuICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZ2V0QWN0aXZlRm9ybUdyb3VwXCI+XG4gICAgPGRpdiAjY29udGFpbmVyIFtjbGFzc109XCInZGNmLWlucHV0LWl0ZW0gJyArIChvcGVyYXRpb24gfHwgJ2NyZWF0ZScpXCIgKGNyZWF0ZUdyb3VwRXZlbnQpPVwibXVsdGlwbGUgPyBoYW5kbGVGaWVsZHNldENyZWF0ZUdyb3VwRXZlbnQoJGV2ZW50KSA6ICcnXCI+XG4gICAgICAgIEBpZih0eXBlID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgICAgPGlvbi10ZXh0YXJlYVxuICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cImhpZGRlblwiXG4gICAgICAgICAgICBbYXV0b0dyb3ddPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWQgIT09IHVuZGVmaW5lZCA/IHJlcXVpcmVkIDogbnVsbFwiXG4gICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1pbmxlbmd0aCAhPT0gdW5kZWZpbmVkID8gbWlubGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heGxlbmd0aCAhPT0gdW5kZWZpbmVkID8gbWF4bGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgIT09IHVuZGVmaW5lZCA/IHJlYWRvbmx5IDogbnVsbFwiXG4gICAgICAgICAgICBbaW5wdXRtb2RlXT1cImlucHV0bW9kZVwiXG4gICAgICAgICAgICBbc3BlbGxjaGVja109XCJzcGVsbGNoZWNrXCJcbiAgICAgICAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50XT1cImxhYmVsUGxhY2VtZW50XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbZmlsbF09XCJmaWxsXCJcbiAgICAgICAgICAgIFtlcnJvclRleHRdPVwiZ2V0RXJyb3JzKGNvbnRhaW5lcilcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRyYW5zbGF0YWJsZSA/IChwbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSkgOiBwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIm5hbWVcIlxuICAgICAgICAgICAgW2xhYmVsXT1cInRyYW5zbGF0YWJsZSA/IChsYWJlbCB8IHRyYW5zbGF0ZSkgOiBsYWJlbFwiXG4gICAgICAgICAgICNjb21wb25lbnQ+XG4gICAgICAgICAgPC9pb24tdGV4dGFyZWE+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYodHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgIDxpb24taXRlbT5cbiAgICAgICAgICAgIDxpb24tY2hlY2tib3hcbiAgICAgICAgICAgICAgI2NoZWNrYm94RWxlbWVudFxuXG4gICAgICAgICAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgICAgICAgICBbZXJyb3JUZXh0XT1cImdldEVycm9ycyhjb250YWluZXIpXCJcbiAgICAgICAgICAgICAgW2hpZGRlbl09XCJoaWRkZW5cIlxuICAgICAgICAgICAgICBbbGFiZWxQbGFjZW1lbnRdPVwibGFiZWxQbGFjZW1lbnRcIlxuICAgICAgICAgICAgICBbanVzdGlmeV09XCJqdXN0aWZ5XCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiY2hlY2tlZFwiXG4gICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgIChpb25DaGFuZ2UpPVwiY2hlY2tlZCA9ICFjaGVja2VkXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAjY29tcG9uZW50PlxuICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIVE1MXT1cImxhYmVsIHwgdHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9pb24tY2hlY2tib3g+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSBpZih0eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgPGlvbi1yYWRpby1ncm91cCBbZm9ybUNvbnRyb2xOYW1lXT1cIm5hbWVcIiBbdmFsdWVdPVwidmFsdWVcIiAjY29tcG9uZW50PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZGNmLXJhZGlvLWdyb3VwLWxhYmVsXCIgW2Zvcl09XCJwYXRoXCI+e3tsYWJlbCB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIEBmb3Iob3B0aW9uIG9mIG9wdGlvbnM7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgICAgICA8aW9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgPGlvbi1yYWRpb1xuICAgICAgICAgICAgICAgICAgW2Vycm9yVGV4dF09XCJnZXRFcnJvcnMoY29udGFpbmVyKVwiXG4gICAgICAgICAgICAgICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgICAgICAgICAgICAgIFtoaWRkZW5dPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbFBsYWNlbWVudF09XCJsYWJlbFBsYWNlbWVudFwiXG4gICAgICAgICAgICAgICAgICBbYWxpZ25tZW50XT1cImFsaWdubWVudFwiXG4gICAgICAgICAgICAgICAgICBbanVzdGlmeV09XCJqdXN0aWZ5XCJcbiAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCJcbiAgICAgICAgICAgICAgICA+e3sgdHJhbnNsYXRhYmxlID8gIChvcHRpb24/LnRleHQgfCB0cmFuc2xhdGUpIDogb3B0aW9uPy50ZXh0IH19PC9pb24tcmFkaW8+XG4gICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9pb24tcmFkaW8tZ3JvdXA+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIDxpb24tc2VsZWN0XG4gICAgICAgICAgICAgIHRvZ2dsZUljb249XCJjaGV2cm9uLWRvd24tb3V0bGluZVwiXG4gICAgICAgICAgICAgIGV4cGFuZGVkSWNvbj1cImNoZXZyb24tdXAtb3V0bGluZVwiXG5cbiAgICAgICAgICAgICAgW21vZGVdPVwibW9kZVwiXG4gICAgICAgICAgICAgIFtoaWRkZW5dPVwiaGlkZGVuXCJcbiAgICAgICAgICAgICAgW2xhYmVsUGxhY2VtZW50XT1cImxhYmVsUGxhY2VtZW50XCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cInRyYW5zbGF0YWJsZSA/IChsYWJlbCB8IHRyYW5zbGF0ZSkgOiBsYWJlbFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgIFtmaWxsXT1cImZpbGxcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRhYmxlID8gKHBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlKSA6IHBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJuYW1lXCJcbiAgICAgICAgICAgICAgW2Vycm9yVGV4dF09XCJnZXRFcnJvcnMoY29udGFpbmVyKVwiXG4gICAgICAgICAgICAgIFtpbnRlcmZhY2VdPVwiaW50ZXJmYWNlXCIgICNjb21wb25lbnQ+XG4gICAgICAgICAgICAgIEBmb3Iob3B0aW9uIG9mIG9wdGlvbnM7IHRyYWNrIG9wdGlvbi52YWx1ZSkge1xuICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24udGV4dCB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICBbbW9kZV09XCJtb2RlXCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiaGlkZGVuXCJcbiAgICAgICAgICAgIFtpbnB1dG1vZGVdPVwiaW5wdXRtb2RlXCJcbiAgICAgICAgICAgIFtsYWJlbFBsYWNlbWVudF09XCJsYWJlbFBsYWNlbWVudFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWQgIT09IHVuZGVmaW5lZCA/IHJlcXVpcmVkIDogZmFsc2VcIlxuICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGggIT09IHVuZGVmaW5lZCA/IG1pbmxlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGggIT09IHVuZGVmaW5lZCA/IG1heGxlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5ICE9PSB1bmRlZmluZWQgPyByZWFkb25seSA6IG51bGxcIlxuICAgICAgICAgICAgW21heF09XCJtYXggIT09IHVuZGVmaW5lZCA/IG1heCA6IG51bGxcIlxuICAgICAgICAgICAgW21pbl09XCJtaW4gIT09IHVuZGVmaW5lZCA/IG1pbiA6IG51bGxcIlxuICAgICAgICAgICAgW3BhdHRlcm5dPVwicGF0dGVybiAhPT0gdW5kZWZpbmVkID8gcGF0dGVybiA6IG51bGxcIlxuICAgICAgICAgICAgW3N0ZXBdPVwic3RlcCAhPT0gdW5kZWZpbmVkID8gc3RlcCA6IG51bGxcIlxuICAgICAgICAgICAgW2ZpbGxdPVwiZmlsbFwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidHJhbnNsYXRhYmxlID8gKHBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlKSA6IHBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICBbZXJyb3JUZXh0XT1cImdldEVycm9ycyhjb250YWluZXIpXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJ0cmFuc2xhdGFibGUgPyAobGFiZWwgfCB0cmFuc2xhdGUpIDogbGFiZWxcIiAjY29tcG9uZW50IC8+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG59XG5cbiJdfQ==
|