UNPKG

ng-zorro-antd-mobile

Version:

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

465 lines 44.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, QueryList, ViewChild, ElementRef, HostBinding, TemplateRef, EventEmitter, ContentChildren, ViewEncapsulation } from '@angular/core'; import { TabPaneComponent } from './tab-pane.component'; var TabsComponent = /** @class */ (function () { function TabsComponent() { this.prefixCls = 'am-tabs'; this.selectedKey = 0; this.keyToSelect = 0; this.paneMoveStyle = 'translate3d(0, 0, 0)'; this._startTime = 0; this._startPosition = 0; this._velocityThreshold = 0.3; this._tabDirection = 'horizontal'; this._tabBarPosition = 'top'; this.page = 5; this.swipeable = true; this.useOnPan = true; this.animated = true; this.distanceToChangeTab = 0.3; this.tabTitleSize = 0; this.tabBarActiveTextColor = ''; this.tabBarInactiveTextColor = ''; this.renderTabBar = null; this.tabBarBackgroundColor = '#FFF'; this.prerenderingSiblingsNumber = -1; this.tabBarTextStyle = {}; /** * should be removed when https://github.com/angular/angular/issues/20810 resolved * */ this.tabPanesContent = null; this.onChange = new EventEmitter(); this.onTabClick = new EventEmitter(); this.amTabs = true; this.amTabsTop = true; this.amTabsLeft = false; this.amTabsRight = false; this.amTabsBottom = false; this.amTabsVertical = false; this.amTabsHorizontal = true; } Object.defineProperty(TabsComponent.prototype, "activeTab", { get: /** * @return {?} */ function () { return this.selectedKey; }, set: /** * @param {?} value * @return {?} */ function (value) { this.keyToSelect = value; }, enumerable: true, configurable: true }); Object.defineProperty(TabsComponent.prototype, "tabBarPosition", { get: /** * @return {?} */ function () { return this._tabBarPosition; }, set: /** * @param {?} position * @return {?} */ function (position) { this._tabBarPosition = position; switch (position) { case 'top': this.amTabsTop = true; this.amTabsLeft = false; this.amTabsRight = false; this.amTabsBottom = false; break; case 'left': this.amTabsTop = false; this.amTabsLeft = true; this.amTabsRight = false; this.amTabsBottom = false; break; case 'bottom': this.amTabsTop = false; this.amTabsLeft = false; this.amTabsRight = false; this.amTabsBottom = true; break; case 'right': this.amTabsTop = false; this.amTabsLeft = false; this.amTabsRight = true; this.amTabsBottom = false; break; default: break; } }, enumerable: true, configurable: true }); Object.defineProperty(TabsComponent.prototype, "tabDirection", { get: /** * @return {?} */ function () { return this._tabDirection; }, set: /** * @param {?} direction * @return {?} */ function (direction) { this._tabDirection = direction; switch (direction) { case 'horizontal': this.amTabsHorizontal = true; this.amTabsVertical = false; break; case 'vertical': this.amTabsHorizontal = false; this.amTabsVertical = true; break; default: break; } }, enumerable: true, configurable: true }); /** * @param {?} index * @return {?} */ TabsComponent.prototype.clickTab = /** * @param {?} index * @return {?} */ function (index) { if (this.selectedKey !== index) { this.keyToSelect = index; this.onTabClick.emit({ index: this.keyToSelect }); } }; /** * @return {?} */ TabsComponent.prototype.getCurrentTabPanes = /** * @return {?} */ function () { return this.tabPanesContent || this.tabPanes; }; /** * @param {?} event * @return {?} */ TabsComponent.prototype.onTouchStart = /** * @param {?} event * @return {?} */ function (event) { this._startTime = event.timeStamp; if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { if ('horizontal' === this._tabDirection) { this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientX; } else if ('vertical' === this._tabDirection) { this._startPosition = event && event.changedTouches && event.changedTouches[0] && event.changedTouches[0].clientY; } } }; /** * @param {?} event * @return {?} */ TabsComponent.prototype.onTouchMove = /** * @param {?} event * @return {?} */ function (event) { if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { if ('horizontal' === this._tabDirection) { /** @type {?} */ var distance = event.changedTouches[0].clientX - this._startPosition; if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) { return; } else if (distance > 0 && this.activeTab === 0) { return; } // velocity 小于阈值才认为是pan操作 if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && this.useOnPan && this.swipeable && this.animated) { this.paneMoveStyle = 'translate3d(calc(-' + this.selectedKey * 100 + '% + ' + distance + 'px), 0, 0 )'; } } else if ('vertical' === this._tabDirection) { /** @type {?} */ var distance = event.changedTouches[0].clientY - this._startPosition; if (distance < 0 && this.activeTab === this.getCurrentTabPanes().length - 1) { return; } else if (distance > 0 && this.activeTab === 0) { return; } if (this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && this.useOnPan && this.swipeable && this.animated) { this.paneMoveStyle = 'translate3d(0, calc(-' + this.selectedKey * 100 + '% + ' + distance + 'px, 0 )'; } } } }; /** * @param {?} event * @return {?} */ TabsComponent.prototype.onTouchEnd = /** * @param {?} event * @return {?} */ function (event) { if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { if ('horizontal' === this._tabDirection) { /** @type {?} */ var distance = event.changedTouches[0].clientX - this._startPosition; /** @type {?} */ var distanceToChangeTabPx = this.tabContent.nativeElement.offsetWidth * this.distanceToChangeTab; if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && (this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) || (this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold && (this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) { if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) { this.keyToSelect++; } else if (distance > 0 && this.activeTab > 0) { this.keyToSelect--; } } this.paneMoveStyle = 'translate3d(-' + this.selectedKey * 100 + '%, 0, 0 )'; } else if ('vertical' === this._tabDirection) { /** @type {?} */ var distance = event.changedTouches[0].clientY - this._startPosition; /** @type {?} */ var distanceToChangeTabPx = this.tabContent.nativeElement.offsetHeight * this.distanceToChangeTab; if ((this.getVelocity(distance, event.timeStamp - this._startTime) <= this._velocityThreshold && (this.useOnPan && this.swipeable && Math.abs(distance) > distanceToChangeTabPx)) || (this.getVelocity(distance, event.timeStamp - this._startTime) > this._velocityThreshold && (this.swipeable && Math.abs(distance) > distanceToChangeTabPx / 2))) { if (distance < 0 && this.activeTab < this.getCurrentTabPanes().length - 1) { this.keyToSelect++; } else if (distance > 0 && this.activeTab > 0) { this.keyToSelect--; } } this.paneMoveStyle = 'translate3d(0, -' + this.selectedKey * 100 + '%, 0 )'; } } }; /** * @return {?} */ TabsComponent.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.selectTabPane(this.keyToSelect); this.selectedKey = this.keyToSelect; }; /** * @return {?} */ TabsComponent.prototype.ngDoCheck = /** * @return {?} */ function () { if (this.keyToSelect !== this.selectedKey && this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { this.selectTabPane(this.keyToSelect); this.selectedKey = this.keyToSelect; this.onChange.emit({ index: this.selectedKey }); } }; /** * @private * @param {?} index * @return {?} */ TabsComponent.prototype.selectTabPane = /** * @private * @param {?} index * @return {?} */ function (index) { if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) { /** @type {?} */ var actualKeyToSelect = Math.min(this.getCurrentTabPanes().length - 1, Math.max(index || 0, 0)); if ('horizontal' === this._tabDirection) { this.paneMoveStyle = 'translate3d(-' + actualKeyToSelect * 100 + '%, 0, 0 )'; } else if ('vertical' === this._tabDirection) { this.paneMoveStyle = 'translate3d(0, -' + actualKeyToSelect * 100 + '%, 0 )'; } } }; /** * @private * @param {?} deltaDistance * @param {?} deltaTime * @return {?} */ TabsComponent.prototype.getVelocity = /** * @private * @param {?} deltaDistance * @param {?} deltaTime * @return {?} */ function (deltaDistance, deltaTime) { return Math.abs(deltaDistance / deltaTime); }; TabsComponent.decorators = [ { type: Component, args: [{ selector: 'Tabs, nzm-tabs', template: "<ng-container>\n <ng-template\n *ngIf=\"'top' === tabBarPosition || 'left' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n >\n </ng-template>\n <div\n #TabContent\n class=\"{{ prefixCls }}-content-wrap\"\n [ngClass]=\"{ 'am-tabs-content-wrap-animated': animated }\"\n [ngStyle]=\"{ transform: paneMoveStyle, webkitTransform: paneMoveStyle }\"\n (touchstart)=\"onTouchStart($event)\"\n (touchmove)=\"onTouchMove($event)\"\n (touchend)=\"onTouchEnd($event)\"\n >\n <div\n tab-pane-body\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n [content]=\"tabPane.content\"\n [active]=\"i === selectedKey\"\n [prerender]=\"\n prerenderingSiblingsNumber < 0 ||\n (selectedKey - i <= prerenderingSiblingsNumber && selectedKey - i + prerenderingSiblingsNumber >= 0)\n \"\n ></div>\n </div>\n <ng-template\n *ngIf=\"'bottom' === tabBarPosition || 'right' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n ></ng-template>\n</ng-container>\n\n<ng-template #renderDefaultTabBar>\n <DefaultTabBar\n #DefaultTabBar\n [page]=\"page\"\n [animated]=\"animated\"\n [activeTab]=\"selectedKey\"\n [tabTitleSize]=\"tabTitleSize\"\n [tabBarPosition]=\"tabBarPosition\"\n [tabBarUnderlineStyle]=\"tabBarUnderlineStyle\"\n [tabBarBackgroundColor]=\"tabBarBackgroundColor\"\n >\n <div\n #TabTitle\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n class=\"{{ prefixCls }}-default-bar-tab\"\n [ngClass]=\"{\n 'am-tabs-default-bar-tab-active': i === selectedKey,\n 'am-tabs-default-bar-tab-disabled': tabPane.disabled\n }\"\n [ngStyle]=\"tabBarTextStyle\"\n [style.color]=\"i === selectedKey ? tabBarActiveTextColor : tabBarInactiveTextColor\"\n (click)=\"clickTab(i)\"\n >\n <ng-container *ngIf=\"tabPane.isTitleString; else titleTemplate\">\n {{ tabPane.title }}\n </ng-container>\n <ng-template #titleTemplate>\n <ng-template [ngTemplateOutlet]=\"tabPane.title\"></ng-template>\n </ng-template>\n </div>\n </DefaultTabBar>\n</ng-template>\n", encapsulation: ViewEncapsulation.None }] } ]; /** @nocollapse */ TabsComponent.ctorParameters = function () { return []; }; TabsComponent.propDecorators = { tabPanes: [{ type: ContentChildren, args: [TabPaneComponent, { descendants: false },] }], tabContent: [{ type: ViewChild, args: ['TabContent', { static: true },] }], defaultTabBar: [{ type: ViewChild, args: ['DefaultTabBar', { static: false },] }], page: [{ type: Input }], swipeable: [{ type: Input }], useOnPan: [{ type: Input }], animated: [{ type: Input }], tabBarUnderlineStyle: [{ type: Input }], distanceToChangeTab: [{ type: Input }], tabTitleSize: [{ type: Input }], tabBarActiveTextColor: [{ type: Input }], tabBarInactiveTextColor: [{ type: Input }], renderTabBar: [{ type: Input }], tabBarBackgroundColor: [{ type: Input }], prerenderingSiblingsNumber: [{ type: Input }], tabBarTextStyle: [{ type: Input }], tabPanesContent: [{ type: Input }], activeTab: [{ type: Input }], tabBarPosition: [{ type: Input }], tabDirection: [{ type: Input }], onChange: [{ type: Output }], onTabClick: [{ type: Output }], amTabs: [{ type: HostBinding, args: ['class.am-tabs',] }], amTabsTop: [{ type: HostBinding, args: ['class.am-tabs-top',] }], amTabsLeft: [{ type: HostBinding, args: ['class.am-tabs-left',] }], amTabsRight: [{ type: HostBinding, args: ['class.am-tabs-right',] }], amTabsBottom: [{ type: HostBinding, args: ['class.am-tabs-bottom',] }], amTabsVertical: [{ type: HostBinding, args: ['class.am-tabs-vertical',] }], amTabsHorizontal: [{ type: HostBinding, args: ['class.am-tabs-horizontal',] }] }; return TabsComponent; }()); export { TabsComponent }; if (false) { /** @type {?} */ TabsComponent.prototype.prefixCls; /** @type {?} */ TabsComponent.prototype.selectedKey; /** @type {?} */ TabsComponent.prototype.keyToSelect; /** @type {?} */ TabsComponent.prototype.paneMoveStyle; /** * @type {?} * @private */ TabsComponent.prototype._startTime; /** * @type {?} * @private */ TabsComponent.prototype._startPosition; /** * @type {?} * @private */ TabsComponent.prototype._velocityThreshold; /** * @type {?} * @private */ TabsComponent.prototype._tabDirection; /** * @type {?} * @private */ TabsComponent.prototype._tabBarPosition; /** @type {?} */ TabsComponent.prototype.tabPanes; /** @type {?} */ TabsComponent.prototype.tabContent; /** @type {?} */ TabsComponent.prototype.defaultTabBar; /** @type {?} */ TabsComponent.prototype.page; /** @type {?} */ TabsComponent.prototype.swipeable; /** @type {?} */ TabsComponent.prototype.useOnPan; /** @type {?} */ TabsComponent.prototype.animated; /** @type {?} */ TabsComponent.prototype.tabBarUnderlineStyle; /** @type {?} */ TabsComponent.prototype.distanceToChangeTab; /** @type {?} */ TabsComponent.prototype.tabTitleSize; /** @type {?} */ TabsComponent.prototype.tabBarActiveTextColor; /** @type {?} */ TabsComponent.prototype.tabBarInactiveTextColor; /** @type {?} */ TabsComponent.prototype.renderTabBar; /** @type {?} */ TabsComponent.prototype.tabBarBackgroundColor; /** @type {?} */ TabsComponent.prototype.prerenderingSiblingsNumber; /** @type {?} */ TabsComponent.prototype.tabBarTextStyle; /** * should be removed when https://github.com/angular/angular/issues/20810 resolved * * @type {?} */ TabsComponent.prototype.tabPanesContent; /** @type {?} */ TabsComponent.prototype.onChange; /** @type {?} */ TabsComponent.prototype.onTabClick; /** @type {?} */ TabsComponent.prototype.amTabs; /** @type {?} */ TabsComponent.prototype.amTabsTop; /** @type {?} */ TabsComponent.prototype.amTabsLeft; /** @type {?} */ TabsComponent.prototype.amTabsRight; /** @type {?} */ TabsComponent.prototype.amTabsBottom; /** @type {?} */ TabsComponent.prototype.amTabsVertical; /** @type {?} */ TabsComponent.prototype.amTabsHorizontal; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRhYnMvdGFicy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3hEO0lBdUlFO1FBaklBLGNBQVMsR0FBVyxTQUFTLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFDeEIsa0JBQWEsR0FBVyxzQkFBc0IsQ0FBQztRQUV2QyxlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLG1CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLHVCQUFrQixHQUFXLEdBQUcsQ0FBQztRQUNqQyxrQkFBYSxHQUFpQixZQUFZLENBQUM7UUFDM0Msb0JBQWUsR0FBdUIsS0FBSyxDQUFDO1FBV3BELFNBQUksR0FBVyxDQUFDLENBQUM7UUFFakIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUUxQixhQUFRLEdBQVksSUFBSSxDQUFDO1FBRXpCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFJekIsd0JBQW1CLEdBQVcsR0FBRyxDQUFDO1FBRWxDLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRXpCLDBCQUFxQixHQUFXLEVBQUUsQ0FBQztRQUVuQyw0QkFBdUIsR0FBVyxFQUFFLENBQUM7UUFFckMsaUJBQVksR0FBc0IsSUFBSSxDQUFDO1FBRXZDLDBCQUFxQixHQUFXLE1BQU0sQ0FBQztRQUV2QywrQkFBMEIsR0FBVyxDQUFDLENBQUMsQ0FBQztRQUV4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SUE4RHBELGlDQUNrRjs7SUFDbEYsbUNBQ29GOztJQUVwRiwrQkFDdUI7O0lBQ3ZCLGtDQUMwQjs7SUFDMUIsbUNBQzRCOztJQUM1QixvQ0FDNkI7O0lBQzdCLHFDQUM4Qjs7SUFDOUIsdUNBQ2dDOztJQUNoQyx5Q0FDaUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIERvQ2hlY2ssXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgVGVtcGxhdGVSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ29udGVudENoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYlBhbmVDb21wb25lbnQgfSBmcm9tICcuL3RhYi1wYW5lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJEaXJlY3Rpb24sIFRhYkJhclBvc2l0aW9uVHlwZSwgVGFic09uQ2hhbmdlRXZlbnQgfSBmcm9tICcuL1Byb3BzVHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1RhYnMsIG56bS10YWJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnMuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFRhYnNDb21wb25lbnQgaW1wbGVtZW50cyBEb0NoZWNrLCBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tdGFicyc7XG4gIHNlbGVjdGVkS2V5OiBudW1iZXIgPSAwO1xuICBrZXlUb1NlbGVjdDogbnVtYmVyID0gMDtcbiAgcGFuZU1vdmVTdHlsZTogc3RyaW5nID0gJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJztcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3N0YXJ0UG9zaXRpb246IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3ZlbG9jaXR5VGhyZXNob2xkOiBudW1iZXIgPSAwLjM7XG4gIHByaXZhdGUgX3RhYkRpcmVjdGlvbjogVGFiRGlyZWN0aW9uID0gJ2hvcml6b250YWwnO1xuICBwcml2YXRlIF90YWJCYXJQb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlID0gJ3RvcCc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJQYW5lQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICB0YWJQYW5lczogUXVlcnlMaXN0PFRhYlBhbmVDb21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ1RhYkNvbnRlbnQnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICB0YWJDb250ZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdEZWZhdWx0VGFiQmFyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGRlZmF1bHRUYWJCYXI6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgcGFnZTogbnVtYmVyID0gNTtcbiAgQElucHV0KClcbiAgc3dpcGVhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgdXNlT25QYW46IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICBhbmltYXRlZDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHRhYkJhclVuZGVybGluZVN0eWxlOiBvYmplY3Q7XG4gIEBJbnB1dCgpXG4gIGRpc3RhbmNlVG9DaGFuZ2VUYWI6IG51bWJlciA9IDAuMztcbiAgQElucHV0KClcbiAgdGFiVGl0bGVTaXplOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKVxuICB0YWJCYXJBY3RpdmVUZXh0Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICB0YWJCYXJJbmFjdGl2ZVRleHRDb2xvcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHJlbmRlclRhYkJhcjogVGVtcGxhdGVSZWY8dm9pZD4gPSBudWxsO1xuICBASW5wdXQoKVxuICB0YWJCYXJCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjRkZGJztcbiAgQElucHV0KClcbiAgcHJlcmVuZGVyaW5nU2libGluZ3NOdW1iZXI6IG51bWJlciA9IC0xO1xuICBASW5wdXQoKVxuICB0YWJCYXJUZXh0U3R5bGU6IG9iamVjdCA9IHt9O1xuICAvKiogc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDgxMCByZXNvbHZlZCAqKi9cbiAgQElucHV0KClcbiAgdGFiUGFuZXNDb250ZW50OiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD4gPSBudWxsO1xuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlVGFiKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRLZXk7XG4gIH1cbiAgc2V0IGFjdGl2ZVRhYih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5rZXlUb1NlbGVjdCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0YWJCYXJQb3NpdGlvbigpOiBUYWJCYXJQb3NpdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl90YWJCYXJQb3NpdGlvbjtcbiAgfVxuICBzZXQgdGFiQmFyUG9zaXRpb24ocG9zaXRpb246IFRhYkJhclBvc2l0aW9uVHlwZSkge1xuICAgIHRoaXMuX3RhYkJhclBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGFiRGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90YWJEaXJlY3Rpb247XG4gIH1cbiAgc2V0IHRhYkRpcmVjdGlvbihkaXJlY3Rpb246IFRhYkRpcmVjdGlvbikge1xuICAgIHRoaXMuX3RhYkRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICAgIHRoaXMuYW1UYWJzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHRoaXMuYW1UYWJzSG9yaXpvbnRhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1ZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8VGFic09uQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxUYWJzT25DaGFuZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpXG4gIG9uVGFiQ2xpY2s6IEV2ZW50RW1pdHRlcjxUYWJzT25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFRhYnNPbkNoYW5nZUV2ZW50PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicycpXG4gIGFtVGFiczogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy10b3AnKVxuICBhbVRhYnNUb3A6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtbGVmdCcpXG4gIGFtVGFic0xlZnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXJpZ2h0JylcbiAgYW1UYWJzUmlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWJvdHRvbScpXG4gIGFtVGFic0JvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtdmVydGljYWwnKVxuICBhbVRhYnNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtaG9yaXpvbnRhbCcpXG4gIGFtVGFic0hvcml6b250YWw6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBjbGlja1RhYihpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRLZXkgIT09IGluZGV4KSB7XG4gICAgICB0aGlzLmtleVRvU2VsZWN0ID0gaW5kZXg7XG4gICAgICB0aGlzLm9uVGFiQ2xpY2suZW1pdCh7IGluZGV4OiB0aGlzLmtleVRvU2VsZWN0IH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEN1cnJlbnRUYWJQYW5lcygpOiBRdWVyeUxpc3Q8VGFiUGFuZUNvbXBvbmVudD4ge1xuICAgIHJldHVybiB0aGlzLnRhYlBhbmVzQ29udGVudCB8fCB0aGlzLnRhYlBhbmVzO1xuICB9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gZXZlbnQudGltZVN0YW1wO1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPVxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID1cbiAgICAgICAgICBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB2ZWxvY2l0eSDlsI/kuo7pmIjlgLzmiY3orqTkuLrmmK9wYW7mk43kvZxcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICB0aGlzLnVzZU9uUGFuICYmXG4gICAgICAgICAgdGhpcy5zd2lwZWFibGUgJiZcbiAgICAgICAgICB0aGlzLmFuaW1hdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZChjYWxjKC0nICsgdGhpcy5zZWxlY3RlZEtleSAqIDEwMCArICclICsgJyArIGRpc3RhbmNlICsgJ3B4KSwgMCwgMCApJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgIHRoaXMudXNlT25QYW4gJiZcbiAgICAgICAgICB0aGlzLnN3aXBlYWJsZSAmJlxuICAgICAgICAgIHRoaXMuYW5pbWF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsIGNhbGMoLScgKyB0aGlzLnNlbGVjdGVkS2V5ICogMTAwICsgJyUgKyAnICsgZGlzdGFuY2UgKyAncHgsIDAgKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRvdWNoRW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0NoYW5nZVRhYlB4ID0gdGhpcy50YWJDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKiB0aGlzLmRpc3RhbmNlVG9DaGFuZ2VUYWI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMudXNlT25QYW4gJiYgdGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4KSkgfHxcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA+IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4IC8gMikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPCB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QrKztcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKC0nICsgdGhpcy5zZWxlY3RlZEtleSAqIDEwMCArICclLCAwLCAwICknO1xuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0NoYW5nZVRhYlB4ID0gdGhpcy50YWJDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5kaXN0YW5jZVRvQ2hhbmdlVGFiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnVzZU9uUGFuICYmIHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCkpIHx8XG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPiB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCAvIDIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiIDwgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0LS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCAtJyArIHRoaXMuc2VsZWN0ZWRLZXkgKiAxMDAgKyAnJSwgMCApJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RUYWJQYW5lKHRoaXMua2V5VG9TZWxlY3QpO1xuICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSB0aGlzLmtleVRvU2VsZWN0O1xuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLmtleVRvU2VsZWN0ICE9PSB0aGlzLnNlbGVjdGVkS2V5ICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdFRhYlBhbmUodGhpcy5rZXlUb1NlbGVjdCk7XG4gICAgICB0aGlzLnNlbGVjdGVkS2V5ID0gdGhpcy5rZXlUb1NlbGVjdDtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7IGluZGV4OiB0aGlzLnNlbGVjdGVkS2V5IH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0VGFiUGFuZShpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhY3R1YWxLZXlUb1NlbGVjdCA9IE1hdGgubWluKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSwgTWF0aC5tYXgoaW5kZXggfHwgMCwgMCkpO1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgtJyArIGFjdHVhbEtleVRvU2VsZWN0ICogMTAwICsgJyUsIDAsIDAgKSc7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgLScgKyBhY3R1YWxLZXlUb1NlbGVjdCAqIDEwMCArICclLCAwICknO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVsb2NpdHkoZGVsdGFEaXN0YW5jZSwgZGVsdGFUaW1lKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGRlbHRhRGlzdGFuY2UgLyBkZWx0YVRpbWUpO1xuICB9XG59XG4iXX0=