UNPKG

solar-ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

518 lines (517 loc) 47.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, EventEmitter, Input, Output, QueryList, ViewChildren } from '@angular/core'; import { isNotNil } from '../core/util/check'; import { NzOptionComponent } from './nz-option.component'; import { merge, Subject } from 'rxjs'; import { NzOptionLiComponent } from './nz-option-li.component'; import { defaultFilterOption, NzOptionPipe } from './nz-option.pipe'; var NzOptionContainerComponent = /** @class */ (function () { function NzOptionContainerComponent() { this.isInit = false; this.isAddTagOptionDisplay = false; this.listOfAllTemplateOption = []; this.listOfTagOption = []; this.listOfFilterOption = []; // tslint:disable-next-line:no-any this.nzListOfSelectedValueChange = new EventEmitter(); this.nzListOfTemplateOptionChange = new EventEmitter(); this.nzClickOption = new EventEmitter(); this.nzScrollToBottom = new EventEmitter(); this.nzMode = 'default'; this.nzServerSearch = false; this.nzFilterOption = defaultFilterOption; this.nzMaxMultipleCount = Infinity; // tslint:disable-next-line:no-any this.compareWith = function (o1, o2) { return o1 === o2; }; } Object.defineProperty(NzOptionContainerComponent.prototype, "nzSearchValue", { get: /** * @return {?} */ function () { return this._searchValue; }, set: /** * @param {?} value * @return {?} */ function (value) { this._searchValue = value; this.updateAddTagOptionDisplay(); this.updateListOfFilterOption(); }, enumerable: true, configurable: true }); Object.defineProperty(NzOptionContainerComponent.prototype, "nzListOfSelectedValue", { // tslint:disable-next-line:no-any get: /** * @return {?} */ function () { return this._listOfSelectedValue; }, set: /** * @param {?} value * @return {?} */ function (value) { if (this._listOfSelectedValue !== value) { this._listOfSelectedValue = value; /** should clear activedOption when listOfSelectedValue change **/ this.clearActivatedOption(); this.refreshAllOptionStatus(false); } }, enumerable: true, configurable: true }); /** * @return {?} */ NzOptionContainerComponent.prototype.addTagOption = /** * @return {?} */ function () { if (this.nzListOfSelectedValue.length < this.nzMaxMultipleCount) { this.nzListOfSelectedValue = tslib_1.__spread(this.nzListOfSelectedValue, [this.nzSearchValue]); this.nzListOfSelectedValueChange.emit(this.nzListOfSelectedValue); } }; /** * @param {?} option * @param {?} isPressEnter * @return {?} */ NzOptionContainerComponent.prototype.clickOption = /** * @param {?} option * @param {?} isPressEnter * @return {?} */ function (option, isPressEnter) { this.updateSelectedOption(option, isPressEnter); this.nzClickOption.emit(); }; /** * @param {?} e * @return {?} */ NzOptionContainerComponent.prototype.onKeyDownUl = /** * @param {?} e * @return {?} */ function (e) { var _this = this; if ([38, 40, 13].indexOf(e.keyCode) > -1) { e.preventDefault(); /** @type {?} */ var activeIndex = this.listOfFilterOption.findIndex(function (item) { return item === _this.activatedOption; }); if (e.keyCode === 38) { /** @type {?} */ var preIndex = activeIndex > 0 ? (activeIndex - 1) : (this.listOfFilterOption.length - 1); this.setActiveOption(this.listOfFilterOption[preIndex]); } else if (e.keyCode === 40) { /** @type {?} */ var nextIndex = activeIndex < this.listOfFilterOption.length - 1 ? (activeIndex + 1) : 0; this.setActiveOption(this.listOfFilterOption[nextIndex]); } else if (e.keyCode === 13) { // enter if (this.isTagsMode) { if (!this.isAddTagOptionDisplay) { this.clickOption(this.activatedOption, true); } else { this.addTagOption(); this.nzClickOption.emit(); } } else { this.clickOption(this.activatedOption, true); } } } }; /** * @return {?} */ NzOptionContainerComponent.prototype.resetActiveOption = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var firstActiveOption = this.listOfAllTemplateOption.concat(this.listOfTagOption).find(function (item) { return _this.compareWith(item.nzValue, _this.nzListOfSelectedValue[0]); }); this.setActiveOption(firstActiveOption); }; /** * @return {?} */ NzOptionContainerComponent.prototype.clearActivatedOption = /** * @return {?} */ function () { this.setActiveOption(null); }; /** * @param {?} option * @param {?=} scroll * @return {?} */ NzOptionContainerComponent.prototype.setActiveOption = /** * @param {?} option * @param {?=} scroll * @return {?} */ function (option, scroll) { if (scroll === void 0) { scroll = true; } this.activatedOption = option; if (scroll) { this.scrollIntoView(); } }; /** * @return {?} */ NzOptionContainerComponent.prototype.scrollIntoView = /** * @return {?} */ function () { var _this = this; if (this.listOfNzOptionLiComponent && this.listOfNzOptionLiComponent.length) { /** @type {?} */ var targetOption_1 = this.listOfNzOptionLiComponent.find(function (o) { return o.nzOption === _this.activatedOption; }); /* tslint:disable-next-line:no-string-literal */ if (targetOption_1 && targetOption_1.el && targetOption_1.el['scrollIntoViewIfNeeded']) { /* tslint:disable-next-line:no-string-literal */ setTimeout(function () { return targetOption_1.el['scrollIntoViewIfNeeded'](false); }, 150); } } }; /** * @param {?} option * @param {?} isPressEnter * @return {?} */ NzOptionContainerComponent.prototype.updateSelectedOption = /** * @param {?} option * @param {?} isPressEnter * @return {?} */ function (option, isPressEnter) { var _this = this; /** update listOfSelectedOption -> update nzListOfSelectedValue -> emit nzListOfSelectedValueChange **/ if (option && !option.nzDisabled) { /** @type {?} */ var changed = false; this.setActiveOption(option); /** @type {?} */ var listOfSelectedValue = tslib_1.__spread(this.nzListOfSelectedValue); if (this.isMultipleOrTags) { /** @type {?} */ var targetValue = listOfSelectedValue.find(function (o) { return _this.compareWith(o, option.nzValue); }); if (isNotNil(targetValue)) { if (!isPressEnter) { /** should not toggle option when press enter **/ listOfSelectedValue.splice(listOfSelectedValue.indexOf(targetValue), 1); changed = true; } } else if (this.nzListOfSelectedValue.length < this.nzMaxMultipleCount) { listOfSelectedValue.push(option.nzValue); changed = true; } } else if (!this.compareWith(listOfSelectedValue[0], option.nzValue)) { listOfSelectedValue = [option.nzValue]; changed = true; } /** update selectedValues when click option **/ if (changed) { this._listOfSelectedValue = listOfSelectedValue; this.nzListOfSelectedValueChange.emit(this.nzListOfSelectedValue); if (this.isTagsMode) { this.refreshAllOptionStatus(false); } } } }; /** * @return {?} */ NzOptionContainerComponent.prototype.refreshListOfTagOption = /** * @return {?} */ function () { var _this = this; if (this.isTagsMode) { /** * * refresh tags option * @type {?} */ var listOfTagsOption_1 = []; this.nzListOfSelectedValue.forEach(function (value) { /** @type {?} */ var existedOption = _this.listOfAllTemplateOption.find(function (o) { return _this.compareWith(o.nzValue, value); }); if (!existedOption) { /** @type {?} */ var nzOptionComponent = new NzOptionComponent(); nzOptionComponent.nzValue = value; nzOptionComponent.nzLabel = value; listOfTagsOption_1.push(nzOptionComponent); } }); this.listOfTagOption = listOfTagsOption_1; } }; /** * @return {?} */ NzOptionContainerComponent.prototype.refreshListOfAllTemplateOption = /** * @return {?} */ function () { var _this = this; this.listOfAllTemplateOption = this.listOfNzOptionComponent.toArray().concat(this.listOfNzOptionGroupComponent.toArray().reduce(function (pre, cur) { return tslib_1.__spread(pre, cur.listOfNzOptionComponent.toArray()); }, [])); Promise.resolve().then(function () { return _this.nzListOfTemplateOptionChange.emit(_this.listOfAllTemplateOption); }); }; /** * @param {?} isTemplateOptionChange * @return {?} */ NzOptionContainerComponent.prototype.refreshAllOptionStatus = /** * @param {?} isTemplateOptionChange * @return {?} */ function (isTemplateOptionChange) { /** update nzListOfSelectedValue | update option list -> update listOfAllTemplateOption -> update listOfSelectedOption -> update activatedOption **/ if (this.isInit) { if (isTemplateOptionChange) { this.refreshListOfAllTemplateOption(); } this.refreshListOfTagOption(); this.updateListOfFilterOption(); this.updateAddTagOptionDisplay(); } }; /** * @return {?} */ NzOptionContainerComponent.prototype.updateListOfFilterOption = /** * @return {?} */ function () { this.listOfFilterOption = /** @type {?} */ (new NzOptionPipe().transform(this.listOfAllTemplateOption.concat(this.listOfTagOption), this.nzSearchValue, this.nzFilterOption, this.nzServerSearch)); if (this.nzSearchValue) { this.setActiveOption(this.listOfFilterOption[0]); } }; /** watch options change in option group **/ /** * watch options change in option group * * @return {?} */ NzOptionContainerComponent.prototype.watchSubOptionChanges = /** * watch options change in option group * * @return {?} */ function () { var _this = this; this.unsubscribeOption(); /** @type {?} */ var optionChanges$ = merge(new Subject().asObservable(), this.listOfNzOptionGroupComponent.changes, this.listOfNzOptionComponent.changes); if (this.listOfNzOptionGroupComponent.length) { this.listOfNzOptionGroupComponent.forEach(function (group) { return optionChanges$ = group.listOfNzOptionComponent ? merge(group.listOfNzOptionComponent.changes, optionChanges$) : optionChanges$; }); } this.optionSubscription = optionChanges$.subscribe(function () { return _this.refreshAllOptionStatus(true); }); }; /** * @return {?} */ NzOptionContainerComponent.prototype.unsubscribeGroup = /** * @return {?} */ function () { if (this.groupSubscription) { this.groupSubscription.unsubscribe(); this.groupSubscription = null; } }; /** * @return {?} */ NzOptionContainerComponent.prototype.unsubscribeOption = /** * @return {?} */ function () { if (this.optionSubscription) { this.optionSubscription.unsubscribe(); this.optionSubscription = null; } }; Object.defineProperty(NzOptionContainerComponent.prototype, "isTagsMode", { get: /** * @return {?} */ function () { return this.nzMode === 'tags'; }, enumerable: true, configurable: true }); Object.defineProperty(NzOptionContainerComponent.prototype, "isMultipleOrTags", { get: /** * @return {?} */ function () { return this.nzMode === 'tags' || this.nzMode === 'multiple'; }, enumerable: true, configurable: true }); Object.defineProperty(NzOptionContainerComponent.prototype, "isNotFoundDisplay", { get: /** * @return {?} */ function () { return (!this.isTagsMode) && (!this.listOfFilterOption.length); }, enumerable: true, configurable: true }); /** * @return {?} */ NzOptionContainerComponent.prototype.updateAddTagOptionDisplay = /** * @return {?} */ function () { /** @type {?} */ var listOfAllOption = this.listOfAllTemplateOption.concat(this.listOfTagOption).map(function (item) { return item.nzLabel; }); /** @type {?} */ var isMatch = listOfAllOption.indexOf(this.nzSearchValue) > -1; this.isAddTagOptionDisplay = this.isTagsMode && this.nzSearchValue && (!isMatch); }; /** * @param {?} e * @param {?} ul * @return {?} */ NzOptionContainerComponent.prototype.dropDownScroll = /** * @param {?} e * @param {?} ul * @return {?} */ function (e, ul) { e.preventDefault(); e.stopPropagation(); if (ul && (ul.scrollHeight - ul.scrollTop === ul.clientHeight)) { this.nzScrollToBottom.emit(); } }; /** * @return {?} */ NzOptionContainerComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { var _this = this; this.isInit = true; this.refreshAllOptionStatus(true); this.watchSubOptionChanges(); this.groupSubscription = this.listOfNzOptionGroupComponent.changes.subscribe(function () { return _this.watchSubOptionChanges(); }); }; /** * @return {?} */ NzOptionContainerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.unsubscribeGroup(); this.unsubscribeOption(); }; NzOptionContainerComponent.decorators = [ { type: Component, args: [{ selector: '[nz-option-container]', preserveWhitespaces: false, template: "<ul\n #dropdownUl\n class=\"ant-select-dropdown-menu ant-select-dropdown-menu-root ant-select-dropdown-menu-vertical\"\n role=\"menu\"\n (keydown)=\"onKeyDownUl($event)\"\n (scroll)=\"dropDownScroll($event,dropdownUl)\"\n tabindex=\"0\">\n <li\n *ngIf=\"isNotFoundDisplay\"\n nz-select-unselectable\n class=\"ant-select-dropdown-menu-item ant-select-dropdown-menu-item-disabled\">\n {{ nzNotFoundContent ? nzNotFoundContent : ('Select.notFoundContent' | nzI18n) }}\n </li>\n <li\n *ngIf=\"isAddTagOptionDisplay\"\n nz-select-unselectable\n (click)=\"addTagOption()\"\n class=\"ant-select-dropdown-menu-item ant-select-dropdown-menu-item-active\">\n {{ nzSearchValue }}\n </li>\n <li\n nz-option-li\n [nzMode]=\"nzMode\"\n [compareWith]=\"compareWith\"\n *ngFor=\"let option of listOfNzOptionComponent | nzFilterOptionPipe : nzSearchValue : nzFilterOption : nzServerSearch \"\n (click)=\"clickOption(option,false)\"\n [nzActiveOption]=\"activatedOption\"\n [nzOption]=\"option\"\n [nzListOfSelectedValue]=\"nzListOfSelectedValue\">\n </li>\n <li\n *ngFor=\"let group of listOfNzOptionGroupComponent | nzSubFilterOptionPipe : nzSearchValue : nzFilterOption : nzServerSearch\"\n class=\"ant-select-dropdown-menu-item-group\">\n <div\n class=\"ant-select-dropdown-menu-item-group-title\"\n [attr.title]=\"group.isLabelString ? group.nzLabel : ''\">\n <ng-container *ngIf=\"group.isLabelString; else labelTemplate\">{{ group.nzLabel }}</ng-container>\n <ng-template #labelTemplate>\n <ng-template [ngTemplateOutlet]=\"group.nzLabel\"></ng-template>\n </ng-template>\n </div>\n <ul class=\"ant-select-dropdown-menu-item-group-list\">\n <li\n nz-option-li\n [nzMode]=\"nzMode\"\n [compareWith]=\"compareWith\"\n *ngFor=\"let option of group.listOfNzOptionComponent | nzFilterOptionPipe : nzSearchValue : nzFilterOption : nzServerSearch\"\n (click)=\"clickOption(option,false)\"\n [nzActiveOption]=\"activatedOption\"\n [nzShowActive]=\"!isAddTagOptionDisplay\"\n [nzOption]=\"option\"\n [nzListOfSelectedValue]=\"nzListOfSelectedValue\">\n </li>\n </ul>\n </li>\n <li\n nz-option-li\n [nzMode]=\"nzMode\"\n [compareWith]=\"compareWith\"\n *ngFor=\"let option of listOfTagOption | nzFilterOptionPipe : nzSearchValue : nzFilterOption : nzServerSearch \"\n (click)=\"clickOption(option,false)\"\n [nzActiveOption]=\"activatedOption\"\n [nzShowActive]=\"!isAddTagOptionDisplay\"\n [nzOption]=\"option\"\n [nzListOfSelectedValue]=\"nzListOfSelectedValue\">\n </li>\n</ul>" }] } ]; NzOptionContainerComponent.propDecorators = { listOfNzOptionLiComponent: [{ type: ViewChildren, args: [NzOptionLiComponent,] }], listOfNzOptionComponent: [{ type: Input }], listOfNzOptionGroupComponent: [{ type: Input }], nzListOfSelectedValueChange: [{ type: Output }], nzListOfTemplateOptionChange: [{ type: Output }], nzClickOption: [{ type: Output }], nzScrollToBottom: [{ type: Output }], nzMode: [{ type: Input }], nzServerSearch: [{ type: Input }], nzFilterOption: [{ type: Input }], nzMaxMultipleCount: [{ type: Input }], nzNotFoundContent: [{ type: Input }], compareWith: [{ type: Input }], nzSearchValue: [{ type: Input }], nzListOfSelectedValue: [{ type: Input }] }; return NzOptionContainerComponent; }()); export { NzOptionContainerComponent }; function NzOptionContainerComponent_tsickle_Closure_declarations() { /** @type {?} */ NzOptionContainerComponent.prototype._listOfSelectedValue; /** @type {?} */ NzOptionContainerComponent.prototype._searchValue; /** @type {?} */ NzOptionContainerComponent.prototype.isInit; /** @type {?} */ NzOptionContainerComponent.prototype.isAddTagOptionDisplay; /** @type {?} */ NzOptionContainerComponent.prototype.listOfAllTemplateOption; /** @type {?} */ NzOptionContainerComponent.prototype.optionSubscription; /** @type {?} */ NzOptionContainerComponent.prototype.groupSubscription; /** @type {?} */ NzOptionContainerComponent.prototype.listOfTagOption; /** @type {?} */ NzOptionContainerComponent.prototype.listOfFilterOption; /** @type {?} */ NzOptionContainerComponent.prototype.activatedOption; /** * can not use ViewChild since it will match sub options in option group * * @type {?} */ NzOptionContainerComponent.prototype.listOfNzOptionLiComponent; /** @type {?} */ NzOptionContainerComponent.prototype.listOfNzOptionComponent; /** @type {?} */ NzOptionContainerComponent.prototype.listOfNzOptionGroupComponent; /** @type {?} */ NzOptionContainerComponent.prototype.nzListOfSelectedValueChange; /** @type {?} */ NzOptionContainerComponent.prototype.nzListOfTemplateOptionChange; /** @type {?} */ NzOptionContainerComponent.prototype.nzClickOption; /** @type {?} */ NzOptionContainerComponent.prototype.nzScrollToBottom; /** @type {?} */ NzOptionContainerComponent.prototype.nzMode; /** @type {?} */ NzOptionContainerComponent.prototype.nzServerSearch; /** @type {?} */ NzOptionContainerComponent.prototype.nzFilterOption; /** @type {?} */ NzOptionContainerComponent.prototype.nzMaxMultipleCount; /** @type {?} */ NzOptionContainerComponent.prototype.nzNotFoundContent; /** @type {?} */ NzOptionContainerComponent.prototype.compareWith; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotb3B0aW9uLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2xhci1uZy16b3Jyby1hbnRkLyIsInNvdXJjZXMiOlsic2VsZWN0L256LW9wdGlvbi1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQzs7O3NCQVd6RSxLQUFLO3FDQUNVLEtBQUs7dUNBQ2tCLEVBQUU7K0JBR1YsRUFBRTtrQ0FDQyxFQUFFOzsyQ0FPSixJQUFJLFlBQVksRUFBUzs0Q0FDeEIsSUFBSSxZQUFZLEVBQXVCOzZCQUN0RCxJQUFJLFlBQVksRUFBUTtnQ0FDckIsSUFBSSxZQUFZLEVBQVE7c0JBQ25DLFNBQVM7OEJBQ0QsS0FBSzs4QkFDVSxtQkFBbUI7a0NBQzlCLFFBQVE7OzJCQUdmLFVBQUMsRUFBTyxFQUFFLEVBQU8sSUFBSyxPQUFBLEVBQUUsS0FBSyxFQUFFLEVBQVQsQ0FBUzs7SUFFdEQsc0JBQ0kscURBQWE7Ozs7UUFNakI7WUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7U0FDMUI7Ozs7O1FBVEQsVUFDa0IsS0FBYTtZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixJQUFJLENB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RSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDOUI7S0FDRjs7OztJQUVELHVEQUFrQjs7O0lBQWxCO1FBQUEsaUJBS0M7UUFKQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBNUIsQ0FBNEIsQ0FBQyxDQUFDO0tBQ2xIOzs7O0lBRUQsZ0RBQVc7OztJQUFYO1FBQ0UsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7S0FDMUI7O2dCQTNRRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFhLHVCQUF1QjtvQkFDNUMsbUJBQW1CLEVBQUUsS0FBSztvQkFDMUIsZ29GQUEyRDtpQkFDNUQ7Ozs0Q0FjRSxZQUFZLFNBQUMsbUJBQW1COzBDQUNoQyxLQUFLOytDQUNMLEtBQUs7OENBRUwsTUFBTTsrQ0FDTixNQUFNO2dDQUNOLE1BQU07bUNBQ04sTUFBTTt5QkFDTixLQUFLO2lDQUNMLEtBQUs7aUNBQ0wsS0FBSztxQ0FDTCxLQUFLO29DQUNMLEtBQUs7OEJBRUwsS0FBSztnQ0FFTCxLQUFLO3dDQVdMLEtBQUs7O3FDQS9EUjs7U0F1QmEsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc05vdE5pbCB9IGZyb20gJy4uL2NvcmUvdXRpbC9jaGVjayc7XG5pbXBvcnQgeyBOek9wdGlvbkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9uei1vcHRpb24tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IE56T3B0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9uei1vcHRpb24uY29tcG9uZW50JztcblxuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTnpPcHRpb25MaUNvbXBvbmVudCB9IGZyb20gJy4vbnotb3B0aW9uLWxpLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBkZWZhdWx0RmlsdGVyT3B0aW9uLCBOek9wdGlvblBpcGUsIFRGaWx0ZXJPcHRpb24gfSBmcm9tICcuL256LW9wdGlvbi5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yICAgICAgICAgICA6ICdbbnotb3B0aW9uLWNvbnRhaW5lcl0nLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgdGVtcGxhdGVVcmwgICAgICAgIDogJy4vbnotb3B0aW9uLWNvbnRhaW5lci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTnpPcHRpb25Db250YWluZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgX2xpc3RPZlNlbGVjdGVkVmFsdWU6IGFueVtdO1xuICBwcml2YXRlIF9zZWFyY2hWYWx1ZTogc3RyaW5nO1xuICBpc0luaXQgPSBmYWxzZTtcbiAgaXNBZGRUYWdPcHRpb25EaXNwbGF5ID0gZmFsc2U7XG4gIGxpc3RPZkFsbFRlbXBsYXRlT3B0aW9uOiBOek9wdGlvbkNvbXBvbmVudFtdID0gW107XG4gIG9wdGlvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBncm91cFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBsaXN0T2ZUYWdPcHRpb246IE56T3B0aW9uQ29tcG9uZW50W10gPSBbXTtcbiAgbGlzdE9mRmlsdGVyT3B0aW9uOiBOek9wdGlvbkNvbXBvbmVudFtdID0gW107XG4gIGFjdGl2YXRlZE9wdGlvbjogTnpPcHRpb25Db21wb25lbnQ7XG4gIC8qKiBjYW4gbm90IHVzZSBWaWV3Q2hpbGQgc2luY2UgaXQgd2lsbCBtYXRjaCBzdWIgb3B0aW9ucyBpbiBvcHRpb24gZ3JvdXAgKiovXG4gIEBWaWV3Q2hpbGRyZW4oTnpPcHRpb25MaUNvbXBvbmVudCkgbGlzdE9mTnpPcHRpb25MaUNvbXBvbmVudDogUXVlcnlMaXN0PE56T3B0aW9uTGlDb21wb25lbnQ+O1xuICBASW5wdXQoKSBsaXN0T2ZOek9wdGlvbkNvbXBvbmVudDogUXVlcnlMaXN0PE56T3B0aW9uQ29tcG9uZW50PjtcbiAgQElucHV0KCkgbGlzdE9mTnpPcHRpb25Hcm91cENvbXBvbmVudDogUXVlcnlMaXN0PE56T3B0aW9uR3JvdXBDb21wb25lbnQ+O1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIEBPdXRwdXQoKSBuekxpc3RPZlNlbGVjdGVkVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCkgbnpMaXN0T2ZUZW1wbGF0ZU9wdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpPcHRpb25Db21wb25lbnRbXT4oKTtcbiAgQE91dHB1dCgpIG56Q2xpY2tPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBuelNjcm9sbFRvQm90dG9tID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBASW5wdXQoKSBuek1vZGUgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIG56U2VydmVyU2VhcmNoID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RmlsdGVyT3B0aW9uOiBURmlsdGVyT3B0aW9uID0gZGVmYXVsdEZpbHRlck9wdGlvbjtcbiAgQElucHV0KCkgbnpNYXhNdWx0aXBsZUNvdW50ID0gSW5maW5pdHk7XG4gIEBJbnB1dCgpIG56Tm90Rm91bmRDb250ZW50OiBzdHJpbmc7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgQElucHV0KCkgY29tcGFyZVdpdGggPSAobzE6IGFueSwgbzI6IGFueSkgPT4gbzEgPT09IG8yO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBuelNlYXJjaFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlQWRkVGFnT3B0aW9uRGlzcGxheSgpO1xuICAgIHRoaXMudXBkYXRlTGlzdE9mRmlsdGVyT3B0aW9uKCk7XG4gIH1cblxuICBnZXQgbnpTZWFyY2hWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hWYWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgc2V0IG56TGlzdE9mU2VsZWN0ZWRWYWx1ZSh2YWx1ZTogYW55W10pIHtcbiAgICBpZiAodGhpcy5fbGlzdE9mU2VsZWN0ZWRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX2xpc3RPZlNlbGVjdGVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgIC8qKiBzaG91bGQgY2xlYXIgYWN0aXZlZE9wdGlvbiB3aGVuIGxpc3RPZlNlbGVjdGVkVmFsdWUgY2hhbmdlICoqL1xuICAgICAgdGhpcy5jbGVhckFjdGl2YXRlZE9wdGlvbigpO1xuICAgICAgdGhpcy5yZWZyZXNoQWxsT3B0aW9uU3RhdHVzKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGdldCBuekxpc3RPZlNlbGVjdGVkVmFsdWUoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLl9saXN0T2ZTZWxlY3RlZFZhbHVlO1xuICB9XG5cbiAgYWRkVGFnT3B0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56TGlzdE9mU2VsZWN0ZWRWYWx1ZS5sZW5ndGggPCB0aGlzLm56TWF4TXVsdGlwbGVDb3VudCkge1xuICAgICAgdGhpcy5uekxpc3RPZlNlbGVjdGVkVmFsdWUgPSBbIC4uLnRoaXMubnpMaXN0T2ZTZWxlY3RlZFZhbHVlLCB0aGlzLm56U2VhcmNoVmFsdWUgXTtcbiAgICAgIHRoaXMubnpMaXN0T2ZTZWxlY3RlZFZhbHVlQ2hhbmdlLmVtaXQodGhpcy5uekxpc3RPZlNlbGVjdGVkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGNsaWNrT3B0aW9uKG9wdGlvbjogTnpPcHRpb25Db21wb25lbnQsIGlzUHJlc3NFbnRlcjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU2VsZWN0ZWRPcHRpb24ob3B0aW9uLCBpc1ByZXNzRW50ZXIpO1xuICAgIHRoaXMubnpDbGlja09wdGlvbi5lbWl0KCk7XG4gIH1cblxuICBvbktleURvd25VbChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFsgMzgsIDQwLCAxMyBdLmluZGV4T2YoZS5rZXlDb2RlKSA+IC0xKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMubGlzdE9mRmlsdGVyT3B0aW9uLmZpbmRJbmRleChpdGVtID0+IGl0ZW0gPT09IHRoaXMuYWN0aXZhdGVkT3B0aW9uKTtcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgIC8vIGFycm93IHVwXG4gICAgICAgIGNvbnN0IHByZUluZGV4ID0gYWN0aXZlSW5kZXggPiAwID8gKGFjdGl2ZUluZGV4IC0gMSkgOiAodGhpcy5saXN0T2ZGaWx0ZXJPcHRpb24ubGVuZ3RoIC0gMSk7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKHRoaXMubGlzdE9mRmlsdGVyT3B0aW9uWyBwcmVJbmRleCBdKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSA0MCkge1xuICAgICAgICAvLyBhcnJvdyBkb3duXG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGFjdGl2ZUluZGV4IDwgdGhpcy5saXN0T2ZGaWx0ZXJPcHRpb24ubGVuZ3RoIC0gMSA/IChhY3RpdmVJbmRleCArIDEpIDogMDtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVPcHRpb24odGhpcy5saXN0T2ZGaWx0ZXJPcHRpb25bIG5leHRJbmRleCBdKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAxMykge1xuICAgICAgICAvLyBlbnRlclxuICAgICAgICBpZiAodGhpcy5pc1RhZ3NNb2RlKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQWRkVGFnT3B0aW9uRGlzcGxheSkge1xuICAgICAgICAgICAgdGhpcy5jbGlja09wdGlvbih0aGlzLmFjdGl2YXRlZE9wdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkVGFnT3B0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLm56Q2xpY2tPcHRpb24uZW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNsaWNrT3B0aW9uKHRoaXMuYWN0aXZhdGVkT3B0aW9uLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlc2V0QWN0aXZlT3B0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0QWN0aXZlT3B0aW9uID0gdGhpcy5saXN0T2ZBbGxUZW1wbGF0ZU9wdGlvbi5jb25jYXQodGhpcy5saXN0T2ZUYWdPcHRpb24pLmZpbmQoaXRlbSA9PiB0aGlzLmNvbXBhcmVXaXRoKGl0ZW0ubnpWYWx1ZSwgdGhpcy5uekxpc3RPZlNlbGVjdGVkVmFsdWVbIDAgXSkpO1xuICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKGZpcnN0QWN0aXZlT3B0aW9uKTtcbiAgfVxuXG4gIGNsZWFyQWN0aXZhdGVkT3B0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKG51bGwpO1xuICB9XG5cbiAgc2V0QWN0aXZlT3B0aW9uKG9wdGlvbjogTnpPcHRpb25Db21wb25lbnQsIHNjcm9sbDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2YXRlZE9wdGlvbiA9IG9wdGlvbjtcbiAgICBpZiAoc2Nyb2xsKSB7XG4gICAgICB0aGlzLnNjcm9sbEludG9WaWV3KCk7XG4gICAgfVxuICB9XG5cbiAgc2Nyb2xsSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdE9mTnpPcHRpb25MaUNvbXBvbmVudCAmJiB0aGlzLmxpc3RPZk56T3B0aW9uTGlDb21wb25lbnQubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0YXJnZXRPcHRpb24gPSB0aGlzLmxpc3RPZk56T3B0aW9uTGlDb21wb25lbnQuZmluZChvID0+IG8ubnpPcHRpb24gPT09IHRoaXMuYWN0aXZhdGVkT3B0aW9uKTtcbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbCAqL1xuICAgICAgaWYgKHRhcmdldE9wdGlvbiAmJiB0YXJnZXRPcHRpb24uZWwgJiYgdGFyZ2V0T3B0aW9uLmVsWyAnc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCcgXSkge1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWwgKi9cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0YXJnZXRPcHRpb24uZWxbICdzY3JvbGxJbnRvVmlld0lmTmVlZGVkJyBdKGZhbHNlKSwgMTUwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVTZWxlY3RlZE9wdGlvbihvcHRpb246IE56T3B0aW9uQ29tcG9uZW50LCBpc1ByZXNzRW50ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvKiogdXBkYXRlIGxpc3RPZlNlbGVjdGVkT3B0aW9uIC0+IHVwZGF0ZSBuekxpc3RPZlNlbGVjdGVkVmFsdWUgLT4gZW1pdCBuekxpc3RPZlNlbGVjdGVkVmFsdWVDaGFuZ2UgKiovXG4gICAgaWYgKG9wdGlvbiAmJiAhb3B0aW9uLm56RGlzYWJsZWQpIHtcbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnNldEFjdGl2ZU9wdGlvbihvcHRpb24pO1xuICAgICAgbGV0IGxpc3RPZlNlbGVjdGVkVmFsdWUgPSBbIC4uLnRoaXMubnpMaXN0T2ZTZWxlY3RlZFZhbHVlIF07XG4gICAgICBpZiAodGhpcy5pc011bHRpcGxlT3JUYWdzKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gbGlzdE9mU2VsZWN0ZWRWYWx1ZS5maW5kKG8gPT4gdGhpcy5jb21wYXJlV2l0aChvLCBvcHRpb24ubnpWYWx1ZSkpO1xuICAgICAgICBpZiAoaXNOb3ROaWwodGFyZ2V0VmFsdWUpKSB7XG4gICAgICAgICAgaWYgKCFpc1ByZXNzRW50ZXIpIHtcbiAgICAgICAgICAgIC8qKiBzaG91bGQgbm90IHRvZ2dsZSBvcHRpb24gd2hlbiBwcmVzcyBlbnRlciAqKi9cbiAgICAgICAgICAgIGxpc3RPZlNlbGVjdGVkVmFsdWUuc3BsaWNlKGxpc3RPZlNlbGVjdGVkVmFsdWUuaW5kZXhPZih0YXJnZXRWYWx1ZSksIDEpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubnpMaXN0T2ZTZWxlY3RlZFZhbHVlLmxlbmd0aCA8IHRoaXMubnpNYXhNdWx0aXBsZUNvdW50KSB7XG4gICAgICAgICAgbGlzdE9mU2VsZWN0ZWRWYWx1ZS5wdXNoKG9wdGlvbi5uelZhbHVlKTtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5jb21wYXJlV2l0aChsaXN0T2ZTZWxlY3RlZFZhbHVlWyAwIF0sIG9wdGlvbi5uelZhbHVlKSkge1xuICAgICAgICBsaXN0T2ZTZWxlY3RlZFZhbHVlID0gWyBvcHRpb24ubnpWYWx1ZSBdO1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIC8qKiB1cGRhdGUgc2VsZWN0ZWRWYWx1ZXMgd2hlbiBjbGljayBvcHRpb24gKiovXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLl9saXN0T2ZTZWxlY3RlZFZhbHVlID0gbGlzdE9mU2VsZWN0ZWRWYWx1ZTtcbiAgICAgICAgdGhpcy5uekxpc3RPZlNlbGVjdGVkVmFsdWVDaGFuZ2UuZW1pdCh0aGlzLm56TGlzdE9mU2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzVGFnc01vZGUpIHtcbiAgICAgICAgICB0aGlzLnJlZnJlc2hBbGxPcHRpb25TdGF0dXMoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVmcmVzaExpc3RPZlRhZ09wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1RhZ3NNb2RlKSB7XG4gICAgICAvKiogcmVmcmVzaCB0YWdzIG9wdGlvbiAqKi9cbiAgICAgIGNvbnN0IGxpc3RPZlRhZ3NPcHRpb24gPSBbXTtcbiAgICAgIHRoaXMubnpMaXN0T2ZTZWxlY3RlZFZhbHVlLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBjb25zdCBleGlzdGVkT3B0aW9uID0gdGhpcy5saXN0T2ZBbGxUZW1wbGF0ZU9wdGlvbi5maW5kKG8gPT4gdGhpcy5jb21wYXJlV2l0aChvLm56VmFsdWUsIHZhbHVlKSk7XG4gICAgICAgIGlmICghZXhpc3RlZE9wdGlvbikge1xuICAgICAgICAgIGNvbnN0IG56T3B0aW9uQ29tcG9uZW50ID0gbmV3IE56T3B0aW9uQ29tcG9uZW50KCk7XG4gICAgICAgICAgbnpPcHRpb25Db21wb25lbnQubnpWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIG56T3B0aW9uQ29tcG9uZW50Lm56TGFiZWwgPSB2YWx1ZTtcbiAgICAgICAgICBsaXN0T2ZUYWdzT3B0aW9uLnB1c2gobnpPcHRpb25Db21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMubGlzdE9mVGFnT3B0aW9uID0gbGlzdE9mVGFnc09wdGlvbjtcbiAgICB9XG5cbiAgfVxuXG4gIHJlZnJlc2hMaXN0T2ZBbGxUZW1wbGF0ZU9wdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RPZkFsbFRlbXBsYXRlT3B0aW9uID0gdGhpcy5saXN0T2ZOek9wdGlvbkNvbXBvbmVudC50b0FycmF5KCkuY29uY2F0KHRoaXMubGlzdE9mTnpPcHRpb25Hcm91cENvbXBvbmVudC50b0FycmF5KCkucmVkdWNlKChwcmUsIGN1cikgPT4gWyAuLi5wcmUsIC4uLmN1ci5saXN0T2ZOek9wdGlvbkNvbXBvbmVudC50b0FycmF5KCkgXSwgW10pKTtcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMubnpMaXN0T2ZUZW1wbGF0ZU9wdGlvbkNoYW5nZS5lbWl0KHRoaXMubGlzdE9mQWxsVGVtcGxhdGVPcHRpb24pKTtcbiAgfVxuXG4gIHJlZnJlc2hBbGxPcHRpb25TdGF0dXMoaXNUZW1wbGF0ZU9wdGlvbkNoYW5nZTogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qKiB1cGRhdGUgbnpMaXN0T2ZTZWxlY3RlZFZhbHVlIHwgdXBkYXRlIG9wdGlvbiBsaXN0IC0+IHVwZGF0ZSBsaXN0T2ZBbGxUZW1wbGF0ZU9wdGlvbiAtPiB1cGRhdGUgbGlzdE9mU2VsZWN0ZWRPcHRpb24gLT4gdXBkYXRlIGFjdGl2YXRlZE9wdGlvbiAqKi9cbiAgICBpZiAodGhpcy5pc0luaXQpIHtcbiAgICAgIGlmIChpc1RlbXBsYXRlT3B0aW9uQ2hhbmdlKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaExpc3RPZkFsbFRlbXBsYXRlT3B0aW9uKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlZnJlc2hMaXN0T2ZUYWdPcHRpb24oKTtcbiAgICAgIHRoaXMudXBkYXRlTGlzdE9mRmlsdGVyT3B0aW9uKCk7XG4gICAgICB0aGlzLnVwZGF0ZUFkZFRhZ09wdGlvbkRpc3BsYXkoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVMaXN0T2ZGaWx0ZXJPcHRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5saXN0T2ZGaWx0ZXJPcHRpb24gPSBuZXcgTnpPcHRpb25QaXBlKCkudHJhbnNmb3JtKHRoaXMubGlzdE9mQWxsVGVtcGxhdGVPcHRpb24uY29uY2F0KHRoaXMubGlzdE9mVGFnT3B0aW9uKSwgdGhpcy5uelNlYXJjaFZhbHVlLCB0aGlzLm56RmlsdGVyT3B0aW9uLCB0aGlzLm56U2VydmVyU2VhcmNoKSBhcyBOek9wdGlvbkNvbXBvbmVudFtdO1xuICAgIGlmICh0aGlzLm56U2VhcmNoVmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0QWN0aXZlT3B0aW9uKHRoaXMubGlzdE9mRmlsdGVyT3B0aW9uWyAwIF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiB3YXRjaCBvcHRpb25zIGNoYW5nZSBpbiBvcHRpb24gZ3JvdXAgKiovXG4gIHdhdGNoU3ViT3B0aW9uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlT3B0aW9uKCk7XG4gICAgbGV0IG9wdGlvbkNoYW5nZXMkID0gbWVyZ2UoXG4gICAgICBuZXcgU3ViamVjdCgpLmFzT2JzZXJ2YWJsZSgpLFxuICAgICAgdGhpcy5saXN0T2ZOek9wdGlvbkdyb3VwQ29tcG9uZW50LmNoYW5nZXMsXG4gICAgICB0aGlzLmxpc3RPZk56T3B0aW9uQ29tcG9uZW50LmNoYW5nZXNcbiAgICApO1xuICAgIGlmICh0aGlzLmxpc3RPZk56T3B0aW9uR3JvdXBDb21wb25lbnQubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxpc3RPZk56T3B0aW9uR3JvdXBDb21wb25lbnQuZm9yRWFjaChncm91cCA9PiBvcHRpb25DaGFuZ2VzJCA9IGdyb3VwLmxpc3RPZk56T3B0aW9uQ29tcG9uZW50ID8gbWVyZ2UoZ3JvdXAubGlzdE9mTnpPcHRpb25Db21wb25lbnQuY2hhbmdlcywgb3B0aW9uQ2hhbmdlcyQpIDogb3B0aW9uQ2hhbmdlcyQpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvblN1YnNjcmlwdGlvbiA9IG9wdGlvbkNoYW5nZXMkLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZnJlc2hBbGxPcHRpb25TdGF0dXModHJ1ZSkpO1xuICB9XG5cbiAgdW5zdWJzY3JpYmVHcm91cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncm91cFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5ncm91cFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5ncm91cFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdW5zdWJzY3JpYmVPcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLm9wdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5vcHRpb25TdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc1RhZ3NNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm56TW9kZSA9PT0gJ3RhZ3MnO1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlwbGVPclRhZ3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubnpNb2RlID09PSAndGFncycgfHwgdGhpcy5uek1vZGUgPT09ICdtdWx0aXBsZSc7XG4gIH1cblxuICBnZXQgaXNOb3RGb3VuZERpc3BsYXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICghdGhpcy5pc1RhZ3NNb2RlKSAmJiAoIXRoaXMubGlzdE9mRmlsdGVyT3B0aW9uLmxlbmd0aCk7XG4gIH1cblxuICB1cGRhdGVBZGRUYWdPcHRpb25EaXNwbGF5KCk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3RPZkFsbE9wdGlvbiA9IHRoaXMubGlzdE9mQWxsVGVtcGxhdGVPcHRpb24uY29uY2F0KHRoaXMubGlzdE9mVGFnT3B0aW9uKS5tYXAoaXRlbSA9PiBpdGVtLm56TGFiZWwpO1xuICAgIGNvbnN0IGlzTWF0Y2ggPSBsaXN0T2ZBbGxPcHRpb24uaW5kZXhPZih0aGlzLm56U2VhcmNoVmFsdWUpID4gLTE7XG4gICAgdGhpcy5pc0FkZFRhZ09wdGlvbkRpc3BsYXkgPSB0aGlzLmlzVGFnc01vZGUgJiYgdGhpcy5uelNlYXJjaFZhbHVlICYmICghaXNNYXRjaCk7XG4gIH1cblxuICBkcm9wRG93blNjcm9sbChlOiBNb3VzZUV2ZW50LCB1bDogSFRNTFVMaXN0RWxlbWVudCk6IHZvaWQge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh1bCAmJiAodWwuc2Nyb2xsSGVpZ2h0IC0gdWwuc2Nyb2xsVG9wID09PSB1bC5jbGllbnRIZWlnaHQpKSB7XG4gICAgICB0aGlzLm56U2Nyb2xsVG9Cb3R0b20uZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5yZWZyZXNoQWxsT3B0aW9uU3RhdHVzKHRydWUpO1xuICAgIHRoaXMud2F0Y2hTdWJPcHRpb25DaGFuZ2VzKCk7XG4gICAgdGhpcy5ncm91cFN1YnNjcmlwdGlvbiA9IHRoaXMubGlzdE9mTnpPcHRpb25Hcm91cENvbXBvbmVudC5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLndhdGNoU3ViT3B0aW9uQ2hhbmdlcygpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmVHcm91cCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVPcHRpb24oKTtcbiAgfVxufVxuIl19