com.phloxui
Version:
PhloxUI Ng2+ Framework
296 lines (295 loc) • 34.5 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';
var /** @type {?} */ TYPE_NAME = "phx-scroll-wizard-pane";
var /** @type {?} */ CLASS_NAME = "phx-scroll-wizard-pane-div-";
var ScrollWizardPane = /** @class */ (function (_super) {
tslib_1.__extends(ScrollWizardPane, _super);
function ScrollWizardPane(appSvc, sanitizer, elementRef) {
var _this = _super.call(this, appSvc, elementRef) || this;
_this.className = CLASS_NAME;
_this.sanitizer = sanitizer;
return _this;
}
/**
* @return {?}
*/
ScrollWizardPane.prototype.ngOnInit = /**
* @return {?}
*/
function () {
_super.prototype.ngOnInit.call(this);
};
/**
* @param {?} event
* @return {?}
*/
ScrollWizardPane.prototype.onScroll = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.delayScrollTimer !== null && typeof this.delayScrollTimer !== 'undefined') {
clearTimeout(this.delayScrollTimer);
this.delayScrollTimer = null;
}
this.delayScrollTimer = setTimeout(function () {
var /** @type {?} */ anchorIndex = _this.currentStep;
var /** @type {?} */ stepsCount = _this.getModel().steps.length;
var /** @type {?} */ lastIndex;
if (stepsCount === 0) {
lastIndex = 0;
}
else {
lastIndex = _this.getModel().steps.length - 1;
}
var /** @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 (var /** @type {?} */ index = 0; index < stepsCount; index++) {
var /** @type {?} */ classNameIndex = _this.className + index;
var /** @type {?} */ classNameDom = void 0;
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 {?}
*/
ScrollWizardPane.prototype.getClassName = /**
* @param {?} index
* @return {?}
*/
function (index) {
return this.className + index;
};
/**
* @param {?} index
* @return {?}
*/
ScrollWizardPane.prototype.showStepContent = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.delayScrollClickTimer !== null && typeof this.delayScrollClickTimer !== 'undefined') {
clearTimeout(this.delayScrollClickTimer);
this.delayScrollClickTimer = null;
}
var /** @type {?} */ rightDom;
var /** @type {?} */ classNameIndex = this.className + index;
var /** @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(function () {
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\">\n\t<div class=\"left\" [style.padding-top]=\"getHeaderHeight() + 'pt'\" [style.padding-bottom]=\"getFooterHeight() + 'pt'\">\n\t\t<div class=\"header\" [style.height]=\"getHeaderHeight() + 'pt'\">\n\t\t\t<ng-template [ngIf]=\"getModel() !== null && getModel().header !== null\">\n\t\t\t\t<ng-template [ngIf]=\"getModel().header.type === null\">\n\t\t\t\t\t<div *ngIf=\"getModel().header.imageURL !== null && getModel().header.imageURL !== ''\" class=\"header-image\">\n\t\t\t\t\t\t<img src=\"{{getModel().header.imageURL}}\">\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"header-label\">{{getModel().header.label}}</div>\n\t\t\t\t</ng-template>\n\t\t\t\t<ng-template [ngIf]=\"getModel().header.type !== null\">\n\t\t\t\t\t<phx-component-wrapper [type]=\"getModel().header.type\" [data]=\"getModel().header.model\"></phx-component-wrapper>\n\t\t\t\t</ng-template>\n\t\t\t</ng-template>\n\t\t</div>\n\t\t<div class=\"body\">\n\t\t\t<ng-template [ngIf]=\"getModel() !== null && getModel().steps !== null\">\n\t\t\t\t<div *ngFor=\"let item of getModel().steps; let i = index;\" class=\"step\" [class.active]=\"isStepSelected(i)\">\n\t\t\t\t\t<ng-template [ngIf]=\"item.type === null\">\n\t\t\t\t\t\t<div (click)=\"stepSelected(i)\"> {{item.label}} </div>\n\t\t\t\t\t</ng-template>\n\t\t\t\t\t<ng-template [ngIf]=\"item.type !== null\">\n\t\t\t\t\t\t<phx-component-wrapper [type]=\"item.type\" [data]=\"item.model\" (click)=\"stepSelected(i)\"></phx-component-wrapper>\n\t\t\t\t\t</ng-template>\n\t\t\t\t</div>\n\t\t\t</ng-template>\n\t\t</div>\n\t\t<div class=\"footer\" [style.height]=\"getFooterHeight() + 'pt'\">\n\t\t\t<ng-template [ngIf]=\"getModel() !== null && getModel().footer !== null\">\n\t\t\t\t<ng-template [ngIf]=\"getModel().footer.type === null\">\n\t\t\t\t\t{{getModel().footer.label}}\n\t\t\t\t</ng-template>\n\t\t\t\t<ng-template [ngIf]=\"getModel().footer.type !== null\">\n\t\t\t\t\t<phx-component-wrapper [type]=\"getModel().footer.type\" [data]=\"getModel().footer.model\"></phx-component-wrapper>\n\t\t\t\t</ng-template>\n\t\t\t</ng-template>\n\t\t</div>\n\t</div>\n\t<div class=\"right\" (scroll)=\"onScroll($event)\">\n\t\t\t<div *ngFor=\"let item of getModel().steps; let i = index;\" [class]=\"getClassName(i)\">\n\t\t\t\t<phx-component-wrapper [class.active]=\"isStepSelected(i)\" [type]=\"item.componentType\"\n\t\t\t\t\t[data]=\"getData()\" [model]=\"item.componentModel\" [dataParent]=\"this\" [handler]=\"getStepsComponentHandler()\">\n\t\t\t\t</phx-component-wrapper>\n\t\t\t</div>\n\t</div>\n</div>\n",
},] },
];
/** @nocollapse */
ScrollWizardPane.ctorParameters = function () { return [
{ 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);
return ScrollWizardPane;
}(AbstractWizardPane));
export { ScrollWizardPane };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvU2Nyb2xsV2l6YXJkUGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF3QixVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFlBQVksRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXRELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUluRCxxQkFBTSxTQUFTLEdBQVcsd0JBQXdCLENBQUM7QUFFbkQscUJBQU0sVUFBVSxHQUFRLDZCQUE2QixDQUFDOztJQXNEaEIsNENBQWtCO0lBMEV0RCwwQkFBWSxNQUF1QixFQUFFLFNBQXVCLEVBQUUsVUFBc0I7UUFBcEYsWUFDRSxrQkFBTSxNQUFNLEVBQUUsVUFBVSxDQUFDLFNBRzFCOzBCQU4yQixVQUFVO1FBS3BDLEtBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOztLQUM1Qjs7OztJQUVNLG1DQUFROzs7O1FBQ2IsaUJBQU0sUUFBUSxXQUFFLENBQUM7Ozs7OztJQUdaLG1DQUFROzs7O2NBQUMsS0FBVTs7UUFDeEIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxXQUFX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OztRQUdoQyxNQUFNLENBQUMsUUFBUSxDQUFDOzBDQUNNLFlBQVk7OztRQUVsQyxNQUFNLENBQUMsY0FBYyxDQUFDOzBDQUNNLFlBQVk7OzJCQXZJM0M7RUFxRXNDLGtCQUFrQjtTQUEzQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XHJcbmltcG9ydCB7IEFic3RyYWN0V2l6YXJkUGFuZSB9IGZyb20gJy4vQWJzdHJhY3RXaXphcmRQYW5lJztcclxuaW1wb3J0IHsgSUNoYW5nZWFibGUgfSBmcm9tICcuLi9JQ2hhbmdlYWJsZSc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSTE4TiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9JMThOLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50L0lIYXNEYXRhJztcclxuaW1wb3J0IHsgV2l6YXJkTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9XaXphcmRNb2RlbCc7XHJcblxyXG5kZWNsYXJlIHZhciAkOiBhbnk7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwicGh4LXNjcm9sbC13aXphcmQtcGFuZVwiO1xyXG5cclxuY29uc3QgQ0xBU1NfTkFNRTogYW55ID0gXCJwaHgtc2Nyb2xsLXdpemFyZC1wYW5lLWRpdi1cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXHJcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtc2Nyb2xsLXdpemFyZC1wYW5lXCI+XG5cdDxkaXYgY2xhc3M9XCJsZWZ0XCIgW3N0eWxlLnBhZGRpbmctdG9wXT1cImdldEhlYWRlckhlaWdodCgpICsgJ3B0J1wiIFtzdHlsZS5wYWRkaW5nLWJvdHRvbV09XCJnZXRGb290ZXJIZWlnaHQoKSArICdwdCdcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWFkZXJIZWlnaHQoKSArICdwdCdcIj5cblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuaGVhZGVyICE9PSBudWxsXCI+XG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlID09PSBudWxsXCI+XG5cdFx0XHRcdFx0PGRpdiAqbmdJZj1cImdldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMICE9PSBudWxsICYmIGdldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMICE9PSAnJ1wiIGNsYXNzPVwiaGVhZGVyLWltYWdlXCI+XG5cdFx0XHRcdFx0XHQ8aW1nIHNyYz1cInt7Z2V0TW9kZWwoKS5oZWFkZXIuaW1hZ2VVUkx9fVwiPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkZXItbGFiZWxcIj57e2dldE1vZGVsKCkuaGVhZGVyLmxhYmVsfX08L2Rpdj5cblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGUgIT09IG51bGxcIj5cblx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGVcIiBbZGF0YV09XCJnZXRNb2RlbCgpLmhlYWRlci5tb2RlbFwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiYm9keVwiPlxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5zdGVwcyAhPT0gbnVsbFwiPlxuXHRcdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1vZGVsKCkuc3RlcHM7IGxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJzdGVwXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N0ZXBTZWxlY3RlZChpKVwiPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpdGVtLnR5cGUgPT09IG51bGxcIj5cblx0XHRcdFx0XHRcdDxkaXYgKGNsaWNrKT1cInN0ZXBTZWxlY3RlZChpKVwiPiB7e2l0ZW0ubGFiZWx9fSA8L2Rpdj5cblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpdGVtLnR5cGUgIT09IG51bGxcIj5cblx0XHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiaXRlbS50eXBlXCIgW2RhdGFdPVwiaXRlbS5tb2RlbFwiIChjbGljayk9XCJzdGVwU2VsZWN0ZWQoaSlcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PC9kaXY+XG5cdFx0PGRpdiBjbGFzcz1cImZvb3RlclwiIFtzdHlsZS5oZWlnaHRdPVwiZ2V0Rm9vdGVySGVpZ2h0KCkgKyAncHQnXCI+XG5cdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKSAhPT0gbnVsbCAmJiBnZXRNb2RlbCgpLmZvb3RlciAhPT0gbnVsbFwiPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5mb290ZXIudHlwZSA9PT0gbnVsbFwiPlxuXHRcdFx0XHRcdHt7Z2V0TW9kZWwoKS5mb290ZXIubGFiZWx9fVxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5mb290ZXIudHlwZSAhPT0gbnVsbFwiPlxuXHRcdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW3R5cGVdPVwiZ2V0TW9kZWwoKS5mb290ZXIudHlwZVwiIFtkYXRhXT1cImdldE1vZGVsKCkuZm9vdGVyLm1vZGVsXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cInJpZ2h0XCIgKHNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCI+XG5cdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1vZGVsKCkuc3RlcHM7IGxldCBpID0gaW5kZXg7XCIgW2NsYXNzXT1cImdldENsYXNzTmFtZShpKVwiPlxuXHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFtjbGFzcy5hY3RpdmVdPVwiaXNTdGVwU2VsZWN0ZWQoaSlcIiBbdHlwZV09XCJpdGVtLmNvbXBvbmVudFR5cGVcIlxuXHRcdFx0XHRcdFtkYXRhXT1cImdldERhdGEoKVwiIFttb2RlbF09XCJpdGVtLmNvbXBvbmVudE1vZGVsXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiIFtoYW5kbGVyXT1cImdldFN0ZXBzQ29tcG9uZW50SGFuZGxlcigpXCI+XG5cdFx0XHRcdDwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxuXHRcdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gLFxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTY3JvbGxXaXphcmRQYW5lIGV4dGVuZHMgQWJzdHJhY3RXaXphcmRQYW5lIGltcGxlbWVudHMgT25Jbml0LCBJSGFzTW9kZWwsIElDaGFuZ2VhYmxlIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFX05BTUU6IHN0cmluZyA9IFRZUEVfTkFNRTtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFIZWxwXHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdEhhc0RhdGFcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREYXRhOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpZ25vcmVQYXJlbnREaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkZWxlZ2F0ZUhpc3Rvcnk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25EaXNhYmxlZDogRnVuY3Rpb247XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgb25FbmFibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBsb2FkaW5nRW5hYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBpMThuS2V5OiBzdHJpbmc7XHJcbiAgQElucHV0KCdpMThuQnlwYXNzJylcclxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcclxuICBwcm90ZWN0ZWQgYnlwYXNzOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFdpemFyZFBhbmVcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBtb2RlbDogV2l6YXJkTW9kZWw7XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxyXG4gIEBPcHRpb24oJ2xvYWQnKVxyXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0V2l6YXJkUGFuZVxyXG4gIEBPdXRwdXQoJ3BoeENoYW5nZScpXHJcbiAgQE9wdGlvbignY2hhbmdlJylcclxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNoYW5nZScpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2hhbmdlJylcclxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG5cclxuICBwcml2YXRlIGRlbGF5U2Nyb2xsVGltZXI6IGFueTtcclxuICBwcml2YXRlIGRlbGF5U2Nyb2xsQ2xpY2tUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XG5cbiAgcHJpdmF0ZSBjbGFzc05hbWU6IHN0cmluZyA9IENMQVNTX05BTUU7XG5cbiAgY29uc3RydWN0b3IoYXBwU3ZjOiBQaGxveEFwcFNlcnZpY2UsIHNhbml0aXplcjogRG9tU2FuaXRpemVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgICBzdXBlcihhcHBTdmMsIGVsZW1lbnRSZWYpO1xyXG5cclxuICAgIHRoaXMuc2FuaXRpemVyID0gc2FuaXRpemVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxuICBwdWJsaWMgb25TY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRlbGF5U2Nyb2xsVGltZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGVsYXlTY3JvbGxUaW1lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlbGF5U2Nyb2xsVGltZXIpO1xuICAgICAgdGhpcy5kZWxheVNjcm9sbFRpbWVyID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRlbGF5U2Nyb2xsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxldCBhbmNob3JJbmRleDogYW55ID0gdGhpcy5jdXJyZW50U3RlcDtcbiAgICAgIGxldCBzdGVwc0NvdW50OiBudW1iZXIgPSB0aGlzLmdldE1vZGVsKCkuc3RlcHMubGVuZ3RoO1xuICAgICAgbGV0IGxhc3RJbmRleDogbnVtYmVyO1xuXG4gICAgICBpZiAoc3RlcHNDb3VudCA9PT0gMCkge1xuICAgICAgICBsYXN0SW5kZXggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGFzdEluZGV4ID0gdGhpcy5nZXRNb2RlbCgpLnN0ZXBzLmxlbmd0aCAtIDE7XG4gICAgICB9XG5cbiAgICAgIGxldCByaWdodERvbTogYW55O1xuXG4gICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByaWdodERvbSA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN0ZXBzQ291bnQ7IGluZGV4KyspIHtcbiAgICAgICAgbGV0IGNsYXNzTmFtZUluZGV4OiBhbnkgPSB0aGlzLmNsYXNzTmFtZSArIGluZGV4O1xuICAgICAgICBsZXQgY2xhc3NOYW1lRG9tOiBhbnk7XG5cbiAgICAgICAgaWYgKHJpZ2h0RG9tICE9PSBudWxsICYmIHJpZ2h0RG9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykuZmluZCgnLicgKyBjbGFzc05hbWVJbmRleCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhc3NOYW1lRG9tID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZCgnLnBoeC1zY3JvbGwtd2l6YXJkLXBhbmUnKS5maW5kKCcucmlnaHQnKS5maW5kKCcuJyArIGNsYXNzTmFtZUluZGV4KTtcblxuICAgICAgICAgICAgaWYgKHJpZ2h0RG9tLnNjcm9sbFRvcCgpID09PSAwKSB7IC8vc2Nyb2xsaW5nIHN0YXJ0XG4gICAgICAgICAgICAgIGFuY2hvckluZGV4ID0gMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChNYXRoLmNlaWwocmlnaHREb20uc2Nyb2xsVG9wKCkgKyByaWdodERvbS5pbm5lckhlaWdodCgpKSA+PSByaWdodERvbVswXS5zY3JvbGxIZWlnaHQpIHsgLy9zY3JvbGxpbmcgZW5kXG4gICAgICAgICAgICAgIGFuY2hvckluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChyaWdodERvbS5zY3JvbGxUb3AoKSArIHJpZ2h0RG9tLm9mZnNldCgpLnRvcCkgPj0gKHJpZ2h0RG9tLnNjcm9sbFRvcCgpICsgY2xhc3NOYW1lRG9tLm9mZnNldCgpLnRvcCkpIHsgLy8gZmluZCBpbmRleCBvZiBzdGVwTWVudSAgc2Nyb2xsaW5nXG4gICAgICAgICAgICAgIGFuY2hvckluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBhbmNob3JJbmRleDtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xhc3NOYW1lKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzTmFtZSArIGluZGV4O1xuICB9XG5cbiAgcHVibGljIHNob3dTdGVwQ29udGVudChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kZWxheVNjcm9sbENsaWNrVGltZXIgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheVNjcm9sbENsaWNrVGltZXIpO1xyXG4gICAgICB0aGlzLmRlbGF5U2Nyb2xsQ2xpY2tUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJpZ2h0RG9tOiBhbnk7XHJcbiAgICBsZXQgY2xhc3NOYW1lSW5kZXg6IGFueSA9IHRoaXMuY2xhc3NOYW1lICsgaW5kZXg7XHJcbiAgICBsZXQgY2xhc3NOYW1lRG9tOiBhbnk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBpZiAodHlwZW9mICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5waHgtc2Nyb2xsLXdpemFyZC1wYW5lJykuZmluZCgnLnJpZ2h0JykgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgcmlnaHREb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpLmZpbmQoJy4nICsgY2xhc3NOYW1lSW5kZXgpICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjbGFzc05hbWVEb20gPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcucGh4LXNjcm9sbC13aXphcmQtcGFuZScpLmZpbmQoJy5yaWdodCcpLmZpbmQoJy4nICsgY2xhc3NOYW1lSW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGVsYXlTY3JvbGxDbGlja1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICgocmlnaHREb20gIT09IG51bGwgJiYgcmlnaHREb20gIT09IHVuZGVmaW5lZCkgJiYgKGNsYXNzTmFtZURvbSAhPT0gbnVsbCAmJiBjbGFzc05hbWVEb20gIT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICBpZiAoKGNsYXNzTmFtZURvbS5vZmZzZXQoKSAhPT0gbnVsbCAmJiBjbGFzc05hbWVEb20ub2Zmc2V0KCkgIT09IHVuZGVmaW5lZCkgJiYgKHJpZ2h0RG9tLnNjcm9sbFRvcCgpICE9PSBudWxsICYmIHJpZ2h0RG9tLnNjcm9sbFRvcCgpICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICByaWdodERvbS5zdG9wKCkuYW5pbWF0ZSh7IHNjcm9sbFRvcDogKGNsYXNzTmFtZURvbS5vZmZzZXQoKS50b3AgLSByaWdodERvbS5vZmZzZXQoKS50b3AgKyByaWdodERvbS5zY3JvbGxUb3AoKSkgKyAwLjcgfSwgJ3Nsb3cnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sIDUpO1xyXG4gIH1cclxufVxyXG4iXX0=