materialize-angular
Version:
Material UI Angular library
529 lines • 39.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/slider/slider.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, Output, QueryList, Renderer2, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { supportedEvents, supportTouchEvents } from '../../utils/get-supported-events.util';
import { config } from '../../config';
import { SliderOptionComponent } from './slider-option/slider-option.component';
var SliderComponent = /** @class */ (function () {
function SliderComponent(renderer) {
this.renderer = renderer;
this.className = SliderComponent.defaultProps.className;
this.disabled = SliderComponent.defaultProps.disabled;
this.required = SliderComponent.defaultProps.required;
this.showLabels = SliderComponent.defaultProps.showLabels;
this.showTicks = SliderComponent.defaultProps.showTicks;
this.value = SliderComponent.defaultProps.value;
this.prefix = config.components.prefix;
this.isFocused = false;
this.supportedEvents = supportedEvents();
this.onChangeEmitter = new EventEmitter();
this.actionDown = this.actionDown.bind(this);
this.actionMove = this.actionMove.bind(this);
this.actionUp = this.actionUp.bind(this);
this.onOptionClick = this.onOptionClick.bind(this);
this.update = this.update.bind(this);
window.addEventListener(this.supportedEvents.resize, this.update);
}
/**
* @return {?}
*/
SliderComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.sliderTrack.nativeElement.addEventListener(this.supportedEvents.down, this.actionDown);
};
/**
* @return {?}
*/
SliderComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.update();
this.options.changes.subscribe(this.update);
};
/**
* @return {?}
*/
SliderComponent.prototype.update = /**
* @return {?}
*/
function () {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
_this.registerEventOptions();
_this.renderPositions();
_this.moveToValue(_this.value, false);
}), 0);
};
/**
* @return {?}
*/
SliderComponent.prototype.registerEventOptions = /**
* @return {?}
*/
function () {
var _this = this;
this.options.forEach((/**
* @param {?} option
* @return {?}
*/
function (option) {
option.onClickEmitter.subscribe(_this.onOptionClick);
}));
};
/**
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.onOptionClick = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
this.onChangeEmitter.emit(this.value);
this.onChange(this.value);
this.moveToValue(this.value, true);
};
/**
* @return {?}
*/
SliderComponent.prototype.renderPositions = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var pixelInterval = this.getPixelInterval();
this.removeTicks();
this.options.forEach((/**
* @param {?} option
* @param {?} index
* @return {?}
*/
function (option, index) {
/** @type {?} */
var leftSpace = pixelInterval * index;
var nativeElement = option.templateRef.nativeElement;
_this.renderer.setStyle(nativeElement, 'left', leftSpace + "px");
if (_this.showTicks) {
/** @type {?} */
var tick = _this.renderer.createElement('div');
_this.renderer.setStyle(tick, 'left', leftSpace + "px");
_this.renderer.addClass(tick, SliderComponent.tickClassName);
_this.renderer.appendChild(_this.sliderTrackInterval.nativeElement, tick);
}
}));
};
/**
* @return {?}
*/
SliderComponent.prototype.removeTicks = /**
* @return {?}
*/
function () {
var nativeElement = this.sliderTrackInterval.nativeElement;
while (nativeElement.firstChild) {
this.renderer.removeChild(nativeElement, nativeElement.firstChild);
}
};
/**
* @param {?} event
* @return {?}
*/
SliderComponent.prototype.actionDown = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (!this.disabled) {
/** @type {?} */
var x = this.getXCoordinate(event, this.supportedEvents.down);
this.animate(x, true);
window.addEventListener(this.supportedEvents.up, this.actionUp);
window.addEventListener(this.supportedEvents.move, this.actionMove);
}
};
/**
* @param {?} event
* @return {?}
*/
SliderComponent.prototype.actionMove = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var x = this.getXCoordinate(event, this.supportedEvents.move);
this.value = this.getValueFromXCoordinate(x);
this.animate(x, false);
};
/**
* @param {?} event
* @return {?}
*/
SliderComponent.prototype.actionUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
window.removeEventListener(this.supportedEvents.up, this.actionUp);
window.removeEventListener(this.supportedEvents.move, this.actionMove);
this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', null);
/** @type {?} */
var x = this.getXCoordinate(event, this.supportedEvents.up);
this.value = this.getValueFromXCoordinate(x);
this.onChangeEmitter.emit(this.value);
this.onChange(this.value);
this.moveToValue(this.value, true);
};
/**
* @param {?} value
* @param {?} hasAnimation
* @return {?}
*/
SliderComponent.prototype.moveToValue = /**
* @param {?} value
* @param {?} hasAnimation
* @return {?}
*/
function (value, hasAnimation) {
/** @type {?} */
var options = this.options.toArray();
/** @type {?} */
var index = options.findIndex((/**
* @param {?} option
* @return {?}
*/
function (option) { return option.value === value; }));
/** @type {?} */
var validatedIndex = index >= 0
? index
: 0;
/** @type {?} */
var pixelInterval = this.getPixelInterval();
/** @type {?} */
var nextXCoordinate = validatedIndex * pixelInterval;
this.animate(nextXCoordinate, hasAnimation);
};
/**
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.activeOption = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.options.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
item.isActive = (item.value === value);
}));
};
/**
* @param {?} x
* @return {?}
*/
SliderComponent.prototype.getValueFromXCoordinate = /**
* @param {?} x
* @return {?}
*/
function (x) {
/** @type {?} */
var index = this.getIndexFromXCoordinate(x);
/** @type {?} */
var options = this.options.toArray();
/** @type {?} */
var value = options[index].value;
return value;
};
/**
* @param {?} x
* @return {?}
*/
SliderComponent.prototype.getIndexFromXCoordinate = /**
* @param {?} x
* @return {?}
*/
function (x) {
/** @type {?} */
var pixelInterval = this.getPixelInterval();
if (pixelInterval) {
/** @type {?} */
var index = Math.round(x / pixelInterval);
if (index >= 0 && index <= this.options.length) {
return index;
}
}
return 0;
};
/**
* @param {?} event
* @param {?} eventType
* @return {?}
*/
SliderComponent.prototype.getXCoordinateByEventType = /**
* @param {?} event
* @param {?} eventType
* @return {?}
*/
function (event, eventType) {
if (supportTouchEvents()) {
if (eventType === this.supportedEvents.up) {
return event.changedTouches[0].clientX;
}
return event.touches[0].clientX;
}
return event.clientX;
};
/**
* @param {?} event
* @param {?} eventType
* @return {?}
*/
SliderComponent.prototype.getXCoordinate = /**
* @param {?} event
* @param {?} eventType
* @return {?}
*/
function (event, eventType) {
/** @type {?} */
var rect = this.sliderTrack.nativeElement.getBoundingClientRect();
/** @type {?} */
var xCoordinateEvent = this.getXCoordinateByEventType(event, eventType);
/** @type {?} */
var x = xCoordinateEvent - rect.left;
if (x < 0) {
return 0;
}
if (x > this.sliderTrack.nativeElement.offsetWidth) {
return this.sliderTrack.nativeElement.offsetWidth;
}
return x;
};
/**
* @return {?}
*/
SliderComponent.prototype.getPixelInterval = /**
* @return {?}
*/
function () {
/** @type {?} */
var maxOptionsSize = this.options.length - 1;
if (maxOptionsSize > 0) {
return this.sliderTrack.nativeElement.offsetWidth / maxOptionsSize;
}
return 0;
};
/**
* @param {?} x
* @param {?} hasAnimation
* @return {?}
*/
SliderComponent.prototype.animate = /**
* @param {?} x
* @param {?} hasAnimation
* @return {?}
*/
function (x, hasAnimation) {
this.activeOption(this.value);
/** @type {?} */
var transitionDuration = hasAnimation
? null
: '0ms';
this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'transitionDuration', transitionDuration);
this.renderer.setStyle(this.sliderIndicatorContainer.nativeElement, 'left', x + "px");
};
/**
* @return {?}
*/
SliderComponent.prototype.onFocus = /**
* @return {?}
*/
function () {
if (!this.disabled) {
this.isFocused = true;
this.onTouched();
}
};
/**
* @return {?}
*/
SliderComponent.prototype.onBlur = /**
* @return {?}
*/
function () {
this.isFocused = false;
};
/**
* @param {?} isDisabled
* @return {?}
*/
SliderComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/**
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
setTimeout((/**
* @return {?}
*/
function () {
_this.value = value;
_this.moveToValue(value, false);
}), 0);
};
/**
* @param {?} fn
* @return {?}
*/
SliderComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
SliderComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} value
* @return {?}
*/
SliderComponent.prototype.onChange = /**
* @param {?} value
* @return {?}
*/
function (value) { };
/**
* @return {?}
*/
SliderComponent.prototype.onTouched = /**
* @return {?}
*/
function () { };
SliderComponent.tickClassName = config.components.prefix + '-slider-step';
SliderComponent.defaultProps = {
className: '',
disabled: false,
required: false,
showLabels: true,
showTicks: false,
value: null
};
SliderComponent.decorators = [
{ type: Component, args: [{
providers: [{
multi: true,
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return SliderComponent; }))
}],
selector: config.components.prefix + "-slider }",
template: "<div [ngClass]=\"[prefix + '-slider', className]\" [class.focused]=\"isFocused\" [class.disabled]=\"disabled\">\n\n <div [ngClass]=\"prefix + '-slider-track-container'\" #sliderTrack [tabindex]=\"disabled ? '-1' : '0'\" (focus)=\"onFocus()\" (blur)=\"onBlur()\">\n <div #sliderTrackInterval></div>\n\n <div [ngClass]=\"prefix + '-slider-track'\" #sliderTrackBackground></div>\n\n <div [ngClass]=\"prefix + '-slider-indicator-container'\" #sliderIndicatorContainer>\n <ng-content select=\"materialize-slider-indicator\"></ng-content>\n </div>\n </div>\n\n <div [ngClass]=\"prefix + '-slider-labels-container'\" *ngIf=\"showLabels\">\n <ng-content select=\"materialize-slider-option\"></ng-content>\n </div>\n</div>\n"
}] }
];
/** @nocollapse */
SliderComponent.ctorParameters = function () { return [
{ type: Renderer2 }
]; };
SliderComponent.propDecorators = {
options: [{ type: ContentChildren, args: [SliderOptionComponent,] }],
sliderIndicatorContainer: [{ type: ViewChild, args: ['sliderIndicatorContainer', { static: true },] }],
sliderTrack: [{ type: ViewChild, args: ['sliderTrack', { static: true },] }],
sliderTrackBackground: [{ type: ViewChild, args: ['sliderTrackBackground', { static: true },] }],
sliderTrackInterval: [{ type: ViewChild, args: ['sliderTrackInterval', { static: true },] }],
onChangeEmitter: [{ type: Output, args: ['onChange',] }],
className: [{ type: Input }],
disabled: [{ type: Input }],
required: [{ type: Input }],
showLabels: [{ type: Input }],
showTicks: [{ type: Input }],
value: [{ type: Input }]
};
return SliderComponent;
}());
export { SliderComponent };
if (false) {
/** @type {?} */
SliderComponent.tickClassName;
/** @type {?} */
SliderComponent.defaultProps;
/** @type {?} */
SliderComponent.prototype.options;
/** @type {?} */
SliderComponent.prototype.sliderIndicatorContainer;
/** @type {?} */
SliderComponent.prototype.sliderTrack;
/** @type {?} */
SliderComponent.prototype.sliderTrackBackground;
/** @type {?} */
SliderComponent.prototype.sliderTrackInterval;
/** @type {?} */
SliderComponent.prototype.onChangeEmitter;
/** @type {?} */
SliderComponent.prototype.className;
/** @type {?} */
SliderComponent.prototype.disabled;
/** @type {?} */
SliderComponent.prototype.required;
/** @type {?} */
SliderComponent.prototype.showLabels;
/** @type {?} */
SliderComponent.prototype.showTicks;
/** @type {?} */
SliderComponent.prototype.value;
/** @type {?} */
SliderComponent.prototype.prefix;
/** @type {?} */
SliderComponent.prototype.isFocused;
/** @type {?} */
SliderComponent.prototype.supportedEvents;
/**
* @type {?}
* @private
*/
SliderComponent.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvc2xpZGVyL3NsaWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUdMLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFHaEY7SUEwQ0UseUJBQW9CLFFBQW1CO1FBQW5CLGFBQVEsR0FBUixRQUFRLENBQVc7UUFaOUIsY0FBUyxHQUFXLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQzNELGFBQVEsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFRLEdBQVksZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDMUQsZUFBVSxHQUFZLGVBQWUsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQzlELGNBQVMsR0FBWSxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUM1RCxVQUFLLEdBQXFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBRS9FLFdBQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQU12QyxJQUFJLENBQUMsU0FBUyxHQUFH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Q25ELFNBQVMsU0FBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7a0NBRWpELE1BQU0sU0FBQyxVQUFVOzRCQUVqQixLQUFLOzJCQUNMLEtBQUs7MkJBQ0wsS0FBSzs2QkFDTCxLQUFLOzRCQUNMLEtBQUs7d0JBQ0wsS0FBSzs7SUE2T1Isc0JBQUM7Q0FBQSxBQWhSRCxJQWdSQztTQXZRWSxlQUFlOzs7SUFDMUIsOEJBQTBFOztJQUUxRSw2QkFPRTs7SUFFRixrQ0FBa0Y7O0lBRWxGLG1EQUE4Rjs7SUFDOUYsc0NBQW9FOztJQUNwRSxnREFBd0Y7O0lBQ3hGLDhDQUFvRjs7SUFFcEYsMENBQW9GOztJQUVwRixvQ0FBb0U7O0lBQ3BFLG1DQUFtRTs7SUFDbkUsbUNBQW1FOztJQUNuRSxxQ0FBdUU7O0lBQ3ZFLG9DQUFxRTs7SUFDckUsZ0NBQXNGOztJQUV0RixpQ0FBeUM7O0lBRXpDLG9DQUEwQjs7SUFDMUIsMENBQTZDOzs7OztJQUVqQyxtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgc3VwcG9ydGVkRXZlbnRzLCBzdXBwb3J0VG91Y2hFdmVudHMgfSBmcm9tICcuLi8uLi91dGlscy9nZXQtc3VwcG9ydGVkLWV2ZW50cy51dGlsJztcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBTbGlkZXJNb2RlbCB9IGZyb20gJy4vc2xpZGVyLm1vZGVsJztcbmltcG9ydCB7IFNsaWRlck9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2xpZGVyLW9wdGlvbi9zbGlkZXItb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRFdmVudHNNb2RlbCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29tbW9uL21vZGVscy9zdXBwb3J0ZWQtZXZlbnRzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHByb3ZpZGVyczogW3tcbiAgICBtdWx0aTogdHJ1ZSxcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTbGlkZXJDb21wb25lbnQpXG4gIH1dLFxuICBzZWxlY3RvcjogYCR7IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeCB9LXNsaWRlciB9YCxcbiAgdGVtcGxhdGVVcmw6ICcuL3NsaWRlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU2xpZGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFNsaWRlck1vZGVsIHtcbiAgc3RhdGljIHJlYWRvbmx5IHRpY2tDbGFzc05hbWUgPSBjb25maWcuY29tcG9uZW50cy5wcmVmaXggKyAnLXNsaWRlci1zdGVwJztcblxuICBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFByb3BzOiBTbGlkZXJNb2RlbCA9IHtcbiAgICBjbGFzc05hbWU6ICcnLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgc2hvd0xhYmVsczogdHJ1ZSxcbiAgICBzaG93VGlja3M6IGZhbHNlLFxuICAgIHZhbHVlOiBudWxsXG4gIH07XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTbGlkZXJPcHRpb25Db21wb25lbnQpIG9wdGlvbnM6IFF1ZXJ5TGlzdDxTbGlkZXJPcHRpb25Db21wb25lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ3NsaWRlckluZGljYXRvckNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIHNsaWRlckluZGljYXRvckNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2snLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJUcmFjazogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnc2xpZGVyVHJhY2tCYWNrZ3JvdW5kJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyVHJhY2tCYWNrZ3JvdW5kOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzbGlkZXJUcmFja0ludGVydmFsJywgeyBzdGF0aWM6IHRydWUgfSkgc2xpZGVyVHJhY2tJbnRlcnZhbDogRWxlbWVudFJlZjtcblxuICBAT3V0cHV0KCdvbkNoYW5nZScpIG9uQ2hhbmdlRW1pdHRlcjogRXZlbnRFbWl0dGVyPG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsPjtcblxuICBASW5wdXQoKSBjbGFzc05hbWU6IHN0cmluZyA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuY2xhc3NOYW1lO1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuZGlzYWJsZWQ7XG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gU2xpZGVyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5yZXF1aXJlZDtcbiAgQElucHV0KCkgc2hvd0xhYmVsczogYm9vbGVhbiA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuc2hvd0xhYmVscztcbiAgQElucHV0KCkgc2hvd1RpY2tzOiBib29sZWFuID0gU2xpZGVyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5zaG93VGlja3M7XG4gIEBJbnB1dCgpIHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCA9IFNsaWRlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMudmFsdWU7XG5cbiAgcHVibGljIHByZWZpeCA9IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeDtcblxuICBwdWJsaWMgaXNGb2N1c2VkOiBib29sZWFuO1xuICBwdWJsaWMgc3VwcG9ydGVkRXZlbnRzOiBTdXBwb3J0ZWRFdmVudHNNb2RlbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3VwcG9ydGVkRXZlbnRzID0gc3VwcG9ydGVkRXZlbnRzKCk7XG4gICAgdGhpcy5vbkNoYW5nZUVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICB0aGlzLmFjdGlvbkRvd24gPSB0aGlzLmFjdGlvbkRvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGlvbk1vdmUgPSB0aGlzLmFjdGlvbk1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmFjdGlvblVwID0gdGhpcy5hY3Rpb25VcC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25PcHRpb25DbGljayA9IHRoaXMub25PcHRpb25DbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMudXBkYXRlID0gdGhpcy51cGRhdGUuYmluZCh0aGlzKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLnJlc2l6ZSwgdGhpcy51cGRhdGUpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLmRvd24sIHRoaXMuYWN0aW9uRG93bik7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy51cGRhdGUoKTtcblxuICAgIHRoaXMub3B0aW9ucy5jaGFuZ2VzLnN1YnNjcmliZSh0aGlzLnVwZGF0ZSk7XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnRPcHRpb25zKCk7XG4gICAgICB0aGlzLnJlbmRlclBvc2l0aW9ucygpO1xuICAgICAgdGhpcy5tb3ZlVG9WYWx1ZSh0aGlzLnZhbHVlLCBmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50T3B0aW9ucygpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgb3B0aW9uLm9uQ2xpY2tFbWl0dGVyLnN1YnNjcmliZSh0aGlzLm9uT3B0aW9uQ2xpY2spO1xuICAgIH0pO1xuICB9XG5cbiAgb25PcHRpb25DbGljayh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgYm9vbGVhbiB8IG51bGwpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZUVtaXR0ZXIuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMubW92ZVRvVmFsdWUodGhpcy52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICByZW5kZXJQb3NpdGlvbnMoKSB7XG4gICAgY29uc3QgcGl4ZWxJbnRlcnZhbCA9IHRoaXMuZ2V0UGl4ZWxJbnRlcnZhbCgpO1xuXG4gICAgdGhpcy5yZW1vdmVUaWNrcygpO1xuXG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goKG9wdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGxlZnRTcGFjZSA9IHBpeGVsSW50ZXJ2YWwgKiBpbmRleDtcbiAgICAgIGNvbnN0IHsgbmF0aXZlRWxlbWVudCB9ID0gb3B0aW9uLnRlbXBsYXRlUmVmO1xuXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7IGxlZnRTcGFjZSB9cHhgKTtcblxuICAgICAgaWYgKHRoaXMuc2hvd1RpY2tzKSB7XG4gICAgICAgIGNvbnN0IHRpY2sgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGljaywgJ2xlZnQnLCBgJHsgbGVmdFNwYWNlIH1weGApO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRpY2ssIFNsaWRlckNvbXBvbmVudC50aWNrQ2xhc3NOYW1lKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnNsaWRlclRyYWNrSW50ZXJ2YWwubmF0aXZlRWxlbWVudCwgdGljayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVUaWNrcygpIHtcbiAgICBjb25zdCB7IG5hdGl2ZUVsZW1lbnQgfSA9IHRoaXMuc2xpZGVyVHJhY2tJbnRlcnZhbDtcblxuICAgIHdoaWxlIChuYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQobmF0aXZlRWxlbWVudCwgbmF0aXZlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25Eb3duKGV2ZW50OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IHggPSB0aGlzLmdldFhDb29yZGluYXRlKGV2ZW50LCB0aGlzLnN1cHBvcnRlZEV2ZW50cy5kb3duKTtcblxuICAgICAgdGhpcy5hbmltYXRlKHgsIHRydWUpO1xuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy51cCwgdGhpcy5hY3Rpb25VcCk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnN1cHBvcnRlZEV2ZW50cy5tb3ZlLCB0aGlzLmFjdGlvbk1vdmUpO1xuICAgIH1cbiAgfVxuXG4gIGFjdGlvbk1vdmUoZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IHggPSB0aGlzLmdldFhDb29yZGluYXRlKGV2ZW50LCB0aGlzLnN1cHBvcnRlZEV2ZW50cy5tb3ZlKTtcblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmdldFZhbHVlRnJvbVhDb29yZGluYXRlKHgpO1xuICAgIHRoaXMuYW5pbWF0ZSh4LCBmYWxzZSk7XG4gIH1cblxuICBhY3Rpb25VcChldmVudDogYW55KSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5zdXBwb3J0ZWRFdmVudHMudXAsIHRoaXMuYWN0aW9uVXApO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuc3VwcG9ydGVkRXZlbnRzLm1vdmUsIHRoaXMuYWN0aW9uTW92ZSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2xpZGVySW5kaWNhdG9yQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2l0aW9uRHVyYXRpb24nLCBudWxsKTtcblxuICAgIGNvbnN0IHggPSB0aGlzLmdldFhDb29yZGluYXRlKGV2ZW50LCB0aGlzLnN1cHBvcnRlZEV2ZW50cy51cCk7XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXRWYWx1ZUZyb21YQ29vcmRpbmF0ZSh4KTtcbiAgICB0aGlzLm9uQ2hhbmdlRW1pdHRlci5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5tb3ZlVG9WYWx1ZSh0aGlzLnZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIG1vdmVUb1ZhbHVlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCwgaGFzQW5pbWF0aW9uOiBib29sZWFuKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy50b0FycmF5KCk7XG4gICAgY29uc3QgaW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb24gPT4gb3B0aW9uLnZhbHVlID09PSB2YWx1ZSk7XG4gICAgY29uc3QgdmFsaWRhdGVkSW5kZXggPSBpbmRleCA+PSAwXG4gICAgICA/IGluZGV4XG4gICAgICA6IDA7XG4gICAgY29uc3QgcGl4ZWxJbnRlcnZhbCA9IHRoaXMuZ2V0UGl4ZWxJbnRlcnZhbCgpO1xuICAgIGNvbnN0IG5leHRYQ29vcmRpbmF0ZSA9IHZhbGlkYXRlZEluZGV4ICogcGl4ZWxJbnRlcnZhbDtcblxuICAgIHRoaXMuYW5pbWF0ZShuZXh0WENvb3JkaW5hdGUsIGhhc0FuaW1hdGlvbik7XG4gIH1cblxuICBhY3RpdmVPcHRpb24odmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBpdGVtLmlzQWN0aXZlID0gKGl0ZW0udmFsdWUgPT09IHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFZhbHVlRnJvbVhDb29yZGluYXRlKHg6IG51bWJlcikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5nZXRJbmRleEZyb21YQ29vcmRpbmF0ZSh4KTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKTtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbaW5kZXhdLnZhbHVlO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZ2V0SW5kZXhGcm9tWENvb3JkaW5hdGUoeDogbnVtYmVyKSB7XG4gICAgY29uc3QgcGl4ZWxJbnRlcnZhbCA9IHRoaXMuZ2V0UGl4ZWxJbnRlcnZhbCgpO1xuXG4gICAgaWYgKHBpeGVsSW50ZXJ2YWwpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZCh4IC8gcGl4ZWxJbnRlcnZhbCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgZ2V0WENvb3JkaW5hdGVCeUV2ZW50VHlwZShldmVudDogYW55LCBldmVudFR5cGU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKHN1cHBvcnRUb3VjaEV2ZW50cygpKSB7XG4gICAgICBpZiAoZXZlbnRUeXBlID09PSB0aGlzLnN1cHBvcnRlZEV2ZW50cy51cCkge1xuICAgICAgICByZXR1cm4gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQuY2xpZW50WDtcbiAgfVxuXG4gIGdldFhDb29yZGluYXRlKGV2ZW50OiBhbnksIGV2ZW50VHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4Q29vcmRpbmF0ZUV2ZW50ID0gdGhpcy5nZXRYQ29vcmRpbmF0ZUJ5RXZlbnRUeXBlKGV2ZW50LCBldmVudFR5cGUpO1xuICAgIGNvbnN0IHggPSB4Q29vcmRpbmF0ZUV2ZW50IC0gcmVjdC5sZWZ0O1xuXG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBpZiAoeCA+IHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpZGVyVHJhY2submF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4geDtcbiAgfVxuXG4gIGdldFBpeGVsSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgbWF4T3B0aW9uc1NpemUgPSB0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMTtcblxuICAgIGlmIChtYXhPcHRpb25zU2l6ZSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWRlclRyYWNrLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggLyBtYXhPcHRpb25zU2l6ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGFuaW1hdGUoeDogbnVtYmVyLCBoYXNBbmltYXRpb246IGJvb2xlYW4pIHtcbiAgICB0aGlzLmFjdGl2ZU9wdGlvbih0aGlzLnZhbHVlKTtcblxuICAgIGNvbnN0IHRyYW5zaXRpb25EdXJhdGlvbiA9IGhhc0FuaW1hdGlvblxuICAgICAgPyBudWxsXG4gICAgICA6ICcwbXMnO1xuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlckluZGljYXRvckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbkR1cmF0aW9uJywgdHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuc2xpZGVySW5kaWNhdG9yQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7IHggfXB4YCk7XG4gIH1cblxuICBvbkZvY3VzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pc0ZvY3VzZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmx1cigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgbnVsbCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICB0aGlzLm1vdmVUb1ZhbHVlKHZhbHVlLCBmYWxzZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgb25DaGFuZ2UodmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4gfCBudWxsKTogdm9pZCB7fVxuXG4gIG9uVG91Y2hlZCgpOiB2b2lkIHt9XG59XG4iXX0=