com.phloxui
Version:
PhloxUI Ng2+ Framework
506 lines (505 loc) • 38.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../../../share/CustomEventType';
import { NeedFocusService } from '../../../service/NeedFocusService.service';
import { AbstractSelectOneItem } from './AbstractSelectOneItem';
import { UUIDUtils } from '../../../share/utils/UUIDUtils';
import { Option } from '../../../decorator/Option.decorator';
import { EventUtils } from '../../../share/utils/EventUtils';
import { I18N } from '../../../decorator/decorators';
const /** @type {?} */ TYPE_NAME = "phx-simple-radio-btns";
export class SimpleRadioButtons extends AbstractSelectOneItem {
/**
* @param {?} elementRef
* @param {?} needFocusService
*/
constructor(elementRef, needFocusService) {
super(elementRef, needFocusService);
this.DEFAULT_GROUP_NAME = "DEFAULT_SIMPLE_RADIO";
this.clickEvent = new EventEmitter();
this.beforeClickEvent = new EventEmitter();
this.changeEvent = new EventEmitter();
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
if (this.name === null || typeof this.name === 'undefined') {
this.name = this.DEFAULT_GROUP_NAME + "_" + UUIDUtils.generateUUID();
}
}
/**
* @param {?} item
* @return {?}
*/
isChecked(item) {
if (item !== null && typeof item !== 'undefined') {
let /** @type {?} */ sItem = this.getSelectedItem();
return (sItem === item);
}
return false;
}
/**
* @param {?} $event
* @param {?} index
* @param {?=} fireEvent
* @return {?}
*/
onRadioBtnClicked($event, index, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
$event.preventDefault();
if (this.isReadOnly()) {
return;
}
if (this.isDisabled()) {
return;
}
let /** @type {?} */ oldIndex = this.getSelectedIndex();
let /** @type {?} */ newIndex = index;
EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => {
// doEvent
this.setSelectedIndex(newIndex);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeClickEvent(oldIndex, newIndex, $event);
}, ($event, result) => {
// emitAfterEvent
this.emitClickEvent(oldIndex, newIndex, $event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?} oldIndex
* @param {?} newIndex
* @param {?=} $event
* @return {?}
*/
emitBeforeClickEvent(oldIndex, newIndex, $event) {
let /** @type {?} */ eventData = {
item: this.getItemAtIndex(newIndex),
index: newIndex,
oldItem: this.getItemAtIndex(oldIndex),
oldIndex: oldIndex
};
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) {
this.beforeClickEvent.emit(ev);
}
}
/**
* @param {?} oldIndex
* @param {?} newIndex
* @param {?=} $event
* @return {?}
*/
emitClickEvent(oldIndex, newIndex, $event) {
let /** @type {?} */ eventData = {
item: this.getItemAtIndex(newIndex),
index: newIndex,
oldItem: this.getItemAtIndex(oldIndex),
oldIndex: oldIndex
};
// emit event
let /** @type {?} */ data = eventData;
let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
if (this.clickEvent !== null && this.clickEvent !== undefined) {
this.clickEvent.emit(ev);
}
}
/**
* @return {?}
*/
getDescription() {
return this.description;
}
/**
* @param {?} description
* @return {?}
*/
setDescription(description) {
this.description = description;
}
/**
* @return {?}
*/
hasDescription() {
if (this.description !== null && typeof this.description === 'string' && this.description !== '') {
return true;
}
return false;
}
/**
* @param {?} inputValue
* @param {?} results
* @return {?}
*/
onValidationEnd(inputValue, results) {
//! do sthing
}
/**
* @param {?} data
* @param {?} inputVal
* @return {?}
*/
onDataChange(data, inputVal) {
}
/**
* @param {?} $event
* @return {?}
*/
doFocus($event) {
}
/**
* @param {?} $event
* @return {?}
*/
doLostFocus($event) {
}
/**
* @return {?}
*/
getClickedEvent() {
return this.clickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setClickedEvent(event) {
this.clickEvent = event;
}
/**
* @return {?}
*/
getBeforeClickedEvent() {
return this.beforeClickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeClickedEvent(event) {
this.beforeClickEvent = event;
}
/**
* @return {?}
*/
getName() {
return this.name;
}
/**
* @return {?}
*/
getItems() {
return this.items;
}
}
SimpleRadioButtons.TYPE_NAME = TYPE_NAME;
SimpleRadioButtons.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-simple-radio-btns">
<div class="radio-group">
<div class="radio" *ngFor="let item of getItems(); let i = index;"
(click)="onRadioBtnClicked($event, i)">
<!-- <button class="fake">
</button> -->
<!-- <input type="radio" name="{{getName()}}" [checked]="isChecked(item)" [disabled]="isDisabled()" > -->
<input type="button" name="{{getName()}}" [class._selected]="getSelectedIndex() === i" [disabled]="isDisabled()">
<label>
{{item.label}}
</label>
</div>
</div>
<br />
<br />
<div class="validation" [style.display]="getValidationResultMessage() ? undefined : 'none'" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()">
<ng-template [ngIf]="getValidationResultMessage()" [ngIfElse]="validation_else">
{{getValidationResultMessage() | phx_text}}
</ng-template>
<ng-template #validation_else>
<!-- We've to put whitespace if there is no validation msg to prevent empty dom -->
<!-- since if validate msg's <div> dom is empty, the component positioning -->
<!-- will be misplaced. -->
{{ ' ' }}
</ng-template>
</div>
<div class="description" [style.display]="getValidationResultMessage() ? 'none' : undefined" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()">
<ng-template [ngIf]="getDescription()" [ngIfElse]="description_else">
{{ getDescription() | phx_text }}
</ng-template>
<ng-template #description_else>
<!-- We've to put whitespace if there is no description to prevent empty dom -->
<!-- since if description's <div> dom is empty, the component positioning -->
<!-- will be misplaced. -->
{{ ' ' }}
</ng-template>
</div>
</div>
`
},] },
];
/** @nocollapse */
SimpleRadioButtons.ctorParameters = () => [
{ type: ElementRef, },
{ type: NeedFocusService, },
];
SimpleRadioButtons.propDecorators = {
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"field": [{ type: Input },],
"name": [{ type: Input },],
"typeOfData": [{ type: Input },],
"readOnly": [{ type: Input },],
"help": [{ type: Input },],
"dataComparator": [{ type: Input, args: ['comparator',] },],
"items": [{ type: Input },],
"description": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },],
"endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },],
"beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },],
"focusEvent": [{ type: Output, args: ['phxFocus',] },],
"beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },],
"lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeSelectEvent": [{ type: Output, args: ['phxBeforeSelect',] },],
"selectEvent": [{ type: Output, args: ['phxSelect',] },],
"beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },],
"clickEvent": [{ type: Output, args: ['phxClick',] },],
};
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], SimpleRadioButtons.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], SimpleRadioButtons.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], SimpleRadioButtons.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], SimpleRadioButtons.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], SimpleRadioButtons.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], SimpleRadioButtons.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], SimpleRadioButtons.prototype, "name", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], SimpleRadioButtons.prototype, "typeOfData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], SimpleRadioButtons.prototype, "readOnly", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], SimpleRadioButtons.prototype, "help", void 0);
tslib_1.__decorate([
Option('comparator'),
tslib_1.__metadata("design:type", Object)
], SimpleRadioButtons.prototype, "dataComparator", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Array)
], SimpleRadioButtons.prototype, "items", void 0);
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", String)
], SimpleRadioButtons.prototype, "description", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('startValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "startValidateEvent", void 0);
tslib_1.__decorate([
Option('endValidate'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "endValidateEvent", void 0);
tslib_1.__decorate([
Option('beforeFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "beforeFocusEvent", void 0);
tslib_1.__decorate([
Option('focus'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "focusEvent", void 0);
tslib_1.__decorate([
Option('beforeLostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "beforeLostFocusEvent", void 0);
tslib_1.__decorate([
Option('lostFocus'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "lostFocusEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "beforeChangeEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeSelect'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "beforeSelectEvent", void 0);
tslib_1.__decorate([
Option('select'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "selectEvent", void 0);
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], SimpleRadioButtons.prototype, "clickEvent", void 0);
function SimpleRadioButtons_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
SimpleRadioButtons.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
SimpleRadioButtons.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
SimpleRadioButtons.propDecorators;
/** @type {?} */
SimpleRadioButtons.TYPE_NAME;
/** @type {?} */
SimpleRadioButtons.prototype.DEFAULT_GROUP_NAME;
/** @type {?} */
SimpleRadioButtons.prototype.dataParent;
/** @type {?} */
SimpleRadioButtons.prototype.ignoreParentData;
/** @type {?} */
SimpleRadioButtons.prototype.data;
/** @type {?} */
SimpleRadioButtons.prototype.ignoreParentDisabled;
/** @type {?} */
SimpleRadioButtons.prototype.delegateHistory;
/** @type {?} */
SimpleRadioButtons.prototype.onDisabled;
/** @type {?} */
SimpleRadioButtons.prototype.onEnabled;
/** @type {?} */
SimpleRadioButtons.prototype.loadingEnabled;
/** @type {?} */
SimpleRadioButtons.prototype.i18nKey;
/** @type {?} */
SimpleRadioButtons.prototype.bypass;
/** @type {?} */
SimpleRadioButtons.prototype.options;
/** @type {?} */
SimpleRadioButtons.prototype.disabled;
/** @type {?} */
SimpleRadioButtons.prototype.field;
/** @type {?} */
SimpleRadioButtons.prototype.name;
/** @type {?} */
SimpleRadioButtons.prototype.typeOfData;
/** @type {?} */
SimpleRadioButtons.prototype.readOnly;
/** @type {?} */
SimpleRadioButtons.prototype.help;
/** @type {?} */
SimpleRadioButtons.prototype.dataComparator;
/** @type {?} */
SimpleRadioButtons.prototype.items;
/** @type {?} */
SimpleRadioButtons.prototype.description;
/** @type {?} */
SimpleRadioButtons.prototype.loadEvent;
/** @type {?} */
SimpleRadioButtons.prototype.startValidateEvent;
/** @type {?} */
SimpleRadioButtons.prototype.endValidateEvent;
/** @type {?} */
SimpleRadioButtons.prototype.beforeFocusEvent;
/** @type {?} */
SimpleRadioButtons.prototype.focusEvent;
/** @type {?} */
SimpleRadioButtons.prototype.beforeLostFocusEvent;
/** @type {?} */
SimpleRadioButtons.prototype.lostFocusEvent;
/** @type {?} */
SimpleRadioButtons.prototype.beforeChangeEvent;
/** @type {?} */
SimpleRadioButtons.prototype.changeEvent;
/** @type {?} */
SimpleRadioButtons.prototype.beforeSelectEvent;
/** @type {?} */
SimpleRadioButtons.prototype.selectEvent;
/** @type {?} */
SimpleRadioButtons.prototype.beforeClickEvent;
/** @type {?} */
SimpleRadioButtons.prototype.clickEvent;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ltcGxlUmFkaW9CdXR0b25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9TaW1wbGVSYWRpb0J1dHRvbnMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUkzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlyRCx1QkFBTSxTQUFTLEdBQVcsdUJBQXVCLENBQUM7QUE2Q2xELE1BQU0seUJBQTBCLFNBQVEscUJBQXFCOzs7OztJQTJIM0QsWUFBWSxVQUFzQixFQUFFLGdCQUFrQztRQUNwRSxLQUFLLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7a0NBeEhELHNCQUFzQjtRQTBIekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztLQUN2Qzs7OztJQUVNLFFB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LENBQUM7c0NBQ00sWUFBWTs7O0lBR2xDLE1BQU0sQ0FBQyxjQUFjLENBQUM7c0NBQ00sWUFBWTs7O0lBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWTs7O0lBS2xDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBRU0sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENMSUNLX0VWRU5ULCBCRUZPUkVfQ0xJQ0tfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RTZWxlY3RPbmVJdGVtIH0gZnJvbSAnLi9BYnN0cmFjdFNlbGVjdE9uZUl0ZW0nO1xuaW1wb3J0IHsgVVVJRFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvdXRpbHMvVVVJRFV0aWxzJztcbmltcG9ydCB7IERlZmF1bHRTZWxlY3RJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9EZWZhdWx0U2VsZWN0SXRlbU1vZGVsJztcbmltcG9ydCB7IElTZWxlY3RJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9JU2VsZWN0SXRlbU1vZGVsJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9WYWxpZGF0aW9uUmVzdWx0JztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7IElEYXRhQ29tcGFyYXRvciB9IGZyb20gJy4uLy4uL0lEYXRhQ29tcGFyYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL2RlY29yYXRvcnMnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtc2ltcGxlLXJhZGlvLWJ0bnNcIjtcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1zaW1wbGUtcmFkaW8tYnRuc1wiPlxuXHQ8ZGl2IGNsYXNzPVwicmFkaW8tZ3JvdXBcIj5cblx0XHQ8ZGl2IGNsYXNzPVwicmFkaW9cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRJdGVtcygpOyBsZXQgaSA9IGluZGV4O1wiXG5cdFx0XHQoY2xpY2spPVwib25SYWRpb0J0bkNsaWNrZWQoJGV2ZW50LCBpKVwiPlxuXHRcdFx0PCEtLSA8YnV0dG9uIGNsYXNzPVwiZmFrZVwiPlxuXHRcdFx0PC9idXR0b24+IC0tPlxuXHRcdFx0PCEtLSA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInt7Z2V0TmFtZSgpfX1cIiBbY2hlY2tlZF09XCJpc0NoZWNrZWQoaXRlbSlcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgPiAtLT5cblx0XHRcdDxpbnB1dCB0eXBlPVwiYnV0dG9uXCIgbmFtZT1cInt7Z2V0TmFtZSgpfX1cIiBbY2xhc3MuX3NlbGVjdGVkXT1cImdldFNlbGVjdGVkSW5kZXgoKSA9PT0gaVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIj5cblx0XHRcdDxsYWJlbD5cblx0XHRcdFx0e3tpdGVtLmxhYmVsfX1cblx0XHRcdDwvbGFiZWw+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHQ8YnIgLz5cblx0PGJyIC8+XG5cdDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/IHVuZGVmaW5lZCA6ICdub25lJ1wiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cblx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKVwiIFtuZ0lmRWxzZV09XCJ2YWxpZGF0aW9uX2Vsc2VcIj5cblx0XHRcdHt7Z2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSB8IHBoeF90ZXh0fX1cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDxuZy10ZW1wbGF0ZSAjdmFsaWRhdGlvbl9lbHNlPlxuXHRcdFx0PCEtLSBXZSd2ZSB0byBwdXQgd2hpdGVzcGFjZSBpZiB0aGVyZSBpcyBubyB2YWxpZGF0aW9uIG1zZyB0byBwcmV2ZW50IGVtcHR5IGRvbSAtLT5cblx0XHRcdDwhLS0gc2luY2UgaWYgdmFsaWRhdGUgbXNnJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxuXHRcdFx0PCEtLSB3aWxsIGJlIG1pc3BsYWNlZC4gLS0+XG5cdFx0XHR7eyAnJm5ic3A7JyB9fVxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiZGVzY3JpcHRpb25cIiBbc3R5bGUuZGlzcGxheV09XCJnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpID8gJ25vbmUnIDogdW5kZWZpbmVkXCIgW2NsYXNzLm5vcm1hbF09XCJpc05vcm1hbCgpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3MoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLndhcm5pbmddPVwiaXNXYXJuaW5nKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5lcnJvcl09XCJpc0Vycm9yKCkgJiYgIWlzRGlzYWJsZWQoKVwiPlxuXHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXREZXNjcmlwdGlvbigpXCIgW25nSWZFbHNlXT1cImRlc2NyaXB0aW9uX2Vsc2VcIj5cblx0XHRcdHt7IGdldERlc2NyaXB0aW9uKCkgfCBwaHhfdGV4dCB9fVxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbl9lbHNlPlxuXHRcdFx0PCEtLSBXZSd2ZSB0byBwdXQgd2hpdGVzcGFjZSBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbiB0byBwcmV2ZW50IGVtcHR5IGRvbSAtLT5cblx0XHRcdDwhLS0gc2luY2UgaWYgZGVzY3JpcHRpb24ncyA8ZGl2PiBkb20gaXMgZW1wdHksIHRoZSBjb21wb25lbnQgcG9zaXRpb25pbmcgLS0+XG5cdFx0XHQ8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cblx0XHRcdHt7ICcmbmJzcDsnIH19XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgU2ltcGxlUmFkaW9CdXR0b25zIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RPbmVJdGVtIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgREVGQVVMVF9HUk9VUF9OQU1FOiBzdHJpbmcgPSBcIkRFRkFVTFRfU0lNUExFX1JBRElPXCI7XG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcbiAgQElucHV0KCdpMThuQnlwYXNzJylcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBuYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgdHlwZU9mRGF0YTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHJlYWRPbmx5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBASTE4TigpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaGVscDogYW55O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdEl0ZW1zXG4gIEBJbnB1dCgnY29tcGFyYXRvcicpXG4gIEBPcHRpb24oJ2NvbXBhcmF0b3InKVxuICBwcm90ZWN0ZWQgZGF0YUNvbXBhcmF0b3I6IElEYXRhQ29tcGFyYXRvcjxhbnk+O1xuICBASW5wdXQoKVxuICBASTE4TigpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaXRlbXM6IERlZmF1bHRTZWxlY3RJdGVtTW9kZWxbXTtcblxuICAvLyAtLS1TZWxmXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcbiAgQE91dHB1dCgncGh4TG9hZCcpXG4gIEBPcHRpb24oJ2xvYWQnKVxuICBwcm90ZWN0ZWQgbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcbiAgQE91dHB1dCgncGh4U3RhcnRWYWxpZGF0ZScpXG4gIEBPcHRpb24oJ3N0YXJ0VmFsaWRhdGUnKVxuICBwcm90ZWN0ZWQgc3RhcnRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4RW5kVmFsaWRhdGUnKVxuICBAT3B0aW9uKCdlbmRWYWxpZGF0ZScpXG4gIHByb3RlY3RlZCBlbmRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlRm9jdXMnKVxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4Rm9jdXMnKVxuICBAT3B0aW9uKCdmb2N1cycpXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlTG9zdEZvY3VzJylcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4TG9zdEZvY3VzJylcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhbmdlJylcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4Q2hhbmdlJylcbiAgQE9wdGlvbignY2hhbmdlJylcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RJdGVtc1xuICBAT3V0cHV0KCdwaHhCZWZvcmVTZWxlY3QnKVxuICBAT3B0aW9uKCdiZWZvcmVTZWxlY3QnKVxuICBwcm90ZWN0ZWQgYmVmb3JlU2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhTZWxlY3QnKVxuICBAT3B0aW9uKCdzZWxlY3QnKVxuICBwcm90ZWN0ZWQgc2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIC8vIC0tLSBmcm9tIHNlbGZcblxuICBAT3V0cHV0KCdwaHhCZWZvcmVDbGljaycpXG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcbiAgcHJvdGVjdGVkIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdjbGljaycpXG4gIEBPdXRwdXQoJ3BoeENsaWNrJylcbiAgcHJvdGVjdGVkIGNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcihlbGVtZW50UmVmLCBuZWVkRm9jdXNTZXJ2aWNlKTtcblxuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgaWYgKHRoaXMubmFtZSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5uYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5uYW1lID0gdGhpcy5ERUZBVUxUX0dST1VQX05BTUUgKyBcIl9cIiArIFVVSURVdGlscy5nZW5lcmF0ZVVVSUQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNDaGVja2VkKGl0ZW06IElTZWxlY3RJdGVtTW9kZWwpOiBib29sZWFuIHtcbiAgICBpZiAoaXRlbSAhPT0gbnVsbCAmJiB0eXBlb2YgaXRlbSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtKCk7XG5cbiAgICAgIHJldHVybiAoc0l0ZW0gPT09IGl0ZW0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgb25SYWRpb0J0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCwgaW5kZXg6IG51bWJlciwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgb2xkSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICBsZXQgbmV3SW5kZXggPSBpbmRleDtcblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVDbGlja0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLnNldFNlbGVjdGVkSW5kZXgobmV3SW5kZXgpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUNsaWNrRXZlbnQob2xkSW5kZXgsIG5ld0luZGV4LCAkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdENsaWNrRXZlbnQob2xkSW5kZXgsIG5ld0luZGV4LCAkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVDbGlja0V2ZW50KG9sZEluZGV4OiBudW1iZXIsIG5ld0luZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIGxldCBldmVudERhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IHRoaXMuZ2V0SXRlbUF0SW5kZXgobmV3SW5kZXgpLFxuICAgICAgaW5kZXg6IG5ld0luZGV4LFxuICAgICAgb2xkSXRlbTogdGhpcy5nZXRJdGVtQXRJbmRleChvbGRJbmRleCksXG4gICAgICBvbGRJbmRleDogb2xkSW5kZXhcbiAgICB9O1xuXG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICBpZiAodGhpcy5iZWZvcmVDbGlja0V2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KG9sZEluZGV4OiBudW1iZXIsIG5ld0luZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIGxldCBldmVudERhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IHRoaXMuZ2V0SXRlbUF0SW5kZXgobmV3SW5kZXgpLFxuICAgICAgaW5kZXg6IG5ld0luZGV4LFxuICAgICAgb2xkSXRlbTogdGhpcy5nZXRJdGVtQXRJbmRleChvbGRJbmRleCksXG4gICAgICBvbGRJbmRleDogb2xkSW5kZXhcbiAgICB9O1xuXG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5jbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGhhc0Rlc2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJyAmJiB0aGlzLmRlc2NyaXB0aW9uICE9PSAnJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uVmFsaWRhdGlvbkVuZChpbnB1dFZhbHVlOiBhbnksIHJlc3VsdHM6IFZhbGlkYXRpb25SZXN1bHRbXSk6IHZvaWQge1xuICAgIC8vISBkbyBzdGhpbmdcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkRhdGFDaGFuZ2UoZGF0YTogYW55LCBpbnB1dFZhbDogYW55KTogdm9pZCB7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICB9ICBcblxuXG4gIHB1YmxpYyBnZXRDbGlja2VkRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tlZEV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCZWZvcmVDbGlja2VkRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlQ2xpY2tlZEV2ZW50KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJdGVtcygpOiBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLml0ZW1zO1xuICB9XG59XG4iXX0=