com.phloxui
Version:
PhloxUI Ng2+ Framework
196 lines (195 loc) • 24.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, ElementRef } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { PhloxAppService } from '../service/PhloxAppService.service';
import { AbstractWizardPane } from './AbstractWizardPane';
const /** @type {?} */ TYPE_NAME = "phx-scroll-wizard-pane";
const /** @type {?} */ CLASS_NAME = "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('.scroll-wizard-pane') !== 'undefined') {
if (typeof $(this.elementRef.nativeElement).find('.scroll-wizard-pane').find('.right') !== 'undefined') {
rightDom = $(this.elementRef.nativeElement).find('.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('.scroll-wizard-pane').find('.right').find('.' + classNameIndex) !== undefined) {
classNameDom = $(this.elementRef.nativeElement).find('.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('.scroll-wizard-pane') !== 'undefined') {
if (typeof $(this.elementRef.nativeElement).find('.scroll-wizard-pane').find('.right') !== 'undefined') {
rightDom = $(this.elementRef.nativeElement).find('.scroll-wizard-pane').find('.right');
}
}
if (typeof $(this.elementRef.nativeElement).find('.scroll-wizard-pane').find('.right').find('.' + classNameIndex) !== 'undefined') {
classNameDom = $(this.elementRef.nativeElement).find('.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, },
];
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 {?} */
ScrollWizardPane.TYPE_NAME;
/** @type {?} */
ScrollWizardPane.prototype.delayScrollTimer;
/** @type {?} */
ScrollWizardPane.prototype.delayScrollClickTimer;
/** @type {?} */
ScrollWizardPane.prototype.sanitizer;
/** @type {?} */
ScrollWizardPane.prototype.className;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSzFELHVCQUFNLFNBQVMsR0FBVyx3QkFBd0IsQ0FBQztBQUVuRCx1QkFBTSxVQUFVLEdBQVEseUJBQXlCLENBQUM7QUFzRGxELE1BQU0sdUJBQXdCLFNBQVEsa0JBQWtCOzs7Ozs7SUFVdEQsWUFBWSxNQUF1QixFQUFFLFNBQXVCLEVBQUUsVUFBc0I7UUFDbEYsS0FBSyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQzt5QkFIQSxVQUFVO1FBS3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0tBQzVCOzs7O0lBRU0sUUFBUTtRQUNiLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7Ozs7O0lBR1osUUFBUSxDQUFDLEtBQVU7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ25GLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDdEMscUJB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LElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNsSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLENBQUM7U0FDdkg7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMzQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNySixRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUNsSTthQUNGO1NBQ0YsRUFBRSxDQUFDLENBQUMsQ0FBQzs7OzZCQXhHbUMsU0FBUzs7WUF0RHJELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4Q1g7YUFDQTs7OztZQTdEUSxlQUFlO1lBRGYsWUFBWTtZQURxQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBQaGxveEFwcFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL1BobG94QXBwU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi9JSGFzTW9kZWwnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdFdpemFyZFBhbmUgfSBmcm9tICcuL0Fic3RyYWN0V2l6YXJkUGFuZSc7XHJcbmltcG9ydCB7IElDaGFuZ2VhYmxlIH0gZnJvbSAnLi9JQ2hhbmdlYWJsZSc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXNjcm9sbC13aXphcmQtcGFuZVwiO1xyXG5cclxuY29uc3QgQ0xBU1NfTkFNRTogYW55ID0gXCJzY3JvbGwtd2l6YXJkLXBhbmUtZGl2LVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcclxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cInBoeC1zY3JvbGwtd2l6YXJkLXBhbmVcIj5cblx0PGRpdiBjbGFzcz1cImxlZnRcIiBbc3R5bGUucGFkZGluZy10b3BdPVwiZ2V0SGVhZGVySGVpZ2h0KCkgKyAncHQnXCIgW3N0eWxlLnBhZGRpbmctYm90dG9tXT1cImdldEZvb3RlckhlaWdodCgpICsgJ3B0J1wiPlxuXHRcdDxkaXYgY2xhc3M9XCJoZWFkZXJcIiBbc3R5bGUuaGVpZ2h0XT1cImdldEhlYWRlckhlaWdodCgpICsgJ3B0J1wiPlxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5oZWFkZXIgIT09IG51bGxcIj5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGUgPT09IG51bGxcIj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiZ2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkwgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkwgIT09ICcnXCIgY2xhc3M9XCJoZWFkZXItaW1hZ2VcIj5cblx0XHRcdFx0XHRcdDxpbWcgc3JjPVwie3tnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTH19XCI+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImhlYWRlci1sYWJlbFwiPnt7Z2V0TW9kZWwoKS5oZWFkZXIubGFiZWx9fTwvZGl2PlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZSAhPT0gbnVsbFwiPlxuXHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZVwiIFtkYXRhXT1cImdldE1vZGVsKCkuaGVhZGVyLm1vZGVsXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJib2R5XCI+XG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLnN0ZXBzICE9PSBudWxsXCI+XG5cdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TW9kZWwoKS5zdGVwczsgbGV0IGkgPSBpbmRleDtcIiBjbGFzcz1cInN0ZXBcIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RlcFNlbGVjdGVkKGkpXCI+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0udHlwZSA9PT0gbnVsbFwiPlxuXHRcdFx0XHRcdFx0PGRpdiAoY2xpY2spPVwic3RlcFNlbGVjdGVkKGkpXCI+IHt7aXRlbS5sYWJlbH19IDwvZGl2PlxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0udHlwZSAhPT0gbnVsbFwiPlxuXHRcdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJpdGVtLnR5cGVcIiBbZGF0YV09XCJpdGVtLm1vZGVsXCIgKGNsaWNrKT1cInN0ZXBTZWxlY3RlZChpKVwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiZm9vdGVyXCIgW3N0eWxlLmhlaWdodF09XCJnZXRGb290ZXJIZWlnaHQoKSArICdwdCdcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuZm9vdGVyICE9PSBudWxsXCI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlID09PSBudWxsXCI+XG5cdFx0XHRcdFx0e3tnZXRNb2RlbCgpLmZvb3Rlci5sYWJlbH19XG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlICE9PSBudWxsXCI+XG5cdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlXCIgW2RhdGFdPVwiZ2V0TW9kZWwoKS5mb290ZXIubW9kZWxcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwicmlnaHRcIiAoc2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIj5cblx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0TW9kZWwoKS5zdGVwczsgbGV0IGkgPSBpbmRleDtcIiBbY2xhc3NdPVwiZ2V0Q2xhc3NOYW1lKGkpXCI+XG5cdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW2NsYXNzLmFjdGl2ZV09XCJpc1N0ZXBTZWxlY3RlZChpKVwiIFt0eXBlXT1cIml0ZW0uY29tcG9uZW50VHlwZVwiXG5cdFx0XHRcdFx0W2RhdGFdPVwiZ2V0RGF0YSgpXCIgW21vZGVsXT1cIml0ZW0uY29tcG9uZW50TW9kZWxcIiBbZGF0YVBhcmVudF09XCJ0aGlzXCIgW2hhbmRsZXJdPVwiZ2V0U3RlcHNDb21wb25lbnRIYW5kbGVyKClcIj5cblx0XHRcdFx0PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmAsXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFNjcm9sbFdpemFyZFBhbmUgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhbmUgaW1wbGVtZW50cyBPbkluaXQsIElIYXNNb2RlbCwgSUNoYW5nZWFibGUge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xyXG5cclxuICBwcml2YXRlIGRlbGF5U2Nyb2xsVGltZXI6IGFueTtcclxuICBwcml2YXRlIGRlbGF5U2Nyb2xsQ2xpY2tUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XG5cbiAgcHJpdmF0ZSBjbGFzc05hbWU6IHN0cmluZyA9IENMQVNTX05BTUU7XG5cbiAgY29uc3RydWN0b3IoYXBwU3ZjOiBQaGxveEFwcFNlcnZpY2UsIHNhbml0aXplcjogRG9tU2FuaXRpemVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICBzdXBlcihhcHBTdmMsIGVsZW1lbnRSZWYpO1xyXG5cclxuICAgIHRoaXMuc2FuaXRpemVyID0gc2FuaXRpemVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxuICBwdWJsaWMgb25TY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlbGF5U2Nyb2xsVGltZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGVsYXlTY3JvbGxUaW1lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5U2Nyb2xsVGltZXIpO1xuICAgICAgdGhpcy5kZWxheVNjcm9sbFRpbWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRlbGF5U2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxldCBhbmNob3JJbmRleDogYW55ID0gdGhpcy5jdXJyZW50U3RlcDtcbiAgICAgIGxldCBzdGVwc0NvdW50OiBudW1iZXIgPSB0aGlzLmdldE1vZGVsKCkuc3RlcHMubGVuZ3RoO1xuICAgICAgbGV0IGxhc3RJbmRleDogbnVtYmVyO1xuXG4gICAgICBpZiAoc3RlcHNDb3VudCA9PT0gMCkge1xuICAgICAgICBsYXN0SW5kZXggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdEluZGV4ID0gdGhpcy5nZXRNb2RlbCgpLnN0ZXBzLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIGxldCByaWdodERvbTogYW55O1xuXG4gICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5zY3JvbGwtd2l6YXJkLXBhbmUnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcuc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmlnaHREb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcuc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN0ZXBzQ291bnQ7IGluZGV4KyspIHtcbiAgICAgICAgbGV0IGNsYXNzTmFtZUluZGV4OiBhbnkgPSB0aGlzLmNsYXNzTmFtZSArIGluZGV4O1xuICAgICAgICBsZXQgY2xhc3NOYW1lRG9tOiBhbnk7XG5cbiAgICAgICAgaWYgKHJpZ2h0RG9tICE9PSBudWxsICYmIHJpZ2h0RG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKS5maW5kKCcuJyArIGNsYXNzTmFtZUluZGV4KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVEb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcuc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykuZmluZCgnLicgKyBjbGFzc05hbWVJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChyaWdodERvbS5zY3JvbGxUb3AoKSA9PT0gMCkgeyAvL3Njcm9sbGluZyBzdGFydFxuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IDA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoTWF0aC5jZWlsKHJpZ2h0RG9tLnNjcm9sbFRvcCgpICsgcmlnaHREb20uaW5uZXJIZWlnaHQoKSkgPj0gcmlnaHREb21bMF0uc2Nyb2xsSGVpZ2h0KSB7IC8vc2Nyb2xsaW5nIGVuZFxuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgocmlnaHREb20uc2Nyb2xsVG9wKCkgKyByaWdodERvbS5vZmZzZXQoKS50b3ApID49IChyaWdodERvbS5zY3JvbGxUb3AoKSArIGNsYXNzTmFtZURvbS5vZmZzZXQoKS50b3ApKSB7IC8vIGZpbmQgaW5kZXggb2Ygc3RlcE1lbnUgIHNjcm9sbGluZ1xuICAgICAgICAgICAgICBhbmNob3JJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRTdGVwID0gYW5jaG9ySW5kZXg7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSwgNTApO1xuICB9XG5cbiAgcHVibGljIGdldENsYXNzTmFtZShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc05hbWUgKyBpbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBzaG93U3RlcENvbnRlbnQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRlbGF5U2Nyb2xsQ2xpY2tUaW1lciAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyKTtcclxuICAgICAgdGhpcy5kZWxheVNjcm9sbENsaWNrVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByaWdodERvbTogYW55O1xyXG4gICAgbGV0IGNsYXNzTmFtZUluZGV4OiBhbnkgPSB0aGlzLmNsYXNzTmFtZSArIGluZGV4O1xyXG4gICAgbGV0IGNsYXNzTmFtZURvbTogYW55O1xyXG5cclxuICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnNjcm9sbC13aXphcmQtcGFuZScpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByaWdodERvbSA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpLmZpbmQoJy4nICsgY2xhc3NOYW1lSW5kZXgpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjbGFzc05hbWVEb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcuc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykuZmluZCgnLicgKyBjbGFzc05hbWVJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kZWxheVNjcm9sbENsaWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKChyaWdodERvbSAhPT0gbnVsbCAmJiByaWdodERvbSAhPT0gdW5kZWZpbmVkKSAmJiAoY2xhc3NOYW1lRG9tICE9PSBudWxsICYmIGNsYXNzTmFtZURvbSAhPT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgIGlmICgoY2xhc3NOYW1lRG9tLm9mZnNldCgpICE9PSBudWxsICYmIGNsYXNzTmFtZURvbS5vZmZzZXQoKSAhPT0gdW5kZWZpbmVkKSAmJiAocmlnaHREb20uc2Nyb2xsVG9wKCkgIT09IG51bGwgJiYgcmlnaHREb20uc2Nyb2xsVG9wKCkgIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICAgIHJpZ2h0RG9tLnN0b3AoKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiAoY2xhc3NOYW1lRG9tLm9mZnNldCgpLnRvcCAtIHJpZ2h0RG9tLm9mZnNldCgpLnRvcCArIHJpZ2h0RG9tLnNjcm9sbFRvcCgpKSArIDAuNyB9LCAnc2xvdycpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSwgNSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==