UNPKG

ngx-pinch-zoom

Version:
395 lines (389 loc) 46.9 kB
import { Component, HostBinding, ElementRef, HostListener, ViewChild, Input, EventEmitter, Output, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class PinchZoomComponent { /** * @param {?} elementRef */ constructor(elementRef) { this.elementRef = elementRef; this.i = 0; this.scale = 1; this.initialScale = 1; this.moveX = 0; this.moveY = 0; this.initialMoveX = 0; this.initialMoveY = 0; this.draggingMode = false; this.lastTap = 0; this.transitionDuration = 200; this.autoZoomOut = false; this.events = new EventEmitter(); } /** * @param {?} value * @return {?} */ set id(value) { this._id = value; } /** * @return {?} */ get id() { return this._id; } /** * @return {?} */ get isMobile() { var /** @type {?} */ check = false; (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor); return check; } ; /** * @return {?} */ get isDragging() { let /** @type {?} */ imgHeight = this.getImageHeight(); let /** @type {?} */ imgWidth = this.getImageWidth(); if (this.scale > 1) { return imgHeight * this.scale > this.parentElement.offsetHeight || imgWidth * this.scale > this.parentElement.offsetWidth; } if (this.scale === 1) { return imgHeight > this.parentElement.offsetHeight || imgWidth > this.parentElement.offsetWidth; } } /** * @return {?} */ ngOnInit() { this.element = this.contentElement.nativeElement; this.parentElement = this.elementRef.nativeElement; this.setBasicStyles(); } /** * @param {?} event * @return {?} */ onResize(event) { this.setImageWidth(); this.transformElement(this.transitionDuration); } /** * @param {?} event * @return {?} */ touchstartHandler(event) { this.getElementPosition(); if (!this.eventType) { this.startX = event.touches[0].clientX - this.elementPosition.left; this.startY = event.touches[0].clientY - this.elementPosition.top; this.startClientX = event.touches[0].clientX - this.elementPosition.left; this.startClientY = event.touches[0].clientY - this.elementPosition.top; } this.events.emit({ type: 'touchstart' }); } /** * @param {?} event * @return {?} */ touchmoveHandler(event) { let /** @type {?} */ touches = event.touches; // Swipe if (this.detectSwipe(touches) || this.eventType == 'swipe') { this.handleSwipe(event); } // Pinch if (touches.length === 2 && !this.eventType || this.eventType == 'pinch') { this.handlePinch(event); } } /** * @param {?} event * @return {?} */ touchendHandler(event) { this.i = 0; this.draggingMode = false; let /** @type {?} */ touches = event.touches; if (this.scale < 1) { this.scale = 1; } // Auto Zoom Out if (this.autoZoomOut && this.eventType === 'pinch') { this.scale = 1; } this.events.emit({ type: 'touchend' }); if (this.eventType === 'pinch' || this.eventType === 'swipe') { this.alignImage(); } if (this.eventType === 'pinch' || this.eventType === 'swipe' || this.eventType === 'horizontal-swipe' || this.eventType === 'vertical-swipe') { this.updateInitialValues(); } this.eventType = 'touchend'; if (touches && touches.length == 0) { this.eventType = ''; } } /** * @param {?} event * @return {?} */ handleSwipe(event) { event.preventDefault(); if (!this.eventType) { this.startX = event.touches[0].clientX - this.elementPosition.left; this.startY = event.touches[0].clientY - this.elementPosition.top; } this.eventType = 'swipe'; this.events.emit({ type: 'swipe', moveX: this.moveX, moveY: this.moveY }); this.moveX = this.initialMoveX + ((event.touches[0].clientX - this.elementPosition.left) - this.startX); this.moveY = this.initialMoveY + ((event.touches[0].clientY - this.elementPosition.top) - this.startY); this.transformElement(0); } /** * @param {?} event * @return {?} */ handlePinch(event) { event.preventDefault(); let /** @type {?} */ touches = event.touches; if (!this.eventType) { this.initialDistance = this.getDistance(touches); this.moveXC = (((event.touches[0].clientX - this.elementPosition.left) + (event.touches[1].clientX - this.elementPosition.left)) / 2) - this.initialMoveX; this.moveYC = (((event.touches[0].clientY - this.elementPosition.top) + (event.touches[1].clientY - this.elementPosition.top)) / 2) - this.initialMoveY; } this.eventType = 'pinch'; this.events.emit({ type: 'pinch' }); this.distance = this.getDistance(touches); this.scale = this.initialScale * (this.distance / this.initialDistance); this.moveX = this.initialMoveX - (((this.distance / this.initialDistance) * this.moveXC) - this.moveXC); this.moveY = this.initialMoveY - (((this.distance / this.initialDistance) * this.moveYC) - this.moveYC); this.transformElement(0); } /** * @param {?} touches * @return {?} */ detectSwipe(touches) { return touches.length === 1 && this.scale > 1 && !this.eventType; } /** * @param {?} touches * @return {?} */ getDistance(touches) { return Math.sqrt(Math.pow(touches[0].pageX - touches[1].pageX, 2) + Math.pow(touches[0].pageY - touches[1].pageY, 2)); } /** * @return {?} */ getImageHeight() { return this.element.getElementsByTagName("img")[0].offsetHeight; } /** * @return {?} */ getImageWidth() { return this.element.getElementsByTagName("img")[0].offsetWidth; } /** * @return {?} */ setBasicStyles() { this.element.style.display = "flex"; this.element.style.height = "100%"; this.element.style.alignItems = "center"; this.element.style.justifyContent = "center"; this.element.style.transformOrigin = '0 0'; this.hostDisplay = "block"; this.hostOverflow = "hidden"; this.hostHeight = this.containerHeight; this.setImageWidth(); } /** * @return {?} */ setImageWidth() { let /** @type {?} */ imgElement = this.element.getElementsByTagName("img"); if (imgElement.length) { imgElement[0].style.maxWidth = '100%'; imgElement[0].style.maxHeight = '100%'; } } /** * @param {?=} duration * @return {?} */ transformElement(duration = 50) { this.element.style.transition = 'all ' + duration + 'ms'; this.element.style.transform = 'matrix(' + Number(this.scale) + ',' + 0 + ',' + 0 + ',' + Number(this.scale) + ',' + Number(this.moveX) + ',' + Number(this.moveY) + ')'; } /** * @return {?} */ resetScale() { this.scale = 1; this.moveX = 0; this.moveY = 0; this.updateInitialValues(); this.transformElement(this.transitionDuration); } /** * @return {?} */ updateInitialValues() { this.initialScale = this.scale; this.initialMoveX = this.moveX; this.initialMoveY = this.moveY; } /** * @return {?} */ centeringImage() { let /** @type {?} */ img = this.element.getElementsByTagName("img")[0]; const /** @type {?} */ initialMoveX = this.moveX; const /** @type {?} */ initialMoveY = this.moveY; if (this.moveY > 0) { this.moveY = 0; } if (this.moveX > 0) { this.moveX = 0; } if (img) { this.transitionYRestriction(); this.transitionXRestriction(); } if (img && this.scale < 1) { if (this.moveX < this.element.offsetWidth * (1 - this.scale)) { this.moveX = this.element.offsetWidth * (1 - this.scale); } } return initialMoveX != this.moveX || initialMoveY != this.moveY; } /** * @return {?} */ alignImage() { let /** @type {?} */ isMoveChanged = this.centeringImage(); if (isMoveChanged) { this.updateInitialValues(); this.transformElement(this.transitionDuration); } } /** * @return {?} */ transitionYRestriction() { let /** @type {?} */ imgHeight = this.getImageHeight(); if (imgHeight * this.scale < this.parentElement.offsetHeight) { this.moveY = (this.parentElement.offsetHeight - this.element.offsetHeight * this.scale) / 2; } else { let /** @type {?} */ imgOffsetTop = ((imgHeight - this.element.offsetHeight) * this.scale) / 2; if (this.moveY > imgOffsetTop) { this.moveY = imgOffsetTop; } else if ((imgHeight * this.scale + Math.abs(imgOffsetTop) - this.parentElement.offsetHeight) + this.moveY < 0) { this.moveY = -(imgHeight * this.scale + Math.abs(imgOffsetTop) - this.parentElement.offsetHeight); } } } /** * @return {?} */ transitionXRestriction() { let /** @type {?} */ imgWidth = this.getImageWidth(); if (imgWidth * this.scale < this.parentElement.offsetWidth) { this.moveX = (this.parentElement.offsetWidth - this.element.offsetWidth * this.scale) / 2; } else { let /** @type {?} */ imgOffsetLeft = ((imgWidth - this.element.offsetWidth) * this.scale) / 2; if (this.moveX > imgOffsetLeft) { this.moveX = imgOffsetLeft; } else if ((imgWidth * this.scale + Math.abs(imgOffsetLeft) - this.parentElement.offsetWidth) + this.moveX < 0) { this.moveX = -(imgWidth * this.scale + Math.abs(imgOffsetLeft) - this.parentElement.offsetWidth); } } } /** * @return {?} */ getElementPosition() { this.elementPosition = this.elementRef.nativeElement.getBoundingClientRect(); } } PinchZoomComponent.decorators = [ { type: Component, args: [{ selector: 'pinch-zoom, [pinch-zoom]', template: `<div #content> <ng-content></ng-content> </div>`, styles: [`:host{position:relative}`] },] }, ]; /** @nocollapse */ PinchZoomComponent.ctorParameters = () => [ { type: ElementRef } ]; PinchZoomComponent.propDecorators = { containerHeight: [{ type: Input, args: ['height',] }], transitionDuration: [{ type: Input, args: ['transition-duration',] }], autoZoomOut: [{ type: Input, args: ['auto-zoom-out',] }], id: [{ type: Input, args: ['id',] }], events: [{ type: Output }], hostDisplay: [{ type: HostBinding, args: ['style.display',] }], hostOverflow: [{ type: HostBinding, args: ['style.overflow',] }], hostHeight: [{ type: HostBinding, args: ['style.height',] }], contentElement: [{ type: ViewChild, args: ['content',] }], onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }], touchstartHandler: [{ type: HostListener, args: ['touchstart', ['$event'],] }], touchmoveHandler: [{ type: HostListener, args: ['touchmove', ['$event'],] }], touchendHandler: [{ type: HostListener, args: ['touchend', ['$event'],] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class PinchZoomModule { } PinchZoomModule.decorators = [ { type: NgModule, args: [{ declarations: [ PinchZoomComponent ], imports: [ CommonModule ], exports: [ PinchZoomComponent ], entryComponents: [ PinchZoomComponent ] },] }, ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { PinchZoomComponent, PinchZoomModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBpbmNoLXpvb20uanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1waW5jaC16b29tL2xpYi9waW5jaC16b29tLmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LXBpbmNoLXpvb20vbGliL3BpbmNoLXpvb20ubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSG9zdEJpbmRpbmcsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25Jbml0LCBWaWV3Q2hpbGQsIElucHV0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3BpbmNoLXpvb20sIFtwaW5jaC16b29tXScsXG4gICAgdGVtcGxhdGU6IGA8ZGl2ICNjb250ZW50PlxuXHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5gLFxuICAgIHN0eWxlczogW2A6aG9zdHtwb3NpdGlvbjpyZWxhdGl2ZX1gXVxufSlcblxuZXhwb3J0IGNsYXNzIFBpbmNoWm9vbUNvbXBvbmVudCB7XG5cbiAgICBpOiBudW1iZXIgPSAwO1xuICAgIF9pZDogYW55O1xuICAgIGVsZW1lbnQ6IGFueTtcbiAgICBlbGVtZW50UG9zaXRpb246IGFueTtcbiAgICBwYXJlbnRFbGVtZW50OiBhbnk7XG4gICAgZXZlbnRUeXBlOiBhbnk7XG5cbiAgICBzY2FsZTogbnVtYmVyID0gMTtcbiAgICBpbml0aWFsU2NhbGU6IG51bWJlciA9IDE7XG5cbiAgICBzdGFydFg6IG51bWJlcjtcbiAgICBzdGFydFk6IG51bWJlcjtcbiAgICBzdGFydENsaWVudFg6IG51bWJlcjtcbiAgICBzdGFydENsaWVudFk6IG51bWJlcjtcblxuICAgIG1vdmVYOiBhbnkgPSAwO1xuICAgIG1vdmVZOiBhbnkgPSAwO1xuICAgIGluaXRpYWxNb3ZlWDogYW55ID0gMDtcbiAgICBpbml0aWFsTW92ZVk6IGFueSA9IDA7XG4gICAgbW92ZVhDOiBudW1iZXI7XG4gICAgbW92ZVlDOiBudW1iZXI7XG5cbiAgICBkaXN0YW5jZTogbnVtYmVyO1xuICAgIGluaXRpYWxEaXN0YW5jZTogbnVtYmVyO1xuICAgIGRyYWdnaW5nTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGRvdWJsZVRhcFRpbWVvdXQ6IGFueTtcbiAgICBsYXN0VGFwOiBudW1iZXIgPSAwO1xuXG4gICAgQElucHV0KCdoZWlnaHQnKSBjb250YWluZXJIZWlnaHQ6IHN0cmluZztcbiAgICBASW5wdXQoJ3RyYW5zaXRpb24tZHVyYXRpb24nKSB0cmFuc2l0aW9uRHVyYXRpb246IG51bWJlciA9IDIwMDtcbiAgICBASW5wdXQoJ2F1dG8tem9vbS1vdXQnKSBhdXRvWm9vbU91dDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgnaWQnKSBzZXQgaWQodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgaWQoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cbiAgICBcbiAgICBAT3V0cHV0KCkgZXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5kaXNwbGF5JykgaG9zdERpc3BsYXk6c3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUub3ZlcmZsb3cnKSBob3N0T3ZlcmZsb3c6c3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JykgaG9zdEhlaWdodDpzdHJpbmc7XG5cbiAgICBAVmlld0NoaWxkKCdjb250ZW50JykgY29udGVudEVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBnZXQgaXNNb2JpbGUoKSB7XG4gICAgICAgIHZhciBjaGVjayA9IGZhbHNlO1xuICAgICAgICAoZnVuY3Rpb24oYSl7aWYoLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLnRlc3QoYSl8fC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLnRlc3QoYS5zdWJzdHIoMCw0KSkpIGNoZWNrID0gdHJ1ZTt9KShuYXZpZ2F0b3IudXNlckFnZW50fHxuYXZpZ2F0b3IudmVuZG9yKTtcbiAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgIH07XG5cbiAgICBnZXQgaXNEcmFnZ2luZygpe1xuICAgICAgICBsZXQgaW1nSGVpZ2h0ID0gdGhpcy5nZXRJbWFnZUhlaWdodCgpO1xuICAgICAgICBsZXQgaW1nV2lkdGggPSB0aGlzLmdldEltYWdlV2lkdGgoKTtcblxuICAgICAgICBpZiAodGhpcy5zY2FsZSA+IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBpbWdIZWlnaHQgKiB0aGlzLnNjYWxlID4gdGhpcy5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCB8fCBpbWdXaWR0aCAqIHRoaXMuc2NhbGUgPiB0aGlzLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2NhbGUgPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBpbWdIZWlnaHQgPiB0aGlzLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IGltZ1dpZHRoID4gdGhpcy5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKXtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy5zZXRCYXNpY1N0eWxlcygpO1xuICAgIH1cblxuXG4gICAgLypcbiAgICAgKiBNb2JpbGUgbGlzdGVuZXJzXG4gICAgICovXG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcbiAgICBvblJlc2l6ZShldmVudDpFdmVudCkge1xuICAgICAgICB0aGlzLnNldEltYWdlV2lkdGgoKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1FbGVtZW50KHRoaXMudHJhbnNpdGlvbkR1cmF0aW9uKTsgXG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gICAgdG91Y2hzdGFydEhhbmRsZXIoZXZlbnQ6YW55KSB7XG4gICAgICAgIHRoaXMuZ2V0RWxlbWVudFBvc2l0aW9uKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50VHlwZSl7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLnRvcDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDbGllbnRYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYIC0gdGhpcy5lbGVtZW50UG9zaXRpb24ubGVmdDtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRDbGllbnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZIC0gdGhpcy5lbGVtZW50UG9zaXRpb24udG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7dHlwZTogJ3RvdWNoc3RhcnQnfSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigndG91Y2htb3ZlJywgWyckZXZlbnQnXSlcbiAgICB0b3VjaG1vdmVIYW5kbGVyKGV2ZW50OmFueSkge1xuICAgICAgICBsZXQgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXM7XG5cbiAgICAgICAgLy8gU3dpcGVcbiAgICAgICAgaWYgKHRoaXMuZGV0ZWN0U3dpcGUodG91Y2hlcykgfHwgdGhpcy5ldmVudFR5cGUgPT0gJ3N3aXBlJyl7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN3aXBlKGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBpbmNoXG4gICAgICAgIGlmICh0b3VjaGVzLmxlbmd0aCA9PT0gMiAmJiAhdGhpcy5ldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUgPT0gJ3BpbmNoJyl7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVBpbmNoKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3RvdWNoZW5kJywgWyckZXZlbnQnXSlcbiAgICB0b3VjaGVuZEhhbmRsZXIoZXZlbnQ6YW55KSB7XG4gICAgICAgIHRoaXMuaSA9IDA7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmdNb2RlID0gZmFsc2U7XG4gICAgICAgIGxldCB0b3VjaGVzID0gZXZlbnQudG91Y2hlcztcblxuICAgICAgICBpZiAodGhpcy5zY2FsZSA8IDEpe1xuICAgICAgICAgICAgdGhpcy5zY2FsZSA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdXRvIFpvb20gT3V0XG4gICAgICAgIGlmICh0aGlzLmF1dG9ab29tT3V0ICYmIHRoaXMuZXZlbnRUeXBlID09PSAncGluY2gnKXtcbiAgICAgICAgICAgIHRoaXMuc2NhbGUgPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7dHlwZTogJ3RvdWNoZW5kJ30pO1xuXG4gICAgICAgIGlmICh0aGlzLmV2ZW50VHlwZSA9PT0gJ3BpbmNoJyB8fCB0aGlzLmV2ZW50VHlwZSA9PT0gJ3N3aXBlJyl7XG4gICAgICAgICAgICB0aGlzLmFsaWduSW1hZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV2ZW50VHlwZSA9PT0gJ3BpbmNoJyB8fCBcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUeXBlID09PSAnc3dpcGUnIHx8XG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9PT0gJ2hvcml6b250YWwtc3dpcGUnIHx8XG4gICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9PT0gJ3ZlcnRpY2FsLXN3aXBlJyl7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluaXRpYWxWYWx1ZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gJ3RvdWNoZW5kJztcblxuICAgICAgICBpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUeXBlID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qXG4gICAgICogSGFuZGxlcnNcbiAgICAgKi9cblxuICAgIGhhbmRsZVN3aXBlKGV2ZW50OmFueSl7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV2ZW50VHlwZSl7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLmxlZnQ7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLnRvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gJ3N3aXBlJztcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAnc3dpcGUnLFxuICAgICAgICAgICAgbW92ZVg6IHRoaXMubW92ZVgsXG4gICAgICAgICAgICBtb3ZlWTogdGhpcy5tb3ZlWVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1vdmVYID0gdGhpcy5pbml0aWFsTW92ZVggKyAoKGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WCAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLmxlZnQpIC0gdGhpcy5zdGFydFgpO1xuICAgICAgICB0aGlzLm1vdmVZID0gdGhpcy5pbml0aWFsTW92ZVkgKyAoKGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WSAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLnRvcCkgLSB0aGlzLnN0YXJ0WSk7XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm1FbGVtZW50KDApO1xuICAgIH1cblxuICAgIGhhbmRsZVBpbmNoKGV2ZW50OmFueSl7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgbGV0IHRvdWNoZXMgPSBldmVudC50b3VjaGVzO1xuXG4gICAgICAgIGlmICghdGhpcy5ldmVudFR5cGUpe1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsRGlzdGFuY2UgPSB0aGlzLmdldERpc3RhbmNlKHRvdWNoZXMpO1xuICAgICAgICAgICAgdGhpcy5tb3ZlWEMgPSAoKChldmVudC50b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLmVsZW1lbnRQb3NpdGlvbi5sZWZ0KSArIChldmVudC50b3VjaGVzWzFdLmNsaWVudFggLSB0aGlzLmVsZW1lbnRQb3NpdGlvbi5sZWZ0KSkgLyAyKSAtIHRoaXMuaW5pdGlhbE1vdmVYO1xuICAgICAgICAgICAgdGhpcy5tb3ZlWUMgPSAoKChldmVudC50b3VjaGVzWzBdLmNsaWVudFkgLSB0aGlzLmVsZW1lbnRQb3NpdGlvbi50b3ApICsgKGV2ZW50LnRvdWNoZXNbMV0uY2xpZW50WSAtIHRoaXMuZWxlbWVudFBvc2l0aW9uLnRvcCkpIC8gMikgLSB0aGlzLmluaXRpYWxNb3ZlWTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXZlbnRUeXBlID0gJ3BpbmNoJztcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7dHlwZTogJ3BpbmNoJ30pO1xuICAgICAgICB0aGlzLmRpc3RhbmNlID0gdGhpcy5nZXREaXN0YW5jZSh0b3VjaGVzKTtcbiAgICAgICAgdGhpcy5zY2FsZSA9IHRoaXMuaW5pdGlhbFNjYWxlICogKHRoaXMuZGlzdGFuY2UgLyB0aGlzLmluaXRpYWxEaXN0YW5jZSk7XG4gICAgICAgIHRoaXMubW92ZVggPSB0aGlzLmluaXRpYWxNb3ZlWCAtICgoKHRoaXMuZGlzdGFuY2UgLyB0aGlzLmluaXRpYWxEaXN0YW5jZSkgKiB0aGlzLm1vdmVYQykgLSB0aGlzLm1vdmVYQyk7XG4gICAgICAgIHRoaXMubW92ZVkgPSB0aGlzLmluaXRpYWxNb3ZlWSAtICgoKHRoaXMuZGlzdGFuY2UgLyB0aGlzLmluaXRpYWxEaXN0YW5jZSkgKiB0aGlzLm1vdmVZQykgLSB0aGlzLm1vdmVZQyk7XG5cbiAgICAgICAgdGhpcy50cmFuc2Zvcm1FbGVtZW50KDApO1xuICAgIH1cblxuXG4gICAgZGV0ZWN0U3dpcGUodG91Y2hlczphbnkpe1xuICAgICAgICByZXR1cm4gdG91Y2hlcy5sZW5ndGggPT09IDEgJiYgdGhpcy5zY2FsZSA+IDEgJiYgIXRoaXMuZXZlbnRUeXBlO1xuICAgIH1cblxuICAgIGdldERpc3RhbmNlKHRvdWNoZXM6IGFueSl7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoIE1hdGgucG93KHRvdWNoZXNbMF0ucGFnZVggLSB0b3VjaGVzWzFdLnBhZ2VYLCAyKSArIE1hdGgucG93KHRvdWNoZXNbMF0ucGFnZVkgLSB0b3VjaGVzWzFdLnBhZ2VZLCAyKSk7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2VIZWlnaHQoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImltZ1wiKVswXS5vZmZzZXRIZWlnaHQ7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2VXaWR0aCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW1nXCIpWzBdLm9mZnNldFdpZHRoO1xuICAgIH1cblxuICAgIHNldEJhc2ljU3R5bGVzKCk6dm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gXCJmbGV4XCI7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmFsaWduSXRlbXMgPSBcImNlbnRlclwiO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuanVzdGlmeUNvbnRlbnQgPSBcImNlbnRlclwiO1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNmb3JtT3JpZ2luID0gJzAgMCc7XG4gICAgICAgIHRoaXMuaG9zdERpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIHRoaXMuaG9zdE92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgdGhpcy5ob3N0SGVpZ2h0ID0gdGhpcy5jb250YWluZXJIZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zZXRJbWFnZVdpZHRoKCk7XG4gICAgfVxuXG4gICAgc2V0SW1hZ2VXaWR0aCgpOnZvaWQge1xuICAgICAgICBsZXQgaW1nRWxlbWVudCA9IHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImltZ1wiKTtcblxuICAgICAgICBpZiAoaW1nRWxlbWVudC5sZW5ndGgpe1xuICAgICAgICAgICAgaW1nRWxlbWVudFswXS5zdHlsZS5tYXhXaWR0aCA9ICcxMDAlJztcbiAgICAgICAgICAgIGltZ0VsZW1lbnRbMF0uc3R5bGUubWF4SGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtRWxlbWVudChkdXJhdGlvbjogYW55ID0gNTApe1xuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgJysgZHVyYXRpb24gKydtcyc7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAnbWF0cml4KCcrIE51bWJlcih0aGlzLnNjYWxlKSArJywnKyAwICsnLCcrIDAgKycsJysgTnVtYmVyKHRoaXMuc2NhbGUpICsnLCcrIE51bWJlcih0aGlzLm1vdmVYKSArJywnKyBOdW1iZXIodGhpcy5tb3ZlWSkgKycpJztcbiAgICB9XG5cbiAgICByZXNldFNjYWxlKCk6dm9pZCB7XG4gICAgICAgIHRoaXMuc2NhbGUgPSAxO1xuICAgICAgICB0aGlzLm1vdmVYID0gMDtcbiAgICAgICAgdGhpcy5tb3ZlWSA9IDA7XG4gICAgICAgIHRoaXMudXBkYXRlSW5pdGlhbFZhbHVlcygpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybUVsZW1lbnQodGhpcy50cmFuc2l0aW9uRHVyYXRpb24pO1xuICAgIH1cblxuICAgIHVwZGF0ZUluaXRpYWxWYWx1ZXMoKTp2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0aWFsU2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgICAgICB0aGlzLmluaXRpYWxNb3ZlWCA9IHRoaXMubW92ZVg7XG4gICAgICAgIHRoaXMuaW5pdGlhbE1vdmVZID0gdGhpcy5tb3ZlWTtcbiAgICB9XG5cbiAgICBjZW50ZXJpbmdJbWFnZSgpOmJvb2xlYW4ge1xuICAgICAgICBsZXQgaW1nID0gdGhpcy5lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW1nXCIpWzBdO1xuICAgICAgICBjb25zdCBpbml0aWFsTW92ZVggPSB0aGlzLm1vdmVYO1xuICAgICAgICBjb25zdCBpbml0aWFsTW92ZVkgPSB0aGlzLm1vdmVZO1xuXG4gICAgICAgIGlmICh0aGlzLm1vdmVZID4gMCl7XG4gICAgICAgICAgICB0aGlzLm1vdmVZID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb3ZlWCA+IDApe1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW1nKXtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbllSZXN0cmljdGlvbigpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uWFJlc3RyaWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGltZyAmJiB0aGlzLnNjYWxlIDwgMSl7XG4gICAgICAgICAgICBpZiAodGhpcy5tb3ZlWCA8IHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAqICgxIC0gdGhpcy5zY2FsZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVYID0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoICogKDEgLSB0aGlzLnNjYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbml0aWFsTW92ZVggIT0gdGhpcy5tb3ZlWCB8fCBpbml0aWFsTW92ZVkgIT0gdGhpcy5tb3ZlWTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWxpZ25JbWFnZSgpOnZvaWQge1xuICAgICAgICBsZXQgaXNNb3ZlQ2hhbmdlZCA9IHRoaXMuY2VudGVyaW5nSW1hZ2UoKTtcblxuICAgICAgICBpZiAoaXNNb3ZlQ2hhbmdlZCl7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUluaXRpYWxWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtRWxlbWVudCh0aGlzLnRyYW5zaXRpb25EdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc2l0aW9uWVJlc3RyaWN0aW9uKCk6dm9pZCB7XG4gICAgICAgIGxldCBpbWdIZWlnaHQgPSB0aGlzLmdldEltYWdlSGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKGltZ0hlaWdodCAqIHRoaXMuc2NhbGUgPCB0aGlzLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0KXtcbiAgICAgICAgICAgIHRoaXMubW92ZVkgPSAodGhpcy5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgKiB0aGlzLnNjYWxlKSAvIDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaW1nT2Zmc2V0VG9wID0gKChpbWdIZWlnaHQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0KSAqIHRoaXMuc2NhbGUpIC8gMjtcblxuICAgICAgICAgICAgaWYgKHRoaXMubW92ZVkgPiBpbWdPZmZzZXRUb3Ape1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZVkgPSBpbWdPZmZzZXRUb3A7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChpbWdIZWlnaHQgKiB0aGlzLnNjYWxlICsgTWF0aC5hYnMoaW1nT2Zmc2V0VG9wKSAtIHRoaXMucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpICsgdGhpcy5tb3ZlWSA8IDApe1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZVkgPSAtIChpbWdIZWlnaHQgKiB0aGlzLnNjYWxlICsgTWF0aC5hYnMoaW1nT2Zmc2V0VG9wKSAtIHRoaXMucGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNpdGlvblhSZXN0cmljdGlvbigpOnZvaWQge1xuICAgICAgICBsZXQgaW1nV2lkdGggPSB0aGlzLmdldEltYWdlV2lkdGgoKTtcblxuICAgICAgICBpZiAoaW1nV2lkdGggKiB0aGlzLnNjYWxlIDwgdGhpcy5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmVYID0gKHRoaXMucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAqIHRoaXMuc2NhbGUpIC8gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBpbWdPZmZzZXRMZWZ0ID0gKChpbWdXaWR0aCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCkgKiB0aGlzLnNjYWxlKSAvIDI7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1vdmVYID4gaW1nT2Zmc2V0TGVmdCl7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IGltZ09mZnNldExlZnQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChpbWdXaWR0aCAqIHRoaXMuc2NhbGUgKyBNYXRoLmFicyhpbWdPZmZzZXRMZWZ0KSAtIHRoaXMucGFyZW50RWxlbWVudC5vZmZzZXRXaWR0aCkgKyB0aGlzLm1vdmVYIDwgMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IC0gKGltZ1dpZHRoICogdGhpcy5zY2FsZSArIE1hdGguYWJzKGltZ09mZnNldExlZnQpIC0gdGhpcy5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEVsZW1lbnRQb3NpdGlvbigpOnZvaWQge1xuICAgICAgICB0aGlzLmVsZW1lbnRQb3NpdGlvbiA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFBpbmNoWm9vbUNvbXBvbmVudCB9IGZyb20gJy4vcGluY2gtem9vbS5jb21wb25lbnQnOyBcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtcbiAgICAgICAgUGluY2hab29tQ29tcG9uZW50XG4gICAgXSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZVxuICAgIF0sXG4gICAgZXhwb3J0czogW1xuICAgICAgICBQaW5jaFpvb21Db21wb25lbnRcbiAgICBdLFxuICAgIGVudHJ5Q29tcG9uZW50czogW1xuICAgICAgICBQaW5jaFpvb21Db21wb25lbnRcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFBpbmNoWm9vbU1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7SUE0RUksWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtpQkFoRTlCLENBQUM7cUJBT0csQ0FBQzs0QkFDTSxDQUFDO3FCQU9YLENBQUM7cUJBQ0QsQ0FBQzs0QkFDTSxD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