UNPKG

carbon-components-angular

Version:
191 lines 22.5 kB
import { Component, Input, ViewChild, HostBinding } from "@angular/core"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/utils"; /** * There are two ways to create a tab, this class is a collection of features * & metadata required by both. */ export class BaseTabHeader { constructor(elementRef, changeDetectorRef, eventService, renderer) { this.elementRef = elementRef; this.changeDetectorRef = changeDetectorRef; this.eventService = eventService; this.renderer = renderer; /** * Set to `true` to have `Tab` items cached and not reloaded on tab switching. * Duplicated from `cds-tabs` to support standalone headers. */ this.cacheActive = false; /** * Visual style of the tab list: `line` or `contained`. */ this.type = "line"; /** * Theme for contained tabs: `dark` or `light`. */ this.theme = "dark"; /** * **Contained only**: Evenly sized tabs across the row (**must** have fewer than 9 tabs). */ this.fullWidth = false; /** * Show a close control on each tab. */ this.dismissable = false; /** * Scroll the active tab into view on focus/select. */ this.scrollIntoView = false; /** * Debounce (ms) for tab list scroll events; affects overflow chevron updates. */ this.scrollDebounceWait = 200; this.tabsClass = true; // width of the overflow buttons this.OVERFLOW_BUTTON_OFFSET = 44; this.longPressMultiplier = 3; this.clickMultiplier = 1.5; this.longPressInterval = null; this.tickInterval = null; this.scrollDebounceTimer = null; } get containedClass() { return this.type === "contained"; } get themeClass() { return this.theme === "light"; } get dismissableClass() { return this.dismissable; } get iconSizeDefaultClass() { return this.iconSize === "default"; } get iconSizeLgClass() { return this.iconSize === "lg"; } get layoutSizeLgClass() { return this.iconSize === "lg"; } get hasHorizontalOverflow() { const tabList = this.headerContainer.nativeElement; return tabList.scrollWidth > tabList.clientWidth; } get leftOverflowNavButtonHidden() { const tabList = this.headerContainer.nativeElement; return !this.hasHorizontalOverflow || !tabList.scrollLeft; } get rightOverflowNavButtonHidden() { const tabList = this.headerContainer.nativeElement; return !this.hasHorizontalOverflow || (tabList.scrollLeft + tabList.clientWidth) === tabList.scrollWidth; } handleScroll() { // Debounce the change detection trigger so the scroll arrow visibility // updates do not fire on every scroll tick. if (this.scrollDebounceWait <= 0) { this.changeDetectorRef.markForCheck(); return; } clearTimeout(this.scrollDebounceTimer); this.scrollDebounceTimer = setTimeout(() => { this.changeDetectorRef.markForCheck(); }, this.scrollDebounceWait); } handleOverflowNavClick(direction, numOftabs = 0) { const tabList = this.headerContainer.nativeElement; const { clientWidth, scrollLeft, scrollWidth } = tabList; if (direction > 0) { tabList.scrollLeft = Math.min(scrollLeft + (scrollWidth / numOftabs) * this.clickMultiplier, scrollWidth - clientWidth); } else if (direction < 0) { tabList.scrollLeft = Math.max(scrollLeft - (scrollWidth / numOftabs) * this.clickMultiplier, 0); } } handleOverflowNavMouseDown(direction) { const tabList = this.headerContainer.nativeElement; this.longPressInterval = setTimeout(() => { // Manually overriding scroll behvior to `auto` to make animation work correctly this.renderer.setStyle(tabList, "scroll-behavior", "auto"); this.tickInterval = setInterval(() => { tabList.scrollLeft += (direction * this.longPressMultiplier); // clear interval if scroll reaches left or right edge if (this.leftOverflowNavButtonHidden || this.rightOverflowNavButtonHidden) { return () => { clearInterval(this.tickInterval); this.handleOverflowNavMouseUp(); }; } }); return () => clearInterval(this.longPressInterval); }, 500); } /** * Clear intervals/Timeout & reset scroll behavior */ handleOverflowNavMouseUp() { clearInterval(this.tickInterval); clearTimeout(this.longPressInterval); // Reset scroll behavior this.renderer.setStyle(this.headerContainer.nativeElement, "scroll-behavior", "smooth"); } } BaseTabHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.EventService }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); BaseTabHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: BaseTabHeader, selector: "ng-component", inputs: { cacheActive: "cacheActive", followFocus: "followFocus", ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby", contentBefore: "contentBefore", contentAfter: "contentAfter", type: "type", theme: "theme", iconSize: "iconSize", fullWidth: "fullWidth", dismissable: "dismissable", scrollIntoView: "scrollIntoView", scrollDebounceWait: "scrollDebounceWait" }, host: { properties: { "class.cds--tabs": "this.tabsClass", "class.cds--tabs--contained": "this.containedClass", "class.cds--tabs--light": "this.themeClass", "class.cds--tabs--dismissable": "this.dismissableClass", "class.cds--tabs__icon--default": "this.iconSizeDefaultClass", "class.cds--tabs__icon--lg": "this.iconSizeLgClass", "class.cds--layout--size-lg": "this.layoutSizeLgClass" } }, viewQueries: [{ propertyName: "headerContainer", first: true, predicate: ["tabList"], descendants: true, static: true }], ngImport: i0, template: "", isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseTabHeader, decorators: [{ type: Component, args: [{ template: "" }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.EventService }, { type: i0.Renderer2 }]; }, propDecorators: { cacheActive: [{ type: Input }], followFocus: [{ type: Input }], ariaLabel: [{ type: Input }], ariaLabelledby: [{ type: Input }], contentBefore: [{ type: Input }], contentAfter: [{ type: Input }], type: [{ type: Input }], theme: [{ type: Input }], iconSize: [{ type: Input }], fullWidth: [{ type: Input }], dismissable: [{ type: Input }], scrollIntoView: [{ type: Input }], scrollDebounceWait: [{ type: Input }], tabsClass: [{ type: HostBinding, args: ["class.cds--tabs"] }], containedClass: [{ type: HostBinding, args: ["class.cds--tabs--contained"] }], themeClass: [{ type: HostBinding, args: ["class.cds--tabs--light"] }], dismissableClass: [{ type: HostBinding, args: ["class.cds--tabs--dismissable"] }], iconSizeDefaultClass: [{ type: HostBinding, args: ["class.cds--tabs__icon--default"] }], iconSizeLgClass: [{ type: HostBinding, args: ["class.cds--tabs__icon--lg"] }], layoutSizeLgClass: [{ type: HostBinding, args: ["class.cds--layout--size-lg"] }], headerContainer: [{ type: ViewChild, args: ["tabList", { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS10YWItaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90YWJzL2Jhc2UtdGFiLWhlYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUlULFdBQVcsRUFFWCxNQUFNLGVBQWUsQ0FBQzs7O0FBR3ZCOzs7R0FHRztBQUlILE1BQU0sT0FBTyxhQUFhO0lBb0h6QixZQUNXLFVBQXNCLEVBQ3RCLGlCQUFvQyxFQUNwQyxZQUEwQixFQUMxQixRQUFtQjtRQUhuQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQXZIOUI7OztXQUdHO1FBQ00sZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUF1QjdCOztXQUVHO1FBQ00sU0FBSSxHQUF5QixNQUFNLENBQUM7UUFDN0M7O1dBRUc7UUFDTSxVQUFLLEdBQXFCLE1BQU0sQ0FBQztRQU8xQzs7V0FFRztRQUNNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUU3Qjs7V0FFRztRQUNNLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRWhDOztXQUVHO1FBQ00sdUJBQWtCLEdBQUcsR0FBRyxDQUFDO1FBRUYsY0FBUyxHQUFHLElBQUksQ0FBQztRQTZCakQsZ0NBQWdDO1FBQ3ZCLDJCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUM1Qix3QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDeEIsb0JBQWUsR0FBRyxHQUFHLENBQUM7UUFFckIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLHdCQUFtQixHQUFRLElBQUksQ0FBQztJQXVC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QUFqQixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRTBCLFNBQVM7c0JBQXhDLFdBQVc7dUJBQUMsaUJBQWlCO2dCQUNpQixjQUFjO3NCQUE1RCxXQUFXO3VCQUFDLDRCQUE0QjtnQkFHRSxVQUFVO3NCQUFwRCxXQUFXO3VCQUFDLHdCQUF3QjtnQkFHWSxnQkFBZ0I7c0JBQWhFLFdBQVc7dUJBQUMsOEJBQThCO2dCQUdRLG9CQUFvQjtzQkFBdEUsV0FBVzt1QkFBQyxnQ0FBZ0M7Z0JBR0MsZUFBZTtzQkFBNUQsV0FBVzt1QkFBQywyQkFBMkI7Z0JBR08saUJBQWlCO3NCQUEvRCxXQUFXO3VCQUFDLDRCQUE0QjtnQkFPRCxlQUFlO3NCQUF0RCxTQUFTO3VCQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRWaWV3Q2hpbGQsXG5cdEVsZW1lbnRSZWYsXG5cdFRlbXBsYXRlUmVmLFxuXHRDaGFuZ2VEZXRlY3RvclJlZixcblx0SG9zdEJpbmRpbmcsXG5cdFJlbmRlcmVyMlxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSBcImNhcmJvbi1jb21wb25lbnRzLWFuZ3VsYXIvdXRpbHNcIjtcblxuLyoqXG4gKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gY3JlYXRlIGEgdGFiLCB0aGlzIGNsYXNzIGlzIGEgY29sbGVjdGlvbiBvZiBmZWF0dXJlc1xuICogJiBtZXRhZGF0YSByZXF1aXJlZCBieSBib3RoLlxuICovXG5AQ29tcG9uZW50KHtcblx0dGVtcGxhdGU6IFwiXCJcbn0pXG5leHBvcnQgY2xhc3MgQmFzZVRhYkhlYWRlciB7XG5cdC8qKlxuXHQgKiBTZXQgdG8gYHRydWVgIHRvIGhhdmUgYFRhYmAgaXRlbXMgY2FjaGVkIGFuZCBub3QgcmVsb2FkZWQgb24gdGFiIHN3aXRjaGluZy5cblx0ICogRHVwbGljYXRlZCBmcm9tIGBjZHMtdGFic2AgdG8gc3VwcG9ydCBzdGFuZGFsb25lIGhlYWRlcnMuXG5cdCAqL1xuXHRASW5wdXQoKSBjYWNoZUFjdGl2ZSA9IGZhbHNlO1xuXHQvKipcblx0ICogU2V0IHRvICd0cnVlJyB0byBoYXZlIHRhYnMgYXV0b21hdGljYWxseSBhY3RpdmF0ZWQgYW5kIGhhdmUgdGhlaXIgY29udGVudCBkaXNwbGF5ZWQgd2hlbiB0aGV5IHJlY2VpdmUgZm9jdXMuXG5cdCAqL1xuXHRASW5wdXQoKSBmb2xsb3dGb2N1czogYm9vbGVhbjtcblx0LyoqXG5cdCAqIFNldHMgdGhlIGFyaWEgbGFiZWwgb24gdGhlIG5hdiBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcmlhIGxhYmVsbGVkYnkgb24gdGhlIG5hdiBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsbGVkYnk6IHN0cmluZztcblxuXHQvKipcblx0ICogVGVtcGxhdGUgcHJvamVjdGVkIGJlZm9yZSB0YWIgaXRlbXMgaW5zaWRlIHRoZSB0YWIgbGlzdC5cblx0ICovXG5cdEBJbnB1dCgpIGNvbnRlbnRCZWZvcmU6IFRlbXBsYXRlUmVmPGFueT47XG5cdC8qKlxuXHQgKiBUZW1wbGF0ZSBwcm9qZWN0ZWQgYWZ0ZXIgdGFiIGl0ZW1zIGluc2lkZSB0aGUgdGFiIGxpc3QuXG5cdCAqL1xuXHRASW5wdXQoKSBjb250ZW50QWZ0ZXI6IFRlbXBsYXRlUmVmPGFueT47XG5cblx0LyoqXG5cdCAqIFZpc3VhbCBzdHlsZSBvZiB0aGUgdGFiIGxpc3Q6IGBsaW5lYCBvciBgY29udGFpbmVkYC5cblx0ICovXG5cdEBJbnB1dCgpIHR5cGU6IFwibGluZVwiIHwgXCJjb250YWluZWRcIiA9IFwibGluZVwiO1xuXHQvKipcblx0ICogVGhlbWUgZm9yIGNvbnRhaW5lZCB0YWJzOiBgZGFya2Agb3IgYGxpZ2h0YC5cblx0ICovXG5cdEBJbnB1dCgpIHRoZW1lOiBcImRhcmtcIiB8IFwibGlnaHRcIiA9IFwiZGFya1wiO1xuXG5cdC8qKlxuXHQgKiBXaGVuIHVzaW5nIGljb24tb25seSB0YWJzLCBpY29uIHNpemU6IGBkZWZhdWx0YCAoMTZweCkgb3IgYGxnYCAoMjBweCkuXG5cdCAqL1xuXHRASW5wdXQoKSBpY29uU2l6ZTogXCJkZWZhdWx0XCIgfCBcImxnXCI7XG5cblx0LyoqXG5cdCAqICoqQ29udGFpbmVkIG9ubHkqKjogRXZlbmx5IHNpemVkIHRhYnMgYWNyb3NzIHRoZSByb3cgKCoqbXVzdCoqIGhhdmUgZmV3ZXIgdGhhbiA5IHRhYnMpLlxuXHQgKi9cblx0QElucHV0KCkgZnVsbFdpZHRoID0gZmFsc2U7XG5cblx0LyoqXG5cdCAqIFNob3cgYSBjbG9zZSBjb250cm9sIG9uIGVhY2ggdGFiLlxuXHQgKi9cblx0QElucHV0KCkgZGlzbWlzc2FibGUgPSBmYWxzZTtcblxuXHQvKipcblx0ICogU2Nyb2xsIHRoZSBhY3RpdmUgdGFiIGludG8gdmlldyBvbiBmb2N1cy9zZWxlY3QuXG5cdCAqL1xuXHRASW5wdXQoKSBzY3JvbGxJbnRvVmlldyA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBEZWJvdW5jZSAobXMpIGZvciB0YWIgbGlzdCBzY3JvbGwgZXZlbnRzOyBhZmZlY3RzIG92ZXJmbG93IGNoZXZyb24gdXBkYXRlcy5cblx0ICovXG5cdEBJbnB1dCgpIHNjcm9sbERlYm91bmNlV2FpdCA9IDIwMDtcblxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLXRhYnNcIikgdGFic0NsYXNzID0gdHJ1ZTtcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10YWJzLS1jb250YWluZWRcIikgZ2V0IGNvbnRhaW5lZENsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLnR5cGUgPT09IFwiY29udGFpbmVkXCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10YWJzLS1saWdodFwiKSBnZXQgdGhlbWVDbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy50aGVtZSA9PT0gXCJsaWdodFwiO1xuXHR9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tdGFicy0tZGlzbWlzc2FibGVcIikgZ2V0IGRpc21pc3NhYmxlQ2xhc3MoKSB7XG5cdFx0cmV0dXJuIHRoaXMuZGlzbWlzc2FibGU7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10YWJzX19pY29uLS1kZWZhdWx0XCIpIGdldCBpY29uU2l6ZURlZmF1bHRDbGFzcygpIHtcblx0XHRyZXR1cm4gdGhpcy5pY29uU2l6ZSA9PT0gXCJkZWZhdWx0XCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS10YWJzX19pY29uLS1sZ1wiKSBnZXQgaWNvblNpemVMZ0NsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLmljb25TaXplID09PSBcImxnXCI7XG5cdH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1sYXlvdXQtLXNpemUtbGdcIikgZ2V0IGxheW91dFNpemVMZ0NsYXNzKCkge1xuXHRcdHJldHVybiB0aGlzLmljb25TaXplID09PSBcImxnXCI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgVW5vcmRlcmVkIExpc3QgZWxlbWVudCB0aGF0IGhvbGRzIHRoZSBgVGFiYCBoZWFkaW5ncyBmcm9tIHRoZSB2aWV3IERPTS5cblx0ICovXG5cdEBWaWV3Q2hpbGQoXCJ0YWJMaXN0XCIsIHsgc3RhdGljOiB0cnVlIH0pIGhlYWRlckNvbnRhaW5lcjtcblxuXHQvKipcblx0ICogQ29udHJvbHMgdGhlIG1hbnVhbCBmb2N1c2luZyBkb25lIGJ5IHRhYmJpbmcgdGhyb3VnaCBoZWFkaW5ncy5cblx0ICovXG5cdGN1cnJlbnRTZWxlY3RlZFRhYjogbnVtYmVyO1xuXHQvLyB3aWR0aCBvZiB0aGUgb3ZlcmZsb3cgYnV0dG9uc1xuXHRyZWFkb25seSBPVkVSRkxPV19CVVRUT05fT0ZGU0VUID0gNDQ7XG5cdHJlYWRvbmx5IGxvbmdQcmVzc011bHRpcGxpZXIgPSAzO1xuXHRyZWFkb25seSBjbGlja011bHRpcGxpZXIgPSAxLjU7XG5cblx0cHJvdGVjdGVkIGxvbmdQcmVzc0ludGVydmFsID0gbnVsbDtcblx0cHJvdGVjdGVkIHRpY2tJbnRlcnZhbCA9IG51bGw7XG5cdHByb3RlY3RlZCBzY3JvbGxEZWJvdW5jZVRpbWVyOiBhbnkgPSBudWxsO1xuXG5cdGdldCBoYXNIb3Jpem9udGFsT3ZlcmZsb3coKSB7XG5cdFx0Y29uc3QgdGFiTGlzdCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0cmV0dXJuIHRhYkxpc3Quc2Nyb2xsV2lkdGggPiB0YWJMaXN0LmNsaWVudFdpZHRoO1xuXHR9XG5cblx0Z2V0IGxlZnRPdmVyZmxvd05hdkJ1dHRvbkhpZGRlbigpIHtcblx0XHRjb25zdCB0YWJMaXN0ID0gdGhpcy5oZWFkZXJDb250YWluZXIubmF0aXZlRWxlbWVudDtcblx0XHRyZXR1cm4gIXRoaXMuaGFzSG9yaXpvbnRhbE92ZXJmbG93IHx8ICF0YWJMaXN0LnNjcm9sbExlZnQ7XG5cdH1cblxuXHRnZXQgcmlnaHRPdmVyZmxvd05hdkJ1dHRvbkhpZGRlbigpIHtcblx0XHRjb25zdCB0YWJMaXN0ID0gdGhpcy5oZWFkZXJDb250YWluZXIubmF0aXZlRWxlbWVudDtcblx0XHRyZXR1cm4gIXRoaXMuaGFzSG9yaXpvbnRhbE92ZXJmbG93IHx8XG5cdFx0XHQodGFiTGlzdC5zY3JvbGxMZWZ0ICsgdGFiTGlzdC5jbGllbnRXaWR0aCkgPT09IHRhYkxpc3Quc2Nyb2xsV2lkdGg7XG5cdH1cblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZixcblx0XHRwcm90ZWN0ZWQgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuXHRcdHByb3RlY3RlZCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcblx0XHRwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMlxuXHQpIHsgfVxuXG5cdGhhbmRsZVNjcm9sbCgpIHtcblx0XHQvLyBEZWJvdW5jZSB0aGUgY2hhbmdlIGRldGVjdGlvbiB0cmlnZ2VyIHNvIHRoZSBzY3JvbGwgYXJyb3cgdmlzaWJpbGl0eVxuXHRcdC8vIHVwZGF0ZXMgZG8gbm90IGZpcmUgb24gZXZlcnkgc2Nyb2xsIHRpY2suXG5cdFx0aWYgKHRoaXMuc2Nyb2xsRGVib3VuY2VXYWl0IDw9IDApIHtcblx0XHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbERlYm91bmNlVGltZXIpO1xuXHRcdHRoaXMuc2Nyb2xsRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcblx0XHR9LCB0aGlzLnNjcm9sbERlYm91bmNlV2FpdCk7XG5cdH1cblxuXHRoYW5kbGVPdmVyZmxvd05hdkNsaWNrKGRpcmVjdGlvbjogbnVtYmVyLCBudW1PZnRhYnMgPSAwKSB7XG5cdFx0Y29uc3QgdGFiTGlzdCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cblx0XHRjb25zdCB7IGNsaWVudFdpZHRoLCBzY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCB9ID0gdGFiTGlzdDtcblx0XHRpZiAoZGlyZWN0aW9uID4gMCkge1xuXHRcdFx0dGFiTGlzdC5zY3JvbGxMZWZ0ID0gTWF0aC5taW4oc2Nyb2xsTGVmdCArIChzY3JvbGxXaWR0aCAvIG51bU9mdGFicykgKiB0aGlzLmNsaWNrTXVsdGlwbGllcixcblx0XHRcdFx0c2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCk7XG5cdFx0fSBlbHNlIGlmIChkaXJlY3Rpb24gPCAwKSB7XG5cdFx0XHR0YWJMaXN0LnNjcm9sbExlZnQgPSBNYXRoLm1heChzY3JvbGxMZWZ0IC0gKHNjcm9sbFdpZHRoIC8gbnVtT2Z0YWJzKSAqIHRoaXMuY2xpY2tNdWx0aXBsaWVyLCAwKTtcblx0XHR9XG5cdH1cblxuXHRoYW5kbGVPdmVyZmxvd05hdk1vdXNlRG93bihkaXJlY3Rpb246IG51bWJlcikge1xuXHRcdGNvbnN0IHRhYkxpc3QgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuXG5cdFx0dGhpcy5sb25nUHJlc3NJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0Ly8gTWFudWFsbHkgb3ZlcnJpZGluZyBzY3JvbGwgYmVodmlvciB0byBgYXV0b2AgdG8gbWFrZSBhbmltYXRpb24gd29yayBjb3JyZWN0bHlcblx0XHRcdHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGFiTGlzdCwgXCJzY3JvbGwtYmVoYXZpb3JcIiwgXCJhdXRvXCIpO1xuXG5cdFx0XHR0aGlzLnRpY2tJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdFx0dGFiTGlzdC5zY3JvbGxMZWZ0ICs9IChkaXJlY3Rpb24gKiB0aGlzLmxvbmdQcmVzc011bHRpcGxpZXIpO1xuXHRcdFx0XHQvLyBjbGVhciBpbnRlcnZhbCBpZiBzY3JvbGwgcmVhY2hlcyBsZWZ0IG9yIHJpZ2h0IGVkZ2Vcblx0XHRcdFx0aWYgKHRoaXMubGVmdE92ZXJmbG93TmF2QnV0dG9uSGlkZGVuIHx8IHRoaXMucmlnaHRPdmVyZmxvd05hdkJ1dHRvbkhpZGRlbikge1xuXHRcdFx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjbGVhckludGVydmFsKHRoaXMudGlja0ludGVydmFsKTtcblx0XHRcdFx0XHRcdHRoaXMuaGFuZGxlT3ZlcmZsb3dOYXZNb3VzZVVwKCk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiAoKSA9PiBjbGVhckludGVydmFsKHRoaXMubG9uZ1ByZXNzSW50ZXJ2YWwpO1xuXHRcdH0sIDUwMCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYXIgaW50ZXJ2YWxzL1RpbWVvdXQgJiByZXNldCBzY3JvbGwgYmVoYXZpb3Jcblx0ICovXG5cdGhhbmRsZU92ZXJmbG93TmF2TW91c2VVcCgpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMudGlja0ludGVydmFsKTtcblx0XHRjbGVhclRpbWVvdXQodGhpcy5sb25nUHJlc3NJbnRlcnZhbCk7XG5cblx0XHQvLyBSZXNldCBzY3JvbGwgYmVoYXZpb3Jcblx0XHR0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaGVhZGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIFwic2Nyb2xsLWJlaGF2aW9yXCIsIFwic21vb3RoXCIpO1xuXHR9XG59XG4iXX0=