UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

489 lines (488 loc) 37 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, ElementRef, EventEmitter, ViewChild } from '@angular/core'; import { CheckBox } from '../../../../../component/dataview/input/CheckBox.component'; import { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; import { EventUtils } from '../../../../../share/utils/EventUtils'; import { INDETERMINATE_CHANGE_EVENT, BEFORE_INDETERMINATE_CHANGE_EVENT } from '../../../../../share/CustomEventType'; import { MatCheckbox } from '@angular/material'; const /** @type {?} */ TYPE_NAME = "material-checkbox"; const /** @type {?} */ DEFAULT_FIELD = "label"; export class MaterialCheckBox extends CheckBox { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(elementRef, needFocusService); this.beforeIndeterminateChangeEvent = new EventEmitter(); this.indeterminateChangeEvent = new EventEmitter(); } /** * @return {?} */ ngOnInit() { super.ngOnInit(); $(this.elementRef.nativeElement).find('input.mat-checkbox-input').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('input.mat-checkbox-input').blur(($event) => { this.onLostFocusing($event); }); } /** * @return {?} */ _displayHelp() { let /** @type {?} */ hasHelp = this.hasHelp(); return hasHelp && this.isShowHelp(); } /** * @return {?} */ getLastPosition() { return this.labelPosition; } /** * @param {?} labelPosition * @return {?} */ setLastPosition(labelPosition) { this.labelPosition = labelPosition; } /** * @return {?} */ isDisableRipple() { return this.disableRipple; } /** * @param {?} disableRipple * @return {?} */ setDisableRipple(disableRipple) { this.disableRipple = disableRipple; } /** * @return {?} */ getLabel() { return this.label; } /** * @param {?} label * @return {?} */ setLabel(label) { this.label = label; } /** * @return {?} */ isIndeterminate() { return this.indeterminate; } /** * @param {?} indeterminate * @return {?} */ setIndeterminate(indeterminate) { this.indeterminate = indeterminate; } /** * @param {?} $event * @return {?} */ onClick($event) { if (this.isReadOnly() || (this.isDisabled())) { $event.preventDefault(); } } /** * @param {?} $event * @return {?} */ onChange($event) { this.mcomp.toggle(); // $event is MatCheckboxChange {source: MatCheckbox, checked: boolean} if ($event.checked !== null && $event.checked !== undefined) { this.setInputValue($event.checked); } } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onIndeterminateChange($event, fireEvent) { // $event is boolean if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } if (fireEvent) { this.emitBeforeIndeterminateChangeEvent(!$event, $event); } EventUtils.handleBrowserEvent(this, 'beforeIndeterminateChangeEvent', $event, fireEvent, ($event) => { // doEvent }, ($event) => { // emitBeforeEvent this.emitBeforeIndeterminateChangeEvent(!$event, $event); }, ($event, result) => { // emitAfterEvent this.emitIndeterminateChangeEvent(!$event, $event); }, ($event) => { // doPrevented }); } /** * @param {?} oldValue * @param {?} newValue * @param {?=} $event * @return {?} */ emitBeforeIndeterminateChangeEvent(oldValue, newValue, $event) { let /** @type {?} */ eventData = { data: this.data, oldValue: oldValue, newValue: newValue }; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_INDETERMINATE_CHANGE_EVENT, this, data, $event); if (this.beforeIndeterminateChangeEvent !== null && this.beforeIndeterminateChangeEvent !== undefined) { this.beforeIndeterminateChangeEvent.emit(ev); } } /** * @param {?} oldValue * @param {?} newValue * @param {?=} $event * @return {?} */ emitIndeterminateChangeEvent(oldValue, newValue, $event) { let /** @type {?} */ eventData = { data: this.data, oldValue: oldValue, newValue: newValue }; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(INDETERMINATE_CHANGE_EVENT, this, data, $event); if (this.indeterminateChangeEvent !== null && this.indeterminateChangeEvent !== undefined) { this.indeterminateChangeEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @param {?} $event * @return {?} */ doFocus($event) { if ($(this.elementRef.nativeElement).find('input.mat-checkbox-input:focus').length <= 0) { $(this.elementRef.nativeElement).find('input.mat-checkbox-input').focus(); } } /** * @param {?} $event * @return {?} */ doLostFocus($event) { if ($(this.elementRef.nativeElement).find('input.mat-checkbox-input:focus').length > 0) { $(this.elementRef.nativeElement).find('input.mat-checkbox-input').blur(); } } /** * @return {?} */ getBeforeIndeterminateChangeEvent() { return this.beforeIndeterminateChangeEvent; } /** * @param {?} event * @return {?} */ setBeforeIndeterminateChangeEvent(event) { this.beforeIndeterminateChangeEvent = event; } /** * @return {?} */ getIndeterminateChangeEvent() { return this.indeterminateChangeEvent; } /** * @param {?} event * @return {?} */ setIndeterminateChangeEvent(event) { this.indeterminateChangeEvent = event; } } MaterialCheckBox.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="material-input material-checkbox"> <mat-checkbox #mcomp [disabled]="isDisabled()" [checked]="isToggle()" [indeterminate]="isIndeterminate()" [disableRipple]="isDisableRipple()" [labelPosition]="getLastPosition()" (click)="onClick($event)" (change)="onChange($event)" (indeterminateChange)="onIndeterminateChange($event)">{{getLabel()}}</mat-checkbox> <div class="help"> {{getHelp() | phx_text}} </div> </div> ` },] }, ]; /** @nocollapse */ MaterialCheckBox.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; MaterialCheckBox.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 },], "labelPosition": [{ type: Input },], "label": [{ type: Input },], "disableRipple": [{ type: Input },], "indeterminate": [{ type: Input },], "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',] },], "beforeIndeterminateChangeEvent": [{ type: Output, args: ['phxBeforeIndeterminateChange',] },], "indeterminateChangeEvent": [{ type: Output, args: ['phxIndeterminateChange',] },], "mcomp": [{ type: ViewChild, args: ['mcomp',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialCheckBox.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialCheckBox.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialCheckBox.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialCheckBox.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialCheckBox.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialCheckBox.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialCheckBox.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialCheckBox.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], MaterialCheckBox.prototype, "help", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialCheckBox.prototype, "labelPosition", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialCheckBox.prototype, "label", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "disableRipple", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialCheckBox.prototype, "indeterminate", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeIndeterminateChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "beforeIndeterminateChangeEvent", void 0); tslib_1.__decorate([ Option('indeterminateChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialCheckBox.prototype, "indeterminateChangeEvent", void 0); function MaterialCheckBox_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialCheckBox.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialCheckBox.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialCheckBox.propDecorators; /** @type {?} */ MaterialCheckBox.prototype.dataParent; /** @type {?} */ MaterialCheckBox.prototype.ignoreParentData; /** @type {?} */ MaterialCheckBox.prototype.data; /** @type {?} */ MaterialCheckBox.prototype.ignoreParentDisabled; /** @type {?} */ MaterialCheckBox.prototype.delegateHistory; /** @type {?} */ MaterialCheckBox.prototype.onDisabled; /** @type {?} */ MaterialCheckBox.prototype.onEnabled; /** @type {?} */ MaterialCheckBox.prototype.loadingEnabled; /** @type {?} */ MaterialCheckBox.prototype.i18nKey; /** @type {?} */ MaterialCheckBox.prototype.bypass; /** @type {?} */ MaterialCheckBox.prototype.options; /** @type {?} */ MaterialCheckBox.prototype.disabled; /** @type {?} */ MaterialCheckBox.prototype.field; /** @type {?} */ MaterialCheckBox.prototype.name; /** @type {?} */ MaterialCheckBox.prototype.typeOfData; /** @type {?} */ MaterialCheckBox.prototype.readOnly; /** @type {?} */ MaterialCheckBox.prototype.help; /** @type {?} */ MaterialCheckBox.prototype.labelPosition; /** @type {?} */ MaterialCheckBox.prototype.label; /** @type {?} */ MaterialCheckBox.prototype.disableRipple; /** @type {?} */ MaterialCheckBox.prototype.indeterminate; /** @type {?} */ MaterialCheckBox.prototype.startValidateEvent; /** @type {?} */ MaterialCheckBox.prototype.endValidateEvent; /** @type {?} */ MaterialCheckBox.prototype.beforeFocusEvent; /** @type {?} */ MaterialCheckBox.prototype.focusEvent; /** @type {?} */ MaterialCheckBox.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialCheckBox.prototype.lostFocusEvent; /** @type {?} */ MaterialCheckBox.prototype.beforeChangeEvent; /** @type {?} */ MaterialCheckBox.prototype.changeEvent; /** @type {?} */ MaterialCheckBox.prototype.beforeIndeterminateChangeEvent; /** @type {?} */ MaterialCheckBox.prototype.indeterminateChangeEvent; /** @type {?} */ MaterialCheckBox.prototype.mcomp; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxDaGVja0JveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxDaGVja0JveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdoRCx1QkFBTSxTQUFTLEdBQVcsbUJBQW1CLENBQUM7QUFFOUMsdUJBQU0sYUFBYSxHQUFXLE9BQU8sQ0FBQztBQWF0QyxNQUFNLHVCQUF3QixTQUFRLFFBQVE7Ozs7O0lBOEc1QyxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUM5RCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztLQUN6RDs7OztJQUVNLFFBQVE7UUFDYixL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cEIsTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBSVIsTUFBTSxFQUFFOzs7O0lBR1IsSUFBSSxFQUFFO0lBQ04sTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBTVIsTUFBTSxDQUFDLGVBQWUsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFekMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQztzQ0FDTSxZQUFZOzs7SUFFakMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO3NDQUNNLFlBQVk7OztJQUUzQyxNQUFNLENBQUMsV0FBVyxDQUFDO3NDQUNNLFlBQVk7OztJQUVyQyxNQUFNLENBQUMsY0FBYyxDQUFDO3NDQUNNLFlBQVk7OztJQUV4QyxNQUFNLENBQUMsUUFBUSxDQUFDO3NDQUNNLFlBQVk7OztJQUlsQyxNQUFNLENBQUMsMkJBQTJCLENBQUM7c0NBQ00sWUFBWTs7O0lBRXJELE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztzQ0FDTSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENoZWNrQm94IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L0NoZWNrQm94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L0lIYXNEYXRhJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xyXG5pbXBvcnQgeyBJTkRFVEVSTUlOQVRFX0NIQU5HRV9FVkVOVCwgQkVGT1JFX0lOREVURVJNSU5BVEVfQ0hBTkdFX0VWRU5UIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3ggfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcIm1hdGVyaWFsLWNoZWNrYm94XCI7XHJcblxyXG5jb25zdCBERUZBVUxUX0ZJRUxEOiBzdHJpbmcgPSBcImxhYmVsXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwibWF0ZXJpYWwtaW5wdXQgbWF0ZXJpYWwtY2hlY2tib3hcIj5cclxuICA8bWF0LWNoZWNrYm94ICNtY29tcCBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgW2NoZWNrZWRdPVwiaXNUb2dnbGUoKVwiIFtpbmRldGVybWluYXRlXT1cImlzSW5kZXRlcm1pbmF0ZSgpXCIgW2Rpc2FibGVSaXBwbGVdPVwiaXNEaXNhYmxlUmlwcGxlKClcIiBbbGFiZWxQb3NpdGlvbl09XCJnZXRMYXN0UG9zaXRpb24oKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiAoaW5kZXRlcm1pbmF0ZUNoYW5nZSk9XCJvbkluZGV0ZXJtaW5hdGVDaGFuZ2UoJGV2ZW50KVwiPnt7Z2V0TGFiZWwoKX19PC9tYXQtY2hlY2tib3g+XHJcblx0PGRpdiBjbGFzcz1cImhlbHBcIj5cclxuXHRcdHt7Z2V0SGVscCgpIHwgcGh4X3RleHR9fVxyXG5cdDwvZGl2PlxyXG48L2Rpdj5cclxuYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWF0ZXJpYWxDaGVja0JveCBleHRlbmRzIENoZWNrQm94IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXHJcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXHJcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbmFtZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIHR5cGVPZkRhdGE6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCByZWFkT25seTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBJMThOKClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaGVscDogYW55O1xyXG4gIC8vIC0tLSBTZWxmXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbGFiZWxQb3NpdGlvbjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVSaXBwbGU6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaW5kZXRlcm1pbmF0ZTogYm9vbGVhbjtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XHJcbiAgQE91dHB1dCgncGh4U3RhcnRWYWxpZGF0ZScpXHJcbiAgQE9wdGlvbignc3RhcnRWYWxpZGF0ZScpXHJcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4RW5kVmFsaWRhdGUnKVxyXG4gIEBPcHRpb24oJ2VuZFZhbGlkYXRlJylcclxuICBwcm90ZWN0ZWQgZW5kVmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlRm9jdXMnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUZvY3VzJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlRm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2ZvY3VzJylcclxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlTG9zdEZvY3VzJylcclxuICBAT3B0aW9uKCdiZWZvcmVMb3N0Rm9jdXMnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4TG9zdEZvY3VzJylcclxuICBAT3B0aW9uKCdsb3N0Rm9jdXMnKVxyXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhbmdlJylcclxuICBAT3B0aW9uKCdiZWZvcmVDaGFuZ2UnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4Q2hhbmdlJylcclxuICBAT3B0aW9uKCdjaGFuZ2UnKVxyXG4gIHByb3RlY3RlZCBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIC0tLSBTZWxmXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlSW5kZXRlcm1pbmF0ZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlSW5kZXRlcm1pbmF0ZUNoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4SW5kZXRlcm1pbmF0ZUNoYW5nZScpXHJcbiAgQE9wdGlvbignaW5kZXRlcm1pbmF0ZUNoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ21jb21wJylcclxuICBwcml2YXRlIG1jb21wOiBNYXRDaGVja2JveDtcclxuXHJcbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG5cclxuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2lucHV0Lm1hdC1jaGVja2JveC1pbnB1dCcpLmZvY3VzKCgkZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5vbkZvY3VzaW5nKCRldmVudCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dC5tYXQtY2hlY2tib3gtaW5wdXQnKS5ibHVyKCgkZXZlbnQpID0+IHtcclxuICAgICAgdGhpcy5vbkxvc3RGb2N1c2luZygkZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfSBcclxuXHJcbiAgcHVibGljIF9kaXNwbGF5SGVscCgpOiBib29sZWFuIHtcclxuICAgIGxldCBoYXNIZWxwID0gdGhpcy5oYXNIZWxwKCk7XHJcblxyXG4gICAgcmV0dXJuIGhhc0hlbHAgJiYgdGhpcy5pc1Nob3dIZWxwKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGFzdFBvc2l0aW9uKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5sYWJlbFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldExhc3RQb3NpdGlvbihsYWJlbFBvc2l0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGFiZWxQb3NpdGlvbiA9IGxhYmVsUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEaXNhYmxlUmlwcGxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVJpcHBsZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREaXNhYmxlUmlwcGxlKGRpc2FibGVSaXBwbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZVJpcHBsZSA9IGRpc2FibGVSaXBwbGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldExhYmVsKGxhYmVsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pbmRldGVybWluYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEluZGV0ZXJtaW5hdGUoaW5kZXRlcm1pbmF0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsaWNrKCRldmVudDogRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkoKSB8fCAodGhpcy5pc0Rpc2FibGVkKCkpKSB7XHJcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2hhbmdlKCRldmVudCkge1xyXG4gICAgdGhpcy5tY29tcC50b2dnbGUoKTtcclxuXHJcbiAgICAvLyAkZXZlbnQgaXMgTWF0Q2hlY2tib3hDaGFuZ2XCoHtzb3VyY2U6IE1hdENoZWNrYm94LCBjaGVja2VkOiBib29sZWFufVxyXG4gICAgaWYgKCRldmVudC5jaGVja2VkICE9PSBudWxsICYmICRldmVudC5jaGVja2VkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKCRldmVudC5jaGVja2VkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkluZGV0ZXJtaW5hdGVDaGFuZ2UoJGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcclxuICAgIC8vICRldmVudCBpcyBib29sZWFuXHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpcmVFdmVudCkge1xyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQoISRldmVudCwgJGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlSW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvRXZlbnRcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQoISRldmVudCwgJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQoISRldmVudCwgJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlSW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnksICRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0ge1xyXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcclxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGVtaXQgZXZlbnRcclxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9JTkRFVEVSTUlOQVRFX0NIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5iZWZvcmVJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLmJlZm9yZUluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudC5lbWl0KGV2KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0SW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50KG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnksICRldmVudD86IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0ge1xyXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXHJcbiAgICAgIG9sZFZhbHVlOiBvbGRWYWx1ZSxcclxuICAgICAgbmV3VmFsdWU6IG5ld1ZhbHVlXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGVtaXQgZXZlbnRcclxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XHJcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KElOREVURVJNSU5BVEVfQ0hBTkdFX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50LmVtaXQoZXYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICgkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dC5tYXQtY2hlY2tib3gtaW5wdXQ6Zm9jdXMnKS5sZW5ndGggPD0gMCkge1xyXG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dC5tYXQtY2hlY2tib3gtaW5wdXQnKS5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICgkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dC5tYXQtY2hlY2tib3gtaW5wdXQ6Zm9jdXMnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJ2lucHV0Lm1hdC1jaGVja2JveC1pbnB1dCcpLmJsdXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCZWZvcmVJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlSW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJlZm9yZUluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuYmVmb3JlSW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50ID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SW5kZXRlcm1pbmF0ZUNoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRJbmRldGVybWluYXRlQ2hhbmdlRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2VFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxufVxyXG4iXX0=