UNPKG

@stratio/egeo

Version:
584 lines 42.3 kB
/** * @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) { var _this = _super.call(this, _render, cd) || this; _this._render = _render; _this.cd = cd; /** * \@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 sth-search-icon--search\" tabindex=\"0\" *ngIf=\"!showClear && showIcon\"></i>\n <i class=\"st-search-icon sth-search-icon sth-search-icon--clear\" 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:0;cursor:pointer}.st-search-icon:focus{outline:0}"] }] } ]; /** @nocollapse */ StSearchComponent.ctorParameters = function () { return [ { type: Renderer2 }, { type: ChangeDetectorRef } ]; }; 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 }], _eventElementRef: [{ type: ViewChild, args: ['buttonId', { static: false },] }] }; 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 {?} */ StSearchComponent.prototype._eventElementRef; /** * @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; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzdHJhdGlvL2VnZW8vIiwic291cmNlcyI6WyJsaWIvc3Qtc2VhcmNoL3N0LXNlYXJjaC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQVVBLE9BQU8sRUFDSix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBaUIsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJ2RTtJQU11Qyw2Q0FBa0I7SUFnRXRELDJCQUFvQixPQUFrQixFQUNsQixFQUFxQjtRQUR6QyxZQUVHLGtCQUFNLE9BQU8sRUFBRSxFQUFFLENBQUMsU0FDcEI7UUFIbUIsYUFBTyxHQUFQLE9BQU8sQ0FBVztRQUNsQixRQUFFLEdBQUYsRUFBRSxDQUFtQjs7OztRQS9EaEMsY0FBUSxHQUFXLENBQUMsQ0FBQzs7OztRQUdyQixnQkFBVSxHQUFZLElBQUksQ0FBQzs7OztRQUczQixlQUFTLEdBQVcsQ0FBQyxDQUFDOzs7O1FBR3RCLGlCQUFXLEdBQVcsUUFBUSxDQUFDOzs7O1FBUy9CLGNBQVEsR0FBWSxLQUFLLENBQUM7Ozs7UUFHMUIsc0JBQWdCLEdBQVksS0FBSyxDQUFDOzs7O1FBR2xDLHNCQUFnQixHQUF5QixFQUFFLENBQUM7Ozs7UUFHNUMsY0FBUSxHQUFhLElBQUksQ0FBQzs7Ozs7UUFLMUIsa0NB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OztJQUc5Qix1Q0FBb0M7Ozs7O0lBR3BDLHNDQUErQjs7Ozs7SUFHL0Isd0NBQXdDOzs7OztJQUd4QyxrQ0FBdUI7Ozs7O0lBR3ZCLGtDQUF1Qjs7Ozs7SUFHdkIscUNBQW1DOzs7OztJQUduQyw2Q0FBMkM7Ozs7O0lBRzNDLDZDQUFxRDs7Ozs7SUFHckQscUNBQW1DOzs7Ozs7SUFLbkMseURBQW1EOzs7Ozs7SUFLbkQsMENBQTZDOzs7Ozs7SUFLN0MsbUNBQWtGOzs7Ozs7SUFLbEYseUNBQW9FOzs7OztJQUlwRSx5Q0FBdUM7O0lBRXZDLHNDQUFrRDs7SUFDbEQsc0NBQTBCOztJQUMxQixtQ0FBc0I7O0lBQ3RCLDZDQUE0RTs7Ozs7SUFFNUUsK0NBQWlFOzs7OztJQUNqRSwwREFBNEU7Ozs7O0lBQzVFLDRDQUF3RDs7Ozs7SUFFNUMsb0NBQTBCOzs7OztJQUMxQiwrQkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7XG4gICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgQ29tcG9uZW50LFxuICAgRWxlbWVudFJlZixcbiAgIEV2ZW50RW1pdHRlcixcbiAgIElucHV0LFxuICAgT25DaGFuZ2VzLFxuICAgT25EZXN0cm95LFxuICAgT25Jbml0LFxuICAgT3V0cHV0LFxuICAgUmVuZGVyZXIyLFxuICAgU2ltcGxlQ2hhbmdlcyxcbiAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFN0RHJvcERvd25NZW51SXRlbSB9IGZyb20gJy4uL3N0LWRyb3Bkb3duLW1lbnUvc3QtZHJvcGRvd24tbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRXZlbnRXaW5kb3dNYW5hZ2VyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtd2luZG93LW1hbmFnZXInO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3RTZWFyY2hFdmVudCwgU3RTZWFyY2hFdmVudE9yaWdpbiB9IGZyb20gJy4vc3Qtc2VhcmNoLm1vZGVsJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24ge0NvbXBvbmVudH0gW1NlYXJjaF1cbiAqXG4gKiBUaGUgc2VhcmNoIGNvbXBvbmVudCBoYXMgYmVlbiBkZXNpZ25lZCB0byBhbGxvdyB1c2VyIHRvIGZpbmQgYSBzcGVjaWZpYyBjb250ZW50IGFjY29yZGluZyB0byBoaXMgbmVlZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIFNlYXJjaCB3aXRob3V0IGZpbHRlcnNcbiAqICA8c3Qtc2VhcmNoIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFtxYVRhZ109XCJxYVRhZ1wiXG4gKiAgW3ZhbHVlXT1cInNlYXJjaGVkXCIgW2RlYm91bmNlXT1cImRlYm91bmNlVGltZVwiIFttaW5MZW5ndGhdPVwibWluTGVuZ3RoXCJcbiAqICAoc2VhcmNoKT1cIm9uU2VhcmNoUmVzdWx0KCRldmVudClcIj48L3N0LXNlYXJjaD5cbiAqXG4gKlxuICogU2VhcmNoIHdpdGggZmlsdGVyc1xuICogIDxzdC1zZWFyY2ggW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW3FhVGFnXT1cInFhVGFnXCJcbiAqICBbdmFsdWVdPVwic2VhcmNoZWRcIiBbZGVib3VuY2VdPVwiZGVib3VuY2VUaW1lXCIgW21pbkxlbmd0aF09XCJtaW5MZW5ndGhcIiBbZmlsdGVyT3B0aW9uc109XCJbXG4gKiAgeyBsYWJlbDogJ0FsbCcsIHZhbHVlOiAxIH0sXG4gKiAgeyBsYWJlbDogJ1R5cGUgJywgdmFsdWU6IDIgfSxcbiAqICB7IGxhYmVsOiAnQ29sb3InLCB2YWx1ZTogMyB9XG4gKiAgXVwiIChzZWFyY2gpPVwib25TZWFyY2hSZXN1bHQoJGV2ZW50KVwiPjwvc3Qtc2VhcmNoPlxuICogYGBgXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnc3Qtc2VhcmNoJyxcbiAgIHRlbXBsYXRlVXJsOiAnLi9zdC1zZWFyY2guY29tcG9uZW50Lmh0bWwnLFxuICAgc3R5bGVVcmxzOiBbJy4vc3Qtc2VhcmNoLmNvbXBvbmVudC5zY3NzJ10sXG4gICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTdFNlYXJjaENvbXBvbmVudCBleHRlbmRzIEV2ZW50V2luZG93TWFuYWdlciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQge1xuICAgLyoqIEBJbnB1dCB7bnVtYmVyfSBbZGVib3VuY2U9MF0gVGltZSBlbGFwc2VkIGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgZGlzcGxheWluZyB0aGUgYXV0b2NvbXBsZXRlIGxpc3QgKi9cbiAgIEBJbnB1dCgpIGRlYm91bmNlOiBudW1iZXIgPSAwO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbbGl2ZVNlYXJjaD10cnVlXSBCb29sZWFuIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgc2VhcmNoIHdoaWxlIHRoZSB1c2VyIGlzIHR5cGluZyAqL1xuICAgQElucHV0KCkgbGl2ZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7XG5cbiAgIC8qKiBASW5wdXQge251bWJlcn0gW21pbkxlbmd0aD0wXSBNaW5pbXVtIG9mIGNoYXJhY3RlcnMgdHlwZWQgYnkgdGhlIHVzZXIgYmVmb3JlIGxhdW5jaGluZyB0aGUgc2VhcmNoICovXG4gICBASW5wdXQoKSBtaW5MZW5ndGg6IG51bWJlciA9IDA7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW3BsYWNlaG9sZGVyPSdTZWFyY2gnXSBUZXh0IGRpc3BsYXllZCBpbiB0aGUgc2VhcmNoIGlucHV0ICovXG4gICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCc7XG5cbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW3FhVGFnPScnXSBMYWJlbCB1c2VkIGFzIGlkICovXG4gICBASW5wdXQoKSBxYVRhZzogc3RyaW5nO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFt2YWx1ZT0nJ10gSW5pdGlhbCB2YWx1ZSBvZiB0aGUgc2VhcmNoIHRleHQgKi9cbiAgIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmc7XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtkaXNhYmxlZD1mYWxzZV0gQm9vbGVhbiB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2VhcmNoICovXG4gICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAvKiogQElucHV0IHtib29sZWFufSBbd2l0aEF1dG9jb21wbGV0ZT1mYWxzZV0gRW5hYmxlIG9yIGRpc2FibGUgdGhlIGF1dG9jb21wbGV0ZSBsaXN0IHdoZW4gdXNlciBpcyB0eXBpbmcgKi9cbiAgIEBJbnB1dCgpIHdpdGhBdXRvY29tcGxldGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgLyoqIEBJbnB1dCB7U3REcm9wRG93bk1lbnVJdGVtW119IFthdXRvY29tcGxldGVMaXN0PScnXSBMaXN0IG9mIGl0ZW1zIGRpc3BsYXllZCBpbiB0aGUgYXV0b2NvbXBsZXRlIGxpc3Qgd2hlbiB1c2VyIGlzIHR5cGluZyAqL1xuICAgQElucHV0KCkgYXV0b2NvbXBsZXRlTGlzdDogU3REcm9wRG93bk1lbnVJdGVtW10gPSBbXTtcblxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW3Nob3dJY29uPXRydWVdIEJvb2xlYW4gdG8gaGlkZS9zaG93IHRoZSBsb3VwZSBpY29uICovXG4gICBASW5wdXQoKSBzaG93SWNvbjogYm9vbGVhbiA9ICB0cnVlO1xuXG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtlbXB0eUF1dG9jb21wbGV0ZUxpc3RNZXNzYWdlPScnXSBNZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSBhdXRvY29tcGxldGUgbGlzdCBpcyBlbmFibGVkIGJ1dFxuICAgICogdGhlcmUgYXJlIG5vdCBhbnkgaXRlbSB3aXRoIHRoZSB0eXBlZCB0ZXh0XG4gICAgKi9cbiAgIEBJbnB1dCgpIGVtcHR5QXV0b2NvbXBsZXRlTGlzdE1lc3NhZ2U6IHN0cmluZyA9ICcnO1xuXG4gICAvKiogQElucHV0IHtTdERyb3BEb3duTWVudUl0ZW1bXX0gW2ZpbHRlck9wdGlvbnM9JyddIE9wdGlvbnMgZGlzcGxheWVkIGF0IHRoZSBmaWx0ZXIgc2VsZWN0LiBJZiBpdCBpcyBub3QgaW50cm9kdWNlZCxcbiAgICAqIGZpbHRlciB3aWxsIG5vdCBiZSBkaXNwbGF5ZWRcbiAgICAqL1xuICAgQElucHV0KCkgZmlsdGVyT3B0aW9uczogU3REcm9wRG93bk1lbnVJdGVtW107XG5cbiAgIC8qKiBAT3V0cHV0IHsgT2JqZWN0KGZpbHRlcj86IHN0cmluZywgdGV4dDogc3RyaW5nKX0gW3NlYXJjaD0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIHNlYXJjaCBpcyBsYXVuY2hlZC4gSXQgY29udGFpbnNcbiAgICAqIHRoZSB0ZXh0IHR5cGVkIGJ5IHRoZSB1c2VyIGFuZCB0aGUgZmlsdGVyIHZhbHVlIHNlbGVjdGVkIChvbmx5IGlmIGZpbHRlciBpcyBkaXNwbGF5ZWQpXG4gICAgKi9cbiAgIEBPdXRwdXQoKSBzZWFyY2g6IEV2ZW50RW1pdHRlcjxTdFNlYXJjaEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8U3RTZWFyY2hFdmVudD4oKTtcblxuICAgLyoqIEBPdXRwdXQge2FueX0gW3ZhbHVlPScnXSBFdmVudCBlbWl0dGVkIHdoZW4gZmlsdGVyIGlzIGNoYW5nZWQuIEl0IGNvbnRhaW5zXG4gICAgKiB0aGUgZmlsdGVyIHZhbHVlIHNlbGVjdGVkXG4gICAgKi9cbiAgIEBPdXRwdXQoKSBzZWxlY3RGaWx0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFtrZXlCb2FyZE1vdmU9ZmFsc2VdIEl0IGlzIG5lZWRlZCB0byBhY3RpdmF0ZSBuYXZpZ2F0aW9uIHRocm91Z2ggb3B0aW9ucyB1c2luZyB0aGUga2V5Ym9hcmRcbiAgICAqL1xuICAgQElucHV0KCkga2V5Qm9hcmRNb3ZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgIHB1YmxpYyBzZWFyY2hCb3g6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG4gICBwdWJsaWMgc2hvd0NsZWFyOiBib29sZWFuO1xuICAgcHVibGljIGZpbHRlcjogc3RyaW5nO1xuICAgQFZpZXdDaGlsZCgnYnV0dG9uSWQnLCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyBfZXZlbnRFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gICBwcml2YXRlIHN1YnNjcmlwdGlvblNlYXJjaDogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25TZWFyY2hDbGVhckJ1dHRvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgcHJpdmF0ZSBsYXN0RW1pdHRlZFRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgICAgc3VwZXIoX3JlbmRlciwgY2QpO1xuICAgfVxuXG4gICBnZXQgbWVudUlkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5xYVRhZyA/IHRoaXMucWFUYWcgKyAnLWF1dG9jb21wbGV0ZS1tZW51JyA6IG51bGw7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vIFNob3cgY2xlYXIgYnV0dG9uIGlmIGhhdmUgdGV4dFxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2hDbGVhckJ1dHRvbiA9IHRoaXMuc2VhcmNoQm94LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbCkgPT4gdGhpcy5zaG93Q2xlYXIgPSAodmFsICYmIHZhbC5sZW5ndGggPiAwKSk7XG4gICAgICB0aGlzLmNoZWNrRGlzYWJsZWQoKTtcbiAgICAgIHRoaXMubWFuYWdlU3Vic2NyaXB0aW9uKCk7XG4gICAgICBpZiAodGhpcy5maWx0ZXJPcHRpb25zKSB7XG4gICAgICAgICB0aGlzLmZpbHRlciA9IHRoaXMuZmlsdGVyT3B0aW9uc1swXS52YWx1ZTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIHRoaXMuY2hlY2tEZWJvdW5jZUNoYW5nZShjaGFuZ2VzKTtcbiAgICAgIHRoaXMuY2hlY2tWYWx1ZUNoYW5nZShjaGFuZ2VzKTtcbiAgICAgIHRoaXMuY2hlY2tEaXNhYmxlQ2hhbmdlKGNoYW5nZXMpO1xuICAgICAgdGhpcy5jaGVja0F1dG9Db21wbGV0ZU1lbnVDaGFuZ2UoY2hhbmdlcyk7XG4gICB9XG5cbiAgIHB1YmxpYyBvbkNoYW5nZUZpbHRlcih2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICB0aGlzLnNlbGVjdEZpbHRlci5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMuZW1pdFZhbHVlKGZhbHNlLCBTdFNlYXJjaEV2ZW50T3JpZ2luLkZJTFRFUik7XG4gICB9XG5cbiAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaC51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoQ2xlYXJCdXR0b24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25TZWFyY2hDbGVhckJ1dHRvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5jbG9zZUVsZW1lbnQoKTtcbiAgIH1cblxuICAgcHVibGljIGxhdW5jaFNlYXJjaChmb3JjZTogYm9vbGVhbiwgb3JpZ2luOiBTdFNlYXJjaEV2ZW50T3JpZ2luKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5jYW5TZWFyY2goKSkge1xuICAgICAgICAgdGhpcy5zaG93QXV0b0NvbXBsZXRlTWVudSgpO1xuICAgICAgICAgdGhpcy5lbWl0VmFsdWUoZm9yY2UsIG9yaWdpbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgdGhpcy5jbG9zZUVsZW1lbnQoKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHVibGljIG9uS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgIGxldCBrZXk6IG51bWJlciA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XG4gICAgICBpZiAoa2V5ID09PSAxMykge1xuICAgICAgICAgdGhpcy5sYXVuY2hTZWFyY2godHJ1ZSwgU3RTZWFyY2hFdmVudE9yaWdpbi5FTlRFUik7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBjaGFuZ2VPcHRpb24oaXRlbTogU3REcm9wRG93bk1lbnVJdGVtKTogdm9pZCB7XG4gICAgICBpZiAoaXRlbSAmJiBpdGVtLmxhYmVsKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaC51bnN1YnNjcmliZSgpO1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guc2V0VmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgdGhpcy5jbG9zZUVsZW1lbnQoKTtcbiAgICAgICAgIHRoaXMuZW1pdFZhbHVlKHRydWUsIFN0U2VhcmNoRXZlbnRPcmlnaW4uTElTVCk7XG4gICAgICAgICB0aGlzLm1hbmFnZVN1YnNjcmlwdGlvbigpO1xuICAgICAgfVxuICAgfVxuXG4gICBwdWJsaWMgY2xlYXJJbnB1dCgpOiB2b2lkIHtcbiAgICAgIHRoaXMuc2VhcmNoQm94LnNldFZhbHVlKCcnKTtcbiAgICAgIHRoaXMuY2xvc2VFbGVtZW50KCk7XG4gICAgICB0aGlzLmVtaXRWYWx1ZSh0cnVlLCBTdFNlYXJjaEV2ZW50T3JpZ2luLklOUFVUKTtcbiAgIH1cblxuICAgcHVibGljIHNob3dBdXRvQ29tcGxldGVNZW51KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMud2l0aEF1dG9jb21wbGV0ZSAmJiAhdGhpcy5pc0FjdGl2ZSkge1xuICAgICAgICAgdGhpcy5vcGVuRWxlbWVudCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VhcmNoQm94LnZhbHVlID09PSAnJykge1xuICAgICAgICAgdGhpcy5jbG9zZUVsZW1lbnQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIHByaXZhdGUgZW1pdFZhbHVlKGZvcmNlOiBib29sZWFuLCBvcmlnaW46IFN0U2VhcmNoRXZlbnRPcmlnaW4pOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzRXF1YWxQcmV2aW91cyhmb3JjZSkpIHtcbiAgICAgICAgIHRoaXMubGFzdEVtaXR0ZWRUZXh0ID0gdGhpcy5zZWFyY2hCb3gudmFsdWU7XG4gICAgICAgICBsZXQgbmV3U2VhcmNoOiBTdFNlYXJjaEV2ZW50ID0ge3RleHQ6IHRoaXMubGFzdEVtaXR0ZWRUZXh0IHx8ICcnLCBvcmlnaW46IG9yaWdpbn07XG4gICAgICAgICBpZiAodGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgIG5ld1NlYXJjaC5maWx0ZXIgPSB0aGlzLmZpbHRlcjtcbiAgICAgICAgIH1cbiAgICAgICAgIHRoaXMuc2VhcmNoLmVtaXQobmV3U2VhcmNoKTtcbiAgICAgIH1cbiAgIH1cblxuXG5cbiAgIHByaXZhdGUgY2hlY2tEaXNhYmxlZCgpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICB0aGlzLnNlYXJjaEJveC5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgdGhpcy5zZWFyY2hCb3guZW5hYmxlKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2FuU2VhcmNoKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaXNEZWZpbmVkKCkgJiYgIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5jaGVja01pbnMoKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBpc0RlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hCb3ggJiYgdGhpcy5zZWFyY2hCb3gudmFsdWUgIT09IG51bGwgJiYgdGhpcy5zZWFyY2hCb3gudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja01pbnMoKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5taW5MZW5ndGggPD0gKHRoaXMuc2VhcmNoQm94ICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlICYmIHRoaXMuc2VhcmNoQm94LnZhbHVlLmxlbmd0aCkgfHxcbiAgICAgICAgIHRoaXMuc2VhcmNoQm94LnZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDA7XG4gICB9XG5cbiAgIHByaXZhdGUgaXNFcXVhbFByZXZpb3VzKGZvcmNlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gdGhpcy5sYXN0RW1pdHRlZFRleHQgIT09IHRoaXMuc2VhcmNoQm94LnZhbHVlIHx8IGZvcmNlO1xuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrVmFsdWVDaGFuZ2UoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy52YWx1ZSkge1xuICAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoKSB7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaC51bnN1YnNjcmliZSgpO1xuICAgICAgICAgfVxuICAgICAgICAgdGhpcy5zZWFyY2hCb3guc2V0VmFsdWUoY2hhbmdlcy52YWx1ZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgdGhpcy5tYW5hZ2VTdWJzY3JpcHRpb24oKTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0RlYm91bmNlQ2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuZGVib3VuY2UpIHtcbiAgICAgICAgIHRoaXMubWFuYWdlU3Vic2NyaXB0aW9uKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tEaXNhYmxlQ2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXMuZGlzYWJsZWQpIHtcbiAgICAgICAgIHRoaXMuY2hlY2tEaXNhYmxlZCgpO1xuICAgICAgfVxuICAgfVxuXG4gICBwcml2YXRlIGNoZWNrQXV0b0NvbXBsZXRlTWVudUNoYW5nZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmF1dG9jb21wbGV0ZUxpc3QpIHtcbiAgICAgICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgbWFuYWdlU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uU2VhcmNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5saXZlU2VhcmNoKSB7XG4gICAgICAgICB0aGlzLnN1YnNjcmlwdGlvblNlYXJjaCA9IHRoaXMuc2VhcmNoQm94XG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChldmVudCkgPT4gdGhpcy5sYXVuY2hTZWFyY2goZmFsc2UsICBTdFNlYXJjaEV2ZW50T3JpZ2luLklOUFVUKSk7XG4gICAgICB9XG4gICB9XG59XG4iXX0=