com.phloxui
Version:
PhloxUI Ng2+ Framework
327 lines (326 loc) • 33.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { PhloxAppService } from '../../service/PhloxAppService.service';
import { AbstractWizardPane } from './AbstractWizardPane';
import { Option } from '../../decorator/Option.decorator';
import { I18N } from '../../decorator/I18N.decorator';
import { WizardModel } from '../model/WizardModel';
const /** @type {?} */ TYPE_NAME = "phx-scroll-wizard-pane";
const /** @type {?} */ CLASS_NAME = "phx-scroll-wizard-pane-div-";
export class ScrollWizardPane extends AbstractWizardPane {
/**
* @param {?} appSvc
* @param {?} sanitizer
* @param {?} elementRef
*/
constructor(appSvc, sanitizer, elementRef) {
super(appSvc, elementRef);
this.className = CLASS_NAME;
this.sanitizer = sanitizer;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @param {?} event
* @return {?}
*/
onScroll(event) {
if (this.delayScrollTimer !== null && typeof this.delayScrollTimer !== 'undefined') {
clearTimeout(this.delayScrollTimer);
this.delayScrollTimer = null;
}
this.delayScrollTimer = setTimeout(() => {
let /** @type {?} */ anchorIndex = this.currentStep;
let /** @type {?} */ stepsCount = this.getModel().steps.length;
let /** @type {?} */ lastIndex;
if (stepsCount === 0) {
lastIndex = 0;
}
else {
lastIndex = this.getModel().steps.length - 1;
}
let /** @type {?} */ rightDom;
if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane') !== 'undefined') {
if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right') !== 'undefined') {
rightDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right');
}
}
for (let /** @type {?} */ index = 0; index < stepsCount; index++) {
let /** @type {?} */ classNameIndex = this.className + index;
let /** @type {?} */ classNameDom;
if (rightDom !== null && rightDom !== undefined) {
if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex) !== undefined) {
classNameDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex);
if (rightDom.scrollTop() === 0) {
//scrolling start
anchorIndex = 0;
break;
}
if (Math.ceil(rightDom.scrollTop() + rightDom.innerHeight()) >= rightDom[0].scrollHeight) {
//scrolling end
anchorIndex = lastIndex;
break;
}
if ((rightDom.scrollTop() + rightDom.offset().top) >= (rightDom.scrollTop() + classNameDom.offset().top)) {
// find index of stepMenu scrolling
anchorIndex = index;
}
}
}
}
this.currentStep = anchorIndex;
event.preventDefault();
}, 50);
}
/**
* @param {?} index
* @return {?}
*/
getClassName(index) {
return this.className + index;
}
/**
* @param {?} index
* @return {?}
*/
showStepContent(index) {
if (this.delayScrollClickTimer !== null && typeof this.delayScrollClickTimer !== 'undefined') {
clearTimeout(this.delayScrollClickTimer);
this.delayScrollClickTimer = null;
}
let /** @type {?} */ rightDom;
let /** @type {?} */ classNameIndex = this.className + index;
let /** @type {?} */ classNameDom;
if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane') !== 'undefined') {
if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right') !== 'undefined') {
rightDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right');
}
}
if (typeof $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex) !== 'undefined') {
classNameDom = $(this.elementRef.nativeElement).find('.phx-scroll-wizard-pane').find('.right').find('.' + classNameIndex);
}
this.delayScrollClickTimer = setTimeout(() => {
if ((rightDom !== null && rightDom !== undefined) && (classNameDom !== null && classNameDom !== undefined)) {
if ((classNameDom.offset() !== null && classNameDom.offset() !== undefined) && (rightDom.scrollTop() !== null && rightDom.scrollTop() !== undefined)) {
rightDom.stop().animate({ scrollTop: (classNameDom.offset().top - rightDom.offset().top + rightDom.scrollTop()) + 0.7 }, 'slow');
}
}
}, 5);
}
}
ScrollWizardPane.TYPE_NAME = TYPE_NAME;
ScrollWizardPane.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: TYPE_NAME,
template: `<div class="phx-scroll-wizard-pane">
<div class="left" [style.padding-top]="getHeaderHeight() + 'pt'" [style.padding-bottom]="getFooterHeight() + 'pt'">
<div class="header" [style.height]="getHeaderHeight() + 'pt'">
<ng-template [ngIf]="getModel() !== null && getModel().header !== null">
<ng-template [ngIf]="getModel().header.type === null">
<div *ngIf="getModel().header.imageURL !== null && getModel().header.imageURL !== ''" class="header-image">
<img src="{{getModel().header.imageURL}}">
</div>
<div class="header-label">{{getModel().header.label}}</div>
</ng-template>
<ng-template [ngIf]="getModel().header.type !== null">
<phx-component-wrapper [type]="getModel().header.type" [data]="getModel().header.model"></phx-component-wrapper>
</ng-template>
</ng-template>
</div>
<div class="body">
<ng-template [ngIf]="getModel() !== null && getModel().steps !== null">
<div *ngFor="let item of getModel().steps; let i = index;" class="step" [class.active]="isStepSelected(i)">
<ng-template [ngIf]="item.type === null">
<div (click)="stepSelected(i)"> {{item.label}} </div>
</ng-template>
<ng-template [ngIf]="item.type !== null">
<phx-component-wrapper [type]="item.type" [data]="item.model" (click)="stepSelected(i)"></phx-component-wrapper>
</ng-template>
</div>
</ng-template>
</div>
<div class="footer" [style.height]="getFooterHeight() + 'pt'">
<ng-template [ngIf]="getModel() !== null && getModel().footer !== null">
<ng-template [ngIf]="getModel().footer.type === null">
{{getModel().footer.label}}
</ng-template>
<ng-template [ngIf]="getModel().footer.type !== null">
<phx-component-wrapper [type]="getModel().footer.type" [data]="getModel().footer.model"></phx-component-wrapper>
</ng-template>
</ng-template>
</div>
</div>
<div class="right" (scroll)="onScroll($event)">
<div *ngFor="let item of getModel().steps; let i = index;" [class]="getClassName(i)">
<phx-component-wrapper [class.active]="isStepSelected(i)" [type]="item.componentType"
[data]="getData()" [model]="item.componentModel" [dataParent]="this" [handler]="getStepsComponentHandler()">
</phx-component-wrapper>
</div>
</div>
</div>
`,
},] },
];
/** @nocollapse */
ScrollWizardPane.ctorParameters = () => [
{ type: PhloxAppService, },
{ type: DomSanitizer, },
{ type: ElementRef, },
];
ScrollWizardPane.propDecorators = {
"help": [{ type: Input },],
"dataParent": [{ type: Input },],
"ignoreParentData": [{ type: Input },],
"data": [{ type: Input },],
"ignoreParentDisabled": [{ type: Input },],
"delegateHistory": [{ type: Input },],
"onDisabled": [{ type: Input },],
"onEnabled": [{ type: Input },],
"loadingEnabled": [{ type: Input },],
"i18nKey": [{ type: Input },],
"bypass": [{ type: Input, args: ['i18nBypass',] },],
"options": [{ type: Input },],
"disabled": [{ type: Input },],
"model": [{ type: Input },],
"field": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
};
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollWizardPane.prototype, "help", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollWizardPane.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollWizardPane.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollWizardPane.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollWizardPane.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollWizardPane.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ScrollWizardPane.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ScrollWizardPane.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollWizardPane.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ScrollWizardPane.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ScrollWizardPane.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollWizardPane.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", WizardModel)
], ScrollWizardPane.prototype, "model", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ScrollWizardPane.prototype, "field", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollWizardPane.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollWizardPane.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollWizardPane.prototype, "beforeChangeEvent", void 0);
function ScrollWizardPane_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ScrollWizardPane.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ScrollWizardPane.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ScrollWizardPane.propDecorators;
/** @type {?} */
ScrollWizardPane.TYPE_NAME;
/** @type {?} */
ScrollWizardPane.prototype.help;
/** @type {?} */
ScrollWizardPane.prototype.dataParent;
/** @type {?} */
ScrollWizardPane.prototype.ignoreParentData;
/** @type {?} */
ScrollWizardPane.prototype.data;
/** @type {?} */
ScrollWizardPane.prototype.ignoreParentDisabled;
/** @type {?} */
ScrollWizardPane.prototype.delegateHistory;
/** @type {?} */
ScrollWizardPane.prototype.onDisabled;
/** @type {?} */
ScrollWizardPane.prototype.onEnabled;
/** @type {?} */
ScrollWizardPane.prototype.loadingEnabled;
/** @type {?} */
ScrollWizardPane.prototype.i18nKey;
/** @type {?} */
ScrollWizardPane.prototype.bypass;
/** @type {?} */
ScrollWizardPane.prototype.options;
/** @type {?} */
ScrollWizardPane.prototype.disabled;
/** @type {?} */
ScrollWizardPane.prototype.model;
/** @type {?} */
ScrollWizardPane.prototype.field;
/** @type {?} */
ScrollWizardPane.prototype.loadEvent;
/** @type {?} */
ScrollWizardPane.prototype.changeEvent;
/** @type {?} */
ScrollWizardPane.prototype.beforeChangeEvent;
/** @type {?} */
ScrollWizardPane.prototype.delayScrollTimer;
/** @type {?} */
ScrollWizardPane.prototype.delayScrollClickTimer;
/** @type {?} */
ScrollWizardPane.prototype.sanitizer;
/** @type {?} */
ScrollWizardPane.prototype.className;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QixVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXRELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUluRCx1QkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7QUFFbkQsdUJBQU0sVUFBVSxHQUFRLDZCQUE2QixDQUFDO0FBc0R0RCxNQUFNLHVCQUF3QixTQUFRLGtCQUFrQjs7Ozs7O0lBMEV0RCxZQUFZLE1BQXVCLEVBQUUsU0FBdUIsRUFBRSxVQUFzQjtRQUNsRixLQUFLLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO3lCQUhBLFVBQVU7UUFLcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7S0FDNUI7Ozs7SUFFTSxRQUFRO1FBQ2IsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDOzs7Ozs7SUFHWixRQUFRLENBQUMsS0FBVTtRQUN4QixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLGdCQUFn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Ozs7SUFHM0IsTUFBTSxFQUFFOzs7O0lBTVIsTUFBTSxDQUFDLE1BQU0sQ0FBQztzQ0FDTSxZQUFZOzs7SUFHaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQztzQ0FDTSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFBobG94QXBwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvUGhsb3hBcHBTZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuLi9JSGFzTW9kZWwnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFdpemFyZFBhbmUgfSBmcm9tICcuL0Fic3RyYWN0V2l6YXJkUGFuZSc7XHJcbmltcG9ydCB7IElDaGFuZ2VhYmxlIH0gZnJvbSAnLi4vSUNoYW5nZWFibGUnO1xyXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudC9JSGFzRGF0YSc7XHJcbmltcG9ydCB7IFdpemFyZE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvV2l6YXJkTW9kZWwnO1xyXG5cclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1zY3JvbGwtd2l6YXJkLXBhbmVcIjtcclxuXHJcbmNvbnN0IENMQVNTX05BTUU6IGFueSA9IFwicGh4LXNjcm9sbC13aXphcmQtcGFuZS1kaXYtXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LXNjcm9sbC13aXphcmQtcGFuZVwiPlxuXHQ8ZGl2IGNsYXNzPVwibGVmdFwiIFtzdHlsZS5wYWRkaW5nLXRvcF09XCJnZXRIZWFkZXJIZWlnaHQoKSArICdwdCdcIiBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiZ2V0Rm9vdGVySGVpZ2h0KCkgKyAncHQnXCI+XG5cdFx0PGRpdiBjbGFzcz1cImhlYWRlclwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0SGVhZGVySGVpZ2h0KCkgKyAncHQnXCI+XG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlciAhPT0gbnVsbFwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZSA9PT0gbnVsbFwiPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCJnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTCAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTCAhPT0gJydcIiBjbGFzcz1cImhlYWRlci1pbWFnZVwiPlxuXHRcdFx0XHRcdFx0PGltZyBzcmM9XCJ7e2dldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMfX1cIj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyLWxhYmVsXCI+e3tnZXRNb2RlbCgpLmhlYWRlci5sYWJlbH19PC9kaXY+XG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlICE9PSBudWxsXCI+XG5cdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlXCIgW2RhdGFdPVwiZ2V0TW9kZWwoKS5oZWFkZXIubW9kZWxcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImJvZHlcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuc3RlcHMgIT09IG51bGxcIj5cblx0XHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNb2RlbCgpLnN0ZXBzOyBsZXQgaSA9IGluZGV4O1wiIGNsYXNzPVwic3RlcFwiIFtjbGFzcy5hY3RpdmVdPVwiaXNTdGVwU2VsZWN0ZWQoaSlcIj5cblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlID09PSBudWxsXCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IChjbGljayk9XCJzdGVwU2VsZWN0ZWQoaSlcIj4ge3tpdGVtLmxhYmVsfX0gPC9kaXY+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiaXRlbS50eXBlICE9PSBudWxsXCI+XG5cdFx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cIml0ZW0udHlwZVwiIFtkYXRhXT1cIml0ZW0ubW9kZWxcIiAoY2xpY2spPVwic3RlcFNlbGVjdGVkKGkpXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJmb290ZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEZvb3RlckhlaWdodCgpICsgJ3B0J1wiPlxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5mb290ZXIgIT09IG51bGxcIj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGUgPT09IG51bGxcIj5cblx0XHRcdFx0XHR7e2dldE1vZGVsKCkuZm9vdGVyLmxhYmVsfX1cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGUgIT09IG51bGxcIj5cblx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cImdldE1vZGVsKCkuZm9vdGVyLnR5cGVcIiBbZGF0YV09XCJnZXRNb2RlbCgpLmZvb3Rlci5tb2RlbFwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJyaWdodFwiIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiPlxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNb2RlbCgpLnN0ZXBzOyBsZXQgaSA9IGluZGV4O1wiIFtjbGFzc109XCJnZXRDbGFzc05hbWUoaSlcIj5cblx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCIgW3R5cGVdPVwiaXRlbS5jb21wb25lbnRUeXBlXCJcblx0XHRcdFx0XHRbZGF0YV09XCJnZXREYXRhKClcIiBbbW9kZWxdPVwiaXRlbS5jb21wb25lbnRNb2RlbFwiIFtkYXRhUGFyZW50XT1cInRoaXNcIiBbaGFuZGxlcl09XCJnZXRTdGVwc0NvbXBvbmVudEhhbmRsZXIoKVwiPlxuXHRcdFx0XHQ8L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuYCxcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgU2Nyb2xsV2l6YXJkUGFuZSBleHRlbmRzIEFic3RyYWN0V2l6YXJkUGFuZSBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc01vZGVsLCBJQ2hhbmdlYWJsZSB7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBASW5wdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhSGVscFxyXG4gIEBJbnB1dCgpXHJcbiAgQEkxOE4oKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaTE4bkJ5cGFzcycpXHJcbiAgQE9wdGlvbignaTE4bkJ5cGFzcycpXHJcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIHByb3RlY3RlZCBvcHRpb25zOiBhbnk7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RXaXphcmRQYW5lXHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgbW9kZWw6IFdpemFyZE1vZGVsO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQE91dHB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBAT3V0cHV0KCdwaHhMb2FkJylcclxuICBAT3B0aW9uKCdsb2FkJylcclxuICBwcm90ZWN0ZWQgbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFdpemFyZFBhbmVcclxuICBAT3V0cHV0KCdwaHhDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2NoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBkZWxheVNjcm9sbFRpbWVyOiBhbnk7XHJcbiAgcHJpdmF0ZSBkZWxheVNjcm9sbENsaWNrVGltZXI6IGFueTtcclxuICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyO1xuXG4gIHByaXZhdGUgY2xhc3NOYW1lOiBzdHJpbmcgPSBDTEFTU19OQU1FO1xuXG4gIGNvbnN0cnVjdG9yKGFwcFN2YzogUGhsb3hBcHBTZXJ2aWNlLCBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoYXBwU3ZjLCBlbGVtZW50UmVmKTtcclxuXHJcbiAgICB0aGlzLnNhbml0aXplciA9IHNhbml0aXplcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgfVxyXG5cbiAgcHVibGljIG9uU2Nyb2xsKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWxheVNjcm9sbFRpbWVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlbGF5U2Nyb2xsVGltZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheVNjcm9sbFRpbWVyKTtcbiAgICAgIHRoaXMuZGVsYXlTY3JvbGxUaW1lciA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kZWxheVNjcm9sbFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsZXQgYW5jaG9ySW5kZXg6IGFueSA9IHRoaXMuY3VycmVudFN0ZXA7XG4gICAgICBsZXQgc3RlcHNDb3VudDogbnVtYmVyID0gdGhpcy5nZXRNb2RlbCgpLnN0ZXBzLmxlbmd0aDtcbiAgICAgIGxldCBsYXN0SW5kZXg6IG51bWJlcjtcblxuICAgICAgaWYgKHN0ZXBzQ291bnQgPT09IDApIHtcbiAgICAgICAgbGFzdEluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHRoaXMuZ2V0TW9kZWwoKS5zdGVwcy5sZW5ndGggLSAxO1xuICAgICAgfVxuXG4gICAgICBsZXQgcmlnaHREb206IGFueTtcblxuICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmlnaHREb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdGVwc0NvdW50OyBpbmRleCsrKSB7XG4gICAgICAgIGxldCBjbGFzc05hbWVJbmRleDogYW55ID0gdGhpcy5jbGFzc05hbWUgKyBpbmRleDtcbiAgICAgICAgbGV0IGNsYXNzTmFtZURvbTogYW55O1xuXG4gICAgICAgIGlmIChyaWdodERvbSAhPT0gbnVsbCAmJiByaWdodERvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpLmZpbmQoJy4nICsgY2xhc3NOYW1lSW5kZXgpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZURvbSA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykuZmluZCgnLicgKyBjbGFzc05hbWVJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChyaWdodERvbS5zY3JvbGxUb3AoKSA9PT0gMCkgeyAvL3Njcm9sbGluZyBzdGFydFxuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoTWF0aC5jZWlsKHJpZ2h0RG9tLnNjcm9sbFRvcCgpICsgcmlnaHREb20uaW5uZXJIZWlnaHQoKSkgPj0gcmlnaHREb21bMF0uc2Nyb2xsSGVpZ2h0KSB7IC8vc2Nyb2xsaW5nIGVuZFxuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgocmlnaHREb20uc2Nyb2xsVG9wKCkgKyByaWdodERvbS5vZmZzZXQoKS50b3ApID49IChyaWdodERvbS5zY3JvbGxUb3AoKSArIGNsYXNzTmFtZURvbS5vZmZzZXQoKS50b3ApKSB7IC8vIGZpbmQgaW5kZXggb2Ygc3RlcE1lbnUgIHNjcm9sbGluZ1xuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwID0gYW5jaG9ySW5kZXg7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgcHVibGljIGdldENsYXNzTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc05hbWUgKyBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzaG93U3RlcENvbnRlbnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlbGF5U2Nyb2xsQ2xpY2tUaW1lciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyKTtcclxuICAgICAgdGhpcy5kZWxheVNjcm9sbENsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByaWdodERvbTogYW55O1xyXG4gICAgbGV0IGNsYXNzTmFtZUluZGV4OiBhbnkgPSB0aGlzLmNsYXNzTmFtZSArIGluZGV4O1xyXG4gICAgbGV0IGNsYXNzTmFtZURvbTogYW55O1xyXG5cclxuICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHJpZ2h0RG9tID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKS5maW5kKCcuJyArIGNsYXNzTmFtZUluZGV4KSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY2xhc3NOYW1lRG9tID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKS5maW5kKCcuJyArIGNsYXNzTmFtZUluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRlbGF5U2Nyb2xsQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoKHJpZ2h0RG9tICE9PSBudWxsICYmIHJpZ2h0RG9tICE9PSB1bmRlZmluZWQpICYmIChjbGFzc05hbWVEb20gIT09IG51bGwgJiYgY2xhc3NOYW1lRG9tICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgaWYgKChjbGFzc05hbWVEb20ub2Zmc2V0KCkgIT09IG51bGwgJiYgY2xhc3NOYW1lRG9tLm9mZnNldCgpICE9PSB1bmRlZmluZWQpICYmIChyaWdodERvbS5zY3JvbGxUb3AoKSAhPT0gbnVsbCAmJiByaWdodERvbS5zY3JvbGxUb3AoKSAhPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgcmlnaHREb20uc3RvcCgpLmFuaW1hdGUoeyBzY3JvbGxUb3A6IChjbGFzc05hbWVEb20ub2Zmc2V0KCkudG9wIC0gcmlnaHREb20ub2Zmc2V0KCkudG9wICsgcmlnaHREb20uc2Nyb2xsVG9wKCkpICsgMC43IH0sICdzbG93Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9LCA1KTtcclxuICB9XHJcbn1cclxuIl19