@stratio/egeo
Version:
585 lines • 42.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-search/st-search.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, Renderer2, ViewChild } from '@angular/core';
import { FormControl } from '@angular/forms';
import { EventWindowManager } from '../utils/event-window-manager';
import { debounceTime } from 'rxjs/operators';
import { StSearchEventOrigin } from './st-search.model';
/**
* \@description {Component} [Search]
*
* The search component has been designed to allow user to find a specific content according to his needs.
*
* \@example
*
* {html}
*
* ```
* Search without filters
* <st-search [placeholder]="placeholder" [qaTag]="qaTag"
* [value]="searched" [debounce]="debounceTime" [minLength]="minLength"
* (search)="onSearchResult($event)"></st-search>
*
*
* Search with filters
* <st-search [placeholder]="placeholder" [qaTag]="qaTag"
* [value]="searched" [debounce]="debounceTime" [minLength]="minLength" [filterOptions]="[
* { label: 'All', value: 1 },
* { label: 'Type ', value: 2 },
* { label: 'Color', value: 3 }
* ]" (search)="onSearchResult($event)"></st-search>
* ```
*
*/
var StSearchComponent = /** @class */ (function (_super) {
tslib_1.__extends(StSearchComponent, _super);
function StSearchComponent(_render, cd, buttonElement) {
var _this = _super.call(this, _render, cd, buttonElement) || this;
_this._render = _render;
_this.cd = cd;
_this.buttonElement = buttonElement;
/**
* \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list
*/
_this.debounce = 0;
/**
* \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing
*/
_this.liveSearch = true;
/**
* \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search
*/
_this.minLength = 0;
/**
* \@Input {string} [placeholder='Search'] Text displayed in the search input
*/
_this.placeholder = 'Search';
/**
* \@Input {boolean} [disabled=false] Boolean to enable or disable the search
*/
_this.disabled = false;
/**
* \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing
*/
_this.withAutocomplete = false;
/**
* \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing
*/
_this.autocompleteList = [];
/**
* \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon
*/
_this.showIcon = true;
/**
* \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but
* there are not any item with the typed text
*/
_this.emptyAutocompleteListMessage = '';
/**
* \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains
* the text typed by the user and the filter value selected (only if filter is displayed)
*/
_this.search = new EventEmitter();
/**
* \@Output {any} [value=''] Event emitted when filter is changed. It contains
* the filter value selected
*/
_this.selectFilter = new EventEmitter();
/**
* \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard
*/
_this.keyBoardMove = false;
_this.searchBox = new FormControl();
_this.subscriptionSearch = undefined;
_this.subscriptionSearchClearButton = undefined;
_this.lastEmittedText = undefined;
return _this;
}
Object.defineProperty(StSearchComponent.prototype, "menuId", {
get: /**
* @return {?}
*/
function () {
return this.qaTag ? this.qaTag + '-autocomplete-menu' : null;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StSearchComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.value) {
this.searchBox.setValue(this.value);
}
// Show clear button if have text
this.subscriptionSearchClearButton = this.searchBox.valueChanges.subscribe((/**
* @param {?} val
* @return {?}
*/
function (val) { return _this.showClear = (val && val.length > 0); }));
this.checkDisabled();
this.manageSubscription();
if (this.filterOptions) {
this.filter = this.filterOptions[0].value;
}
};
/**
* @param {?} changes
* @return {?}
*/
StSearchComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
this.checkDebounceChange(changes);
this.checkValueChange(changes);
this.checkDisableChange(changes);
this.checkAutoCompleteMenuChange(changes);
};
/**
* @param {?} value
* @return {?}
*/
StSearchComponent.prototype.onChangeFilter = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.selectFilter.emit(value);
this.emitValue(false, StSearchEventOrigin.FILTER);
};
/**
* @return {?}
*/
StSearchComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.subscriptionSearch !== undefined) {
this.subscriptionSearch.unsubscribe();
}
if (this.subscriptionSearchClearButton !== undefined) {
this.subscriptionSearchClearButton.unsubscribe();
}
this.closeElement();
};
/**
* @param {?} force
* @param {?} origin
* @return {?}
*/
StSearchComponent.prototype.launchSearch = /**
* @param {?} force
* @param {?} origin
* @return {?}
*/
function (force, origin) {
if (this.canSearch()) {
this.showAutoCompleteMenu();
this.emitValue(force, origin);
}
else {
this.closeElement();
}
};
/**
* @param {?} event
* @return {?}
*/
StSearchComponent.prototype.onKeyPress = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var key = event.keyCode || event.which;
if (key === 13) {
this.launchSearch(true, StSearchEventOrigin.ENTER);
}
};
/**
* @param {?} item
* @return {?}
*/
StSearchComponent.prototype.changeOption = /**
* @param {?} item
* @return {?}
*/
function (item) {
if (item && item.label) {
this.subscriptionSearch.unsubscribe();
this.searchBox.setValue(item.value);
this.cd.markForCheck();
this.closeElement();
this.emitValue(true, StSearchEventOrigin.LIST);
this.manageSubscription();
}
};
/**
* @return {?}
*/
StSearchComponent.prototype.clearInput = /**
* @return {?}
*/
function () {
this.searchBox.setValue('');
this.closeElement();
this.emitValue(true, StSearchEventOrigin.INPUT);
};
/**
* @return {?}
*/
StSearchComponent.prototype.showAutoCompleteMenu = /**
* @return {?}
*/
function () {
if (this.withAutocomplete && !this.isActive) {
this.openElement();
}
if (this.searchBox.value === '') {
this.closeElement();
}
this.cd.markForCheck();
};
/**
* @private
* @param {?} force
* @param {?} origin
* @return {?}
*/
StSearchComponent.prototype.emitValue = /**
* @private
* @param {?} force
* @param {?} origin
* @return {?}
*/
function (force, origin) {
if (this.isEqualPrevious(force)) {
this.lastEmittedText = this.searchBox.value;
/** @type {?} */
var newSearch = { text: this.lastEmittedText || '', origin: origin };
if (this.filter) {
newSearch.filter = this.filter;
}
this.search.emit(newSearch);
}
};
/**
* @private
* @return {?}
*/
StSearchComponent.prototype.checkDisabled = /**
* @private
* @return {?}
*/
function () {
if (this.disabled) {
this.searchBox.disable();
}
else {
this.searchBox.enable();
}
};
/**
* @private
* @return {?}
*/
StSearchComponent.prototype.canSearch = /**
* @private
* @return {?}
*/
function () {
return this.isDefined() && !this.disabled && this.checkMins();
};
/**
* @private
* @return {?}
*/
StSearchComponent.prototype.isDefined = /**
* @private
* @return {?}
*/
function () {
return this.searchBox && this.searchBox.value !== null && this.searchBox.value !== undefined;
};
/**
* @private
* @return {?}
*/
StSearchComponent.prototype.checkMins = /**
* @private
* @return {?}
*/
function () {
return this.minLength <= (this.searchBox && this.searchBox.value && this.searchBox.value.length) ||
this.searchBox.value.trim().length === 0;
};
/**
* @private
* @param {?} force
* @return {?}
*/
StSearchComponent.prototype.isEqualPrevious = /**
* @private
* @param {?} force
* @return {?}
*/
function (force) {
return this.lastEmittedText !== this.searchBox.value || force;
};
/**
* @private
* @param {?} changes
* @return {?}
*/
StSearchComponent.prototype.checkValueChange = /**
* @private
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes && changes.value) {
if (this.subscriptionSearch) {
this.subscriptionSearch.unsubscribe();
}
this.searchBox.setValue(changes.value.currentValue);
this.manageSubscription();
}
};
/**
* @private
* @param {?} changes
* @return {?}
*/
StSearchComponent.prototype.checkDebounceChange = /**
* @private
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes && changes.debounce) {
this.manageSubscription();
}
};
/**
* @private
* @param {?} changes
* @return {?}
*/
StSearchComponent.prototype.checkDisableChange = /**
* @private
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes && changes.disabled) {
this.checkDisabled();
}
};
/**
* @private
* @param {?} changes
* @return {?}
*/
StSearchComponent.prototype.checkAutoCompleteMenuChange = /**
* @private
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes && changes.autocompleteList) {
this.cd.markForCheck();
}
};
/**
* @private
* @return {?}
*/
StSearchComponent.prototype.manageSubscription = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.subscriptionSearch !== undefined) {
this.subscriptionSearch.unsubscribe();
}
if (this.liveSearch) {
this.subscriptionSearch = this.searchBox
.valueChanges.pipe(debounceTime(this.debounce))
.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) { return _this.launchSearch(false, StSearchEventOrigin.INPUT); }));
}
};
StSearchComponent.decorators = [
{ type: Component, args: [{
selector: 'st-search',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<div class=\"st-search sth-search\">\n <st-select\n *ngIf=\"filterOptions && filterOptions.length > 0\"\n [options]=\"filterOptions\"\n [(ngModel)]=\"filter\"\n [disabled]=\"disabled\"\n name=\"search-filter\"\n (select)=\"onChangeFilter($event)\"\n class=\"sth-search-filter st-search-filter\"\n [ngClass]=\"{'disabled': disabled}\"\n ></st-select>\n\n <st-dropdown-menu [items]=\"autocompleteList\" [attr.id]=\"menuId\" class=\"st-search-box\" (change)=\"changeOption($event)\"\n [active]=\"isActive && (autocompleteList && autocompleteList.length || emptyAutocompleteListMessage !== '')\"\n [placement]=\"'bottom-start'\" [emptyListMessage]=\"emptyAutocompleteListMessage\"\n [keyBoardMove]=\"keyBoardMove\">\n <div #buttonId>\n <input [attr.id]=\"qaTag\" [formControl]=\"searchBox\" [placeholder]=\"placeholder\" (keypress)=\"onKeyPress($event)\"\n (focus)=\"showAutoCompleteMenu()\"\n class=\"st-search-input sth-search-input\"/>\n <i class=\"st-search-icon sth-search-icon icon-search\" tabindex=\"0\" *ngIf=\"!showClear && showIcon\"></i>\n <i class=\"st-search-icon sth-search-icon icon-cross\" tabindex=\"0\" *ngIf=\"showClear\" (mousedown)=\"clearInput()\"\n (keyup.enter)=\"clearInput()\"></i>\n </div>\n </st-dropdown-menu>\n\n</div>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["@charset \"UTF-8\";input{outline:0;border:none;padding:0;height:40px}.st-search{position:relative;display:flex;min-width:100%}.st-search :invalid{box-shadow:none}.st-search-box{display:flex;flex:2 0}.st-search-input{padding-left:12px;padding-right:40px;width:100%}.st-search-filter{flex:auto 1;height:40px;padding:0;max-width:37%}.st-search-icon{position:absolute;right:10px;top:13px;cursor:pointer}.st-search-icon:focus{outline:0}"]
}] }
];
/** @nocollapse */
StSearchComponent.ctorParameters = function () { return [
{ type: Renderer2 },
{ type: ChangeDetectorRef },
{ type: ElementRef, decorators: [{ type: ViewChild, args: ['buttonId', { static: false },] }] }
]; };
StSearchComponent.propDecorators = {
debounce: [{ type: Input }],
liveSearch: [{ type: Input }],
minLength: [{ type: Input }],
placeholder: [{ type: Input }],
qaTag: [{ type: Input }],
value: [{ type: Input }],
disabled: [{ type: Input }],
withAutocomplete: [{ type: Input }],
autocompleteList: [{ type: Input }],
showIcon: [{ type: Input }],
emptyAutocompleteListMessage: [{ type: Input }],
filterOptions: [{ type: Input }],
search: [{ type: Output }],
selectFilter: [{ type: Output }],
keyBoardMove: [{ type: Input }]
};
return StSearchComponent;
}(EventWindowManager));
export { StSearchComponent };
if (false) {
/**
* \@Input {number} [debounce=0] Time elapsed in milliseconds before displaying the autocomplete list
* @type {?}
*/
StSearchComponent.prototype.debounce;
/**
* \@Input {boolean} [liveSearch=true] Boolean to enable or disable the automatic search while the user is typing
* @type {?}
*/
StSearchComponent.prototype.liveSearch;
/**
* \@Input {number} [minLength=0] Minimum of characters typed by the user before launching the search
* @type {?}
*/
StSearchComponent.prototype.minLength;
/**
* \@Input {string} [placeholder='Search'] Text displayed in the search input
* @type {?}
*/
StSearchComponent.prototype.placeholder;
/**
* \@Input {string} [qaTag=''] Label used as id
* @type {?}
*/
StSearchComponent.prototype.qaTag;
/**
* \@Input {string} [value=''] Initial value of the search text
* @type {?}
*/
StSearchComponent.prototype.value;
/**
* \@Input {boolean} [disabled=false] Boolean to enable or disable the search
* @type {?}
*/
StSearchComponent.prototype.disabled;
/**
* \@Input {boolean} [withAutocomplete=false] Enable or disable the autocomplete list when user is typing
* @type {?}
*/
StSearchComponent.prototype.withAutocomplete;
/**
* \@Input {StDropDownMenuItem[]} [autocompleteList=''] List of items displayed in the autocomplete list when user is typing
* @type {?}
*/
StSearchComponent.prototype.autocompleteList;
/**
* \@Input {boolean} [showIcon=true] Boolean to hide/show the loupe icon
* @type {?}
*/
StSearchComponent.prototype.showIcon;
/**
* \@Input {string} [emptyAutocompleteListMessage=''] Message displayed when the autocomplete list is enabled but
* there are not any item with the typed text
* @type {?}
*/
StSearchComponent.prototype.emptyAutocompleteListMessage;
/**
* \@Input {StDropDownMenuItem[]} [filterOptions=''] Options displayed at the filter select. If it is not introduced,
* filter will not be displayed
* @type {?}
*/
StSearchComponent.prototype.filterOptions;
/**
* \@Output { Object(filter?: string, text: string)} [search=''] Event emitted when search is launched. It contains
* the text typed by the user and the filter value selected (only if filter is displayed)
* @type {?}
*/
StSearchComponent.prototype.search;
/**
* \@Output {any} [value=''] Event emitted when filter is changed. It contains
* the filter value selected
* @type {?}
*/
StSearchComponent.prototype.selectFilter;
/**
* \@Input {boolean} [keyBoardMove=false] It is needed to activate navigation through options using the keyboard
* @type {?}
*/
StSearchComponent.prototype.keyBoardMove;
/** @type {?} */
StSearchComponent.prototype.searchBox;
/** @type {?} */
StSearchComponent.prototype.showClear;
/** @type {?} */
StSearchComponent.prototype.filter;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.subscriptionSearch;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.subscriptionSearchClearButton;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.lastEmittedText;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype._render;
/**
* @type {?}
* @private
*/
StSearchComponent.prototype.cd;
/** @type {?} */
StSearchComponent.prototype.buttonElement;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3Qtc2VhcmNoL3N0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFDSix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBaUIsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJ2RTtJQU11Qyw2Q0FBa0I7SUErRHRELDJCQUFvQixPQUFrQixFQUNsQixFQUFxQixFQUNrQixhQUF5QjtRQUZwRixZQUdHLGtCQUFNLE9BQU8sRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLFNBQ25DO1FBSm1CLGFBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsUUFBRSxHQUFGLEVBQUUsQ0FBbUI7UUFDa0IsbUJBQWEsR0FBYixhQUFhLENBQVk7Ozs7UUEvRDNFLGNBQVEsR0FBVyxDQUFDLENBQUM7Ozs7UUFHckIsZ0JBQVUsR0FBWSxJQUFJLENBQUM7Ozs7UUFHM0IsZUFBUyxHQUFXLENBQUMsQ0FBQzs7OztRQUd0QixpQkFBVyxHQUFXLFFBQVEsQ0FBQzs7OztRQVMvQixjQUFRLEdBQVksS0FBSyxDQUFDOzs7O1FBRzFCLHNCQUFnQixHQUFZLEtBQUssQ0FBQzs7OztRQUdsQyxzQkFBZ0IsR0FBeUIsRUFB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QSxBQTFPRCxDQU11QyxrQkFBa0IsR0FvT3hEO1NBcE9ZLGlCQUFpQjs7Ozs7O0lBRTNCLHFDQUE4Qjs7Ozs7SUFHOUIsdUNBQW9DOzs7OztJQUdwQyxzQ0FBK0I7Ozs7O0lBRy9CLHdDQUF3Qzs7Ozs7SUFHeEMsa0NBQXVCOzs7OztJQUd2QixrQ0FBdUI7Ozs7O0lBR3ZCLHFDQUFtQzs7Ozs7SUFHbkMsNkNBQTJDOzs7OztJQUczQyw2Q0FBcUQ7Ozs7O0lBR3JELHFDQUFtQzs7Ozs7O0lBS25DLHlEQUFtRDs7Ozs7O0lBS25ELDBDQUE2Qzs7Ozs7O0lBSzdDLG1DQUFrRjs7Ozs7O0lBS2xGLHlDQUFvRTs7Ozs7SUFJcEUseUNBQXVDOztJQUV2QyxzQ0FBa0Q7O0lBQ2xELHNDQUEwQjs7SUFDMUIsbUNBQXNCOzs7OztJQUV0QiwrQ0FBaUU7Ozs7O0lBQ2pFLDBEQUE0RTs7Ozs7SUFDNUUsNENBQXdEOzs7OztJQUU1QyxvQ0FBMEI7Ozs7O0lBQzFCLCtCQUE2Qjs7SUFDN0IsMENBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIMKpIDIwMTcgU3RyYXRpbyBCaWcgRGF0YSBJbmMuLCBTdWN1cnNhbCBlbiBFc3Bhw7FhLlxuICpcbiAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC5cbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7XG4gKiB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICogU2VlIHRoZSB0ZXJtcyBvZiB0aGUgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wLlxuICovXG5pbXBvcnQge1xuICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgIENvbXBvbmVudCxcbiAgIEVsZW1lbnRSZWYsXG4gICBFdmVudEVtaXR0ZXIsXG4gICBJbnB1dCxcbiAgIE9uQ2hhbmdlcyxcbiAgIE9uRGVzdHJveSxcbiAgIE9uSW5pdCxcbiAgIE91dHB1dCxcbiAgIFJlbmRlcmVyMixcbiAgIFNpbXBsZUNoYW5nZXMsXG4gICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTdERyb3BEb3duTWVudUl0ZW0gfSBmcm9tICcuLi9zdC1kcm9wZG93bi1tZW51L3N0LWRyb3Bkb3duLW1lbnUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEV2ZW50V2luZG93TWFuYWdlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LXdpbmRvdy1tYW5hZ2VyJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN0U2VhcmNoRXZlbnQsIFN0U2VhcmNoRXZlbnRPcmlnaW4gfSBmcm9tICcuL3N0LXNlYXJjaC5tb2RlbCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIHtDb21wb25lbnR9IFtTZWFyY2hdXG4gKlxuICogVGhlIHNlYXJjaCBjb21wb25lbnQgaGFzIGJlZW4gZGVzaWduZWQgdG8gYWxsb3cgdXNlciB0byBmaW5kIGEgc3BlY2lmaWMgY29udGVudCBhY2NvcmRpbmcgdG8gaGlzIG5lZWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICoge2h0bWx9XG4gKlxuICogYGBgXG4gKiBTZWFyY2ggd2l0aG91dCBmaWx0ZXJzXG4gKiAgPHN0LXNlYXJjaCBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbcWFUYWddPVwicWFUYWdcIlxuICogIFt2YWx1ZV09XCJzZWFyY2hlZFwiIFtkZWJvdW5jZV09XCJkZWJvdW5jZVRpbWVcIiBbbWluTGVuZ3RoXT1cIm1pbkxlbmd0aFwiXG4gKiAgKHNlYXJjaCk9XCJvblNlYXJjaFJlc3VsdCgkZXZlbnQpXCI+PC9zdC1zZWFyY2g+XG4gKlxuICpcbiAqIFNlYXJjaCB3aXRoIGZpbHRlcnNcbiAqICA8c3Qtc2VhcmNoIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtxYVRhZ109XCJxYVRhZ1wiXG4gKiAgW3ZhbHVlXT1cInNlYXJjaGVkXCIgW2RlYm91bmNlXT1cImRlYm91bmNlVGltZVwiIFttaW5MZW5ndGhdPVwibWluTGVuZ3RoXCIgW2ZpbHRlck9wdGlvbnNdPVwiW1xuICogIHsgbGFiZWw6ICdBbGwnLCB2YWx1ZTogMSB9LFxuICogIHsgbGFiZWw6ICdUeXBlICcsIHZhbHVlOiAyIH0sXG4gKiAgeyBsYWJlbDogJ0NvbG9yJywgdmFsdWU6IDMgfVxuICogIF1cIiAoc2VhcmNoKT1cIm9uU2VhcmNoUmVzdWx0KCRldmVudClcIj48L3N0LXNlYXJjaD5cbiAqIGBgYFxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LXNlYXJjaCcsXG4gICB0ZW1wbGF0ZVVybDogJy4vc3Qtc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXNlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBFdmVudFdpbmRvd01hbmFnZXIgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgIC8qKiBASW5wdXQge251bWJlcn0gW2RlYm91bmNlPTBdIFRpbWUgZWxhcHNlZCBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIGF1dG9jb21wbGV0ZSBsaXN0ICovXG4gICBASW5wdXQoKSBkZWJvdW5jZTogbnVtYmVyID0gMDtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2xpdmVTZWFyY2g9dHJ1ZV0gQm9vbGVhbiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIHNlYXJjaCB3aGlsZSB0aGUgdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIGxpdmVTZWFyY2g6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAvKiogQElucHV0IHtudW1iZXJ9IFttaW5MZW5ndGg9MF0gTWluaW11bSBvZiBjaGFyYWN0ZXJzIHR5cGVkIGJ5IHRoZSB1c2VyIGJlZm9yZSBsYXVuY2hpbmcgdGhlIHNlYXJjaCAqL1xuICAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtwbGFjZWhvbGRlcj0nU2VhcmNoJ10gVGV4dCBkaXNwbGF5ZWQgaW4gdGhlIHNlYXJjaCBpbnB1dCAqL1xuICAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICdTZWFyY2gnO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtxYVRhZz0nJ10gTGFiZWwgdXNlZCBhcyBpZCAqL1xuICAgQElucHV0KCkgcWFUYWc6IHN0cmluZztcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbdmFsdWU9JyddIEluaXRpYWwgdmFsdWUgb2YgdGhlIHNlYXJjaCB0ZXh0ICovXG4gICBASW5wdXQoKSB2YWx1ZTogc3RyaW5nO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbZGlzYWJsZWQ9ZmFsc2VdIEJvb2xlYW4gdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNlYXJjaCAqL1xuICAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW3dpdGhBdXRvY29tcGxldGU9ZmFsc2VdIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvY29tcGxldGUgbGlzdCB3aGVuIHVzZXIgaXMgdHlwaW5nICovXG4gICBASW5wdXQoKSB3aXRoQXV0b2NvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIC8qKiBASW5wdXQge1N0RHJvcERvd25NZW51SXRlbVtdfSBbYXV0b2NvbXBsZXRlTGlzdD0nJ10gTGlzdCBvZiBpdGVtcyBkaXNwbGF5ZWQgaW4gdGhlIGF1dG9jb21wbGV0ZSBsaXN0IHdoZW4gdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIGF1dG9jb21wbGV0ZUxpc3Q6IFN0RHJvcERvd25NZW51SXRlbVtdID0gW107XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtzaG93SWNvbj10cnVlXSBCb29sZWFuIHRvIGhpZGUvc2hvdyB0aGUgbG91cGUgaWNvbiAqL1xuICAgQElucHV0KCkgc2hvd0ljb246IGJvb2xlYW4gPSAgdHJ1ZTtcblxuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbZW1wdHlBdXRvY29tcGxldGVMaXN0TWVzc2FnZT0nJ10gTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgYXV0b2NvbXBsZXRlIGxpc3QgaXMgZW5hYmxlZCBidXRcbiAgICAqIHRoZXJlIGFyZSBub3QgYW55IGl0ZW0gd2l0aCB0aGUgdHlwZWQgdGV4dFxuICAgICovXG4gICBASW5wdXQoKSBlbXB0eUF1dG9jb21wbGV0ZUxpc3RNZXNzYWdlOiBzdHJpbmcgPSAnJztcblxuICAgLyoqIEBJbnB1dCB7U3REcm9wRG93bk1lbnVJdGVtW119IFtmaWx0ZXJPcHRpb25zPScnXSBPcHRpb25zIGRpc3BsYXllZCBhdCB0aGUgZmlsdGVyIHNlbGVjdC4gSWYgaXQgaXMgbm90IGludHJvZHVjZWQsXG4gICAgKiBmaWx0ZXIgd2lsbCBub3QgYmUgZGlzcGxheWVkXG4gICAgKi9cbiAgIEBJbnB1dCgpIGZpbHRlck9wdGlvbnM6IFN0RHJvcERvd25NZW51SXRlbVtdO1xuXG4gICAvKiogQE91dHB1dCB7IE9iamVjdChmaWx0ZXI/OiBzdHJpbmcsIHRleHQ6IHN0cmluZyl9IFtzZWFyY2g9JyddIEV2ZW50IGVtaXR0ZWQgd2hlbiBzZWFyY2ggaXMgbGF1bmNoZWQuIEl0IGNvbnRhaW5zXG4gICAgKiB0aGUgdGV4dCB0eXBlZCBieSB0aGUgdXNlciBhbmQgdGhlIGZpbHRlciB2YWx1ZSBzZWxlY3RlZCAob25seSBpZiBmaWx0ZXIgaXMgZGlzcGxheWVkKVxuICAgICovXG4gICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8U3RTZWFyY2hFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFN0U2VhcmNoRXZlbnQ+KCk7XG5cbiAgIC8qKiBAT3V0cHV0IHthbnl9IFt2YWx1ZT0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIGZpbHRlciBpcyBjaGFuZ2VkLiBJdCBjb250YWluc1xuICAgICogdGhlIGZpbHRlciB2YWx1ZSBzZWxlY3RlZFxuICAgICovXG4gICBAT3V0cHV0KCkgc2VsZWN0RmlsdGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBba2V5Qm9hcmRNb3ZlPWZhbHNlXSBJdCBpcyBuZWVkZWQgdG8gYWN0aXZhdGUgbmF2aWdhdGlvbiB0aHJvdWdoIG9wdGlvbnMgdXNpbmcgdGhlIGtleWJvYXJkXG4gICAgKi9cbiAgIEBJbnB1dCgpIGtleUJvYXJkTW92ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICBwdWJsaWMgc2VhcmNoQm94OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICAgcHVibGljIHNob3dDbGVhcjogYm9vbGVhbjtcbiAgIHB1YmxpYyBmaWx0ZXI6IHN0cmluZztcblxuICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25TZWFyY2g6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgbGFzdEVtaXR0ZWRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICBAVmlld0NoaWxkKCdidXR0b25JZCcsIHtzdGF0aWM6IGZhbHNlfSkgcHVibGljIGJ1dHRvbkVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgIHN1cGVyKF9yZW5kZXIsIGNkLCBidXR0b25FbGVtZW50KTtcbiAgIH1cblxuICAgZ2V0IG1lbnVJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMucWFUYWcgPyB0aGlzLnFhVGFnICsgJy1hdXRvY29tcGxldGUtbWVudScgOiBudWxsO1xuICAgfVxuXG4gICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvLyBTaG93IGNsZWFyIGJ1dHRvbiBpZiBoYXZlIHRleHRcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24gPSB0aGlzLnNlYXJjaEJveC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMuc2hvd0NsZWFyID0gKHZhbCAmJiB2YWwubGVuZ3RoID4gMCkpO1xuICAgICAgdGhpcy5jaGVja0Rpc2FibGVkKCk7XG4gICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgaWYgKHRoaXMuZmlsdGVyT3B0aW9ucykge1xuICAgICAgICAgdGhpcy5maWx0ZXIgPSB0aGlzLmZpbHRlck9wdGlvbnNbMF0udmFsdWU7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICB0aGlzLmNoZWNrRGVib3VuY2VDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrVmFsdWVDaGFuZ2UoY2hhbmdlcyk7XG4gICAgICB0aGlzLmNoZWNrRGlzYWJsZUNoYW5nZShjaGFuZ2VzKTtcbiAgICAgIHRoaXMuY2hlY2tBdXRvQ29tcGxldGVNZW51Q2hhbmdlKGNoYW5nZXMpO1xuICAgfVxuXG4gICBwdWJsaWMgb25DaGFuZ2VGaWx0ZXIodmFsdWU6IGFueSk6IHZvaWQge1xuICAgICAgdGhpcy5zZWxlY3RGaWx0ZXIuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLmVtaXRWYWx1ZShmYWxzZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5GSUxURVIpO1xuICAgfVxuXG4gICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaENsZWFyQnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICB9XG5cbiAgIHB1YmxpYyBsYXVuY2hTZWFyY2goZm9yY2U6IGJvb2xlYW4sIG9yaWdpbjogU3RTZWFyY2hFdmVudE9yaWdpbik6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuY2FuU2VhcmNoKCkpIHtcbiAgICAgICAgIHRoaXMuc2hvd0F1dG9Db21wbGV0ZU1lbnUoKTtcbiAgICAgICAgIHRoaXMuZW1pdFZhbHVlKGZvcmNlLCBvcmlnaW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICBsZXQga2V5OiBudW1iZXIgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoO1xuICAgICAgaWYgKGtleSA9PT0gMTMpIHtcbiAgICAgICAgIHRoaXMubGF1bmNoU2VhcmNoKHRydWUsIFN0U2VhcmNoRXZlbnRPcmlnaW4uRU5URVIpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgY2hhbmdlT3B0aW9uKGl0ZW06IFN0RHJvcERvd25NZW51SXRlbSk6IHZvaWQge1xuICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5sYWJlbCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKGl0ZW0udmFsdWUpO1xuICAgICAgICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICAgICB0aGlzLmVtaXRWYWx1ZSh0cnVlLCBTdFNlYXJjaEV2ZW50T3JpZ2luLkxJU1QpO1xuICAgICAgICAgdGhpcy5tYW5hZ2VTdWJzY3JpcHRpb24oKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIGNsZWFySW5wdXQoKTogdm9pZCB7XG4gICAgICB0aGlzLnNlYXJjaEJveC5zZXRWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmNsb3NlRWxlbWVudCgpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUodHJ1ZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5JTlBVVCk7XG4gICB9XG5cbiAgIHB1YmxpYyBzaG93QXV0b0NvbXBsZXRlTWVudSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLndpdGhBdXRvY29tcGxldGUgJiYgIXRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgIHRoaXMub3BlbkVsZW1lbnQoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlYXJjaEJveC52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB9XG4gICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgfVxuXG4gICBwcml2YXRlIGVtaXRWYWx1ZShmb3JjZTogYm9vbGVhbiwgb3JpZ2luOiBTdFNlYXJjaEV2ZW50T3JpZ2luKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0VxdWFsUHJldmlvdXMoZm9yY2UpKSB7XG4gICAgICAgICB0aGlzLmxhc3RFbWl0dGVkVGV4dCA9IHRoaXMuc2VhcmNoQm94LnZhbHVlO1xuICAgICAgICAgbGV0IG5ld1NlYXJjaDogU3RTZWFyY2hFdmVudCA9IHt0ZXh0OiB0aGlzLmxhc3RFbWl0dGVkVGV4dCB8fCAnJywgb3JpZ2luOiBvcmlnaW59O1xuICAgICAgICAgaWYgKHRoaXMuZmlsdGVyKSB7XG4gICAgICAgICAgICBuZXdTZWFyY2guZmlsdGVyID0gdGhpcy5maWx0ZXI7XG4gICAgICAgICB9XG4gICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KG5ld1NlYXJjaCk7XG4gICAgICB9XG4gICB9XG5cblxuXG4gICBwcml2YXRlIGNoZWNrRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guZGlzYWJsZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LmVuYWJsZSgpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNhblNlYXJjaCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLmlzRGVmaW5lZCgpICYmICF0aGlzLmRpc2FibGVkICYmIHRoaXMuY2hlY2tNaW5zKCk7XG4gICB9XG5cbiAgIHByaXZhdGUgaXNEZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQm94ICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICE9PSBudWxsICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tNaW5zKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubWluTGVuZ3RoIDw9ICh0aGlzLnNlYXJjaEJveCAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZSAmJiB0aGlzLnNlYXJjaEJveC52YWx1ZS5sZW5ndGgpIHx8XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC52YWx1ZS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgfVxuXG4gICBwcml2YXRlIGlzRXF1YWxQcmV2aW91cyhmb3JjZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdEVtaXR0ZWRUZXh0ICE9PSB0aGlzLnNlYXJjaEJveC52YWx1ZSB8fCBmb3JjZTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja1ZhbHVlQ2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMudmFsdWUpIHtcbiAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCkge1xuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKGNoYW5nZXMudmFsdWUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgIHRoaXMubWFuYWdlU3Vic2NyaXB0aW9uKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tEZWJvdW5jZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmRlYm91bmNlKSB7XG4gICAgICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrRGlzYWJsZUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmRpc2FibGVkKSB7XG4gICAgICAgICB0aGlzLmNoZWNrRGlzYWJsZWQoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0F1dG9Db21wbGV0ZU1lbnVDaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5hdXRvY29tcGxldGVMaXN0KSB7XG4gICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIG1hbmFnZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaC51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGl2ZVNlYXJjaCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2ggPSB0aGlzLnNlYXJjaEJveFxuICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2UpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHRoaXMubGF1bmNoU2VhcmNoKGZhbHNlLCAgU3RTZWFyY2hFdmVudE9yaWdpbi5JTlBVVCkpO1xuICAgICAgfVxuICAgfVxufVxuIl19