com.phloxui
Version:
PhloxUI Ng2+ Framework
303 lines (302 loc) • 29.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, HostListener, 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-pagination-wizard-pane";
var /** @type {?} */ INDEX_Y_0 = "INDEX_Y_0";
var /** @type {?} */ UP = "UP";
var /** @type {?} */ DOWN = "DOWN";
var ScrollPaginationWizardPane = /** @class */ (function (_super) {
tslib_1.__extends(ScrollPaginationWizardPane, _super);
function ScrollPaginationWizardPane(appSvc, sanitizer, elementRef) {
var _this = _super.call(this, appSvc, elementRef) || this;
_this.sanitizer = sanitizer;
return _this;
}
/**
* @return {?}
*/
ScrollPaginationWizardPane.prototype.ngOnInit = /**
* @return {?}
*/
function () {
_super.prototype.ngOnInit.call(this);
};
/**
* @param {?} event
* @return {?}
*/
ScrollPaginationWizardPane.prototype.onmousewheel = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
clearTimeout(this.delayMouseWheelTimer);
this.delayMouseWheelTimer = null;
this.delayMouseWheelTimer = setTimeout(function () {
event = window.event || event;
var /** @type {?} */ delta = Math.max(-1, Math.min(1, (event.wheelDelta || -event.detail)));
if (delta > -1) {
// mouseWheel up
if (_this.currentStep !== 0) {
_this.currentStep -= 1;
if (_this.currentStep === 0) {
_this.setSafeStyleIndexY(INDEX_Y_0);
}
else {
_this.setSafeStyleIndexY(UP);
}
}
}
else {
// mouseWheel down
if (_this.getModel().steps.length > 0) {
var /** @type {?} */ stepsIndex = _this.getModel().steps.length - 1;
if (_this.currentStep < stepsIndex) {
_this.currentStep += 1;
_this.setSafeStyleIndexY(DOWN);
}
}
}
event.preventDefault();
}, 250);
};
/**
* @param {?} mouseWheel
* @return {?}
*/
ScrollPaginationWizardPane.prototype.setSafeStyleIndexY = /**
* @param {?} mouseWheel
* @return {?}
*/
function (mouseWheel) {
var /** @type {?} */ y;
var /** @type {?} */ index = this.currentStep;
if (mouseWheel === DOWN || mouseWheel === UP) {
// set Style translate3d = (0, -(index * 100), 0);
y = -(index * 100);
}
else if (mouseWheel === INDEX_Y_0) {
// set Style translate3d = (0, 0, 0);
y = 0;
}
else {
// default set Style translate3d = (0, 0, 0);
y = 0;
}
this.safeStyle = this.sanitizer.bypassSecurityTrustStyle("translate3d( 0, " + y + "%, 0 )");
};
/**
* @return {?}
*/
ScrollPaginationWizardPane.prototype.getSafeStyle = /**
* @return {?}
*/
function () {
return this.safeStyle;
};
/**
* @param {?} index
* @return {?}
*/
ScrollPaginationWizardPane.prototype.showStepContent = /**
* @param {?} index
* @return {?}
*/
function (index) {
var /** @type {?} */ y;
if (index !== 0) {
// set Style translate3d = (0, -(index * 100), 0);
y = -(index * 100);
}
else if (index === 0) {
// set Style translate3d = (0, 0, 0);
y = 0;
}
else {
// default set Style translate3d = (0, 0, 0);
y = 0;
}
this.safeStyle = this.sanitizer.bypassSecurityTrustStyle("translate3d( 0, " + y + "%, 0 )");
};
/**
* @param {?} index
* @return {?}
*/
ScrollPaginationWizardPane.prototype.getStepInstance = /**
* @param {?} index
* @return {?}
*/
function (index) { };
ScrollPaginationWizardPane.TYPE_NAME = TYPE_NAME;
ScrollPaginationWizardPane.decorators = [
{ type: Component, args: [{
moduleId: module.id,
selector: 'phx-scroll-pagination-wizard-pane',
template: "<div class=\"phx-scroll-pagination-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\">\n\t\t<div class=\"scrollpage\" [style.transform]=\"getSafeStyle()\">\n\t\t\t<div *ngFor=\"let item of getModel().steps; let i = index;\" style=\"height: 100%;\">\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\t</div>\n\t</div>\n</div>\n",
},] },
];
/** @nocollapse */
ScrollPaginationWizardPane.ctorParameters = function () { return [
{ type: PhloxAppService, },
{ type: DomSanitizer, },
{ type: ElementRef, },
]; };
ScrollPaginationWizardPane.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 },],
"field": [{ type: Input },],
"model": [{ type: Input },],
"loadEvent": [{ type: Output, args: ['phxLoad',] },],
"changeEvent": [{ type: Output, args: ['phxChange',] },],
"beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },],
"onmousewheel": [{ type: HostListener, args: ['mousewheel', ['$event'],] },],
};
tslib_1.__decorate([
I18N(),
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollPaginationWizardPane.prototype, "help", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollPaginationWizardPane.prototype, "dataParent", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "ignoreParentData", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Object)
], ScrollPaginationWizardPane.prototype, "data", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "ignoreParentDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "delegateHistory", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ScrollPaginationWizardPane.prototype, "onDisabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Function)
], ScrollPaginationWizardPane.prototype, "onEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "loadingEnabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ScrollPaginationWizardPane.prototype, "i18nKey", void 0);
tslib_1.__decorate([
Option('i18nBypass'),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "bypass", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", Boolean)
], ScrollPaginationWizardPane.prototype, "disabled", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], ScrollPaginationWizardPane.prototype, "field", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", WizardModel)
], ScrollPaginationWizardPane.prototype, "model", void 0);
tslib_1.__decorate([
Option('load'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollPaginationWizardPane.prototype, "loadEvent", void 0);
tslib_1.__decorate([
Option('change'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollPaginationWizardPane.prototype, "changeEvent", void 0);
tslib_1.__decorate([
Option('beforeChange'),
tslib_1.__metadata("design:type", EventEmitter)
], ScrollPaginationWizardPane.prototype, "beforeChangeEvent", void 0);
return ScrollPaginationWizardPane;
}(AbstractWizardPane));
export { ScrollPaginationWizardPane };
function ScrollPaginationWizardPane_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ScrollPaginationWizardPane.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ScrollPaginationWizardPane.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
ScrollPaginationWizardPane.propDecorators;
/** @type {?} */
ScrollPaginationWizardPane.TYPE_NAME;
/** @type {?} */
ScrollPaginationWizardPane.prototype.help;
/** @type {?} */
ScrollPaginationWizardPane.prototype.dataParent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.ignoreParentData;
/** @type {?} */
ScrollPaginationWizardPane.prototype.data;
/** @type {?} */
ScrollPaginationWizardPane.prototype.ignoreParentDisabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.delegateHistory;
/** @type {?} */
ScrollPaginationWizardPane.prototype.onDisabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.onEnabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.loadingEnabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.i18nKey;
/** @type {?} */
ScrollPaginationWizardPane.prototype.bypass;
/** @type {?} */
ScrollPaginationWizardPane.prototype.options;
/** @type {?} */
ScrollPaginationWizardPane.prototype.disabled;
/** @type {?} */
ScrollPaginationWizardPane.prototype.field;
/** @type {?} */
ScrollPaginationWizardPane.prototype.model;
/** @type {?} */
ScrollPaginationWizardPane.prototype.loadEvent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.changeEvent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.beforeChangeEvent;
/** @type {?} */
ScrollPaginationWizardPane.prototype.delayMouseWheelTimer;
/** @type {?} */
ScrollPaginationWizardPane.prototype.sanitizer;
/** @type {?} */
ScrollPaginationWizardPane.prototype.safeStyle;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsUGFnaW5hdGlvbldpemFyZFBhbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L1Njcm9sbFBhZ2luYXRpb25XaXphcmRQYW5lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTFELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSW5ELHFCQUFNLFNBQVMsR0FBVyxtQ0FBbUMsQ0FBQztBQUU5RCxxQkFBTSxTQUFTLEdBQVcsV0FBVyxDQUFDO0FBQ3RDLHFCQUFNLEVBQUUsR0FBUSxJQUFJLENBQUM7QUFDckIscUJBQU0sSUFBSSxHQUFRLE1BQU0sQ0FBQzs7SUF5RHVCLHNEQUFrQjtJQXdFaEUsb0NBQVksTUFBdUIsRUFBRSxTQUF1QixFQUFFLFVBQXNCO1FBQXBGLFlBQ0Usa0JBQU0sTUFBTSxFQUFFLFVBQVUsQ0FBQyxTQUUxQjtRQURDLEtBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDOztLQUM1Qjs7OztJQUVNLDZDQUFROzs7O1FBQ2IsaUJBQU0sUUFBUSxXQUFFLENBQUM7Ozs7OztJQUlaLGlEQUFZOzs7O2NBQUMsS0FBVTs7UUFDNUIs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QUtwQixNQUFNLEVBQUU7Ozs7UUFJUixNQUFNLEVBQUU7Ozs7UUFJUixNQUFNLEVBQUU7MENBQ1EsV0FBVzs7O1FBSzNCLE1BQU0sQ0FBQyxNQUFNLENBQUM7MENBQ00sWUFBWTs7O1FBR2hDLE1BQU0sQ0FBQyxRQUFRLENBQUM7MENBQ00sWUFBWTs7O1FBRWxDLE1BQU0sQ0FBQyxjQUFjLENBQUM7MENBQ00sWUFBWTs7cUNBNUkzQztFQTBFZ0Qsa0JBQWtCO1NBQXJELDBCQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBQaGxveEFwcFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL1BobG94QXBwU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUhhc01vZGVsIH0gZnJvbSAnLi4vSUhhc01vZGVsJztcclxuaW1wb3J0IHsgQWJzdHJhY3RXaXphcmRQYW5lIH0gZnJvbSAnLi9BYnN0cmFjdFdpemFyZFBhbmUnO1xyXG5pbXBvcnQgeyBJQ2hhbmdlYWJsZSB9IGZyb20gJy4uL0lDaGFuZ2VhYmxlJztcclxuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi9jb21wb25lbnQvSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBXaXphcmRNb2RlbCB9IGZyb20gJy4uL21vZGVsL1dpemFyZE1vZGVsJztcclxuXHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtc2Nyb2xsLXBhZ2luYXRpb24td2l6YXJkLXBhbmVcIjtcclxuXHJcbmNvbnN0IElOREVYX1lfMDogc3RyaW5nID0gXCJJTkRFWF9ZXzBcIjtcclxuY29uc3QgVVA6IGFueSA9IFwiVVBcIjtcclxuY29uc3QgRE9XTjogYW55ID0gXCJET1dOXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxyXG4gIHNlbGVjdG9yOiAncGh4LXNjcm9sbC1wYWdpbmF0aW9uLXdpemFyZC1wYW5lJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtc2Nyb2xsLXBhZ2luYXRpb24td2l6YXJkLXBhbmVcIj5cclxuXHQ8ZGl2IGNsYXNzPVwibGVmdFwiIFtzdHlsZS5wYWRkaW5nLXRvcF09XCJnZXRIZWFkZXJIZWlnaHQoKSArICdwdCdcIiBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiZ2V0Rm9vdGVySGVpZ2h0KCkgKyAncHQnXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyXCIgW3N0eWxlLmhlaWdodF09XCJnZXRIZWFkZXJIZWlnaHQoKSArICdwdCdcIj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5oZWFkZXIgIT09IG51bGxcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5oZWFkZXIudHlwZSA9PT0gbnVsbFwiPlxyXG5cdFx0XHRcdFx0PGRpdiAqbmdJZj1cImdldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMICE9PSBudWxsICYmIGdldE1vZGVsKCkuaGVhZGVyLmltYWdlVVJMICE9PSAnJ1wiIGNsYXNzPVwiaGVhZGVyLWltYWdlXCI+XHJcblx0XHRcdFx0XHRcdDxpbWcgc3JjPVwie3tnZXRNb2RlbCgpLmhlYWRlci5pbWFnZVVSTH19XCI+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJoZWFkZXItbGFiZWxcIj57e2dldE1vZGVsKCkuaGVhZGVyLmxhYmVsfX08L2Rpdj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpLmhlYWRlci50eXBlICE9PSBudWxsXCI+XHJcblx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cImdldE1vZGVsKCkuaGVhZGVyLnR5cGVcIiBbZGF0YV09XCJnZXRNb2RlbCgpLmhlYWRlci5tb2RlbFwiPjwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDxkaXYgY2xhc3M9XCJib2R5XCI+XHJcblx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRNb2RlbCgpICE9PSBudWxsICYmIGdldE1vZGVsKCkuc3RlcHMgIT09IG51bGxcIj5cclxuXHRcdFx0XHQ8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldE1vZGVsKCkuc3RlcHM7IGxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJzdGVwXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N0ZXBTZWxlY3RlZChpKVwiPlxyXG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0udHlwZSA9PT0gbnVsbFwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IChjbGljayk9XCJzdGVwU2VsZWN0ZWQoaSlcIj4ge3tpdGVtLmxhYmVsfX0gPC9kaXY+XHJcblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cIml0ZW0udHlwZSAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdFx0XHQ8cGh4LWNvbXBvbmVudC13cmFwcGVyIFt0eXBlXT1cIml0ZW0udHlwZVwiIFtkYXRhXT1cIml0ZW0ubW9kZWxcIiAoY2xpY2spPVwic3RlcFNlbGVjdGVkKGkpXCI+PC9waHgtY29tcG9uZW50LXdyYXBwZXI+XHJcblx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0PC9kaXY+XHJcblx0XHQ8ZGl2IGNsYXNzPVwiZm9vdGVyXCIgW3N0eWxlLmhlaWdodF09XCJnZXRGb290ZXJIZWlnaHQoKSArICdwdCdcIj5cclxuXHRcdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldE1vZGVsKCkgIT09IG51bGwgJiYgZ2V0TW9kZWwoKS5mb290ZXIgIT09IG51bGxcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5mb290ZXIudHlwZSA9PT0gbnVsbFwiPlxyXG5cdFx0XHRcdFx0e3tnZXRNb2RlbCgpLmZvb3Rlci5sYWJlbH19XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgW25nSWZdPVwiZ2V0TW9kZWwoKS5mb290ZXIudHlwZSAhPT0gbnVsbFwiPlxyXG5cdFx0XHRcdFx0PHBoeC1jb21wb25lbnQtd3JhcHBlciBbdHlwZV09XCJnZXRNb2RlbCgpLmZvb3Rlci50eXBlXCIgW2RhdGFdPVwiZ2V0TW9kZWwoKS5mb290ZXIubW9kZWxcIj48L3BoeC1jb21wb25lbnQtd3JhcHBlcj5cclxuXHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0PC9kaXY+XHJcblx0PC9kaXY+XHJcblx0PGRpdiBjbGFzcz1cInJpZ2h0XCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwic2Nyb2xscGFnZVwiIFtzdHlsZS50cmFuc2Zvcm1dPVwiZ2V0U2FmZVN0eWxlKClcIj5cclxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRNb2RlbCgpLnN0ZXBzOyBsZXQgaSA9IGluZGV4O1wiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxyXG5cdFx0XHRcdDxwaHgtY29tcG9uZW50LXdyYXBwZXIgW2NsYXNzLmFjdGl2ZV09XCJpc1N0ZXBTZWxlY3RlZChpKVwiIFt0eXBlXT1cIml0ZW0uY29tcG9uZW50VHlwZVwiXHJcblx0XHRcdFx0XHRbZGF0YV09XCJnZXREYXRhKClcIiBbbW9kZWxdPVwiaXRlbS5jb21wb25lbnRNb2RlbFwiIFtkYXRhUGFyZW50XT1cInRoaXNcIiBbaGFuZGxlcl09XCJnZXRTdGVwc0NvbXBvbmVudEhhbmRsZXIoKVwiPlxyXG5cdFx0XHRcdDwvcGh4LWNvbXBvbmVudC13cmFwcGVyPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG48L2Rpdj5cclxuYCxcclxufSlcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU2Nyb2xsUGFnaW5hdGlvbldpemFyZFBhbmUgZXh0ZW5kcyBBYnN0cmFjdFdpemFyZFBhbmUgaW1wbGVtZW50cyBPbkluaXQsIElIYXNNb2RlbCwgSUNoYW5nZWFibGUge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YUhlbHBcclxuICBASW5wdXQoKVxyXG4gIEBJMThOKClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgaGVscDogYW55O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxyXG4gIEBPcHRpb24oJ2kxOG5CeXBhc3MnKVxyXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0V2l6YXJkUGFuZVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG1vZGVsOiBXaXphcmRNb2RlbDtcclxuXHJcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXHJcbiAgQE91dHB1dCgncGh4TG9hZCcpXHJcbiAgQE9wdGlvbignbG9hZCcpXHJcbiAgcHJvdGVjdGVkIGxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RXaXphcmRQYW5lXHJcbiAgQE91dHB1dCgncGh4Q2hhbmdlJylcclxuICBAT3B0aW9uKCdjaGFuZ2UnKVxyXG4gIHByb3RlY3RlZCBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4QmVmb3JlQ2hhbmdlJylcclxuICBAT3B0aW9uKCdiZWZvcmVDaGFuZ2UnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIHByaXZhdGUgZGVsYXlNb3VzZVdoZWVsVGltZXI6IGFueTtcclxuICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyO1xyXG4gIHByaXZhdGUgc2FmZVN0eWxlOiBTYWZlU3R5bGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGFwcFN2YzogUGhsb3hBcHBTZXJ2aWNlLCBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoYXBwU3ZjLCBlbGVtZW50UmVmKTtcclxuICAgIHRoaXMuc2FuaXRpemVyID0gc2FuaXRpemVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNld2hlZWwnLCBbJyRldmVudCddKVxyXG4gIHB1YmxpYyBvbm1vdXNld2hlZWwoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIpO1xyXG5cclxuICAgIHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuZGVsYXlNb3VzZVdoZWVsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgIGV2ZW50ID0gd2luZG93LmV2ZW50IHx8IGV2ZW50O1xyXG5cclxuICAgICAgbGV0IGRlbHRhOiBudW1iZXIgPSBNYXRoLm1heCgtMSwgTWF0aC5taW4oMSwgKGV2ZW50LndoZWVsRGVsdGEgfHwgLWV2ZW50LmRldGFpbCkpKTtcclxuXHJcbiAgICAgIGlmIChkZWx0YSA+IC0xKSB7IC8vIG1vdXNlV2hlZWwgdXBcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50U3RlcCAhPT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCAtPSAxO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2FmZVN0eWxlSW5kZXhZKElOREVYX1lfMCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNhZmVTdHlsZUluZGV4WShVUCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgeyAgIC8vIG1vdXNlV2hlZWwgZG93blxyXG4gICAgICAgIGlmICh0aGlzLmdldE1vZGVsKCkuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHN0ZXBzSW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TW9kZWwoKS5zdGVwcy5sZW5ndGggLSAxO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwIDwgc3RlcHNJbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGVwICs9IDE7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2FmZVN0eWxlSW5kZXhZKERPV04pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH0sIDI1MCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2FmZVN0eWxlSW5kZXhZKG1vdXNlV2hlZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IHk6IGFueTtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuY3VycmVudFN0ZXA7XHJcblxyXG4gICAgaWYgKG1vdXNlV2hlZWwgPT09IERPV04gfHwgbW91c2VXaGVlbCA9PT0gVVApIHsgLy8gc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAtKGluZGV4ICogMTAwKSwgMCk7XHJcbiAgICAgIHkgPSAtKGluZGV4ICogMTAwKTtcclxuICAgIH0gZWxzZSBpZiAobW91c2VXaGVlbCA9PT0gSU5ERVhfWV8wKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfSBlbHNlIHsgLy8gZGVmYXVsdCAgc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAwLCAwKTtcclxuICAgICAgeSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYWZlU3R5bGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXCJ0cmFuc2xhdGUzZCggMCwgXCIgKyB5ICsgXCIlLCAwIClcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U2FmZVN0eWxlKCk6IFNhZmVTdHlsZSB7XHJcbiAgICByZXR1cm4gdGhpcy5zYWZlU3R5bGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd1N0ZXBDb250ZW50KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCB5OiBhbnk7XHJcblxyXG4gICAgaWYgKGluZGV4ICE9PSAwKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgLShpbmRleCAqIDEwMCksIDApO1xyXG4gICAgICB5ID0gLShpbmRleCAqIDEwMCk7XHJcbiAgICB9IGVsc2UgaWYgKGluZGV4ID09PSAwKSB7IC8vIHNldCBTdHlsZSB0cmFuc2xhdGUzZCA9ICAoMCwgMCwgMCk7XHJcbiAgICAgIHkgPSAwO1xyXG4gICAgfSBlbHNlIHsgLy8gZGVmYXVsdCAgc2V0IFN0eWxlIHRyYW5zbGF0ZTNkID0gICgwLCAwLCAwKTtcclxuICAgICAgeSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYWZlU3R5bGUgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoXCJ0cmFuc2xhdGUzZCggMCwgXCIgKyB5ICsgXCIlLCAwIClcIik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0U3RlcEluc3RhbmNlKGluZGV4OiBudW1iZXIpOiBhbnkgeyB9XHJcbn1cclxuIl19