@spartacus/storefront
Version:
Spartacus Storefront is a package that you can include in your application, which allows you to add default storefront features.
109 lines • 15.5 kB
JavaScript
import { Injectable } from '@angular/core';
import { AutoFocusService } from '../autofocus/auto-focus.service';
import * as i0 from "@angular/core";
export class TabFocusService extends AutoFocusService {
/**
* Moves to the next (or previous) tab.
*/
moveTab(host, config, increment, event) {
if (config === null || config === void 0 ? void 0 : config.tab) {
const next = config.tab === 'scroll'
? this.findNextScrollable(host, config, increment)
: this.findNext(host, config, increment);
next === null || next === void 0 ? void 0 : next.focus();
event.preventDefault();
event.stopPropagation();
}
}
/**
* builds out virtual slides out of the full scrollable area, to allow
* for maximum flexibility for the underlying layout without using hardcoded
* slide sizes.
*/
findNextScrollable(host, config, increment) {
var _a;
const active = this.getActiveChild(host, config);
if (!active) {
return;
}
// slide count
const virtualSlideCount = Math.round(host.scrollWidth / host.clientWidth);
// find current virtual slide
const currentVirtualSlide = Math.round(active.offsetLeft / (host.scrollWidth / virtualSlideCount));
let nextVirtualSlide = currentVirtualSlide + increment;
if (increment === 1 /* NEXT */ &&
nextVirtualSlide >= virtualSlideCount) {
nextVirtualSlide = 0;
}
if (increment === -1 /* PREV */ && nextVirtualSlide < 0) {
nextVirtualSlide = virtualSlideCount - 1;
}
const firstItemOnNextSlide = (_a = this.getChildren(host, config)) === null || _a === void 0 ? void 0 : _a.find((tab) => tab.offsetLeft >=
(host.scrollWidth / virtualSlideCount) * nextVirtualSlide);
return firstItemOnNextSlide;
}
findNext(host, config, increment) {
const childs = this.getChildren(host, config);
let activeIndex = childs === null || childs === void 0 ? void 0 : childs.findIndex((c) => c === this.getActiveChild(host, config));
if (!activeIndex || activeIndex === -1) {
activeIndex = 0;
}
activeIndex += increment;
if (increment === 1 /* NEXT */ && activeIndex >= (childs === null || childs === void 0 ? void 0 : childs.length)) {
activeIndex = childs.length - 1;
}
if (increment === -1 /* PREV */ && activeIndex < 0) {
activeIndex = 0;
}
return childs ? childs[activeIndex] : undefined;
}
/**
* Returns the active focusable child element. If there's no active
* focusable child element, the first focusable child is returned.
*/
getActiveChild(host, config) {
const persisted = this.getPersisted(host, config === null || config === void 0 ? void 0 : config.group);
if (persisted) {
return persisted;
}
const children = this.getChildren(host, config);
let index = children.findIndex((tab) => this.isActive(tab));
if (!index || index === -1) {
index = 0;
}
return children[index];
}
getChildren(host, config) {
if (typeof config.tab === 'string' && config.tab !== 'scroll') {
return this.selectFocusUtil.query(host, config.tab);
}
else {
return this.findFocusable(host, true);
}
}
/**
* Returns all focusable child elements of the host element.
*
* @param host The host element is used to query child focusable elements.
* @param locked Indicates if locked elements (tabindex=-1) should be returned, defaults to false.
* @param invisible Indicates if invisible child elements should be returned, defaults to false.
*/
findFocusable(host, locked = false, invisible = false) {
return this.selectFocusUtil.findFocusable(host, locked, invisible);
}
isActive(el) {
const child = document.activeElement;
const selector = child.tagName;
return (el === child ||
!!Array.from(el.querySelectorAll(selector)).find((e) => e === child));
}
}
TabFocusService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TabFocusService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
TabFocusService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TabFocusService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: TabFocusService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWZvY3VzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdG9yZWZyb250bGliL2xheW91dC9hMTF5L2tleWJvYXJkLWZvY3VzL3RhYi90YWItZm9jdXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQU1uRSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxnQkFBZ0I7SUFDbkQ7O09BRUc7SUFDSCxPQUFPLENBQ0wsSUFBaUIsRUFDakIsTUFBc0IsRUFDdEIsU0FBcUIsRUFDckIsS0FBb0I7UUFFcEIsSUFBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsR0FBRyxFQUFFO1lBQ2YsTUFBTSxJQUFJLEdBQ1IsTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRO2dCQUNyQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO2dCQUNsRCxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRTdDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxLQUFLLEVBQUUsQ0FBQztZQUVkLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGtCQUFrQixDQUMxQixJQUFpQixFQUNqQixNQUFzQixFQUN0QixTQUFxQjs7UUFFckIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE9BQU87U0FDUjtRQUNELGNBQWM7UUFDZCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFMUUsNkJBQTZCO1FBQzdCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDcEMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUMsQ0FDM0QsQ0FBQztRQUVGLElBQUksZ0JBQWdCLEdBQUcsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3ZELElBQ0UsU0FBUyxpQkFBb0I7WUFDN0IsZ0JBQWdCLElBQUksaUJBQWlCLEVBQ3JDO1lBQ0EsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxTQUFTLGtCQUFvQixJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTtZQUN6RCxnQkFBZ0IsR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7U0FDMUM7UUFFRCxNQUFNLG9CQUFvQixHQUFHLE1BQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLDBDQUFFLElBQUksQ0FDL0QsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNOLEdBQUcsQ0FBQyxVQUFVO1lBQ2QsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsZ0JBQWdCLENBQzVELENBQUM7UUFFRixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFFUyxRQUFRLENBQ2hCLElBQWlCLEVBQ2pCLE1BQXNCLEVBQ3RCLFNBQXFCO1FBRXJCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLElBQUksV0FBVyxHQUFHLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxTQUFTLENBQ2pDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQy9DLENBQUM7UUFFRixJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN0QyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO1FBQ0QsV0FBVyxJQUFJLFNBQVMsQ0FBQztRQUV6QixJQUFJLFNBQVMsaUJBQW9CLElBQUksV0FBVyxLQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLENBQUEsRUFBRTtZQUNsRSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDakM7UUFDRCxJQUFJLFNBQVMsa0JBQW9CLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNwRCxXQUFXLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO1FBQ0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7O09BR0c7SUFDTyxjQUFjLENBQ3RCLElBQWlCLEVBQ2pCLE1BQXNCO1FBRXRCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxJQUFJLFNBQVMsRUFBRTtZQUNiLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFCLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDWDtRQUNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFUyxXQUFXLENBQ25CLElBQWlCLEVBQ2pCLE1BQXNCO1FBRXRCLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsYUFBYSxDQUNYLElBQWlCLEVBQ2pCLE1BQU0sR0FBRyxLQUFLLEVBQ2QsU0FBUyxHQUFHLEtBQUs7UUFFakIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFUyxRQUFRLENBQUMsRUFBZTtRQUNoQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFL0IsT0FBTyxDQUNMLEVBQUUsS0FBSyxLQUFLO1lBQ1osQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQ3JFLENBQUM7SUFDSixDQUFDOzs0R0FoSlUsZUFBZTtnSEFBZixlQUFlLGNBRmQsTUFBTTsyRkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dG9Gb2N1c1NlcnZpY2UgfSBmcm9tICcuLi9hdXRvZm9jdXMvYXV0by1mb2N1cy5zZXJ2aWNlJztcbmltcG9ydCB7IE1PVkVfRk9DVVMsIFRhYkZvY3VzQ29uZmlnIH0gZnJvbSAnLi4va2V5Ym9hcmQtZm9jdXMubW9kZWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVGFiRm9jdXNTZXJ2aWNlIGV4dGVuZHMgQXV0b0ZvY3VzU2VydmljZSB7XG4gIC8qKlxuICAgKiBNb3ZlcyB0byB0aGUgbmV4dCAob3IgcHJldmlvdXMpIHRhYi5cbiAgICovXG4gIG1vdmVUYWIoXG4gICAgaG9zdDogSFRNTEVsZW1lbnQsXG4gICAgY29uZmlnOiBUYWJGb2N1c0NvbmZpZyxcbiAgICBpbmNyZW1lbnQ6IE1PVkVfRk9DVVMsXG4gICAgZXZlbnQ6IEtleWJvYXJkRXZlbnRcbiAgKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZz8udGFiKSB7XG4gICAgICBjb25zdCBuZXh0ID1cbiAgICAgICAgY29uZmlnLnRhYiA9PT0gJ3Njcm9sbCdcbiAgICAgICAgICA/IHRoaXMuZmluZE5leHRTY3JvbGxhYmxlKGhvc3QsIGNvbmZpZywgaW5jcmVtZW50KVxuICAgICAgICAgIDogdGhpcy5maW5kTmV4dChob3N0LCBjb25maWcsIGluY3JlbWVudCk7XG5cbiAgICAgIG5leHQ/LmZvY3VzKCk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYnVpbGRzIG91dCB2aXJ0dWFsIHNsaWRlcyBvdXQgb2YgdGhlIGZ1bGwgc2Nyb2xsYWJsZSBhcmVhLCB0byBhbGxvd1xuICAgKiBmb3IgbWF4aW11bSBmbGV4aWJpbGl0eSBmb3IgdGhlIHVuZGVybHlpbmcgbGF5b3V0IHdpdGhvdXQgdXNpbmcgaGFyZGNvZGVkXG4gICAqIHNsaWRlIHNpemVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbmROZXh0U2Nyb2xsYWJsZShcbiAgICBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBjb25maWc6IFRhYkZvY3VzQ29uZmlnLFxuICAgIGluY3JlbWVudDogTU9WRV9GT0NVU1xuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5nZXRBY3RpdmVDaGlsZChob3N0LCBjb25maWcpO1xuXG4gICAgaWYgKCFhY3RpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gc2xpZGUgY291bnRcbiAgICBjb25zdCB2aXJ0dWFsU2xpZGVDb3VudCA9IE1hdGgucm91bmQoaG9zdC5zY3JvbGxXaWR0aCAvIGhvc3QuY2xpZW50V2lkdGgpO1xuXG4gICAgLy8gZmluZCBjdXJyZW50IHZpcnR1YWwgc2xpZGVcbiAgICBjb25zdCBjdXJyZW50VmlydHVhbFNsaWRlID0gTWF0aC5yb3VuZChcbiAgICAgIGFjdGl2ZS5vZmZzZXRMZWZ0IC8gKGhvc3Quc2Nyb2xsV2lkdGggLyB2aXJ0dWFsU2xpZGVDb3VudClcbiAgICApO1xuXG4gICAgbGV0IG5leHRWaXJ0dWFsU2xpZGUgPSBjdXJyZW50VmlydHVhbFNsaWRlICsgaW5jcmVtZW50O1xuICAgIGlmIChcbiAgICAgIGluY3JlbWVudCA9PT0gTU9WRV9GT0NVUy5ORVhUICYmXG4gICAgICBuZXh0VmlydHVhbFNsaWRlID49IHZpcnR1YWxTbGlkZUNvdW50XG4gICAgKSB7XG4gICAgICBuZXh0VmlydHVhbFNsaWRlID0gMDtcbiAgICB9XG4gICAgaWYgKGluY3JlbWVudCA9PT0gTU9WRV9GT0NVUy5QUkVWICYmIG5leHRWaXJ0dWFsU2xpZGUgPCAwKSB7XG4gICAgICBuZXh0VmlydHVhbFNsaWRlID0gdmlydHVhbFNsaWRlQ291bnQgLSAxO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0SXRlbU9uTmV4dFNsaWRlID0gdGhpcy5nZXRDaGlsZHJlbihob3N0LCBjb25maWcpPy5maW5kKFxuICAgICAgKHRhYikgPT5cbiAgICAgICAgdGFiLm9mZnNldExlZnQgPj1cbiAgICAgICAgKGhvc3Quc2Nyb2xsV2lkdGggLyB2aXJ0dWFsU2xpZGVDb3VudCkgKiBuZXh0VmlydHVhbFNsaWRlXG4gICAgKTtcblxuICAgIHJldHVybiBmaXJzdEl0ZW1Pbk5leHRTbGlkZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaW5kTmV4dChcbiAgICBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBjb25maWc6IFRhYkZvY3VzQ29uZmlnLFxuICAgIGluY3JlbWVudDogTU9WRV9GT0NVU1xuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgY2hpbGRzID0gdGhpcy5nZXRDaGlsZHJlbihob3N0LCBjb25maWcpO1xuICAgIGxldCBhY3RpdmVJbmRleCA9IGNoaWxkcz8uZmluZEluZGV4KFxuICAgICAgKGMpID0+IGMgPT09IHRoaXMuZ2V0QWN0aXZlQ2hpbGQoaG9zdCwgY29uZmlnKVxuICAgICk7XG5cbiAgICBpZiAoIWFjdGl2ZUluZGV4IHx8IGFjdGl2ZUluZGV4ID09PSAtMSkge1xuICAgICAgYWN0aXZlSW5kZXggPSAwO1xuICAgIH1cbiAgICBhY3RpdmVJbmRleCArPSBpbmNyZW1lbnQ7XG5cbiAgICBpZiAoaW5jcmVtZW50ID09PSBNT1ZFX0ZPQ1VTLk5FWFQgJiYgYWN0aXZlSW5kZXggPj0gY2hpbGRzPy5sZW5ndGgpIHtcbiAgICAgIGFjdGl2ZUluZGV4ID0gY2hpbGRzLmxlbmd0aCAtIDE7XG4gICAgfVxuICAgIGlmIChpbmNyZW1lbnQgPT09IE1PVkVfRk9DVVMuUFJFViAmJiBhY3RpdmVJbmRleCA8IDApIHtcbiAgICAgIGFjdGl2ZUluZGV4ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkcyA/IGNoaWxkc1thY3RpdmVJbmRleF0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYWN0aXZlIGZvY3VzYWJsZSBjaGlsZCBlbGVtZW50LiBJZiB0aGVyZSdzIG5vIGFjdGl2ZVxuICAgKiBmb2N1c2FibGUgY2hpbGQgZWxlbWVudCwgdGhlIGZpcnN0IGZvY3VzYWJsZSBjaGlsZCBpcyByZXR1cm5lZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRBY3RpdmVDaGlsZChcbiAgICBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBjb25maWc6IFRhYkZvY3VzQ29uZmlnXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBwZXJzaXN0ZWQgPSB0aGlzLmdldFBlcnNpc3RlZChob3N0LCBjb25maWc/Lmdyb3VwKTtcbiAgICBpZiAocGVyc2lzdGVkKSB7XG4gICAgICByZXR1cm4gcGVyc2lzdGVkO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW4oaG9zdCwgY29uZmlnKTtcbiAgICBsZXQgaW5kZXggPSBjaGlsZHJlbi5maW5kSW5kZXgoKHRhYikgPT4gdGhpcy5pc0FjdGl2ZSh0YWIpKTtcbiAgICBpZiAoIWluZGV4IHx8IGluZGV4ID09PSAtMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGRyZW5baW5kZXhdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldENoaWxkcmVuKFxuICAgIGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIGNvbmZpZzogVGFiRm9jdXNDb25maWdcbiAgKTogSFRNTEVsZW1lbnRbXSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcudGFiID09PSAnc3RyaW5nJyAmJiBjb25maWcudGFiICE9PSAnc2Nyb2xsJykge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0Rm9jdXNVdGlsLnF1ZXJ5KGhvc3QsIGNvbmZpZy50YWIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kRm9jdXNhYmxlKGhvc3QsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBmb2N1c2FibGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGhvc3QgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGhvc3QgVGhlIGhvc3QgZWxlbWVudCBpcyB1c2VkIHRvIHF1ZXJ5IGNoaWxkIGZvY3VzYWJsZSBlbGVtZW50cy5cbiAgICogQHBhcmFtIGxvY2tlZCBJbmRpY2F0ZXMgaWYgbG9ja2VkIGVsZW1lbnRzICh0YWJpbmRleD0tMSkgc2hvdWxkIGJlIHJldHVybmVkLCBkZWZhdWx0cyB0byBmYWxzZS5cbiAgICogQHBhcmFtIGludmlzaWJsZSBJbmRpY2F0ZXMgaWYgaW52aXNpYmxlIGNoaWxkIGVsZW1lbnRzIHNob3VsZCBiZSByZXR1cm5lZCwgZGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBmaW5kRm9jdXNhYmxlKFxuICAgIGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIGxvY2tlZCA9IGZhbHNlLFxuICAgIGludmlzaWJsZSA9IGZhbHNlXG4gICk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEZvY3VzVXRpbC5maW5kRm9jdXNhYmxlKGhvc3QsIGxvY2tlZCwgaW52aXNpYmxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0FjdGl2ZShlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBjaGlsZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBjaGlsZC50YWdOYW1lO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGVsID09PSBjaGlsZCB8fFxuICAgICAgISFBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKS5maW5kKChlKSA9PiBlID09PSBjaGlsZClcbiAgICApO1xuICB9XG59XG4iXX0=