ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
473 lines (472 loc) • 46.1 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;
export class Tabs {
constructor() {
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;
}
/**
* @return {?}
*/
get activeTab() {
return this.selectedKey;
}
/**
* @param {?} value
* @return {?}
*/
set activeTab(value) {
this.keyToSelect = value;
}
/**
* @return {?}
*/
get tabBarPosition() {
return this._tabBarPosition;
}
/**
* @param {?} position
* @return {?}
*/
set tabBarPosition(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;
}
}
/**
* @return {?}
*/
get tabDirection() {
return this._tabDirection;
}
/**
* @param {?} direction
* @return {?}
*/
set tabDirection(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;
}
}
/**
* @param {?} index
* @return {?}
*/
clickTab(index) {
if (this.selectedKey !== index) {
this.keyToSelect = index;
this.onTabClick.emit({ index: this.keyToSelect });
}
}
/**
* @return {?}
*/
getCurrentTabPanes() {
return this.tabPanesComponent || this.tabPanes;
}
/**
* @param {?} event
* @return {?}
*/
onTouchStart(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 {?}
*/
onTouchMove(event) {
if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
if ('horizontal' === this._tabDirection) {
/** @type {?} */
const 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 {?} */
const 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 {?}
*/
onTouchEnd(event) {
if (this.getCurrentTabPanes() && this.getCurrentTabPanes().length > 0) {
if ('horizontal' === this._tabDirection) {
/** @type {?} */
const distance = event.changedTouches[0].clientX - this._startPosition;
/** @type {?} */
const 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 {?} */
const distance = event.changedTouches[0].clientY - this._startPosition;
/** @type {?} */
const 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 {?}
*/
ngAfterContentInit() {
this.selectTabPane(this.keyToSelect);
this.selectedKey = this.keyToSelect;
}
/**
* @return {?}
*/
ngDoCheck() {
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 {?}
*/
selectTabPane(index) {
/** @type {?} */
const keyToSelect = Math.min(this.getCurrentTabPanes().length - 1, Math.max(index || 0, 0));
this.getCurrentTabPanes().forEach((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 {?}
*/
getVelocity(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 = () => [];
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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInRhYnMvdGFicy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsV0FBVyxFQUNYLFlBQVksRUFDWixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQWEvQyxNQUFNO0lBa0lKO3lCQWpJb0IsU0FBUzsyQkFDUCxDQUFDOzJCQUNELENBQUM7NkJBQ0MsRUFBRTswQkFFRyxDQUFDOzhCQUNHLENBQUM7a0NBQ0csR0FBRzs2QkFDRixZQUFZOytCQUNKLEtBQUs7b0JBZXBDLENBQUM7eUJBRUssSUFBSTt3QkFFTCxJQUFJO3dCQUVKLElBQUk7bUNBSU0sR0FBRztxQ0FFRCxFQUFFO3VDQUVBLEVBQUU7NEJBRUYsSUFBSTtxQ0FFTixNQUFNOytCQUVaLEVBQUU7Ozs7aUNBR1ksSUFBSTt3QkErREosSUFBSSxZQUFZLEVBQWlCOzBCQUUvQixJQUFJLFlBQVksRUFBaUI7c0JBR3pELElBQUk7eUJBRUQsSUFBSTswQkFFSCxLQUFLOzJCQUVKLEtBQUs7NEJBRUosS0FBSzs4QkFFSCxLQUFLO2dDQUVILElBQUk7S0FFaEI7Ozs7SUFqRmhCLElBQ0ksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztLQUN6Qjs7Ozs7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0tBQzFCOzs7O0lBQ0QsSUFDSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztLQUM3Qjs7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LFdBQVcsU0FBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIERvQ2hlY2ssXG4gIEFmdGVyQ29udGVudEluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0QmluZGluZyxcbiAgVGVtcGxhdGVSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ29udGVudENoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRhYlBhbmUgfSBmcm9tICcuL3RhYi1wYW5lLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIFRhYkRpcmVjdGlvbiA9ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5leHBvcnQgdHlwZSBUYWJCYXJQb3NpdGlvblR5cGUgPSAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcbmV4cG9ydCBpbnRlcmZhY2UgT25DaGFuZ2VFdmVudCB7XG4gIGluZGV4OiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1RhYnMsIG56bS10YWJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnMuY29tcG9uZW50Lmh0bWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIFRhYnMgaW1wbGVtZW50cyBEb0NoZWNrLCBBZnRlckNvbnRlbnRJbml0IHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tdGFicyc7XG4gIHNlbGVjdGVkS2V5OiBudW1iZXIgPSAwO1xuICBrZXlUb1NlbGVjdDogbnVtYmVyID0gMDtcbiAgcGFuZU1vdmVTdHlsZTogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBfc3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9zdGFydFBvc2l0aW9uOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF92ZWxvY2l0eVRocmVzaG9sZDogbnVtYmVyID0gMC4zO1xuICBwcml2YXRlIF90YWJEaXJlY3Rpb246IFRhYkRpcmVjdGlvbiA9ICdob3Jpem9udGFsJztcbiAgcHJpdmF0ZSBfdGFiQmFyUG9zaXRpb246IFRhYkJhclBvc2l0aW9uVHlwZSA9ICd0b3AnO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oVGFiUGFuZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICB0YWJQYW5lczogUXVlcnlMaXN0PFRhYlBhbmU+O1xuXG4gIEBWaWV3Q2hpbGQoJ1RhYkNvbnRlbnQnKVxuICB0YWJDb250ZW50OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdUYWJzQmFyU3dpcGUnKVxuICB0YWJzQmFyU3dpcGU6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ0RlZmF1bHRUYWJCYXInKVxuICBkZWZhdWx0VGFiQmFyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdUYWJzQmFyQ29udGFpbmVyJylcbiAgdGFic0JhckNvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKVxuICBwYWdlOiBudW1iZXIgPSA1O1xuICBASW5wdXQoKVxuICBzd2lwZWFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKVxuICB1c2VPblBhbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGFuaW1hdGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgdGFiQmFyVW5kZXJsaW5lU3R5bGU6IG9iamVjdDtcbiAgQElucHV0KClcbiAgZGlzdGFuY2VUb0NoYW5nZVRhYjogbnVtYmVyID0gMC4zO1xuICBASW5wdXQoKVxuICB0YWJCYXJBY3RpdmVUZXh0Q29sb3I6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKVxuICB0YWJCYXJJbmFjdGl2ZVRleHRDb2xvcjogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpXG4gIHJlbmRlclRhYkJhcjogVGVtcGxhdGVSZWY8dm9pZD4gPSBudWxsO1xuICBASW5wdXQoKVxuICB0YWJCYXJCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZyA9ICcjRkZGJztcbiAgQElucHV0KClcbiAgdGFiQmFyVGV4dFN0eWxlOiBvYmplY3QgPSB7fTtcbiAgLyoqIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjA4MTAgcmVzb2x2ZWQgKiovXG4gIEBJbnB1dCgpXG4gIHRhYlBhbmVzQ29tcG9uZW50OiBRdWVyeUxpc3Q8VGFiUGFuZT4gPSBudWxsO1xuICBASW5wdXQoKVxuICBnZXQgYWN0aXZlVGFiKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRLZXk7XG4gIH1cbiAgc2V0IGFjdGl2ZVRhYih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5rZXlUb1NlbGVjdCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCB0YWJCYXJQb3NpdGlvbigpOiBUYWJCYXJQb3NpdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl90YWJCYXJQb3NpdGlvbjtcbiAgfVxuICBzZXQgdGFiQmFyUG9zaXRpb24ocG9zaXRpb246IFRhYkJhclBvc2l0aW9uVHlwZSkge1xuICAgIHRoaXMuX3RhYkJhclBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgc3dpdGNoIChwb3NpdGlvbikge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmFtVGFic1RvcCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic0xlZnQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzQm90dG9tID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNCb3R0b20gPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgdGhpcy5hbVRhYnNUb3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hbVRhYnNMZWZ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW1UYWJzUmlnaHQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFtVGFic0JvdHRvbSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKVxuICBnZXQgdGFiRGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl90YWJEaXJlY3Rpb247XG4gIH1cbiAgc2V0IHRhYkRpcmVjdGlvbihkaXJlY3Rpb246IFRhYkRpcmVjdGlvbikge1xuICAgIHRoaXMuX3RhYkRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICAgIHRoaXMuYW1UYWJzSG9yaXpvbnRhbCA9IHRydWU7XG4gICAgICAgIHRoaXMuYW1UYWJzVmVydGljYWwgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHRoaXMuYW1UYWJzSG9yaXpvbnRhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFtVGFic1ZlcnRpY2FsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8T25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKVxuICBvblRhYkNsaWNrOiBFdmVudEVtaXR0ZXI8T25DaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPE9uQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzJylcbiAgYW1UYWJzOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5hbS10YWJzLXRvcCcpXG4gIGFtVGFic1RvcDogYm9vbGVhbiA9IHRydWU7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1sZWZ0JylcbiAgYW1UYWJzTGVmdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtcmlnaHQnKVxuICBhbVRhYnNSaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLXRhYnMtYm90dG9tJylcbiAgYW1UYWJzQm90dG9tOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy12ZXJ0aWNhbCcpXG4gIGFtVGFic1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuYW0tdGFicy1ob3Jpem9udGFsJylcbiAgYW1UYWJzSG9yaXpvbnRhbDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGNsaWNrVGFiKGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEtleSAhPT0gaW5kZXgpIHtcbiAgICAgIHRoaXMua2V5VG9TZWxlY3QgPSBpbmRleDtcbiAgICAgIHRoaXMub25UYWJDbGljay5lbWl0KHsgaW5kZXg6IHRoaXMua2V5VG9TZWxlY3QgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFRhYlBhbmVzKCk6IFF1ZXJ5TGlzdDxUYWJQYW5lPiB7XG4gICAgcmV0dXJuIHRoaXMudGFiUGFuZXNDb21wb25lbnQgfHwgdGhpcy50YWJQYW5lcztcbiAgfVxuXG4gIG9uVG91Y2hTdGFydChldmVudCkge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IGV2ZW50LnRpbWVTdGFtcDtcbiAgICBpZiAodGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKSAmJiB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICB0aGlzLl9zdGFydFBvc2l0aW9uID1cbiAgICAgICAgICBldmVudCAmJiBldmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSAmJiBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9XG4gICAgICAgICAgZXZlbnQgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblRvdWNoTW92ZShldmVudCkge1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmVsb2NpdHkg5bCP5LqO6ZiI5YC85omN6K6k5Li65pivcGFu5pON5L2cXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgdGhpcy51c2VPblBhbiAmJlxuICAgICAgICAgIHRoaXMuc3dpcGVhYmxlICYmXG4gICAgICAgICAgdGhpcy5hbmltYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoJyArIGRpc3RhbmNlICsgJ3B4LCAwLCAwICknO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLl9zdGFydFBvc2l0aW9uO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiID09PSB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpIDw9IHRoaXMuX3ZlbG9jaXR5VGhyZXNob2xkICYmXG4gICAgICAgICAgdGhpcy51c2VPblBhbiAmJlxuICAgICAgICAgIHRoaXMuc3dpcGVhYmxlICYmXG4gICAgICAgICAgdGhpcy5hbmltYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgJyArIGRpc3RhbmNlICsgJ3B4LCAwICknO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaEVuZChldmVudCkge1xuICAgIGlmICh0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuX3N0YXJ0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCA9IHRoaXMudGFiQ29udGVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogdGhpcy5kaXN0YW5jZVRvQ2hhbmdlVGFiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnVzZU9uUGFuICYmIHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCkpIHx8XG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPiB0aGlzLl92ZWxvY2l0eVRocmVzaG9sZCAmJlxuICAgICAgICAgICAgKHRoaXMuc3dpcGVhYmxlICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGRpc3RhbmNlVG9DaGFuZ2VUYWJQeCAvIDIpKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPCAwICYmIHRoaXMuYWN0aXZlVGFiIDwgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0Kys7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA+IDAgJiYgdGhpcy5hY3RpdmVUYWIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmtleVRvU2VsZWN0LS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFuZU1vdmVTdHlsZSA9ICd0cmFuc2xhdGUzZCgwLCAwLCAwICknO1xuICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5fc3RhcnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VUb0NoYW5nZVRhYlB4ID0gdGhpcy50YWJDb250ZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICogdGhpcy5kaXN0YW5jZVRvQ2hhbmdlVGFiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRoaXMuZ2V0VmVsb2NpdHkoZGlzdGFuY2UsIGV2ZW50LnRpbWVTdGFtcCAtIHRoaXMuX3N0YXJ0VGltZSkgPD0gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnVzZU9uUGFuICYmIHRoaXMuc3dpcGVhYmxlICYmICBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHgpKSB8fFxuICAgICAgICAgICh0aGlzLmdldFZlbG9jaXR5KGRpc3RhbmNlLCBldmVudC50aW1lU3RhbXAgLSB0aGlzLl9zdGFydFRpbWUpID4gdGhpcy5fdmVsb2NpdHlUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICh0aGlzLnN3aXBlYWJsZSAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBkaXN0YW5jZVRvQ2hhbmdlVGFiUHggLyAyKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDwgMCAmJiB0aGlzLmFjdGl2ZVRhYiA8IHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdCsrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGlzdGFuY2UgPiAwICYmIHRoaXMuYWN0aXZlVGFiID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZXlUb1NlbGVjdC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhbmVNb3ZlU3R5bGUgPSAndHJhbnNsYXRlM2QoMCwgMCwgMCApJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RUYWJQYW5lKHRoaXMua2V5VG9TZWxlY3QpO1xuICAgIHRoaXMuc2VsZWN0ZWRLZXkgPSB0aGlzLmtleVRvU2VsZWN0O1xuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLmtleVRvU2VsZWN0ICE9PSB0aGlzLnNlbGVjdGVkS2V5ICYmIHRoaXMuZ2V0Q3VycmVudFRhYlBhbmVzKCkgJiYgdGhpcy5nZXRDdXJyZW50VGFiUGFuZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlbGVjdFRhYlBhbmUodGhpcy5rZXlUb1NlbGVjdCk7XG4gICAgICB0aGlzLnNlbGVjdGVkS2V5ID0gdGhpcy5rZXlUb1NlbGVjdDtcbiAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7IGluZGV4OiB0aGlzLnNlbGVjdGVkS2V5IH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0VGFiUGFuZShpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qga2V5VG9TZWxlY3QgPSBNYXRoLm1pbih0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmxlbmd0aCAtIDEsIE1hdGgubWF4KGluZGV4IHx8IDAsIDApKTtcbiAgICB0aGlzLmdldEN1cnJlbnRUYWJQYW5lcygpLmZvckVhY2goKHRhYlBhbmU6IFRhYlBhbmUsIGluZGV4S2V5OiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChrZXlUb1NlbGVjdCA8IGluZGV4S2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkKSB7XG4gICAgICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoa2V5VG9TZWxlY3QgPT09IGluZGV4S2V5IC0gMSkge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3JpZ2h0LXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3JpZ2h0LXdpdGgtYW5pbWF0aW9uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKGtleVRvU2VsZWN0ID09PSBpbmRleEtleSAtIDEpIHtcbiAgICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdib3R0b20td2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnYm90dG9tLXdpdGgtYW5pbWF0aW9uJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3JpZ2h0LXdpdGhvdXQtYW5pbWF0aW9uJztcbiAgICAgICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdib3R0b20td2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXlUb1NlbGVjdCA+IGluZGV4S2V5KSB7XG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGVkKSB7XG4gICAgICAgICAgaWYgKCdob3Jpem9udGFsJyA9PT0gdGhpcy5fdGFiRGlyZWN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoa2V5VG9TZWxlY3QgPT09IGluZGV4S2V5ICsgMSkge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2xlZnQtd2l0aC1hbmltYXRpb24td2l0aC1oaWdoZXItemluZGV4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAnbGVmdC13aXRoLWFuaW1hdGlvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICgndmVydGljYWwnID09PSB0aGlzLl90YWJEaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChrZXlUb1NlbGVjdCA9PT0gaW5kZXhLZXkgKyAxKSB7XG4gICAgICAgICAgICAgIHRhYlBhbmUucG9zaXRpb24gPSAndG9wLXdpdGgtYW5pbWF0aW9uLXdpdGgtaGlnaGVyLXppbmRleCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ3RvcC13aXRoLWFuaW1hdGlvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgnaG9yaXpvbnRhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdsZWZ0LXdpdGhvdXQtYW5pbWF0aW9uJztcbiAgICAgICAgICB9IGVsc2UgaWYgKCd2ZXJ0aWNhbCcgPT09IHRoaXMuX3RhYkRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICd0b3Atd2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0ZWQpIHtcbiAgICAgICAgICB0YWJQYW5lLnBvc2l0aW9uID0gJ2NlbnRlci13aXRoLWFuaW1hdGlvbic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFiUGFuZS5wb3NpdGlvbiA9ICdjZW50ZXItd2l0aG91dC1hbmltYXRpb24nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoa2V5VG9TZWxlY3QgIT09IGluZGV4S2V5KSB7XG4gICAgICAgIHRhYlBhbmUuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWJQYW5lLmFjdGl2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFZlbG9jaXR5KGRlbHRhRGlzdGFuY2UsIGRlbHRhVGltZSkge1xuICAgIHJldHVybiBNYXRoLmFicyhkZWx0YURpc3RhbmNlIC8gZGVsdGFUaW1lKTtcbiAgfVxufVxuIl19