angular-responsive-carousel-ng16
Version:
Carousel for Angular. A simple solution for horizontal scrolling images with lazy loading.
397 lines • 50.5 kB
JavaScript
export class Slide {
get fullCellWidth() {
return this.carouselProperties.cellWidth + this.carouselProperties.margin;
}
get margin() {
return this.carouselProperties.margin;
}
get minSwipeDistance() {
return this.carouselProperties.minSwipeDistance;
}
get numberOfVisibleCells() {
return this.utils.numberOfVisibleCells;
}
get visibleCellsOverflowContainer() {
return this.utils.visibleCellsOverflowContainer;
}
/* The position to which the container returns after each slide
* in the light DUM tree mode.
*/
get fixedContainerPosition() {
return -(this.overflowCellsLimit * this.fullCellWidth);
}
get overflowCellsLimit() {
return this.utils.overflowCellsLimit;
}
get images() {
return this.carouselProperties.images;
}
/* Number of cell elements in the DUM tree */
get cellLength() {
if (this.isLightDOM) {
return this.cells.cellLengthInLightDOMMode;
}
else {
if (this.images) {
return this.images.length;
}
else {
return this.cells.cellLength;
}
}
}
get isLightDOM() {
return this.carouselProperties.lightDOM || this.carouselProperties.loop;
}
constructor(carouselProperties, utils, cells, container) {
this.carouselProperties = carouselProperties;
this.utils = utils;
this.cells = cells;
this.container = container;
this.slideLength = 0;
this.isSlideInProgress = false;
this.counter = 0;
this._counter = 0;
this.distance = 0;
this.distanceAbs = 0;
this.isNotClickOnArrow = false;
this.initialPositionX = 0;
this.currentPositionX = 0;
/* The slide length has been limited by the limitSlideLength() method */
this.isSlideLengthLimited = false;
this.init();
}
updateProperties(carouselProperties) {
this.carouselProperties = carouselProperties;
this.setVisibleWidth();
}
init() {
this.visibleWidth = this.carouselProperties.visibleWidth || this.carouselProperties.hostElement.clientWidth;
}
handleTouchstart() {
/* Touchstart event is not called for arrow */
this.isNotClickOnArrow = true;
this.isSlideLengthLimited = false;
if (!this.isSlideInProgress) {
this.initialPositionX = this.container.getCurrentPositionX();
}
}
handleTouchend() {
if (!this.isNotClickOnArrow) {
return;
}
this.currentPositionX = this.container.getCurrentPositionX();
this.distanceAbs = Math.abs(this.initialPositionX - this.currentPositionX);
this.distance = this.initialPositionX - this.currentPositionX;
this.direction = this.getDirection();
this.isNotClickOnArrow = false;
this.handleSlide();
}
handleTransitionend() {
this.setCounter();
this.isSlideInProgress = false;
if (this.isLightDOM) {
this.alignContainerFast();
}
}
handleSlide(customSlideLength = undefined) {
let isUsingButton = customSlideLength;
let newPositionX;
if (isUsingButton && this.isSlideInProgress || !this.direction) {
return;
}
/* Custom slide length is used in arrows */
if (customSlideLength) {
this.slideLength = this.limitSlideLength(customSlideLength);
if (!this.isSlideInProgress) {
this.initialPositionX = this.container.getCurrentPositionX();
}
}
else {
this.slideLength = this.getSlideLength(this.distanceAbs);
}
/* Store intermediate counter value */
this._counter = this.getPreliminaryCounter();
if (this.direction === 'left') {
if (!customSlideLength) {
this.slideLength = this.limitSlideLength(this.getSlideLength(this.distanceAbs));
}
this._counter = this.getPreliminaryCounter();
let isSlidesEnd = this.isSlidesEnd(this._counter);
newPositionX = this.getPositionByIndex(this._counter);
if (isSlidesEnd) {
this._counter = this.counter;
newPositionX = this.getPositionByIndex(this.counter);
this.slideLength = 0;
}
}
if (this.direction === 'right') {
if (!customSlideLength) {
this.slideLength = this.getSlideLength(this.distanceAbs);
}
if (this._counter < 0) {
this._counter = this.counter;
this.slideLength = this.counter;
}
newPositionX = this.getPositionByIndex(this.counter - this.slideLength);
}
if (this.container.getCurrentPositionX() !== newPositionX) {
this.isSlideInProgress = true;
this.container.transformPositionX(newPositionX);
}
}
next(length = 1) {
this.direction = 'left';
this.handleSlide(length);
}
prev(length = 1) {
this.direction = 'right';
this.handleSlide(length);
}
select(index) {
if (index > this.cellLength - 1) {
return;
}
if (index > this.counter) {
let length = index - this.counter;
this.next(length);
}
if (index < this.counter) {
let length = this.counter - index;
this.prev(length);
}
}
getPreliminaryCounter() {
if (this.direction === 'left') {
return this.counter + this.slideLength;
}
if (this.direction === 'right') {
return this.counter - this.slideLength;
}
return 0;
}
/*
* Limits the length of the slide during calls to the next() and prev()
* methods if the specified position is outside the cell length
*/
limitSlideLength(slideLength) {
if (slideLength > 1) {
for (var i = 0; i < slideLength; i++) {
let newCounter = this.counter + (slideLength - i);
if (!this.isSlidesEnd(newCounter)) {
slideLength = slideLength - i;
this.isSlideLengthLimited = i > 0;
break;
}
}
}
return slideLength;
}
/* Offset the container to show the last cell completely */
getPositionCorrection(counter) {
let correction = 0;
let isLastSlide = this.isLastSlide(counter);
if (this.carouselProperties.loop || this.direction === "right") {
return 0;
}
if (this.isSlideLengthLimited || isLastSlide) {
let cellsWidth = this.cells.cellLengthInLightDOMMode * this.fullCellWidth;
if (this.visibleWidth < cellsWidth) {
correction = -(this.numberOfVisibleCells * this.fullCellWidth - this.visibleWidth - this.margin);
}
if (correction >= -this.margin) {
correction = 0;
}
}
return correction;
}
getSlideLength(distanceAbs) {
let isLastSlide = this.isLastSlide(this.counter);
/* If the last cell does not fit entirely, then the
* length of the swipe to the left, from the extreme
* right position, may be shorter than usual.
*/
if (isLastSlide && this.direction === "right") {
distanceAbs = distanceAbs + this.visibleWidth % this.fullCellWidth;
}
let length = Math.floor(distanceAbs / this.fullCellWidth);
if (distanceAbs % this.fullCellWidth >= this.minSwipeDistance) {
length++;
}
return length;
}
getDistanceAbs() {
return Math.abs(this.initialPositionX - this.currentPositionX);
}
getDirection() {
const direction = Math.sign(this.initialPositionX - this.currentPositionX);
if (direction === -1) {
return 'right';
}
if (direction === 1) {
return 'left';
}
return undefined;
}
isSlidesEnd(counter) {
let margin = this.visibleCellsOverflowContainer ? 1 : 0;
let imageLength = this.images ? this.images.length : this.cells.cellLength;
if (this.carouselProperties.loop) {
return false;
}
else {
return (imageLength - counter + margin) < this.numberOfVisibleCells;
}
}
isLastSlide(counter) {
return this.isSlidesEnd(counter + 1);
}
setCounter() {
if (this.direction === 'left') {
this.counter = this.counter + this.slideLength;
}
if (this.direction === 'right') {
this.counter = this.counter - this.slideLength;
}
}
getPositionByIndex(_counter) {
let correction = this.getPositionCorrection(this.counter + this.slideLength);
let position;
if (correction !== 0) {
correction = correction + this.fullCellWidth;
}
if (this.direction === 'right') {
correction = 0;
}
if (this.isLightDOM && this.isLightDOMMode(_counter) ||
this.isLightDOM && this.ifLeftDOMModeAtEnd(_counter)) {
let initialPosition = this.getPositionWithoutCorrection(this.initialPositionX);
let counterDifference = _counter - this.counter;
position = initialPosition - ((counterDifference * this.fullCellWidth) - correction);
}
else {
position = -((_counter * this.fullCellWidth) - correction);
}
position = this.provideSafePosition(position);
return position;
}
provideSafePosition(position) {
const endPosition = this.container.getEndPosition();
if (this.direction === 'left') {
if (position > 0) {
position = 0;
}
}
if (this.direction === 'right') {
if (position < endPosition) {
position = endPosition;
}
}
return position;
}
getPositionWithoutCorrection(value) {
let remainder = Math.round(value) % this.fullCellWidth;
if (remainder !== 0) {
return value - (this.fullCellWidth + remainder);
}
else {
return value;
}
}
isNextArrowDisabled() {
return this.isLastSlide(this.counter) ||
(!this.visibleCellsOverflowContainer && this.cellLength <= this.numberOfVisibleCells) ||
(this.visibleCellsOverflowContainer && this.cellLength < this.numberOfVisibleCells);
}
isPrevArrowDisabled() {
return this.counter === 0;
}
alignContainerFast() {
if (this.isLightDOMMode(this.counter)) {
let positionX = this.fixedContainerPosition;
this.container.transformPositionX(positionX, 0);
this.cells.setCounter(this.counter);
this.cells.lineUp();
}
else if (this.ifLeftDOMModeToBeginning(this.counter)) {
/* If we have already exited the light DOM mode but
* the cells are still out of place
*/
if (this.cells.ifSequenceOfCellsIsChanged()) {
let positionX = -(this.counter * this.fullCellWidth);
this.container.transformPositionX(positionX, 0);
this.cells.setCounter(this.counter);
this.cells.lineUp();
}
}
else if (this.ifLeftDOMModeAtEnd(this.counter)) {
let containerPositionX = this.container.getCurrentPositionX();
let containerWidth = this.container.getWidth();
this.visibleWidth;
if (this.isLastSlide(this.counter) &&
containerWidth + containerPositionX >= this.visibleWidth) {
return;
}
let correction = this.getPositionCorrection(this.counter);
if (correction !== 0) {
correction = correction + this.fullCellWidth;
}
if (this.direction === 'right') {
correction = 0;
}
let positionX = this.fixedContainerPosition + correction;
this.container.transformPositionX(positionX, 0);
this.cells.setCounter(this.counter);
this.cells.lineUp();
}
}
isLightDOMMode(counter) {
let flag;
let remainderOfCells = this.images.length - this.overflowCellsLimit - this.numberOfVisibleCells;
if (!this.isLightDOM) {
return false;
}
if (counter > this.overflowCellsLimit && this.direction === "left" &&
counter <= remainderOfCells) {
flag = true;
}
if (counter >= this.overflowCellsLimit && this.direction === "right" &&
counter < remainderOfCells) {
flag = true;
}
if (this.counter > this.overflowCellsLimit && this.direction === "left" &&
this.counter <= remainderOfCells) {
flag = true;
}
if (this.counter >= this.overflowCellsLimit && this.direction === "right" &&
this.counter < remainderOfCells) {
flag = true;
}
return flag;
}
ifLeftDOMModeAtEnd(counter) {
let flag;
let remainderOfCells = this.images.length - this.overflowCellsLimit - this.numberOfVisibleCells;
if (counter >= remainderOfCells) {
flag = true;
}
if (this.counter >= remainderOfCells) {
flag = true;
}
return flag;
}
ifLeftDOMModeToBeginning(counter) {
let flag;
if (counter <= this.overflowCellsLimit) {
flag = true;
}
if (this.counter <= this.overflowCellsLimit) {
flag = true;
}
return flag;
}
setVisibleWidth() {
this.visibleWidth = this.carouselProperties.visibleWidth || this.carouselProperties.hostElement.clientWidth;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXJlc3BvbnNpdmUtY2Fyb3VzZWwtbmcxNi9zcmMvbGliL3NsaWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBTyxLQUFLO0lBZ0JkLElBQUksYUFBYTtRQUNiLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksNkJBQTZCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLHNCQUFzQjtRQUN0QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUMxQyxDQUFDO0lBRUQsNkNBQTZDO0lBQzdDLElBQUksVUFBVTtRQUNWLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsd0JBQXdC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QUFPLElBQUksZ0JBQWdCLEVBQUU7WUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNmO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHdCQUF3QixDQUFDLE9BQWU7UUFDcEMsSUFBSSxJQUFJLENBQUM7UUFFVCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDcEMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNmO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQztJQUNoSCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Byb3BlcnRpZXMgYXMgQ2Fyb3VzZWxQcm9wZXJ0aWVzfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BlcnRpZXMge1xuICAgIGNhcm91c2VsUHJvcGVydGllczogQ2Fyb3VzZWxQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY2xhc3MgU2xpZGUge1xuICAgIHNsaWRlTGVuZ3RoOiBudW1iZXIgPSAwO1xuICAgIGlzU2xpZGVJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gICAgZGlyZWN0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgdW5kZWZpbmVkO1xuICAgIGNvdW50ZXI6IG51bWJlciA9IDA7XG4gICAgX2NvdW50ZXI6IG51bWJlciA9IDA7XG4gICAgZGlzdGFuY2U6IG51bWJlciA9IDA7XG4gICAgZGlzdGFuY2VBYnM6IG51bWJlciA9IDA7XG4gICAgdmlzaWJsZVdpZHRoITogbnVtYmVyO1xuICAgIGlzTm90Q2xpY2tPbkFycm93OiBib29sZWFuID0gZmFsc2U7XG4gICAgaW5pdGlhbFBvc2l0aW9uWDogbnVtYmVyID0gMDtcbiAgICBjdXJyZW50UG9zaXRpb25YOiBudW1iZXIgPSAwO1xuXG4gICAgLyogVGhlIHNsaWRlIGxlbmd0aCBoYXMgYmVlbiBsaW1pdGVkIGJ5IHRoZSBsaW1pdFNsaWRlTGVuZ3RoKCkgbWV0aG9kICovXG4gICAgaXNTbGlkZUxlbmd0aExpbWl0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBmdWxsQ2VsbFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMuY2VsbFdpZHRoICsgdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubWFyZ2luO1xuICAgIH1cblxuICAgIGdldCBtYXJnaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5tYXJnaW47XG4gICAgfVxuXG4gICAgZ2V0IG1pblN3aXBlRGlzdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5taW5Td2lwZURpc3RhbmNlO1xuICAgIH1cblxuICAgIGdldCBudW1iZXJPZlZpc2libGVDZWxscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMubnVtYmVyT2ZWaXNpYmxlQ2VsbHM7XG4gICAgfVxuXG4gICAgZ2V0IHZpc2libGVDZWxsc092ZXJmbG93Q29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51dGlscy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKiBUaGUgcG9zaXRpb24gdG8gd2hpY2ggdGhlIGNvbnRhaW5lciByZXR1cm5zIGFmdGVyIGVhY2ggc2xpZGUgXG4gICAgICogaW4gdGhlIGxpZ2h0IERVTSB0cmVlIG1vZGUuIFxuICAgICAqL1xuICAgIGdldCBmaXhlZENvbnRhaW5lclBvc2l0aW9uKCkge1xuICAgICAgICByZXR1cm4gLSh0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIHRoaXMuZnVsbENlbGxXaWR0aCk7XG4gICAgfVxuXG4gICAgZ2V0IG92ZXJmbG93Q2VsbHNMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMub3ZlcmZsb3dDZWxsc0xpbWl0O1xuICAgIH1cblxuICAgIGdldCBpbWFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5pbWFnZXM7XG4gICAgfVxuXG4gICAgLyogTnVtYmVyIG9mIGNlbGwgZWxlbWVudHMgaW4gdGhlIERVTSB0cmVlICovXG4gICAgZ2V0IGNlbGxMZW5ndGgoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRET00pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmNlbGxMZW5ndGhJbkxpZ2h0RE9NTW9kZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmltYWdlcy5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNlbGxzLmNlbGxMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgaXNMaWdodERPTSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmxpZ2h0RE9NIHx8IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmxvb3A7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcyxcbiAgICAgICAgcHJpdmF0ZSB1dGlsczogYW55LFxuICAgICAgICBwcml2YXRlIGNlbGxzOiBhbnksXG4gICAgICAgIHByaXZhdGUgY29udGFpbmVyOiBhbnkpIHtcblxuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQcm9wZXJ0aWVzKGNhcm91c2VsUHJvcGVydGllczogQ2Fyb3VzZWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzID0gY2Fyb3VzZWxQcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLnNldFZpc2libGVXaWR0aCgpO1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMudmlzaWJsZVdpZHRoID0gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMudmlzaWJsZVdpZHRoIHx8IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmhvc3RFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIH1cblxuICAgIGhhbmRsZVRvdWNoc3RhcnQoKSB7XG4gICAgICAgIC8qIFRvdWNoc3RhcnQgZXZlbnQgaXMgbm90IGNhbGxlZCBmb3IgYXJyb3cgKi9cbiAgICAgICAgdGhpcy5pc05vdENsaWNrT25BcnJvdyA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNTbGlkZUxlbmd0aExpbWl0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVRvdWNoZW5kKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNOb3RDbGlja09uQXJyb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN1cnJlbnRQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XG4gICAgICAgIHRoaXMuZGlzdGFuY2VBYnMgPSBNYXRoLmFicyh0aGlzLmluaXRpYWxQb3NpdGlvblggLSB0aGlzLmN1cnJlbnRQb3NpdGlvblgpO1xuICAgICAgICB0aGlzLmRpc3RhbmNlID0gdGhpcy5pbml0aWFsUG9zaXRpb25YIC0gdGhpcy5jdXJyZW50UG9zaXRpb25YO1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuZ2V0RGlyZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuaXNOb3RDbGlja09uQXJyb3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZSgpO1xuICAgIH1cblxuICAgIGhhbmRsZVRyYW5zaXRpb25lbmQoKSB7XG4gICAgICAgIHRoaXMuc2V0Q291bnRlcigpO1xuICAgICAgICB0aGlzLmlzU2xpZGVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNMaWdodERPTSkge1xuICAgICAgICAgICAgdGhpcy5hbGlnbkNvbnRhaW5lckZhc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVNsaWRlKGN1c3RvbVNsaWRlTGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGlzVXNpbmdCdXR0b24gPSBjdXN0b21TbGlkZUxlbmd0aDtcbiAgICAgICAgbGV0IG5ld1Bvc2l0aW9uWDtcblxuICAgICAgICBpZiAoaXNVc2luZ0J1dHRvbiAmJiB0aGlzLmlzU2xpZGVJblByb2dyZXNzIHx8ICF0aGlzLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ3VzdG9tIHNsaWRlIGxlbmd0aCBpcyB1c2VkIGluIGFycm93cyAqL1xuICAgICAgICBpZiAoY3VzdG9tU2xpZGVMZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSB0aGlzLmxpbWl0U2xpZGVMZW5ndGgoY3VzdG9tU2xpZGVMZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvblggPSB0aGlzLmNvbnRhaW5lci5nZXRDdXJyZW50UG9zaXRpb25YKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNsaWRlTGVuZ3RoID0gdGhpcy5nZXRTbGlkZUxlbmd0aCh0aGlzLmRpc3RhbmNlQWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFN0b3JlIGludGVybWVkaWF0ZSBjb3VudGVyIHZhbHVlICovXG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmdldFByZWxpbWluYXJ5Q291bnRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBpZiAoIWN1c3RvbVNsaWRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMubGltaXRTbGlkZUxlbmd0aCh0aGlzLmdldFNsaWRlTGVuZ3RoKHRoaXMuZGlzdGFuY2VBYnMpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY291bnRlciA9IHRoaXMuZ2V0UHJlbGltaW5hcnlDb3VudGVyKCk7XG4gICAgICAgICAgICBsZXQgaXNTbGlkZXNFbmQgPSB0aGlzLmlzU2xpZGVzRW5kKHRoaXMuX2NvdW50ZXIpO1xuICAgICAgICAgICAgbmV3UG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbkJ5SW5kZXgodGhpcy5fY291bnRlcik7XG5cbiAgICAgICAgICAgIGlmIChpc1NsaWRlc0VuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XG5cbiAgICAgICAgICAgICAgICBuZXdQb3NpdGlvblggPSB0aGlzLmdldFBvc2l0aW9uQnlJbmRleCh0aGlzLmNvdW50ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVMZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBpZiAoIWN1c3RvbVNsaWRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMuZ2V0U2xpZGVMZW5ndGgodGhpcy5kaXN0YW5jZUFicyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9jb3VudGVyIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5zbGlkZUxlbmd0aCA9IHRoaXMuY291bnRlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmV3UG9zaXRpb25YID0gdGhpcy5nZXRQb3NpdGlvbkJ5SW5kZXgodGhpcy5jb3VudGVyIC0gdGhpcy5zbGlkZUxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIuZ2V0Q3VycmVudFBvc2l0aW9uWCgpICE9PSBuZXdQb3NpdGlvblgpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIudHJhbnNmb3JtUG9zaXRpb25YKG5ld1Bvc2l0aW9uWCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0KGxlbmd0aDogbnVtYmVyID0gMSkge1xuICAgICAgICB0aGlzLmRpcmVjdGlvbiA9ICdsZWZ0JztcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZShsZW5ndGgpO1xuICAgIH1cblxuICAgIHByZXYobGVuZ3RoOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gJ3JpZ2h0JztcbiAgICAgICAgdGhpcy5oYW5kbGVTbGlkZShsZW5ndGgpO1xuICAgIH1cblxuICAgIHNlbGVjdChpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMuY2VsbExlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA+IHRoaXMuY291bnRlcikge1xuICAgICAgICAgICAgbGV0IGxlbmd0aCA9IGluZGV4IC0gdGhpcy5jb3VudGVyO1xuICAgICAgICAgICAgdGhpcy5uZXh0KGxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmNvdW50ZXIpIHtcbiAgICAgICAgICAgIGxldCBsZW5ndGggPSB0aGlzLmNvdW50ZXIgLSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMucHJldihsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UHJlbGltaW5hcnlDb3VudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRlciArIHRoaXMuc2xpZGVMZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvdW50ZXIgLSB0aGlzLnNsaWRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyogIFxuICAgICAqIExpbWl0cyB0aGUgbGVuZ3RoIG9mIHRoZSBzbGlkZSBkdXJpbmcgY2FsbHMgdG8gdGhlIG5leHQoKSBhbmQgcHJldigpIFxuICAgICAqIG1ldGhvZHMgaWYgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBjZWxsIGxlbmd0aCBcbiAgICAgKi9cbiAgICBsaW1pdFNsaWRlTGVuZ3RoKHNsaWRlTGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHNsaWRlTGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGlkZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvdW50ZXIgPSB0aGlzLmNvdW50ZXIgKyAoc2xpZGVMZW5ndGggLSBpKTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NsaWRlc0VuZChuZXdDb3VudGVyKSkge1xuICAgICAgICAgICAgICAgICAgICBzbGlkZUxlbmd0aCA9IHNsaWRlTGVuZ3RoIC0gaTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NsaWRlTGVuZ3RoTGltaXRlZCA9IGkgPiAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsaWRlTGVuZ3RoO1xuICAgIH1cblxuICAgIC8qIE9mZnNldCB0aGUgY29udGFpbmVyIHRvIHNob3cgdGhlIGxhc3QgY2VsbCBjb21wbGV0ZWx5ICovXG4gICAgZ2V0UG9zaXRpb25Db3JyZWN0aW9uKGNvdW50ZXI6bnVtYmVyKSB7XG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gMDtcbiAgICAgICAgbGV0IGlzTGFzdFNsaWRlID0gdGhpcy5pc0xhc3RTbGlkZShjb3VudGVyKTtcblxuICAgICAgICBpZiAodGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCB8fCB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2xpZGVMZW5ndGhMaW1pdGVkIHx8IGlzTGFzdFNsaWRlKSB7XG4gICAgICAgICAgICBsZXQgY2VsbHNXaWR0aCA9IHRoaXMuY2VsbHMuY2VsbExlbmd0aEluTGlnaHRET01Nb2RlICogdGhpcy5mdWxsQ2VsbFdpZHRoO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52aXNpYmxlV2lkdGggPCBjZWxsc1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IC0odGhpcy5udW1iZXJPZlZpc2libGVDZWxscyAqIHRoaXMuZnVsbENlbGxXaWR0aCAtIHRoaXMudmlzaWJsZVdpZHRoIC0gdGhpcy5tYXJnaW4pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29ycmVjdGlvbiA+PSAtdGhpcy5tYXJnaW4pIHtcbiAgICAgICAgICAgICAgICBjb3JyZWN0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb3JyZWN0aW9uO1xuICAgIH1cblxuICAgIGdldFNsaWRlTGVuZ3RoKGRpc3RhbmNlQWJzOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGlzTGFzdFNsaWRlID0gdGhpcy5pc0xhc3RTbGlkZSh0aGlzLmNvdW50ZXIpO1xuXG4gICAgICAgIC8qIElmIHRoZSBsYXN0IGNlbGwgZG9lcyBub3QgZml0IGVudGlyZWx5LCB0aGVuIHRoZSBcbiAgICAgICAgICogbGVuZ3RoIG9mIHRoZSBzd2lwZSB0byB0aGUgbGVmdCwgZnJvbSB0aGUgZXh0cmVtZSBcbiAgICAgICAgICogcmlnaHQgcG9zaXRpb24sIG1heSBiZSBzaG9ydGVyIHRoYW4gdXN1YWwuIFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGlzTGFzdFNsaWRlICYmIHRoaXMuZGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgICAgIGRpc3RhbmNlQWJzID0gZGlzdGFuY2VBYnMgKyB0aGlzLnZpc2libGVXaWR0aCAlIHRoaXMuZnVsbENlbGxXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW5ndGggPSBNYXRoLmZsb29yKGRpc3RhbmNlQWJzIC8gdGhpcy5mdWxsQ2VsbFdpZHRoKTtcblxuICAgICAgICBpZiAoZGlzdGFuY2VBYnMgJSB0aGlzLmZ1bGxDZWxsV2lkdGggPj0gdGhpcy5taW5Td2lwZURpc3RhbmNlKSB7XG4gICAgICAgICAgICBsZW5ndGgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0RGlzdGFuY2VBYnMoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmluaXRpYWxQb3NpdGlvblggLSB0aGlzLmN1cnJlbnRQb3NpdGlvblgpO1xuICAgIH1cblxuICAgIGdldERpcmVjdGlvbigpIHtcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gTWF0aC5zaWduKHRoaXMuaW5pdGlhbFBvc2l0aW9uWCAtIHRoaXMuY3VycmVudFBvc2l0aW9uWCk7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiAnbGVmdCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlzU2xpZGVzRW5kKGNvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgbWFyZ2luID0gdGhpcy52aXNpYmxlQ2VsbHNPdmVyZmxvd0NvbnRhaW5lciA/IDEgOiAwO1xuICAgICAgICBsZXQgaW1hZ2VMZW5ndGggPSB0aGlzLmltYWdlcyA/IHRoaXMuaW1hZ2VzLmxlbmd0aCA6IHRoaXMuY2VsbHMuY2VsbExlbmd0aDtcblxuICAgICAgICBpZiAodGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChpbWFnZUxlbmd0aCAtIGNvdW50ZXIgKyBtYXJnaW4pIDwgdGhpcy5udW1iZXJPZlZpc2libGVDZWxscztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTGFzdFNsaWRlKGNvdW50ZXI6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NsaWRlc0VuZChjb3VudGVyICsgMSlcbiAgICB9XG5cbiAgICBzZXRDb3VudGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gdGhpcy5jb3VudGVyICsgdGhpcy5zbGlkZUxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdGhpcy5jb3VudGVyID0gdGhpcy5jb3VudGVyIC0gdGhpcy5zbGlkZUxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBvc2l0aW9uQnlJbmRleChfY291bnRlcjogbnVtYmVyKSB7XG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gdGhpcy5nZXRQb3NpdGlvbkNvcnJlY3Rpb24odGhpcy5jb3VudGVyICsgdGhpcy5zbGlkZUxlbmd0aCk7XG4gICAgICAgIGxldCBwb3NpdGlvbjtcblxuICAgICAgICBpZiAoY29ycmVjdGlvbiAhPT0gMCkge1xuICAgICAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gKyB0aGlzLmZ1bGxDZWxsV2lkdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0xpZ2h0RE9NICYmIHRoaXMuaXNMaWdodERPTU1vZGUoX2NvdW50ZXIpIHx8XG4gICAgICAgICAgICB0aGlzLmlzTGlnaHRET00gJiYgdGhpcy5pZkxlZnRET01Nb2RlQXRFbmQoX2NvdW50ZXIpKSB7XG5cbiAgICAgICAgICAgIGxldCBpbml0aWFsUG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uV2l0aG91dENvcnJlY3Rpb24odGhpcy5pbml0aWFsUG9zaXRpb25YKTtcbiAgICAgICAgICAgIGxldCBjb3VudGVyRGlmZmVyZW5jZSA9IF9jb3VudGVyIC0gdGhpcy5jb3VudGVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb24gLSAoKGNvdW50ZXJEaWZmZXJlbmNlICogdGhpcy5mdWxsQ2VsbFdpZHRoKSAtIGNvcnJlY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9zaXRpb24gPSAtKChfY291bnRlciAqIHRoaXMuZnVsbENlbGxXaWR0aCkgLSBjb3JyZWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvc2l0aW9uID0gdGhpcy5wcm92aWRlU2FmZVBvc2l0aW9uKHBvc2l0aW9uKTtcblxuICAgICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuXG4gICAgcHJvdmlkZVNhZmVQb3NpdGlvbihwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5jb250YWluZXIuZ2V0RW5kUG9zaXRpb24oKTtcblxuICAgICAgICBpZiAodGhpcy5kaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uID4gMCkge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZW5kUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGVuZFBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIGdldFBvc2l0aW9uV2l0aG91dENvcnJlY3Rpb24odmFsdWU6IG51bWJlcikge1xuICAgICAgICBsZXQgcmVtYWluZGVyID0gTWF0aC5yb3VuZCh2YWx1ZSkgJSB0aGlzLmZ1bGxDZWxsV2lkdGg7XG5cbiAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIC0gKHRoaXMuZnVsbENlbGxXaWR0aCArIHJlbWFpbmRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc05leHRBcnJvd0Rpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0xhc3RTbGlkZSh0aGlzLmNvdW50ZXIpIHx8IFxuICAgICAgICAoIXRoaXMudmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIgJiYgdGhpcy5jZWxsTGVuZ3RoIDw9IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMpIHx8XG4gICAgICAgICh0aGlzLnZpc2libGVDZWxsc092ZXJmbG93Q29udGFpbmVyICYmIHRoaXMuY2VsbExlbmd0aCA8IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMpXG4gICAgfVxuXG4gICAgaXNQcmV2QXJyb3dEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY291bnRlciA9PT0gMDtcbiAgICB9XG5cbiAgICBhbGlnbkNvbnRhaW5lckZhc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTGlnaHRET01Nb2RlKHRoaXMuY291bnRlcikpIHtcbiAgICAgICAgICAgIGxldCBwb3NpdGlvblggPSB0aGlzLmZpeGVkQ29udGFpbmVyUG9zaXRpb247XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcblxuICAgICAgICAgICAgdGhpcy5jZWxscy5zZXRDb3VudGVyKHRoaXMuY291bnRlcik7XG4gICAgICAgICAgICB0aGlzLmNlbGxzLmxpbmVVcCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaWZMZWZ0RE9NTW9kZVRvQmVnaW5uaW5nKHRoaXMuY291bnRlcikpIHtcbiAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBleGl0ZWQgdGhlIGxpZ2h0IERPTSBtb2RlIGJ1dCBcbiAgICAgICAgICAgICAqIHRoZSBjZWxscyBhcmUgc3RpbGwgb3V0IG9mIHBsYWNlIFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAodGhpcy5jZWxscy5pZlNlcXVlbmNlT2ZDZWxsc0lzQ2hhbmdlZCgpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uWCA9IC0odGhpcy5jb3VudGVyICogdGhpcy5mdWxsQ2VsbFdpZHRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMuc2V0Q291bnRlcih0aGlzLmNvdW50ZXIpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2VsbHMubGluZVVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pZkxlZnRET01Nb2RlQXRFbmQodGhpcy5jb3VudGVyKSkge1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclBvc2l0aW9uWCA9IHRoaXMuY29udGFpbmVyLmdldEN1cnJlbnRQb3NpdGlvblgoKTtcbiAgICAgICAgICAgIGxldCBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyLmdldFdpZHRoKCk7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVXaWR0aDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNMYXN0U2xpZGUodGhpcy5jb3VudGVyKSAmJlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoICsgY29udGFpbmVyUG9zaXRpb25YID49IHRoaXMudmlzaWJsZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29ycmVjdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb25Db3JyZWN0aW9uKHRoaXMuY291bnRlcik7XG5cbiAgICAgICAgICAgIGlmIChjb3JyZWN0aW9uICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IGNvcnJlY3Rpb24gKyB0aGlzLmZ1bGxDZWxsV2lkdGhcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBwb3NpdGlvblggPSB0aGlzLmZpeGVkQ29udGFpbmVyUG9zaXRpb24gKyBjb3JyZWN0aW9uO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci50cmFuc2Zvcm1Qb3NpdGlvblgocG9zaXRpb25YLCAwKTtcbiAgICAgICAgICAgIHRoaXMuY2VsbHMuc2V0Q291bnRlcih0aGlzLmNvdW50ZXIpO1xuICAgICAgICAgICAgdGhpcy5jZWxscy5saW5lVXAoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzTGlnaHRET01Nb2RlKGNvdW50ZXI6IG51bWJlcikge1xuICAgICAgICBsZXQgZmxhZztcbiAgICAgICAgbGV0IHJlbWFpbmRlck9mQ2VsbHMgPSB0aGlzLmltYWdlcy5sZW5ndGggLSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAtIHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzTGlnaHRET00pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3VudGVyID4gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgJiYgdGhpcy5kaXJlY3Rpb24gPT09IFwibGVmdFwiICYmXG4gICAgICAgICAgICBjb3VudGVyIDw9IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvdW50ZXIgPj0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgJiYgdGhpcy5kaXJlY3Rpb24gPT09IFwicmlnaHRcIiAmJlxuICAgICAgICAgICAgY291bnRlciA8IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0ICYmIHRoaXMuZGlyZWN0aW9uID09PSBcImxlZnRcIiAmJlxuICAgICAgICAgICAgdGhpcy5jb3VudGVyIDw9IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+PSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAmJiB0aGlzLmRpcmVjdGlvbiA9PT0gXCJyaWdodFwiICYmXG4gICAgICAgICAgICB0aGlzLmNvdW50ZXIgPCByZW1haW5kZXJPZkNlbGxzKSB7XG4gICAgICAgICAgICBmbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGFnO1xuICAgIH1cblxuICAgIGlmTGVmdERPTU1vZGVBdEVuZChjb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGZsYWc7XG4gICAgICAgIGxldCByZW1haW5kZXJPZkNlbGxzID0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgLSB0aGlzLm51bWJlck9mVmlzaWJsZUNlbGxzO1xuXG4gICAgICAgIGlmIChjb3VudGVyID49IHJlbWFpbmRlck9mQ2VsbHMpIHtcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY291bnRlciA+PSByZW1haW5kZXJPZkNlbGxzKSB7XG4gICAgICAgICAgICBmbGFnID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbGFnO1xuICAgIH1cblxuICAgIGlmTGVmdERPTU1vZGVUb0JlZ2lubmluZyhjb3VudGVyOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGZsYWc7XG5cbiAgICAgICAgaWYgKGNvdW50ZXIgPD0gdGhp