carbon-components-angular
Version:
Next generation components
191 lines • 22.5 kB
JavaScript
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=