UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

138 lines 20 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ActiveDescendantKeyManager, LiveAnnouncer } from "@angular/cdk/a11y"; import { Injectable } from "@angular/core"; import isNil from "lodash/isNil"; import { ANNOUNCER_CLOSE_MESSAGE, ANNOUNCER_OPEN_MESSAGE_SUFFIX, } from "./constants"; import { KEYBOARD_CODE } from "../../constants/keycode.constants"; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/a11y"; export class OptionKeyControlService { constructor(liveAnnouncer) { this.liveAnnouncer = liveAnnouncer; } initKeyboardManager() { this.keyboardEventsManager = new ActiveDescendantKeyManager(this.optionItems).withVerticalOrientation(); } handleKeydown(event) { this.popup.showing ? this.handleOpenKeyDown(event) : this.handleClosedKeyDown(event); } setActiveItem(option) { this.keyboardEventsManager?.setActiveItem(option); } resetActiveItem() { this.keyboardEventsManager.setActiveItem(-1); } setFirstItemActive() { this.keyboardEventsManager?.setFirstItemActive(); } getActiveItemIndex() { return this.keyboardEventsManager.activeItemIndex; } setSkipPredicate(predicate) { this.keyboardEventsManager.skipPredicate(predicate); } scrollToActiveItem(options) { if (this.keyboardEventsManager.activeItem) { // setTimeout is necessary because scrolling to the selected item should occur only when overlay rendered setTimeout(() => { this.keyboardEventsManager.activeItem?.scrollIntoView(options); }); } } hasActiveItem() { if (isNil(this.keyboardEventsManager.activeItemIndex)) { throw new Error("ActiveItemIndex is not defined"); } return Boolean(this.keyboardEventsManager.activeItem && this.keyboardEventsManager.activeItemIndex >= 0); } handleOpenKeyDown(event) { switch (event.code) { case KEYBOARD_CODE.ARROW_DOWN: case KEYBOARD_CODE.ARROW_UP: this.keyboardEventsManager.onKeydown(event); this.announceNavigatedOption(); break; case KEYBOARD_CODE.PAGE_UP: event.preventDefault(); this.keyboardEventsManager.onKeydown(event); this.keyboardEventsManager.setFirstItemActive(); break; case KEYBOARD_CODE.PAGE_DOWN: event.preventDefault(); this.keyboardEventsManager.onKeydown(event); this.keyboardEventsManager.setLastItemActive(); break; } this.scrollToActiveItem({ block: "nearest" }); // prevent closing on enter if (!this.hasActiveItem() && event.code === KEYBOARD_CODE.ENTER) { event.preventDefault(); } if (this.hasActiveItem() && event.code === KEYBOARD_CODE.ENTER) { if (!this.keyboardEventsManager.activeItem) { throw new Error("ActiveItem is not defined"); } // perform action in menu item(select, switch, check etc). this.keyboardEventsManager.activeItem.element.nativeElement.click(); } if (event.code === KEYBOARD_CODE.TAB || event.code === KEYBOARD_CODE.ESCAPE) { this.popup.toggle(); this.announceDropdown(this.popup.showing); } } handleClosedKeyDown(event) { // prevent opening on enter and prevent scrolling page on key down/key up when focused if (this.shouldBePrevented(event)) { event.preventDefault(); } if (event.code === KEYBOARD_CODE.ARROW_DOWN) { this.popup.toggle(); this.scrollToActiveItem({ block: "center" }); } } shouldBePrevented(event) { return (event.code === KEYBOARD_CODE.ARROW_DOWN || event.code === KEYBOARD_CODE.ARROW_UP || event.code === KEYBOARD_CODE.ENTER); } announceNavigatedOption() { const activeItem = this.keyboardEventsManager.activeItem; if (activeItem) { this.liveAnnouncer.announce(activeItem.value); } } announceDropdown(open) { const message = open ? `${this.optionItems.length} ${ANNOUNCER_OPEN_MESSAGE_SUFFIX}` : ANNOUNCER_CLOSE_MESSAGE; this.liveAnnouncer.announce(message); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionKeyControlService, deps: [{ token: i1.LiveAnnouncer }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionKeyControlService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OptionKeyControlService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.LiveAnnouncer }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9uLWtleS1jb250cm9sLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlbGVjdC12Mi9vcHRpb24ta2V5LWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBRWpDLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsNkJBQTZCLEdBQ2hDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBSWxFLE1BQU0sT0FBTyx1QkFBdUI7SUFNaEMsWUFBbUIsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFBRyxDQUFDO0lBRTVDLG1CQUFtQjtRQUN0QixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSwwQkFBMEIsQ0FDdkQsSUFBSSxDQUFDLFdBQVcsQ0FDbkIsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTSxhQUFhLENBQUMsS0FBb0I7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQ2QsQ0FBQyxDQUFDLElBQUksQ0FBQyxp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QyxRQUFRLENBQUUsVUFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFhO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUk7WUFDaEIsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksNkJBQTZCLEVBQUU7WUFDL0QsQ0FBQyxDQUFDLHVCQUF1QixDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7K0dBeklRLHVCQUF1QjttSEFBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyLCBMaXZlQW5ub3VuY2VyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBRdWVyeUxpc3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzTmlsIGZyb20gXCJsb2Rhc2gvaXNOaWxcIjtcblxuaW1wb3J0IHtcbiAgICBBTk5PVU5DRVJfQ0xPU0VfTUVTU0FHRSxcbiAgICBBTk5PVU5DRVJfT1BFTl9NRVNTQUdFX1NVRkZJWCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBLRVlCT0FSRF9DT0RFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9rZXljb2RlLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgSU9wdGlvbiwgSU92ZXJsYXlDb21wb25lbnQgfSBmcm9tIFwiLi4vb3ZlcmxheS90eXBlc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT3B0aW9uS2V5Q29udHJvbFNlcnZpY2U8VCBleHRlbmRzIElPcHRpb24+IHtcbiAgICBwdWJsaWMgcG9wdXA6IElPdmVybGF5Q29tcG9uZW50O1xuICAgIHB1YmxpYyBvcHRpb25JdGVtczogUXVlcnlMaXN0PFQ+O1xuXG4gICAgcHJpdmF0ZSBrZXlib2FyZEV2ZW50c01hbmFnZXI6IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyPFQ+O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGxpdmVBbm5vdW5jZXI6IExpdmVBbm5vdW5jZXIpIHt9XG5cbiAgICBwdWJsaWMgaW5pdEtleWJvYXJkTWFuYWdlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIgPSBuZXcgQWN0aXZlRGVzY2VuZGFudEtleU1hbmFnZXIoXG4gICAgICAgICAgICB0aGlzLm9wdGlvbkl0ZW1zXG4gICAgICAgICkud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBvcHVwLnNob3dpbmdcbiAgICAgICAgICAgID8gdGhpcy5oYW5kbGVPcGVuS2V5RG93bihldmVudClcbiAgICAgICAgICAgIDogdGhpcy5oYW5kbGVDbG9zZWRLZXlEb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWN0aXZlSXRlbShvcHRpb246IFQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXI/LnNldEFjdGl2ZUl0ZW0ob3B0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRBY3RpdmVJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRBY3RpdmVJdGVtKC0xKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rmlyc3RJdGVtQWN0aXZlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlcj8uc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFjdGl2ZUl0ZW1JbmRleCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2tpcFByZWRpY2F0ZShwcmVkaWNhdGU6IChvcHRpb246IFQpID0+IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuc2tpcFByZWRpY2F0ZShwcmVkaWNhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzY3JvbGxUb0FjdGl2ZUl0ZW0ob3B0aW9uczogU2Nyb2xsSW50b1ZpZXdPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtKSB7XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNjcm9sbGluZyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBzaG91bGQgb2NjdXIgb25seSB3aGVuIG92ZXJsYXkgcmVuZGVyZWRcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW0/LnNjcm9sbEludG9WaWV3KG9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0FjdGl2ZUl0ZW0oKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpc05pbCh0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtSW5kZXgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY3RpdmVJdGVtSW5kZXggaXMgbm90IGRlZmluZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oXG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtICYmXG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuYWN0aXZlSXRlbUluZGV4ID49IDBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZU9wZW5LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICAgICAgY2FzZSBLRVlCT0FSRF9DT0RFLkFSUk9XX0RPV046XG4gICAgICAgICAgICBjYXNlIEtFWUJPQVJEX0NPREUuQVJST1dfVVA6XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlTmF2aWdhdGVkT3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtFWUJPQVJEX0NPREUuUEFHRV9VUDpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEtFWUJPQVJEX0NPREUuUEFHRV9ET1dOOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5rZXlib2FyZEV2ZW50c01hbmFnZXIub25LZXlkb3duKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY3JvbGxUb0FjdGl2ZUl0ZW0oeyBibG9jazogXCJuZWFyZXN0XCIgfSk7XG5cbiAgICAgICAgLy8gcHJldmVudCBjbG9zaW5nIG9uIGVudGVyXG4gICAgICAgIGlmICghdGhpcy5oYXNBY3RpdmVJdGVtKCkgJiYgZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5FTlRFUikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc0FjdGl2ZUl0ZW0oKSAmJiBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkVOVEVSKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBY3RpdmVJdGVtIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBwZXJmb3JtIGFjdGlvbiBpbiBtZW51IGl0ZW0oc2VsZWN0LCBzd2l0Y2gsIGNoZWNrIGV0YykuXG4gICAgICAgICAgICB0aGlzLmtleWJvYXJkRXZlbnRzTWFuYWdlci5hY3RpdmVJdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5UQUIgfHxcbiAgICAgICAgICAgIGV2ZW50LmNvZGUgPT09IEtFWUJPQVJEX0NPREUuRVNDQVBFXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5wb3B1cC50b2dnbGUoKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VEcm9wZG93bih0aGlzLnBvcHVwLnNob3dpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVDbG9zZWRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIHByZXZlbnQgb3BlbmluZyBvbiBlbnRlciBhbmQgcHJldmVudCBzY3JvbGxpbmcgcGFnZSBvbiBrZXkgZG93bi9rZXkgdXAgd2hlbiBmb2N1c2VkXG4gICAgICAgIGlmICh0aGlzLnNob3VsZEJlUHJldmVudGVkKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX0RPV04pIHtcbiAgICAgICAgICAgIHRoaXMucG9wdXAudG9nZ2xlKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvQWN0aXZlSXRlbSh7IGJsb2NrOiBcImNlbnRlclwiIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRCZVByZXZlbnRlZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZXZlbnQuY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19ET1dOIHx8XG4gICAgICAgICAgICBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkFSUk9XX1VQIHx8XG4gICAgICAgICAgICBldmVudC5jb2RlID09PSBLRVlCT0FSRF9DT0RFLkVOVEVSXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbm5vdW5jZU5hdmlnYXRlZE9wdGlvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYWN0aXZlSXRlbSA9IHRoaXMua2V5Ym9hcmRFdmVudHNNYW5hZ2VyLmFjdGl2ZUl0ZW07XG5cbiAgICAgICAgaWYgKGFjdGl2ZUl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZSgoYWN0aXZlSXRlbSBhcyBhbnkpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYW5ub3VuY2VEcm9wZG93bihvcGVuOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBvcGVuXG4gICAgICAgICAgICA/IGAke3RoaXMub3B0aW9uSXRlbXMubGVuZ3RofSAke0FOTk9VTkNFUl9PUEVOX01FU1NBR0VfU1VGRklYfWBcbiAgICAgICAgICAgIDogQU5OT1VOQ0VSX0NMT1NFX01FU1NBR0U7XG5cbiAgICAgICAgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKG1lc3NhZ2UpO1xuICAgIH1cbn1cbiJdfQ==