UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

736 lines (735 loc) 53.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core'; import { AbstractHasFormatterInputDataView } from './AbstractHasFormatterInputDataView'; import { BEFORE_KEY_UP_EVENT, KEY_UP_EVENT, BEFORE_KEY_DOWN_EVENT, KEY_DOWN_EVENT } from '../../../share/CustomEventType'; import { Option } from '../../../decorator/Option.decorator'; import { I18N } from '../../../decorator/I18N.decorator'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; import { EventUtils } from '../../../share/utils/EventUtils'; import { FormatterFactory } from '../../../service/FormatterFactory.service'; const /** @type {?} */ TYPE_NAME = "phx-text-box"; export class TextBox extends AbstractHasFormatterInputDataView { /** * @param {?} elementRef * @param {?} formatterFactory * @param {?} needFocusService */ constructor(elementRef, formatterFactory, needFocusService) { super(elementRef, formatterFactory, needFocusService); this.beforeKeyUpEvent = new EventEmitter(); this.keyUpEvent = new EventEmitter(); this.beforeKeyDownEvent = new EventEmitter(); this.keyDownEvent = new EventEmitter(); } /** * @return {?} */ ngOnInit() { super.ngOnInit(); this.checkType(); } /** * @return {?} */ revertOriginalToData() { this.formattedData = this.originalValue; } /** * @return {?} */ checkType() { if (this.type === null || this.type === undefined || typeof this.type !== 'string' || this.type === '') { this.type = 'text'; } if (this.type.trim().toLowerCase() !== 'text' && this.type.trim().toLowerCase() !== 'password' && this.type.trim().toLowerCase() !== 'number') { // Only allow to possible values. // If not, use default value as "text". this.type = 'text'; } } /** * @param {?} inputValue * @param {?} results * @return {?} */ onValidationEnd(inputValue, results) { //! do sthing } /** * @param {?} data * @param {?} inputVal * @return {?} */ onDataChange(data, inputVal) { } /** * @param {?} $event * @return {?} */ doFocus($event) { if (this.elementRef) { $(this.elementRef.nativeElement).find('input').focus(); } } /** * @param {?} inputVal * @param {?=} $event * @param {?=} fireEvent * @return {?} */ setInputValue(inputVal, $event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } let /** @type {?} */ oldValue = this.getInputValue(); EventUtils.handleBrowserEvent(this, 'beforeChangeEvent', $event, fireEvent, ($event) => { // doEvent // Set input value into data object. this._setValueToData(inputVal); }, ($event) => { // emitBeforeEvent this.emitBeforeChangeEvent(oldValue, inputVal, true, $event); }, ($event) => { // emitAfterEvent this.emitChangeEvent(oldValue, inputVal, true, $event); }, ($event) => { // doPrevented if ($event !== null && $event !== undefined) { (/** @type {?} */ ($event.target)).value = (oldValue !== null && oldValue !== undefined) ? oldValue : ""; } }, 'inputValue'); } /** * @param {?} $event * @return {?} */ doLostFocus($event) { } /** * @param {?} $event * @return {?} */ doKeyUp($event) { } /** * @param {?} $event * @return {?} */ doKeyDown($event) { } /** * @param {?} $event * @return {?} */ emitBeforeKeyUpEvent($event) { let /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } let /** @type {?} */ data = { data: this.data, value: inputText }; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_KEY_UP_EVENT, this, data, $event); this.beforeKeyUpEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitKeyUpEvent($event) { let /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } let /** @type {?} */ data = { data: this.data, value: inputText }; let /** @type {?} */ ev = EventUtils.newCustomEvent(KEY_UP_EVENT, this, data, $event); this.keyUpEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitBeforeKeyDownEvent($event) { let /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } let /** @type {?} */ data = { data: this.data, value: inputText }; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_KEY_DOWN_EVENT, this, data, $event); this.beforeKeyDownEvent.emit(ev); } /** * @param {?} $event * @return {?} */ emitKeyDownEvent($event) { let /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } let /** @type {?} */ data = { data: this.data, value: inputText }; let /** @type {?} */ ev = EventUtils.newCustomEvent(KEY_DOWN_EVENT, this, data, $event); this.keyDownEvent.emit(ev); } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onKeyUp($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeKeyUpEvent', $event, fireEvent, ($event) => { // doEvent this.doKeyUp($event); }, ($event) => { // emitBeforeEvent this.emitBeforeKeyUpEvent($event); }, ($event, result) => { // emitAfterEvent this.emitKeyUpEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onKeyDown($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeKeyDownEvent', $event, fireEvent, ($event) => { // doEvent this.doKeyDown($event); }, ($event) => { // emitBeforeEvent this.emitBeforeKeyDownEvent($event); }, ($event, result) => { // emitAfterEvent this.emitKeyDownEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?} $event * @return {?} */ onValueChanged($event) { let /** @type {?} */ inputText = null; try { inputText = (/** @type {?} */ ($event.target)).value.toString(); } catch (/** @type {?} */ e) { } this.setFormattedData(inputText, $event); } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @return {?} */ isSelfDataDirty() { let /** @type {?} */ d1 = (this.originalValue === null || typeof this.originalValue === 'undefined') ? '' : this.originalValue; let /** @type {?} */ d2 = (this.formattedData === null || typeof this.formattedData === 'undefined') ? '' : this.formattedData; // check array open this is u want to check array try { let /** @type {?} */ jsonD1 = JSON.stringify(d1); let /** @type {?} */ jsonD2 = JSON.stringify(d2); if (jsonD1 !== jsonD2) { return true; } else { return false; } } catch (/** @type {?} */ error) { // error } if (d1 !== d2) { return true; } return false; } /** * @param {?} data * @return {?} */ setData(data) { super.setData(data); if (!this._isSetOriginal) { this.originalValue = AbstractHasFormatterInputDataView.resolveFormattedData(this.formatter, AbstractHasFormatterInputDataView.resolveInputValue(this.field, data)); this._isSetOriginal = true; } } /** * @param {?} data * @return {?} */ selfSaveData(data) { this.originalValue = AbstractHasFormatterInputDataView.resolveFormattedData(this.formatter, AbstractHasFormatterInputDataView.resolveInputValue(this.field, data)); } /** * @return {?} */ selfResetData() { this.revertOriginalToData(); } /** * @return {?} */ resetOriginalData() { this._isSetOriginal = false; this.originalValue = undefined; } /** * @param {?} options * @return {?} */ setOptions(options) { super.setOptions(options); this.checkType(); } /** * @return {?} */ getType() { return this.type; } /** * @param {?} type * @return {?} */ setType(type) { this.type = type; this.checkType(); } /** * @return {?} */ getWidth() { return this.width; } /** * @param {?} width * @return {?} */ setWidth(width) { this.width = width; } /** * @return {?} */ getHeight() { return this.height; } /** * @param {?} height * @return {?} */ setHeight(height) { this.height = height; } /** * @return {?} */ getBeforeKeyDownEvent() { return this.beforeKeyDownEvent; } /** * @param {?} event * @return {?} */ setBeforeKeyDownEvent(event) { this.beforeKeyDownEvent = event; } /** * @return {?} */ getKeyDownEvent() { return this.keyDownEvent; } /** * @param {?} event * @return {?} */ setKeyDownEvent(event) { this.keyDownEvent = event; } /** * @return {?} */ getBeforeKeyUpEvent() { return this.beforeKeyUpEvent; } /** * @param {?} event * @return {?} */ setBeforeKeyUpEvent(event) { this.beforeKeyUpEvent = event; } /** * @return {?} */ getKeyUpEvent() { return this.keyUpEvent; } /** * @param {?} event * @return {?} */ setKeyUpEvent(event) { this.keyUpEvent = event; } /** * @return {?} */ getMaxLength() { return this.maxLength; } } TextBox.TYPE_NAME = TYPE_NAME; TextBox.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="phx-text-box"> <div class="table-wrapper"> <div class="table-cell-wrapper middle"> <input [attr.maxlength]="getMaxLength()" [style.width]="getWidth()" [style.height]="getHeight()" (keyup)="onKeyUp($event)" (keydown)="onKeyDown($event)" type="{{getType()}}" class="form-control" [disabled]="isDisabled()" [readonly]="isReadOnly()" [class.dirty]="isDataDirty()" (focusin)="onFocusing($event)" (blur)="onLostFocusing($event)" (change)="onValueChanged($event)" [value]="(formattedData === undefined || formattedData === null) ? '' : formattedData"> </div> </div> </div> ` },] }, ]; /** @nocollapse */ TextBox.ctorParameters = () => [ { type: ElementRef, }, { type: FormatterFactory, }, { type: NeedFocusService, }, ]; TextBox.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 },], "formatter": [{ type: Input, args: ['formatter',] },], "formatterName": [{ type: Input, args: ['formatterName',] },], "formatterOptions": [{ type: Input, args: ['formatterOptions',] },], "formatterUsePropertyValue": [{ type: Input, args: ['formatterUsePropertyValue',] },], "type": [{ type: Input },], "width": [{ type: Input },], "height": [{ type: Input },], "maxLength": [{ type: Input, args: ['maxLength',] },], "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',] },], "beforeKeyUpEvent": [{ type: Output, args: ['phxBeforeKeyUp',] },], "keyUpEvent": [{ type: Output, args: ['phxKeyUp',] },], "beforeKeyDownEvent": [{ type: Output, args: ['phxBeforeKeyDown',] },], "keyDownEvent": [{ type: Output, args: ['phxKeyDown',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], TextBox.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], TextBox.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "help", void 0); tslib_1.__decorate([ Option('formatter.instance'), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "formatter", void 0); tslib_1.__decorate([ Option('formatter.name'), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "formatterName", void 0); tslib_1.__decorate([ Option('formatter.options'), tslib_1.__metadata("design:type", Object) ], TextBox.prototype, "formatterOptions", void 0); tslib_1.__decorate([ Option('formatter.usePropertyValue'), tslib_1.__metadata("design:type", Boolean) ], TextBox.prototype, "formatterUsePropertyValue", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "type", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "width", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], TextBox.prototype, "height", void 0); tslib_1.__decorate([ Option('maxLength'), tslib_1.__metadata("design:type", Number) ], TextBox.prototype, "maxLength", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeKeyUp'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeKeyUpEvent", void 0); tslib_1.__decorate([ Option('keyUp'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "keyUpEvent", void 0); tslib_1.__decorate([ Option('beforeKeyDown'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "beforeKeyDownEvent", void 0); tslib_1.__decorate([ Option('keyDown'), tslib_1.__metadata("design:type", EventEmitter) ], TextBox.prototype, "keyDownEvent", void 0); function TextBox_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ TextBox.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ TextBox.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ TextBox.propDecorators; /** @type {?} */ TextBox.TYPE_NAME; /** @type {?} */ TextBox.prototype.dataParent; /** @type {?} */ TextBox.prototype.ignoreParentData; /** @type {?} */ TextBox.prototype.data; /** @type {?} */ TextBox.prototype.ignoreParentDisabled; /** @type {?} */ TextBox.prototype.delegateHistory; /** @type {?} */ TextBox.prototype.onDisabled; /** @type {?} */ TextBox.prototype.onEnabled; /** @type {?} */ TextBox.prototype.loadingEnabled; /** @type {?} */ TextBox.prototype.i18nKey; /** @type {?} */ TextBox.prototype.bypass; /** @type {?} */ TextBox.prototype.options; /** @type {?} */ TextBox.prototype.disabled; /** @type {?} */ TextBox.prototype.field; /** @type {?} */ TextBox.prototype.name; /** @type {?} */ TextBox.prototype.typeOfData; /** @type {?} */ TextBox.prototype.readOnly; /** @type {?} */ TextBox.prototype.help; /** @type {?} */ TextBox.prototype.formatter; /** @type {?} */ TextBox.prototype.formatterName; /** @type {?} */ TextBox.prototype.formatterOptions; /** @type {?} */ TextBox.prototype.formatterUsePropertyValue; /** @type {?} */ TextBox.prototype.type; /** @type {?} */ TextBox.prototype.width; /** @type {?} */ TextBox.prototype.height; /** @type {?} */ TextBox.prototype.maxLength; /** @type {?} */ TextBox.prototype.loadEvent; /** @type {?} */ TextBox.prototype.startValidateEvent; /** @type {?} */ TextBox.prototype.endValidateEvent; /** @type {?} */ TextBox.prototype.beforeFocusEvent; /** @type {?} */ TextBox.prototype.focusEvent; /** @type {?} */ TextBox.prototype.beforeLostFocusEvent; /** @type {?} */ TextBox.prototype.lostFocusEvent; /** @type {?} */ TextBox.prototype.beforeChangeEvent; /** @type {?} */ TextBox.prototype.changeEvent; /** @type {?} */ TextBox.prototype.beforeKeyUpEvent; /** @type {?} */ TextBox.prototype.keyUpEvent; /** @type {?} */ TextBox.prototype.beforeKeyDownEvent; /** @type {?} */ TextBox.prototype.keyDownEvent; /** @type {?} */ TextBox.prototype.originalValue; /** @type {?} */ TextBox.prototype._isSetOriginal; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGV4dEJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvVGV4dEJveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTFILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRTdFLHVCQUFNLFNBQVMsR0FBVyxjQUFjLENBQUM7QUFjekMsTUFBTSxjQUFlLFNBQVEsaUNBQWlDOzs7Ozs7SUFzSTVELFlBQVksVUFBc0IsRUFBRSxnQkFBa0MsRUFBRSxnQkFBa0M7UUFDeEcsS0FBSyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0FDeEM7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Ozs7SUFHWCxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDOzs7OztJQUdsQyxTQUFTO1FBQ2YsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7U0FDcEI7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU07ZUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxVQUFVO2VBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQzs7O1lBR2pELElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFBO1NBQ25COzs7Ozs7O0lBR08sZUFBZSxDQUFDLFVBQWUsRUFBRSxPQUEyQjs7S0FFckU7Ozs7OztJQUVTLFlBQVksQ0FBQyxJQUFTLEVBQUUsUUFBYTtLQUM5Qzs7Ozs7SUFFUyxPQUFPLENBQUMsTUFBYTtRQUM3QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEQ7S0FDRjs7Ozs7OztJQUdNLGFBQWEsQ0FBQyxRQUFhLEVBQUUsTUFBYyxFQUFFLFNBQW1CO1FBQ3JFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELHFCQUFJLFFBQVEsR0FBUSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFekMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7OztZQUc1RixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzlELEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN4RCxFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1lBRW5CLEVBQUUsQ0FBQSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFBLENBQUM7Z0JBQzFDLG1CQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDNUY7U0FDRixFQUFFLFlBQVksQ0FBQyxDQUFDOzs7Ozs7SUFHVCxXQUFXLENBQUMsTUFBYTtLQUNsQzs7Ozs7SUFFUyxPQUFPLENBQUMsTUFBYTtLQUM5Qjs7Ozs7SUFFUyxTQUFTLENBQUMsTUFBYTtLQUNoQzs7Ozs7SUFFUyxvQkFBb0IsQ0FBQyxNQUFhO1FBQzFDLHFCQUFJLFNBQVMsR0FBVyxJQUFJLENBQUM7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsU0FBUyxHQUFHLG1CQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkQ7UUFBQyxLQUFLLENBQUMsQ0FBQyxpQkFBQSxDQUFDLEVBQUUsQ0FBQztTQUNaO1FBRUQscUJBQUksSUFBSSxHQUFRO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQztRQUVGLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLG1CQUFtQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNoQzs7Ozs7SUFFUyxjQUFjLENBQUMsTUFBYTtRQUNwQyxxQkFBSSxTQUFTLEdBQVcsSUFBSSxDQUFDO1FBRTdCLElBQUksQ0FBQztZQUNILFNBQVMsR0FBRyxtQkFBTSxNQUFNLENBQUMsTUFBTSxFQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ25EO1FBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsQ0FBQyxFQUFFLENBQUM7U0FDWjtRQUVELHFCQUFJLElBQUksR0FBUTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUM7UUFFRixxQkFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMxQjs7Ozs7SUFFUyxzQkFBc0IsQ0FBQyxNQUFhO1FBQzVDLHFCQUFJLFNBQVMsR0FBVyxJQUFJLENBQUM7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsU0FBUyxHQUFHLG1CQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkQ7UUFBQyxLQUFLLENBQUMsQ0FBQyxpQkFBQSxDQUFDLEVBQUUsQ0FBQztTQUNaO1FBRUQscUJBQUksSUFBSSxHQUFRO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQztRQUVGLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFOUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNsQzs7Ozs7SUFFUyxnQkFBZ0IsQ0FBQyxNQUFhO1FBQ3RDLHFCQUFJLFNBQVMsR0FBVyxJQUFJLENBQUM7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsU0FBUyxHQUFHLG1CQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkQ7UUFBQyxLQUFLLENBQUMsQ0FBQyxpQkFBQSxDQUFDLEVBQUUsQ0FBQztTQUNaO1FBRUQscUJBQUksSUFBSSxHQUFRO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQztRQUVGLHFCQUFJLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzVCOzs7Ozs7SUFFTSxPQUFPLENBQUMsTUFBYSxFQUFFLFNBQW1CO1FBQy9DLEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztZQUUzRixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFakIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDN0IsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztTQUdwQixDQUFDLENBQUM7Ozs7Ozs7SUFHRSxTQUFTLENBQUMsTUFBYSxFQUFFLFNBQW1CO1FBQ2pELEVBQUUsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUVELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztZQUU3RixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3hCLEVBQUUsQ0FBQyxNQUFhLEVBQUUsRUFBRTs7WUFFakIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQixFQUFFLENBQUMsTUFBYSxFQUFFLEVBQUU7O1NBR3BCLENBQUMsQ0FBQzs7Ozs7O0lBR0UsY0FBYyxDQUFDLE1BQWE7UUFDakMscUJBQUksU0FBUyxHQUFXLElBQUksQ0FBQztRQUU3QixJQUFJLENBQUM7WUFDSCxTQUFTLEdBQUcsbUJBQU0sTUFBTSxDQUFDLE1BQU0sRUFBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNuRDtRQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFBLENBQUMsRUFBRSxDQUFDO1NBQ1o7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7Ozs7SUFHcEMsVUFBVSxDQUFDLE1BQWE7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzs7Ozs7O0lBR3BELGNBQWMsQ0FBQyxNQUFhO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7SUFHaEQsZUFBZTtRQUNwQixxQkFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUM5RyxxQkFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7UUFHOUcsSUFBSSxDQUFDO1lBQ0gscUJBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMscUJBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFaEMsRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUM7YUFDYjtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsS0FBSyxFQUFFLENBQUM7O1NBRWhCO1FBRUQsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDZCxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFHUixPQUFPLENBQUMsSUFBUztRQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBCLEVBQUUsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxpQ0FBaUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuSyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztTQUM1Qjs7Ozs7O0lBR0ksWUFBWSxDQUFDLElBQVM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxpQ0FBaUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlDQUFpQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs7Ozs7SUFHOUosYUFBYTtRQUNsQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7Ozs7SUFHdkIsaUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDOzs7Ozs7SUFLMUIsVUFBVSxDQUFDLE9BQVk7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Ozs7O0lBR1osT0FBTztRQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7Ozs7SUFHWixPQUFPLENBQUMsSUFBWTtRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUVqQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Ozs7O0lBR1osUUFBUTtRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOzs7Ozs7SUFHYixRQUFRLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7Ozs7SUFHZCxTQUFTO1FBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7OztJQUdkLFNBQVMsQ0FBQyxNQUFjO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOzs7OztJQUdoQixxQkFBcUI7UUFDMUIsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzs7Ozs7O0lBRzFCLHFCQUFxQixDQUFDLEtBQXdCO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7Ozs7O0lBRzNCLGVBQWU7UUFDcEIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7Ozs7OztJQUdwQixlQUFlLENBQUMsS0FBd0I7UUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Ozs7O0lBR3JCLG1CQUFtQjtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7SUFHeEIsbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Ozs7SUFHekIsYUFBYTtRQUNsQixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7Ozs7O0lBR2xCLGFBQWEsQ0FBQyxLQUF3QjtRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQzs7Ozs7SUFHbkIsWUFBWTtRQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7O29CQXpjbUIsU0FBUzs7WUFkckQsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDbkIsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLFFBQVEsRUFBRTs7Ozs7OztDQU9YO2FBQ0E7Ozs7WUF6QndELFVBQVU7WUFVMUQsZ0JBQWdCO1lBSGhCLGdCQUFnQjs7OzJCQXlCdEIsS0FBSztpQ0FHTCxLQUFLO3FCQUdMLEtBQUs7cUNBR0wsS0FBSztnQ0FHTCxLQUFLOzJCQUdMLEtBQUs7MEJBR0wsS0FBSzsrQkFHTCxLQUFLO3dCQUdMLEtBQUs7dUJBR0wsS0FBSyxTQUFDLFlBQVk7d0JBR2xCLEtBQUs7eUJBRUwsS0FBSztzQkFJTCxLQUFLO3FCQUlMLEtBQUs7MkJBR0wsS0FBSzt5QkFHTCxLQUFLO3FCQUdMLEtBQUs7MEJBS0wsS0FBSyxTQUFDLFdBQVc7OEJBR2pCLEtBQUssU0FBQyxlQUFlO2lDQUdyQixLQUFLLFNBQUMsa0JBQWtCOzBDQUd4QixLQUFLLFNBQUMsMkJBQTJCO3FCQUlqQyxLQUFLO3NCQUdMLEtBQUs7dUJBR0wsS0FBSzswQkFHTCxLQUFLLFNBQUMsV0FBVzswQkFNakIsTUFBTSxTQUFDLFNBQVM7bUNBS2hCLE1BQU0sU0FBQyxrQkFBa0I7aUNBR3pCLE1BQU0sU0FBQyxnQkFBZ0I7aUNBR3ZCLE1BQU0sU0FBQyxnQkFBZ0I7MkJBR3ZCLE1BQU0sU0FBQyxVQUFVO3FDQUdqQixNQUFNLFNBQUMsb0JBQW9COytCQUczQixNQUFNLFNBQUMsY0FBYztrQ0FHckIsTUFBTSxTQUFDLGlCQUFpQjs0QkFHeEIsTUFBTSxTQUFDLFdBQVc7aUNBTWxCLE1BQU0sU0FBQyxnQkFBZ0I7MkJBR3ZCLE1BQU0sU0FBQyxVQUFVO21DQUdqQixNQUFNLFNBQUMsa0JBQWtCOzZCQUd6QixNQUFNLFNBQUMsWUFBWTs7O0lBMUhuQixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7c0NBQ2EsUUFBUTs7O0lBRTdCLE1BQU0sRUFBRTtzQ0FDWSxRQUFROzs7SUFFNUIsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxDQUFDLFlBQVksQ0FBQzs7OztJQUtwQixNQUFNLEVBQUU7Ozs7SUFJUixNQUFNLEVBQUU7Ozs7SUFJUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixNQUFNLEVBQUU7Ozs7SUFHUixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7Ozs7SUFJUixNQUFNLENBQUMsb0JBQW9CLENBQUM7Ozs7SUFHNUIsTUFBTSxDQUFDLGdCQUFnQixDQUFDOzs7O0lBR3hCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQzs7OztJQUczQixNQUFNLENBQUMsNEJBQTRCLENBQUM7Ozs7SUFJcEMsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxFQUFFOzs7O0lBR1IsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7OztJQU1uQixNQUFNLENBQUMsTUFBTSxDQUFDO3NDQUNNLFlBQVk7OztJQUloQyxNQUFNLENBQUMsZUFBZSxDQUFDO3NDQUNNLFlBQVk7OztJQUV6QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUNNLFlBQVk7OztJQUV2QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUNNLFlBQVk7OztJQUV2QyxNQUFNLENBQUMsT0FBTyxDQUFDO3NDQUNNLFlBQVk7OztJQUVqQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7c0NBQ00sWUFBWTs7O0lBRTNDLE1BQU0sQ0FBQyxXQUFXLENBQUM7c0NBQ00sWUFBWTs7O0lBRXJDLE1BQU0sQ0FBQyxjQUFjLENBQUM7c0NBQ00sWUFBWTs7O0lBRXhDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWTs7O0lBR2xDLE1BQU0sQ0FBQyxhQUFhLENBQUM7c0NBRU0sWUFBWTs7O0lBQ3ZDLE1BQU0sQ0FBQyxPQUFPLENBQUM7c0NBRU0sWUFBWTs7O0lBQ2pDLE1BQU0sQ0FBQyxlQUFlLENBQUM7c0NBRU0sWUFBWTs7O0lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBRU0sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlldyB9IGZyb20gJy4vQWJzdHJhY3RIYXNGb3JtYXR0ZXJJbnB1dERhdGFWaWV3JztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xuaW1wb3J0IHsgQkVGT1JFX0tFWV9VUF9FVkVOVCwgS0VZX1VQX0VWRU5ULCBCRUZPUkVfS0VZX0RPV05fRVZFTlQsIEtFWV9ET1dOX0VWRU5UIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9WYWxpZGF0aW9uUmVzdWx0JztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7IElGb3JtYXR0ZXIgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS9mb3JtYXR0ZXIvSUZvcm1hdHRlcic7XG5pbXBvcnQgeyBGb3JtYXR0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9Gb3JtYXR0ZXJGYWN0b3J5LnNlcnZpY2UnO1xuXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXRleHQtYm94XCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtdGV4dC1ib3hcIj5cblx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHQ8ZGl2IGNsYXNzPVwidGFibGUtY2VsbC13cmFwcGVyIG1pZGRsZVwiPlxuXHRcdFx0PGlucHV0IFthdHRyLm1heGxlbmd0aF09XCJnZXRNYXhMZW5ndGgoKVwiIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWlnaHQoKVwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIHR5cGU9XCJ7e2dldFR5cGUoKX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCIgW3JlYWRvbmx5XT1cImlzUmVhZE9ubHkoKVwiIFtjbGFzcy5kaXJ0eV09XCJpc0RhdGFEaXJ0eSgpXCIgKGZvY3VzaW4pPVwib25Gb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiIChjaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIFt2YWx1ZV09XCIoZm9ybWF0dGVkRGF0YSA9PT0gdW5kZWZpbmVkIHx8IGZvcm1hdHRlZERhdGEgPT09IG51bGwpID8gJycgOiBmb3JtYXR0ZWREYXRhXCI+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIFRleHRCb3ggZXh0ZW5kcyBBYnN0cmFjdEhhc0Zvcm1hdHRlcklucHV0RGF0YVZpZXcgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xuICBASW5wdXQoJ2Zvcm1hdHRlcicpXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5pbnN0YW5jZScpXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXI6IElGb3JtYXR0ZXI7XG4gIEBJbnB1dCgnZm9ybWF0dGVyTmFtZScpXG4gIEBPcHRpb24oJ2Zvcm1hdHRlci5uYW1lJylcbiAgcHJvdGVjdGVkIGZvcm1hdHRlck5hbWU6IHN0cmluZztcbiAgQElucHV0KCdmb3JtYXR0ZXJPcHRpb25zJylcbiAgQE9wdGlvbignZm9ybWF0dGVyLm9wdGlvbnMnKVxuICBwcm90ZWN0ZWQgZm9ybWF0dGVyT3B0aW9uczogYW55O1xuICBASW5wdXQoJ2Zvcm1hdHRlclVzZVByb3BlcnR5VmFsdWUnKVxuICBAT3B0aW9uKCdmb3JtYXR0ZXIudXNlUHJvcGVydHlWYWx1ZScpXG4gIHByb3RlY3RlZCBmb3JtYXR0ZXJVc2VQcm9wZXJ0eVZhbHVlOiBib29sZWFuO1xuICAvLyAtLS0gc2VsZlxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHR5cGU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB3aWR0aDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGhlaWdodDogc3RyaW5nO1xuICBASW5wdXQoJ21heExlbmd0aCcpXG4gIEBPcHRpb24oJ21heExlbmd0aCcpXG4gIHByb3RlY3RlZCBtYXhMZW5ndGg6IG51bWJlcjtcblxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxuICBAT3B0aW9uKCdsb2FkJylcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RJbnB1dERhdGFWaWV3XG4gIEBPdXRwdXQoJ3BoeFN0YXJ0VmFsaWRhdGUnKVxuICBAT3B0aW9uKCdzdGFydFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIHN0YXJ0VmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEVuZFZhbGlkYXRlJylcbiAgQE9wdGlvbignZW5kVmFsaWRhdGUnKVxuICBwcm90ZWN0ZWQgZW5kVmFsaWRhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUZvY3VzJylcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxuICBwcm90ZWN0ZWQgYmVmb3JlRm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEZvY3VzJylcbiAgQE9wdGlvbignZm9jdXMnKVxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUxvc3RGb2N1cycpXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeExvc3RGb2N1cycpXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXG4gIEBPcHRpb24oJ2NoYW5nZScpXG4gIHByb3RlY3RlZCBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRm9ybWF0dGVySW5wdXREYXRhVmlld1xuICAvLyAtLS0gc2VsZlxuICBAT3B0aW9uKCdiZWZvcmVLZXlVcCcpXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUtleVVwJylcbiAgcHJvdGVjdGVkIGJlZm9yZUtleVVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdrZXlVcCcpXG4gIEBPdXRwdXQoJ3BoeEtleVVwJylcbiAgcHJvdGVjdGVkIGtleVVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdiZWZvcmVLZXlEb3duJylcbiAgQE91dHB1dCgncGh4QmVmb3JlS2V5RG93bicpXG4gIHByb3RlY3RlZCBiZWZvcmVLZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdrZXlEb3duJylcbiAgQE91dHB1dCgncGh4S2V5RG93bicpXG4gIHByb3RlY3RlZCBrZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgb3JpZ2luYWxWYWx1ZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgX2lzU2V0T3JpZ2luYWw6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgZm9ybWF0dGVyRmFjdG9yeTogRm9ybWF0dGVyRmFjdG9yeSwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIGZvcm1hdHRlckZhY3RvcnksIG5lZWRGb2N1c1NlcnZpY2UpO1xuXG4gICAgdGhpcy5iZWZvcmVLZXlVcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMua2V5VXBFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUtleURvd25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmtleURvd25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5jaGVja1R5cGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV2ZXJ0T3JpZ2luYWxUb0RhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtYXR0ZWREYXRhID0gdGhpcy5vcmlnaW5hbFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1R5cGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gbnVsbCB8fCB0aGlzLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdGhpcy50eXBlICE9PSAnc3RyaW5nJyB8fCB0aGlzLnR5cGUgPT09ICcnKSB7XG4gICAgICB0aGlzLnR5cGUgPSAndGV4dCc7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT09ICd0ZXh0J1xuICAgICAgJiYgdGhpcy50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9PSAncGFzc3dvcmQnXG4gICAgICAmJiB0aGlzLnR5cGUudHJpbSgpLnRvTG93ZXJDYXNlKCkgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBPbmx5IGFsbG93IHRvIHBvc3NpYmxlIHZhbHVlcy5cbiAgICAgIC8vIElmIG5vdCwgdXNlIGRlZmF1bHQgdmFsdWUgYXMgXCJ0ZXh0XCIuXG4gICAgICB0aGlzLnR5cGUgPSAndGV4dCdcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XG4gICAgLy8hIGRvIHN0aGluZ1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmKSB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCdpbnB1dCcpLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gT3ZlcnJpZGUgUHJldmVudERlZmF1bHRcbiAgcHVibGljIHNldElucHV0VmFsdWUoaW5wdXRWYWw6IGFueSwgJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBvbGRWYWx1ZTogYW55ID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlQ2hhbmdlRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIC8vIFNldCBpbnB1dCB2YWx1ZSBpbnRvIGRhdGEgb2JqZWN0LlxuICAgICAgdGhpcy5fc2V0VmFsdWVUb0RhdGEoaW5wdXRWYWwpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QmVmb3JlRXZlbnRcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUNoYW5nZUV2ZW50KG9sZFZhbHVlLCBpbnB1dFZhbCwgdHJ1ZSwgJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KG9sZFZhbHVlLCBpbnB1dFZhbCwgdHJ1ZSwgJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9QcmV2ZW50ZWRcbiAgICAgIGlmKCRldmVudCAhPT0gbnVsbCAmJiAkZXZlbnQgIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICg8YW55PiRldmVudC50YXJnZXQpLnZhbHVlID0gKG9sZFZhbHVlICE9PSBudWxsICYmIG9sZFZhbHVlICE9PSB1bmRlZmluZWQpID8gb2xkVmFsdWUgOiBcIlwiO1xuICAgICAgfVxuICAgIH0sICdpbnB1dFZhbHVlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvS2V5VXAoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICB9XG5cbiAgcHJvdGVjdGVkIGRvS2V5RG93bigkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUtleVVwRXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGxldCBpbnB1dFRleHQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5wdXRUZXh0ID0gKDxhbnk+JGV2ZW50LnRhcmdldCkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHZhbHVlOiBpbnB1dFRleHRcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfS0VZX1VQX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgdGhpcy5iZWZvcmVLZXlVcEV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRLZXlVcEV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgaW5wdXRUZXh0OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlucHV0VGV4dCA9ICg8YW55PiRldmVudC50YXJnZXQpLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cblxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICB2YWx1ZTogaW5wdXRUZXh0XG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoS0VZX1VQX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgdGhpcy5rZXlVcEV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVLZXlEb3duRXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGxldCBpbnB1dFRleHQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5wdXRUZXh0ID0gKDxhbnk+JGV2ZW50LnRhcmdldCkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIHZhbHVlOiBpbnB1dFRleHRcbiAgICB9O1xuXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfS0VZX0RPV05fRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmJlZm9yZUtleURvd25FdmVudC5lbWl0KGV2KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0S2V5RG93bkV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgaW5wdXRUZXh0OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlucHV0VGV4dCA9ICg8YW55PiRldmVudC50YXJnZXQpLnZhbHVlLnRvU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgIH1cblxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICB2YWx1ZTogaW5wdXRUZXh0XG4gICAgfTtcblxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoS0VZX0RPV05fRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmtleURvd25FdmVudC5lbWl0KGV2KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleVVwKCRldmVudDogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVLZXlVcEV2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmRvS2V5VXAoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICAgIHRoaXMuZW1pdEJlZm9yZUtleVVwRXZlbnQoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCwgcmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XG4gICAgICB0aGlzLmVtaXRLZXlVcEV2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG5cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbktleURvd24oJGV2ZW50OiBFdmVudCwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUtleURvd25FdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5kb0tleURvd24oJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XG4gICAgICAgIHRoaXMuZW1pdEJlZm9yZUtleURvd25FdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdEtleURvd25FdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25WYWx1ZUNoYW5nZWQoJGV2ZW50OiBFdmVudCkge1xuICAgIGxldCBpbnB1dFRleHQ6IHN0cmluZyA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgaW5wdXRUZXh0ID0gKDxhbnk+JGV2ZW50LnRhcmdldCkudmFsdWUudG9TdHJpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRGb3JtYXR0ZWREYXRhKGlucHV0VGV4dCwgJGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzaW5nKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2Uuc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcywgJGV2ZW50KTtcbiAgfVxuXG