UNPKG

angular-gallery

Version:

Responsive gallery for Angular with touch screen support.

472 lines 60.4 kB
var Carousel = /** @class */ (function () { function Carousel(properties) { var _this = this; this.initialPositionX = 0; this.newContainerPositionIndex = 0; // The index of the new position relative to the active index, for example -1 or +1 this.preliminarySlideCounter = 0; this.slideCounter = 0; // Scrolling Index (counter) this.previousSlideCounter = 0; this.isContentImages = true; this.isLazyLoad = true; this.isContainerLocked = false; this.alignCells = "left"; this.initialContainerPosition = 0; this.handleTouchstart = function (event) { _this.isTouchstart = true; if (_this.isSlideInProgress) { return; } var touches = event.touches; if (touches) { _this.startX = touches[0].clientX - _this.getCarouselElementPosition()['left']; } else { _this.startX = event.clientX - _this.getCarouselElementPosition()['left']; } _this.containerInitialPositionX = _this.getElementPosition()['left'] - _this.getCarouselElementPosition()['left']; _this.isMoveInProgress = true; }; this.handleHorizontalSwipe = function (event) { if (_this.isSlideInProgress) { return; } var touches = event.touches; if (touches) { _this.moveX = touches[0].clientX - _this.getCarouselElementPosition()['left']; } else { _this.moveX = event.clientX - _this.getCarouselElementPosition()['left']; } _this.distanceAbs = _this.getDistanceAbs(); _this.direction = _this.getDirection(); _this.moveContainer(); }; this.handleTouchend = function (event) { if (_this.isSlideInProgress || !_this.isTouchstart) { _this.isTouchstart = false; return; } _this.isMoveInProgress = false; if (_this.detectSlide()) { _this.handleSlide(); } else { _this.newContainerPositionIndex = 0; _this.alignContainer(); } _this.startX = _this.moveX = _this.distanceAbs = undefined; _this.isTouchstart = false; }; this.element = properties.element; this.properties = properties; this.cells = this.element.children; this.visibleWidth = this.properties.visibleWidth || this.element.parentElement.clientWidth; this.setContainerWidth(); this.alignContainer(0); } Object.defineProperty(Carousel.prototype, "isFirstCell", { get: function () { return this.slideCounter === 0; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "lastCellIndex", { get: function () { return this.images.length ? (this.images.length - 1) : (this.cells.length - 1); }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "overflowCellsLimit", { get: function () { return this.properties.overflowCellsLimit; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "cellLimit", { get: function () { return this.visibleCellsCount + this.overflowCellsLimit * 2; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "images", { get: function () { return this.properties.images; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "margin", { get: function () { return this.properties.margin; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "minSwipeDistance", { get: function () { return this.properties.minSwipeDistance; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "transitionDuration", { get: function () { return this.properties.transitionDuration; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "transitionTimingFunction", { get: function () { return this.properties.transitionTimingFunction; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "fullCellWidth", { get: function () { return this.properties.cellWidth + this.margin; }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "visibleCellsCount", { get: function () { return Math.ceil(this.visibleWidth / this.fullCellWidth); }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "lapCounter", { get: function () { return Math.floor(this.slideCounter / this.totalContainerCellsCount); }, enumerable: true, configurable: true }); Object.defineProperty(Carousel.prototype, "visibleCellsOverflowContainer", { get: function () { return (this.visibleCellsCount * this.fullCellWidth - this.margin) > this.visibleWidth; }, enumerable: true, configurable: true }); /* Move */ Carousel.prototype.moveContainer = function () { var positionX = this.getMovePositionX(); this.transformPositionX(positionX, 0); }; Carousel.prototype.getMovePositionX = function () { var distance = this.getDistance(); return this.containerInitialPositionX - distance; }; /* Align */ Carousel.prototype.alignContainer = function (duration) { if (duration === void 0) { duration = this.transitionDuration; } var positionX = this.getContainerPosition(); this.transformPositionX(positionX, duration); this.setInitialContainerPosition(positionX); }; Carousel.prototype.getContainerPosition = function () { var correction = this.getContainerPositionCorrection(); this.isContainerPositionCorrection = correction != 0; return (this.initialContainerPosition + this.newContainerPositionIndex * this.fullCellWidth) + correction; }; Carousel.prototype.setInitialContainerPosition = function (position) { var correction = this.getContainerPositionCorrection(); this.initialContainerPosition = position - correction; }; Carousel.prototype.getContainerPositionCorrection = function () { var correction = 0; if ((this.images.length - this.preliminarySlideCounter) < this.visibleCellsCount || this.isSlideLengthLimited) { if (this.visibleWidth < this.totalContainerCellsCount * this.fullCellWidth) { correction = -(this.visibleCellsCount * this.fullCellWidth - this.visibleWidth - this.margin); } if (correction >= -this.margin) { correction = 0; } } return correction; }; /* Quickly center */ Carousel.prototype.quicklyPositionContainer = function () { var correction = this.getContainerPositionCorrection(); var initialPosition = this.getNewContainerPosition() + correction; this.transformPositionX(initialPosition, 0); this.setInitialContainerPosition(initialPosition); }; Carousel.prototype.getNewContainerPosition = function () { if (this.slideCounter > this.overflowCellsLimit) { if (this.alignCells === "left") { this.lineUpCells(); return -(this.overflowCellsLimit * this.fullCellWidth); } } if (this.slideCounter <= this.overflowCellsLimit) { if (this.previousSlideCounter > this.overflowCellsLimit) { this.lineUpCells(); } return -(this.slideCounter * this.fullCellWidth); } }; Carousel.prototype.setContainerWidth = function () { var containerWidth = this.getContainerWidth(); this.element.style.width = containerWidth + "px"; }; Carousel.prototype.getContainerWidth = function () { this.totalContainerCellsCount = this.visibleCellsCount + this.overflowCellsLimit * 2; var containerWidth = this.totalContainerCellsCount * this.fullCellWidth; var totalImageWidth = this.images.length * this.fullCellWidth; if (totalImageWidth < containerWidth) { containerWidth = totalImageWidth; } return containerWidth; }; Carousel.prototype.getFile = function (cellIndex) { var imageIndex = this.getFileIndex(cellIndex); var file = this.images[imageIndex]; if (file && !file.type) { file.type = 'image'; } return { image: this.images[imageIndex], imageIndex: imageIndex }; }; Carousel.prototype.getFileIndex = function (cellIndex) { var positionIndex = this.getPositionIndex(cellIndex); var numberLeftCells = (this.totalContainerCellsCount - 1) / 2; var imageIndex; if (!this.isContainerLocked) { if (this.slideCounter <= this.overflowCellsLimit) { return cellIndex; } else { var cellLimitOverflow = this.slideCounter - this.overflowCellsLimit; imageIndex = positionIndex + cellLimitOverflow; return imageIndex; } } if (this.alignCells === "left") { if (this.slideCounter > this.overflowCellsLimit) { var cellLimitOverflow = this.slideCounter - this.overflowCellsLimit; imageIndex = positionIndex + cellLimitOverflow; } else { imageIndex = cellIndex; } } if (imageIndex > this.lastCellIndex) { return false; } return imageIndex; }; Carousel.prototype.transformPositionX = function (value, duration) { if (duration === void 0) { duration = this.transitionDuration; } this.element.style.transition = 'transform ' + duration + 'ms ' + this.transitionTimingFunction; this.element.style.transform = 'translateX(' + value + 'px)'; }; Carousel.prototype.detectSlide = function () { return this.distanceAbs >= this.minSwipeDistance; }; Carousel.prototype.next = function () { if (this.isSlideInProgress) { return; } this.direction = 'left'; this.handleSlide(1); }; Carousel.prototype.prev = function () { if (this.isSlideInProgress) { return; } this.direction = 'right'; this.handleSlide(1); }; Carousel.prototype.select = function (index) { this.slideCounter = index; this.quicklyPositionContainer(); }; Carousel.prototype.handleSlide = function (slideLength) { if (slideLength === void 0) { slideLength = undefined; } this.slideLength = this.getSlideLength(); this.slideLength = slideLength ? slideLength : this.limitSlideLength(this.slideLength); if (this.direction === 'left' && !this.isSlideInProgress) { this.preliminarySlideCounter = this.slideCounter + this.slideLength; if (!this.detectLastSlide(this.slideCounter + this.slideLength)) { this.newContainerPositionIndex = this.newContainerPositionIndex - this.slideLength; this.isSlideInProgress = true; if (this.isLazyLoad) { this.isContainerLocked = this.preliminarySlideCounter > this.overflowCellsLimit; if (this.detectContainerUnlock()) { this.isContainerLocked = false; } } } } if (this.direction === 'right' && !this.isSlideInProgress) { if (this.slideCounter - this.slideLength < 0) { this.slideLength = this.slideCounter; } this.preliminarySlideCounter = this.slideCounter - this.slideLength; if (!this.isFirstCell) { this.newContainerPositionIndex = this.newContainerPositionIndex + this.slideLength; this.isSlideInProgress = true; if (this.isLazyLoad) { if (this.preliminarySlideCounter > this.overflowCellsLimit) { this.isContainerLocked = true; } else { this.isContainerLocked = false; } if (this.detectContainerUnlock()) { this.isContainerLocked = false; } } } } this.alignContainer(); }; Carousel.prototype.getSlideLength = function () { var correction = this.getContainerPositionCorrection(); var length = Math.floor((this.distanceAbs + correction) / this.fullCellWidth); if (this.distanceAbs % this.fullCellWidth >= this.minSwipeDistance) { length++; } return length; }; Carousel.prototype.limitSlideLength = function (slideLength) { if (slideLength > 1) { for (var i = 0; i < slideLength; i++) { var newSlideCounter = this.slideCounter + (slideLength - i); if (!this.detectLastSlide(newSlideCounter)) { slideLength = slideLength - i; this.isSlideLengthLimited = i > 0; break; } } } return slideLength; }; Carousel.prototype.detectLastSlide = function (slideCounter) { return (this.images.length - slideCounter) < this.visibleCellsCount; }; Carousel.prototype.isNextArrowDisabled = function () { if (this.visibleCellsOverflowContainer) { return this.detectLastSlide(this.slideCounter + 1) && this.isContainerPositionCorrection; } else { return this.detectLastSlide(this.slideCounter + 1); } }; Carousel.prototype.isPrevArrowDisabled = function () { return this.slideCounter === 0; }; Carousel.prototype.detectContainerUnlock = function () { return (this.images.length - this.preliminarySlideCounter) < (this.visibleCellsCount + this.overflowCellsLimit); }; Carousel.prototype.handleSlideEnd = function () { if (this.isSlideInProgress) { this.transformSlideEnd(); this.isSlideInProgress = false; this.newContainerPositionIndex = 0; this.isSlideLengthLimited = undefined; } }; Carousel.prototype.transformSlideEnd = function () { if (this.isLazyLoad) { this.setSlideCounter(); this.quicklyPositionContainer(); } this.previousSlideCounter = this.slideCounter; }; Carousel.prototype.setSlideCounter = function () { if (this.direction === 'left') { this.slideCounter = this.slideCounter + this.slideLength; } if (this.direction === 'right') { this.slideCounter = this.slideCounter - this.slideLength; } this.direction = undefined; this.slideLength = 0; }; Carousel.prototype.resetTransition = function () { this.element.style.transition = ''; }; Carousel.prototype.getElementPosition = function () { return this.element.getBoundingClientRect(); }; Carousel.prototype.getCarouselElementPosition = function () { return this.properties.container.getBoundingClientRect(); }; Carousel.prototype.getDistance = function () { return this.startX - this.moveX; }; Carousel.prototype.getDistanceAbs = function () { return Math.abs(this.startX - this.moveX); }; Carousel.prototype.getDirection = function () { var direction = Math.sign(this.startX - this.moveX); if (direction === -1) { return 'right'; } if (direction === 1) { return 'left'; } }; Carousel.prototype.lineUpCells = function () { var cells = this.element.children; for (var i = 0; i < cells.length; i++) { var cell = cells[i]; var positionX = this.getCellPositionX(i); cell.style.transform = 'translateX(' + positionX + 'px)'; } ; }; Carousel.prototype.getCellPositionX = function (index) { var positionIndex = this.getPositionIndex(index); return positionIndex * this.fullCellWidth; }; Carousel.prototype.getPositionIndex = function (cellIndex) { var slideCounter = this.slideCounter - this.overflowCellsLimit; var positionIndex; if (slideCounter > this.totalContainerCellsCount) { slideCounter = slideCounter % this.totalContainerCellsCount; } if (slideCounter < 0) { return cellIndex; } else { positionIndex = cellIndex - slideCounter; if (positionIndex < 0) { positionIndex = this.totalContainerCellsCount + positionIndex; } } return positionIndex; }; Object.defineProperty(Carousel.prototype, "containerOverflowRightCount", { get: function () { var totalOverflowCellsCount = this.images.length - this.totalContainerCellsCount; var overflowRight = 0; if (totalOverflowCellsCount > 0) { overflowRight = totalOverflowCellsCount - (this.previousSlideCounter - this.overflowCellsLimit); if (overflowRight > 0) { return overflowRight; } } return overflowRight; }, enumerable: true, configurable: true }); Carousel.prototype.getCenterPositionIndex = function () { return (this.totalContainerCellsCount - 1) / 2; }; return Carousel; }()); export { Carousel }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWdhbGxlcnkvIiwic291cmNlcyI6WyJsaWIvY2Fyb3VzZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0E7SUFvRkksa0JBQVksVUFBc0I7UUFBbEMsaUJBUUM7UUFwRkQscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBRzdCLDhCQUF5QixHQUFXLENBQUMsQ0FBQyxDQUFDLG1GQUFtRjtRQUMxSCw0QkFBdUIsR0FBVyxDQUFDLENBQUM7UUFDcEMsaUJBQVksR0FBVyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7UUFDdEQseUJBQW9CLEdBQVcsQ0FBQyxDQUFDO1FBVWpDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBR2hDLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFDM0Isc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLGVBQVUsR0FBc0IsTUFBTSxDQUFDO1FBQ3ZDLDZCQUF3QixHQUFXLENBQUMsQ0FBQztRQWdFckMscUJBQWdCLEdBQUcsVUFBQyxLQUFVO1lBQzFCLEtBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBRXpCLElBQUksS0FBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUN4QixPQUFPO2FBQ1Y7WUFFRCxJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzlCLElBQUksT0FBTyxFQUFFO2dCQUNULEtBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoRjtpQkFBTTtnQkFDSCxLQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDM0U7WUFDRCxLQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsTUFB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b3BlcnRpZXMge1xyXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG4gICAgaW1hZ2VzOiBhbnk7XHJcbiAgICBjZWxsV2lkdGg6IG51bWJlcjtcclxuICAgIG92ZXJmbG93Q2VsbHNMaW1pdDogbnVtYmVyO1xyXG4gICAgdmlzaWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICBtYXJnaW46IG51bWJlcjtcclxuICAgIG1pblN3aXBlRGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHRyYW5zaXRpb25EdXJhdGlvbjogbnVtYmVyO1xyXG4gICAgdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOiAnZWFzZScgfCAnZWFzZS1pbicgfCAnZWFzZS1vdXQnIHwgJ2Vhc2UtaW4tb3V0JyB8ICdsaW5lYXInO1xyXG4gICAgdmlkZW9Qcm9wZXJ0aWVzOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbCB7XHJcbiAgICBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzO1xyXG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBzdGFydFg6IG51bWJlcjtcclxuICAgIG1vdmVYOiBudW1iZXI7XHJcbiAgICBkaXJlY3Rpb246ICdsZWZ0JyB8ICdyaWdodCc7XHJcbiAgICBzbGlkZUxlbmd0aDogbnVtYmVyO1xyXG4gICAgZGlzdGFuY2VBYnM6IG51bWJlcjtcclxuICAgIGluaXRpYWxQb3NpdGlvblg6IG51bWJlciA9IDA7XHJcbiAgICBjZWxsczogSFRNTENvbGxlY3Rpb247XHJcblxyXG4gICAgbmV3Q29udGFpbmVyUG9zaXRpb25JbmRleDogbnVtYmVyID0gMDsgLy8gVGhlIGluZGV4IG9mIHRoZSBuZXcgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGFjdGl2ZSBpbmRleCwgZm9yIGV4YW1wbGUgLTEgb3IgKzFcclxuICAgIHByZWxpbWluYXJ5U2xpZGVDb3VudGVyOiBudW1iZXIgPSAwO1xyXG4gICAgc2xpZGVDb3VudGVyOiBudW1iZXIgPSAwOyAvLyBTY3JvbGxpbmcgSW5kZXggKGNvdW50ZXIpXHJcbiAgICBwcmV2aW91c1NsaWRlQ291bnRlcjogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpc1NsaWRlSW5Qcm9ncmVzczogYm9vbGVhbjtcclxuICAgIGlzTW92ZUluUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgICBpc1RyYW5zaXRpb25JblByb2dyZXNzOiBib29sZWFuO1xyXG4gICAgaXNUb3VjaHN0YXJ0OiBib29sZWFuO1xyXG4gICAgaXNTbGlkZUxlbmd0aExpbWl0ZWQ6IGJvb2xlYW47XHJcbiAgICBpc0NvbnRhaW5lclBvc2l0aW9uQ29ycmVjdGlvbjogYm9vbGVhbjtcclxuXHJcbiAgICBjb250YWluZXJJbml0aWFsUG9zaXRpb25YOiBudW1iZXI7XHJcbiAgICBpc0NvbnRlbnRJbWFnZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgdmlzaWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICB0b3RhbENvbnRhaW5lckNlbGxzQ291bnQ6IG51bWJlcjtcclxuICAgIGlzTGF6eUxvYWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgaXNDb250YWluZXJMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGFsaWduQ2VsbHM6IFwibGVmdFwiIHwgXCJjZW50ZXJcIiA9IFwibGVmdFwiO1xyXG4gICAgaW5pdGlhbENvbnRhaW5lclBvc2l0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGdldCBpc0ZpcnN0Q2VsbCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zbGlkZUNvdW50ZXIgPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhc3RDZWxsSW5kZXgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VzLmxlbmd0aCA/ICh0aGlzLmltYWdlcy5sZW5ndGggLSAxKSA6ICh0aGlzLmNlbGxzLmxlbmd0aCAtIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvdmVyZmxvd0NlbGxzTGltaXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5vdmVyZmxvd0NlbGxzTGltaXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNlbGxMaW1pdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ2VsbHNDb3VudCArIHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0ICogMjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW1hZ2VzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuaW1hZ2VzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtYXJnaW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5tYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1pblN3aXBlRGlzdGFuY2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5taW5Td2lwZURpc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0cmFuc2l0aW9uRHVyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy50cmFuc2l0aW9uRHVyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZnVsbENlbGxXaWR0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmNlbGxXaWR0aCArIHRoaXMubWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2aXNpYmxlQ2VsbHNDb3VudCgpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudmlzaWJsZVdpZHRoIC8gdGhpcy5mdWxsQ2VsbFdpZHRoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGFwQ291bnRlcigpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnNsaWRlQ291bnRlciAvIHRoaXMudG90YWxDb250YWluZXJDZWxsc0NvdW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmlzaWJsZUNlbGxzT3ZlcmZsb3dDb250YWluZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnZpc2libGVDZWxsc0NvdW50ICogdGhpcy5mdWxsQ2VsbFdpZHRoIC10aGlzLm1hcmdpbikgPiB0aGlzLnZpc2libGVXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gcHJvcGVydGllcy5lbGVtZW50O1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XHJcbiAgICAgICAgdGhpcy5jZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbjtcclxuICAgICAgICB0aGlzLnZpc2libGVXaWR0aCA9IHRoaXMucHJvcGVydGllcy52aXNpYmxlV2lkdGggfHwgdGhpcy5lbGVtZW50LnBhcmVudEVsZW1lbnQuY2xpZW50V2lkdGg7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgICAgICB0aGlzLmFsaWduQ29udGFpbmVyKDApO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZVRvdWNoc3RhcnQgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNUb3VjaHN0YXJ0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTbGlkZUluUHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXM7XHJcbiAgICAgICAgaWYgKHRvdWNoZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFggPSB0b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmdldENhcm91c2VsRWxlbWVudFBvc2l0aW9uKClbJ2xlZnQnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLmdldENhcm91c2VsRWxlbWVudFBvc2l0aW9uKClbJ2xlZnQnXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb25YID0gdGhpcy5nZXRFbGVtZW50UG9zaXRpb24oKVsnbGVmdCddIC0gdGhpcy5nZXRDYXJvdXNlbEVsZW1lbnRQb3NpdGlvbigpWydsZWZ0J107XHJcbiAgICAgICAgdGhpcy5pc01vdmVJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVIb3Jpem9udGFsU3dpcGUgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2xpZGVJblByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRvdWNoZXMgPSBldmVudC50b3VjaGVzO1xyXG4gICAgICAgIGlmICh0b3VjaGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW92ZVggPSB0b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmdldENhcm91c2VsRWxlbWVudFBvc2l0aW9uKClbJ2xlZnQnXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuZ2V0Q2Fyb3VzZWxFbGVtZW50UG9zaXRpb24oKVsnbGVmdCddO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRpc3RhbmNlQWJzID0gdGhpcy5nZXREaXN0YW5jZUFicygpO1xyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5nZXREaXJlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb3ZlQ29udGFpbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlVG91Y2hlbmQgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzU2xpZGVJblByb2dyZXNzIHx8ICF0aGlzLmlzVG91Y2hzdGFydCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVG91Y2hzdGFydCA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzTW92ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGV0ZWN0U2xpZGUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNsaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5uZXdDb250YWluZXJQb3NpdGlvbkluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hbGlnbkNvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zdGFydFggPSB0aGlzLm1vdmVYID0gdGhpcy5kaXN0YW5jZUFicyA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmlzVG91Y2hzdGFydCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIE1vdmUgKi9cclxuICAgIG1vdmVDb250YWluZXIoKSB7XHJcbiAgICAgICAgbGV0IHBvc2l0aW9uWCA9IHRoaXMuZ2V0TW92ZVBvc2l0aW9uWCgpO1xyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtUG9zaXRpb25YKHBvc2l0aW9uWCwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TW92ZVBvc2l0aW9uWCgpIHtcclxuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMuZ2V0RGlzdGFuY2UoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb25YIC0gZGlzdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQWxpZ24gKi9cclxuICAgIGFsaWduQ29udGFpbmVyKGR1cmF0aW9uOiBudW1iZXIgPSB0aGlzLnRyYW5zaXRpb25EdXJhdGlvbikge1xyXG4gICAgICAgIGxldCBwb3NpdGlvblggPSB0aGlzLmdldENvbnRhaW5lclBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNmb3JtUG9zaXRpb25YKHBvc2l0aW9uWCwgZHVyYXRpb24pO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbENvbnRhaW5lclBvc2l0aW9uKHBvc2l0aW9uWCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGFpbmVyUG9zaXRpb24oKSB7XHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb24gPSB0aGlzLmdldENvbnRhaW5lclBvc2l0aW9uQ29ycmVjdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29udGFpbmVyUG9zaXRpb25Db3JyZWN0aW9uID0gY29ycmVjdGlvbiAhPSAwO1xyXG4gICAgICAgIHJldHVybiAodGhpcy5pbml0aWFsQ29udGFpbmVyUG9zaXRpb24gKyB0aGlzLm5ld0NvbnRhaW5lclBvc2l0aW9uSW5kZXggKiB0aGlzLmZ1bGxDZWxsV2lkdGgpICsgY29ycmVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsQ29udGFpbmVyUG9zaXRpb24ocG9zaXRpb24pIHtcclxuICAgICAgICBsZXQgY29ycmVjdGlvbiA9IHRoaXMuZ2V0Q29udGFpbmVyUG9zaXRpb25Db3JyZWN0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsQ29udGFpbmVyUG9zaXRpb24gPSBwb3NpdGlvbiAtIGNvcnJlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGFpbmVyUG9zaXRpb25Db3JyZWN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjb3JyZWN0aW9uID0gMDtcclxuXHJcbiAgICAgICAgaWYgKCh0aGlzLmltYWdlcy5sZW5ndGggLSB0aGlzLnByZWxpbWluYXJ5U2xpZGVDb3VudGVyKSA8IHRoaXMudmlzaWJsZUNlbGxzQ291bnQgfHwgdGhpcy5pc1NsaWRlTGVuZ3RoTGltaXRlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52aXNpYmxlV2lkdGggPCB0aGlzLnRvdGFsQ29udGFpbmVyQ2VsbHNDb3VudCAqIHRoaXMuZnVsbENlbGxXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IC0gKHRoaXMudmlzaWJsZUNlbGxzQ291bnQgKiB0aGlzLmZ1bGxDZWxsV2lkdGggLSB0aGlzLnZpc2libGVXaWR0aCAtIHRoaXMubWFyZ2luKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvcnJlY3Rpb24gPj0gLSB0aGlzLm1hcmdpbikge1xyXG4gICAgICAgICAgICAgICAgY29ycmVjdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjb3JyZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIFF1aWNrbHkgY2VudGVyICovXHJcbiAgICBxdWlja2x5UG9zaXRpb25Db250YWluZXIoKSB7XHJcbiAgICAgICAgbGV0IGNvcnJlY3Rpb24gPSB0aGlzLmdldENvbnRhaW5lclBvc2l0aW9uQ29ycmVjdGlvbigpO1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IHRoaXMuZ2V0TmV3Q29udGFpbmVyUG9zaXRpb24oKSArIGNvcnJlY3Rpb247XHJcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1Qb3NpdGlvblgoaW5pdGlhbFBvc2l0aW9uLCAwKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxDb250YWluZXJQb3NpdGlvbihpbml0aWFsUG9zaXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE5ld0NvbnRhaW5lclBvc2l0aW9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlQ291bnRlciA+IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmFsaWduQ2VsbHMgPT09IFwibGVmdFwiKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVVcENlbGxzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gLSh0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIHRoaXMuZnVsbENlbGxXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlQ291bnRlciA8PSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c1NsaWRlQ291bnRlciA+IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVVcENlbGxzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIC0odGhpcy5zbGlkZUNvdW50ZXIgKiB0aGlzLmZ1bGxDZWxsV2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUud2lkdGggPSBjb250YWluZXJXaWR0aCArIFwicHhcIjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250YWluZXJXaWR0aCgpIHtcclxuICAgICAgICB0aGlzLnRvdGFsQ29udGFpbmVyQ2VsbHNDb3VudCA9IHRoaXMudmlzaWJsZUNlbGxzQ291bnQgKyB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIDI7XHJcbiAgICAgICAgbGV0IGNvbnRhaW5lcldpZHRoID0gdGhpcy50b3RhbENvbnRhaW5lckNlbGxzQ291bnQgKiB0aGlzLmZ1bGxDZWxsV2lkdGg7XHJcbiAgICAgICAgbGV0IHRvdGFsSW1hZ2VXaWR0aCA9IHRoaXMuaW1hZ2VzLmxlbmd0aCAqIHRoaXMuZnVsbENlbGxXaWR0aDtcclxuXHJcbiAgICAgICAgaWYgKHRvdGFsSW1hZ2VXaWR0aCA8IGNvbnRhaW5lcldpZHRoKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lcldpZHRoID0gdG90YWxJbWFnZVdpZHRoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcldpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGUoY2VsbEluZGV4KSB7XHJcbiAgICAgICAgbGV0IGltYWdlSW5kZXggPSB0aGlzLmdldEZpbGVJbmRleChjZWxsSW5kZXgpOyBcclxuICAgICAgICBsZXQgZmlsZSA9IHRoaXMuaW1hZ2VzW2ltYWdlSW5kZXhdO1xyXG5cclxuICAgICAgICBpZiAoZmlsZSAmJiAhZmlsZS50eXBlKSB7XHJcbiAgICAgICAgICAgIGZpbGUudHlwZSA9ICdpbWFnZSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBpbWFnZTogdGhpcy5pbWFnZXNbaW1hZ2VJbmRleF0sXHJcbiAgICAgICAgICAgIGltYWdlSW5kZXhcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbGVJbmRleChjZWxsSW5kZXg6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uSW5kZXggPSB0aGlzLmdldFBvc2l0aW9uSW5kZXgoY2VsbEluZGV4KTtcclxuICAgICAgICBjb25zdCBudW1iZXJMZWZ0Q2VsbHMgPSAodGhpcy50b3RhbENvbnRhaW5lckNlbGxzQ291bnQgLSAxKSAvIDI7XHJcbiAgICAgICAgbGV0IGltYWdlSW5kZXg7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc0NvbnRhaW5lckxvY2tlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZUNvdW50ZXIgPD0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjZWxsSW5kZXg7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2VsbExpbWl0T3ZlcmZsb3cgPSB0aGlzLnNsaWRlQ291bnRlciAtIHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0O1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VJbmRleCA9IHBvc2l0aW9uSW5kZXggKyBjZWxsTGltaXRPdmVyZmxvdztcclxuICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZUluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hbGlnbkNlbGxzID09PSBcImxlZnRcIikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zbGlkZUNvdW50ZXIgPiB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNlbGxMaW1pdE92ZXJmbG93ID0gdGhpcy5zbGlkZUNvdW50ZXIgLSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdDtcclxuICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPSBwb3NpdGlvbkluZGV4ICsgY2VsbExpbWl0T3ZlcmZsb3c7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZUluZGV4ID0gY2VsbEluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW1hZ2VJbmRleCA+IHRoaXMubGFzdENlbGxJbmRleCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW1hZ2VJbmRleDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFuc2Z