ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
522 lines (521 loc) • 47.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, QueryList, ViewChild, ElementRef, HostBinding, TemplateRef, EventEmitter, ContentChildren, ViewEncapsulation } from '@angular/core';
import { TabPane } from './tab-pane.component';
/** @typedef {?} */
var TabDirection;
export { TabDirection };
/** @typedef {?} */
var TabBarPositionType;
export { TabBarPositionType };
/**
* @record
*/
export function OnChangeEvent() { }
/** @type {?} */
OnChangeEvent.prototype.index;
var Tabs = /** @class */ (function () {
function Tabs() {
this.prefixCls = 'am-tabs';
this.selectedKey = 0;
this.keyToSelect = 0;
this.paneMoveStyle = '';
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.tabBarActiveTextColor = '';
this.tabBarInactiveTextColor = '';
this.renderTabBar = null;
this.tabBarBackgroundColor = '#FFF';
this.tabBarTextStyle = {};
/**
* should be removed when https://github.com/angular/angular/issues/20810 resolved *
*/
this.tabPanesComponent = 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(Tabs.prototype, "activeTab", {
get: /**
* @return {?}
*/
function () {
return this.selectedKey;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.keyToSelect = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Tabs.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(Tabs.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 {?}
*/
Tabs.prototype.clickTab = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.selectedKey !== index) {
this.keyToSelect = index;
this.onTabClick.emit({ index: this.keyToSelect });
}
};
/**
* @return {?}
*/
Tabs.prototype.getCurrentTabPanes = /**
* @return {?}
*/
function () {
return this.tabPanesComponent || this.tabPanes;
};
/**
* @param {?} event
* @return {?}
*/
Tabs.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 {?}
*/
Tabs.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(' + 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, ' + distance + 'px, 0 )';
}
}
}
};
/**
* @param {?} event
* @return {?}
*/
Tabs.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(0, 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, 0, 0 )';
}
}
};
/**
* @return {?}
*/
Tabs.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.selectTabPane(this.keyToSelect);
this.selectedKey = this.keyToSelect;
};
/**
* @return {?}
*/
Tabs.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 });
}
};
/**
* @param {?} index
* @return {?}
*/
Tabs.prototype.selectTabPane = /**
* @param {?} index
* @return {?}
*/
function (index) {
var _this = this;
/** @type {?} */
var keyToSelect = Math.min(this.getCurrentTabPanes().length - 1, Math.max(index || 0, 0));
this.getCurrentTabPanes().forEach(function (tabPane, indexKey) {
if (keyToSelect < indexKey) {
if (_this.animated) {
if ('horizontal' === _this._tabDirection) {
if (keyToSelect === indexKey - 1) {
tabPane.position = 'right-with-animation-with-higher-zindex';
}
else {
tabPane.position = 'right-with-animation';
}
}
else if ('vertical' === _this._tabDirection) {
if (keyToSelect === indexKey - 1) {
tabPane.position = 'bottom-with-animation-with-higher-zindex';
}
else {
tabPane.position = 'bottom-with-animation';
}
}
}
else {
if ('horizontal' === _this._tabDirection) {
tabPane.position = 'right-without-animation';
}
else if ('vertical' === _this._tabDirection) {
tabPane.position = 'bottom-without-animation';
}
}
}
else if (keyToSelect > indexKey) {
if (_this.animated) {
if ('horizontal' === _this._tabDirection) {
if (keyToSelect === indexKey + 1) {
tabPane.position = 'left-with-animation-with-higher-zindex';
}
else {
tabPane.position = 'left-with-animation';
}
}
else if ('vertical' === _this._tabDirection) {
if (keyToSelect === indexKey + 1) {
tabPane.position = 'top-with-animation-with-higher-zindex';
}
else {
tabPane.position = 'top-with-animation';
}
}
}
else {
if ('horizontal' === _this._tabDirection) {
tabPane.position = 'left-without-animation';
}
else if ('vertical' === _this._tabDirection) {
tabPane.position = 'top-without-animation';
}
}
}
else {
if (_this.animated) {
tabPane.position = 'center-with-animation';
}
else {
tabPane.position = 'center-without-animation';
}
}
if (keyToSelect !== indexKey) {
tabPane.active = false;
}
else {
tabPane.active = true;
}
});
};
/**
* @param {?} deltaDistance
* @param {?} deltaTime
* @return {?}
*/
Tabs.prototype.getVelocity = /**
* @param {?} deltaDistance
* @param {?} deltaTime
* @return {?}
*/
function (deltaDistance, deltaTime) {
return Math.abs(deltaDistance / deltaTime);
};
Tabs.decorators = [
{ type: Component, args: [{
selector: 'Tabs, nzm-tabs',
template: "<ng-container>\n <ng-template *ngIf=\"'top' === tabBarPosition || 'left' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\">\n </ng-template>\n <div #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 <ng-content></ng-content>\n </div>\n <ng-template *ngIf=\"'bottom' === tabBarPosition || 'right' === tabBarPosition\"\n [ngTemplateOutlet]=\"renderTabBar || renderDefaultTabBar\"\n ></ng-template>\n</ng-container>\n\n<ng-template #renderDefaultTabBar>\n <DefaultTabBar #DefaultTabBar\n [page]=\"page\"\n [animated]=\"animated\"\n [activeTab]=\"selectedKey\"\n [tabBarPosition]=\"tabBarPosition\"\n [tabBarBackgroundColor]=\"tabBarBackgroundColor\"\n [tabBarUnderlineStyle]=\"tabBarUnderlineStyle\"\n >\n <div #TabTitle\n *ngFor=\"let tabPane of getCurrentTabPanes(); let i = index\"\n class=\"{{prefixCls}}-default-bar-tab\"\n [ngClass]=\"{'am-tabs-default-bar-tab-active': tabPane.active, 'am-tabs-default-bar-tab-disabled': tabPane.disabled}\"\n [ngStyle]=\"tabBarTextStyle\"\n [style.color]=\"tabPane.active ? 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>",
encapsulation: ViewEncapsulation.None
}] }
];
/** @nocollapse */
Tabs.ctorParameters = function () { return []; };
Tabs.propDecorators = {
tabPanes: [{ type: ContentChildren, args: [TabPane, { descendants: true },] }],
tabContent: [{ type: ViewChild, args: ['TabContent',] }],
tabsBarSwipe: [{ type: ViewChild, args: ['TabsBarSwipe',] }],
defaultTabBar: [{ type: ViewChild, args: ['DefaultTabBar',] }],
tabsBarContainer: [{ type: ViewChild, args: ['TabsBarContainer',] }],
page: [{ type: Input }],
swipeable: [{ type: Input }],
useOnPan: [{ type: Input }],
animated: [{ type: Input }],
tabBarUnderlineStyle: [{ type: Input }],
distanceToChangeTab: [{ type: Input }],
tabBarActiveTextColor: [{ type: Input }],
tabBarInactiveTextColor: [{ type: Input }],
renderTabBar: [{ type: Input }],
tabBarBackgroundColor: [{ type: Input }],
tabBarTextStyle: [{ type: Input }],
tabPanesComponent: [{ 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 Tabs;
}());
export { Tabs };
if (false) {
/** @type {?} */
Tabs.prototype.prefixCls;
/** @type {?} */
Tabs.prototype.selectedKey;
/** @type {?} */
Tabs.prototype.keyToSelect;
/** @type {?} */
Tabs.prototype.paneMoveStyle;
/** @type {?} */
Tabs.prototype._startTime;
/** @type {?} */
Tabs.prototype._startPosition;
/** @type {?} */
Tabs.prototype._velocityThreshold;
/** @type {?} */
Tabs.prototype._tabDirection;
/** @type {?} */
Tabs.prototype._tabBarPosition;
/** @type {?} */
Tabs.prototype.tabPanes;
/** @type {?} */
Tabs.prototype.tabContent;
/** @type {?} */
Tabs.prototype.tabsBarSwipe;
/** @type {?} */
Tabs.prototype.defaultTabBar;
/** @type {?} */
Tabs.prototype.tabsBarContainer;
/** @type {?} */
Tabs.prototype.page;
/** @type {?} */
Tabs.prototype.swipeable;
/** @type {?} */
Tabs.prototype.useOnPan;
/** @type {?} */
Tabs.prototype.animated;
/** @type {?} */
Tabs.prototype.tabBarUnderlineStyle;
/** @type {?} */
Tabs.prototype.distanceToChangeTab;
/** @type {?} */
Tabs.prototype.tabBarActiveTextColor;
/** @type {?} */
Tabs.prototype.tabBarInactiveTextColor;
/** @type {?} */
Tabs.prototype.renderTabBar;
/** @type {?} */
Tabs.prototype.tabBarBackgroundColor;
/** @type {?} */
Tabs.prototype.tabBarTextStyle;
/**
* should be removed when https://github.com/angular/angular/issues/20810 resolved *
* @type {?}
*/
Tabs.prototype.tabPanesComponent;
/** @type {?} */
Tabs.prototype.onChange;
/** @type {?} */
Tabs.prototype.onTabClick;
/** @type {?} */
Tabs.prototype.amTabs;
/** @type {?} */
Tabs.prototype.amTabsTop;
/** @type {?} */
Tabs.prototype.amTabsLeft;
/** @type {?} */
Tabs.prototype.amTabsRight;
/** @type {?} */
Tabs.prototype.amTabsBottom;
/** @type {?} */
Tabs.prototype.amTabsVertical;
/** @type {?} */
Tabs.prototype.amTabsHorizontal;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRhYnMvdGFicy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7SUErSTdDO3lCQWpJb0IsU0FBUzsyQkFDUCxDQUFDOzJCQUNELENBQUM7NkJBQ0MsRUFBRTswQkFFRyxDQUFDOzhCQUNHLENBQUM7a0NBQ0csR0FBRzs2QkFDRixZQUFZOytCQUNKLEtBQUs7b0JBZXBDLENBQUM7eUJBRUssSUFBSTt3QkFFTCxJQUFJO3dCQUVKLElBQUk7bUNBSU0sR0FBRztxQ0FFRCxFQUFFO3VDQUVBLEVBQUU7NEJBRUYsSUFBSTtxQ0FFTixNQUFNOytCQUVaLEVBQUU7Ozs7aUNBR1ksSUFBSTt3QkErREosSUFBSSxZQUFZLEVBQWlCOzBCQUUvQixJQUFJLFlBQVksRUFBaUI7c0JBR3pELElBQUk7eUJBRUQsSUFBSTswQkFFSCxLQUFLOzJCQUVKLEtBQUs7NEJBRUosS0FBSzs4QkFFSCxLQUFLO2dDQUVILElBQUk7S0FFaEI7SUFqRmhCLHNCQUNJLDJCQUFTOzs7O1FBRGI7WUFFRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7U0FDekI7Ozs7O1FBQ0QsVUFBYyxLQUFhO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzFCOzs7T0FIQTtJQUlELHNCQUNJLGdDQUFjOzs7O1FBRGxCO1lBRUUsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1NBQzdC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RWhDLFdBQVcsU0FBQyxxQkFBcUI7K0JBRWpDLFdBQVcsU0FBQyxzQkFBc0I7aUNBRWxDLFdBQVcsU0FBQyx3QkFBd0I7bUNBRXBDLFdBQVcsU0FBQywwQkFBMEI7O2VBM0p6Qzs7U0E0QmEsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRG9DaGVjayxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBUZW1wbGF0ZVJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFiUGFuZSB9IGZyb20gJy4vdGFiLXBhbmUuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgVGFiRGlyZWN0aW9uID0gJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcbmV4cG9ydCB0eXBlIFRhYkJhclBvc2l0aW9uVHlwZSA9ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuZXhwb3J0IGludGVyZmFjZSBPbkNoYW5nZUV2ZW50IHtcbiAgaW5kZXg6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnVGFicywgbnptLXRhYnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFicy5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGFicyBpbXBsZW1lbnRzIERvQ2hlY2ssIEFmdGVyQ29udGVudEluaXQge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS10YWJzJztcbiAgc2VsZWN0ZWRLZXk6IG51bWJlciA9IDA7XG4gIGtleVRvU2VsZWN0OiBudW1iZXIgPSAwO1xuICBwYW5lTW92ZVN0eWxlOiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIF9zdGFydFRpbWU6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3N0YXJ0UG9zaXRpb246IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX3ZlbG9jaXR5VGhyZXNob2xkOiBudW1iZXIgPSAwLjM7XG4gIHByaXZhdGUgX3RhYkRpcmVjdGlvbjogVGFiRGlyZWN0aW9uID0gJ2hvcml6b250YWwnO1xuICBwcml2YXRlIF90YWJCYXJQb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlID0gJ3RvcCc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUYWJQYW5lLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHRhYlBhbmVzOiBRdWVyeUxpc3Q8VGFiUGFuZT47XG5cbiAgQFZpZXdDaGlsZCgnVGFiQ29udGVudCcpXG4gIHRhYkNvbnRlbnQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ1RhYnNCYXJTd2lwZScpXG4gIHRhYnNCYXJTd2lwZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnRGVmYXVsdFRhYkJhcicpXG4gIGRlZmF1bHRUYWJCYXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ1RhYnNCYXJDb250YWluZXInKVxuICB0YWJzQmFyQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIHBhZ2U6IG51bWJlciA9IDU7XG4gIEBJbnB1dCgpXG4gIHN3aXBlYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHVzZU9uUGFuOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICB0YWJCYXJVbmRlcmxpbmVTdHlsZTogb2JqZWN0O1xuICBASW5wdXQoKVxuICBkaXN0YW5jZVRvQ2hhbmdlVGFiOiBudW1iZXIgPSAwLjM7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckFjdGl2ZVRleHRDb2xvcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckluYWN0aXZlVGV4dENvbG9yOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KClcbiAgcmVuZGVyVGFiQmFyOiBUZW1wbGF0ZVJlZjx2b2lkPiA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHRhYkJhckJhY2tncm91bmRDb2xvcjogc3RyaW5nID0gJyNGRkYnO1xuICBASW5wdXQoKVxuICB0YWJCYXJUZXh0U3R5bGU6IG9iamVjdCA9IHt9O1xuICAvKiogc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8yMDgxMCByZXNvbHZlZCAqKi9cbiAgQElucHV0KClcbiAgdGFiUGFuZXNDb21wb25lbnQ6IFF1ZXJ5TGlzdDxUYWJQYW5lPiA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmVUYWIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEtleTtcbiAgfVxuICBzZXQgYWN0aXZlVGFiKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLmtleVRvU2VsZWN0ID0gdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHRhYkJhclBvc2l0aW9uKCk6IFRhYkJhclBvc2l0aW9uVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkJhclBvc2l0aW9uO1xuICB9XG4gIHNldCB0YWJCYXJQb3NpdGlvbihwb3NpdGlvbjogVGFiQmFyUG9zaXRpb25UeXBlKSB7XG4gICAgdGhpcy5fdGFiQmFyUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICBzd2l0Y2ggKHBvc2l0aW9uKSB7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHRoaXMuYW1UYWJzVG9wID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzTGVmdCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0YWJEaXJlY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYkRpcmVjdGlvbjtcbiAgfVxuICBzZXQgdGFiRGlyZWN0aW9uKGRpcmVjdGlvbjogVGFiRGlyZWN0aW9uKSB7XG4gICAgdGhpcy5fdGFiRGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzpcbiAgICAgICAgdGhpcy5hbVRhYnNIb3Jpem9udGFsID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hbVRhYnNWZXJ0aWNhbCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgICAgdGhpcy5hbVRhYnNIb3Jpem9udGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxPbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8T25DaGFuZ2VFdmVudD4oKTtcbiAgQE91dHB1dCgpXG4gIG9uVGFiQ2xpY2s6IEV2ZW50RW1pdHRlcjxPbkNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8T25DaGFuZ2VFdmVudD4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMnKVxuICBhbVRhYnM6IGJvb2xlYW4gPSB0cnVlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtdG9wJylcbiAgYW1UYWJzVG9wOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWxlZnQnKVxuICBhbVRhYnNMZWZ0OiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1yaWdodCcpXG4gIGFtVGFic1JpZ2h0OiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1ib3R0b20nKVxuICBhbVRhYnNCb3R0b206IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXZlcnRpY2FsJylcbiAgYW1UYWJzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLWhvcml6b250YWwnKVxuICBhbVRhYnNIb3Jpem9udGFsOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgY2xpY2tUYWIoaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkS2V5ICE9PSBpbmRleCkge1xuICAgICAgdGhpcy5rZXlUb1NlbGVjdCA9IGluZGV4O1xuICAgICAgdGhpcy5vblRhYkNsaWNrLmVtaXQoeyBpbmRleDogdGhpcy5rZXlUb1NlbGVjdCB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRDdXJyZW50VGFiUGFuZXMoKTogUXVlcnlMaXN0PFRhYlBhbmU+IHtcbiAgICByZXR1cm4gdGhpcy50YWJQYW5lc0NvbXBvbmVudCB8fCB0aGlzLnRhYlBhbmVzO1xuICB9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgdGhpcy5fc3RhcnRUaW1lID0gZXZlbnQudGltZVN0YW1wO1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPVxuICAgICAgICAgIGV2ZW50ICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFg7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID1cbiAgICAgICAgICBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA9PT0gMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB2ZWxvY2l0eSDlsI/kuo7pmIjlgLzmiY3orqTkuLrmmK9wYW7mk43kvZxcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICB0aGlzLnVzZU9uUGFuICYmXG4gICAgICAgICAgdGhpcy5zd2lwZWFibGUgJiZcbiAgICAgICAgICB0aGlzLmFuaW1hdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgnICsgZGlzdGFuY2UgKyAncHgsIDAsIDAgKSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICB0aGlzLnVzZU9uUGFuICYmXG4gICAgICAgICAgdGhpcy5zd2lwZWFibGUgJiZcbiAgICAgICAgICB0aGlzLmFuaW1hdGVkXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCAnICsgZGlzdGFuY2UgKyAncHgsIDAgKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRvdWNoRW5kKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0NoYW5nZVRhYlB4ID0gdGhpcy50YWJDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKiB0aGlzLmRpc3RhbmNlVG9DaGFuZ2VUYWI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMudXNlT25QYW4gJiYgdGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4KSkgfHxcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA+IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgICAodGhpcy5zd2lwZWFibGUgJiYgTWF0aC5hYnMoZGlzdGFuY2UpID4gZGlzdGFuY2VUb0NoYW5nZVRhYlB4IC8gMikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPCB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QrKztcbiAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID4gMCAmJiB0aGlzLmFjdGl2ZVRhYiA+IDApIHtcbiAgICAgICAgICAgIHRoaXMua2V5VG9TZWxlY3QtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYW5lTW92ZVN0eWxlID0gJ3RyYW5zbGF0ZTNkKDAsIDAsIDAgKSc7XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBjb25zdCBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggPSB0aGlzLnRhYkNvbnRlbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgKiB0aGlzLmRpc3RhbmNlVG9DaGFuZ2VUYWI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAodGhpcy5nZXRWZWxvY2l0eShkaXN0YW5jZSwgZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lKSA8PSB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMudXNlT25QYW4gJiYgdGhpcy5zd2lwZWFibGUgJiYgIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCkpIHx8XG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPiB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCAvIDIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiIDwgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0LS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCAwLCAwICknO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnNlbGVjdFRhYlBhbmUodGhpcy5rZXlUb1NlbGVjdCk7XG4gICAgdGhpcy5zZWxlY3RlZEtleSA9IHRoaXMua2V5VG9TZWxlY3Q7XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMua2V5VG9TZWxlY3QgIT09IHRoaXMuc2VsZWN0ZWRLZXkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiUGFuZSh0aGlzLmtleVRvU2VsZWN0KTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSB0aGlzLmtleVRvU2VsZWN0O1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHsgaW5kZXg6IHRoaXMuc2VsZWN0ZWRLZXkgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RUYWJQYW5lKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBrZXlUb1NlbGVjdCA9IE1hdGgubWluKHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSwgTWF0aC5tYXgoaW5kZXggfHwgMCwgMCkpO1xuICAgIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkuZm9yRWFjaCgodGFiUGFuZTogVGFiUGFuZSwgaW5kZXhLZXk6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGtleVRvU2VsZWN0IDwgaW5kZXhLZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChrZXlUb1NlbGVjdCA9PT0gaW5kZXhLZXkgLSAxKSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAncmlnaHQtd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAncmlnaHQtd2l0aC1hbmltYXRpb24nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoa2V5VG9TZWxlY3QgPT09IGluZGV4S2V5IC0gMSkge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2JvdHRvbS13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdib3R0b20td2l0aC1hbmltYXRpb24nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAncmlnaHQtd2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2JvdHRvbS13aXRob3V0LWFuaW1hdGlvbic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGtleVRvU2VsZWN0ID4gaW5kZXhLZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgICAgICBpZiAoJ2hvcml6b250YWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChrZXlUb1NlbGVjdCA9PT0gaW5kZXhLZXkgKyAxKSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnbGVmdC13aXRoLWFuaW1hdGlvbi13aXRoLWhpZ2hlci16aW5kZXgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdsZWZ0LXdpdGgtYW5pbWF0aW9uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKGtleVRvU2VsZWN0ID09PSBpbmRleEtleSArIDEpIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICd0b3Atd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAndG9wLXdpdGgtYW5pbWF0aW9uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2xlZnQtd2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJ3ZlcnRpY2FsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3RvcC13aXRob3V0LWFuaW1hdGlvbic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCkge1xuICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnY2VudGVyLXdpdGgtYW5pbWF0aW9uJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2NlbnRlci13aXRob3V0LWFuaW1hdGlvbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChrZXlUb1NlbGVjdCAhPT0gaW5kZXhLZXkpIHtcbiAgICAgICAgdGFiUGFuZS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhYlBhbmUuYWN0aXZlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmVsb2NpdHkoZGVsdGFEaXN0YW5jZSwgZGVsdGFUaW1lKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKGRlbHRhRGlzdGFuY2UgLyBkZWx0YVRpbWUpO1xuICB9XG59XG4iXX0=