UNPKG

@crystalui/angular-lightbox

Version:

Angular library for viewing images in a pop-up window with touch screen support.

331 lines 31.9 kB
import { __decorate } from "tslib"; import { Component, Input, HostBinding, ViewChild } from '@angular/core'; import { EventService } from './event.service'; import { Utils } from './utils'; var LightboxCommonComponent = /** @class */ (function () { function LightboxCommonComponent(eventService) { this.eventService = eventService; this.currentImageIndex = 0; this.indexCurrentSlide = 1; this.containerStyles = { transition: '', transform: '', width: '', height: '', opacity: '' }; this.currImageLoadingState = 'not-loaded'; this.isMobile = Utils.mobileCheck(); } Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImage", { get: function () { return this._lightboxImage; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImageElement", { get: function () { if (this.lightboxImage) { return this.lightboxImage.nativeElement; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImageNaturalHeight", { get: function () { if (this.lightboxImageElement) { return this.lightboxImageElement.naturalHeight; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "lightboxImageNaturalWidth", { get: function () { if (this.lightboxImageElement) { return this.lightboxImageElement.naturalWidth; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "index", { get: function () { return this.currentImageIndex; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "properties", { get: function () { return this.lightboxData.properties; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "images", { get: function () { return this.lightboxData.images || [this.lightboxData.image]; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "thumbnailImage", { get: function () { return this.images[this.currentImageIndex].nativeElement; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "thumbnailImagePosition", { get: function () { return this.thumbnailImage.getBoundingClientRect(); }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "virtualImageDimension", { // Image size if it is larger than the window size get: function () { var height = this.lightboxImageNaturalHeight; var width = height * this.imageAspectRatio; var windowWidth = document.body.clientWidth; var windowHeight = window.innerHeight; if (this.isImageLargerWindow) { if (height > windowHeight) { height = windowHeight; width = height * this.imageAspectRatio; } if (width > windowWidth) { width = windowWidth; height = width / this.imageAspectRatio; } } else { width = this.lightboxImageNaturalWidth; height = this.lightboxImageNaturalHeight; } if (width === 0 || Number.parseInt(height) === 0) { return { width: 200, height: 200 }; } return { width: width, height: height }; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "containerInitialPosition", { get: function () { var scale = (this.showState === 'initial-thumbnail-image') ? 1 : this.containerScale; var top = this.thumbnailImagePosition.top; var left = this.thumbnailImagePosition.left; return 'matrix(' + scale + ', 0, 0, ' + scale + ',' + left + ',' + top + ')'; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "containerFullscreenPosition", { get: function () { var left = (document.body.clientWidth - this.virtualImageDimension.width) / 2; var top = (window.innerHeight - this.virtualImageDimension.height) / 2; return 'translate3d(' + left + 'px, ' + top + 'px, 0)'; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "containerScale", { get: function () { return this.thumbnailImagePosition.width / this.virtualImageDimension.width; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "imageAspectRatio", { get: function () { return this.thumbnailImage.naturalWidth / this.thumbnailImage.naturalHeight; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "isImageLargerWindow", { get: function () { var imageNaturalWidth = this.lightboxImageNaturalWidth; var imageNaturalHeight = this.lightboxImageNaturalHeight; var windowWidth = document.body.clientWidth; var windowHeight = window.innerHeight; return imageNaturalWidth > windowWidth || imageNaturalHeight > windowHeight; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "isFirstImage", { get: function () { if (this.properties.loop) { return false; } else { return this.index === 0; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "isLastImage", { get: function () { if (this.properties.loop) { return false; } else { return this.index === this.latestImageIndex; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "latestImageIndex", { get: function () { return this.images.length - 1; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "backgroundColor", { get: function () { var opacity = this.properties.backgroundOpacity; var color = this.properties.backgroundColor; if (color === 'black') { return 'rgba(0, 0, 0, ' + opacity + ')'; } else { return 'rgba(255, 255, 255, ' + opacity + ')'; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "animationDuration", { get: function () { var animationDuration = this.properties.animationDuration; if (typeof animationDuration === "string") { return Number.parseInt(animationDuration); } else { return animationDuration; } }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "animationMode", { get: function () { if (this.currImageLoadingState === 'error') { return 'default'; } return this.properties.animationMode; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "animationTimingFunction", { get: function () { return this.properties.animationTimingFunction; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "closeButtonText", { get: function () { return this.properties.closeButtonText; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "counterSeparator", { get: function () { return this.properties.counterSeparator; }, enumerable: true, configurable: true }); Object.defineProperty(LightboxCommonComponent.prototype, "counter", { get: function () { return this.currentImageIndex + 1 + this.counterSeparator + this.images.length; }, enumerable: true, configurable: true }); LightboxCommonComponent.prototype.emitState = function (type, state) { if (state === 'initial-virtual-image' || state === 'initial-styles') { return; } if (state === 'initial-default' || state === 'initial-thumbnail-image') { state = 'initial'; } this.eventService.emitChangeEvent({ type: type + ':' + state }); }; LightboxCommonComponent.prototype.setShowState = function (state) { this.showState = state; this.emitState('show-state', state); }; LightboxCommonComponent.prototype.setClosingState = function (state) { this.closingState = state; this.emitState('closing-state', state); }; LightboxCommonComponent.prototype.setAnimationDuration = function () { this.hostStyleTransition = 'background-color ' + this.animationDuration + 'ms'; this.containerStyles.transition = 'all ' + this.animationDuration + 'ms ' + this.animationTimingFunction; }; LightboxCommonComponent.prototype.setBackgroundColor = function () { this.hostStyleBackgroundColor = this.backgroundColor; }; LightboxCommonComponent.prototype.getContainerHeight = function () { return this.thumbnailImagePosition.height / this.containerScale + 'px'; }; LightboxCommonComponent.prototype.showThumbnailImage = function () { this.thumbnailImage.style.opacity = ''; }; LightboxCommonComponent.prototype.hideThumbnailImage = function () { this.thumbnailImage.style.opacity = 0; }; LightboxCommonComponent.prototype.updateThumbnailPosition = function () { this.containerStyles.transform = this.containerInitialPosition; }; LightboxCommonComponent.ctorParameters = function () { return [ { type: EventService } ]; }; __decorate([ Input() ], LightboxCommonComponent.prototype, "lightboxData", void 0); __decorate([ HostBinding('style.backgroundColor') ], LightboxCommonComponent.prototype, "hostStyleBackgroundColor", void 0); __decorate([ HostBinding('style.transition') ], LightboxCommonComponent.prototype, "hostStyleTransition", void 0); __decorate([ ViewChild('imageFirst', { static: true }) ], LightboxCommonComponent.prototype, "_imageFirst", void 0); __decorate([ ViewChild('imageSecond', { static: true }) ], LightboxCommonComponent.prototype, "_imageSecond", void 0); __decorate([ ViewChild('imageLast', { static: true }) ], LightboxCommonComponent.prototype, "_imageLast", void 0); __decorate([ ViewChild('lightboxImage', { static: true }) ], LightboxCommonComponent.prototype, "_lightboxImage", void 0); LightboxCommonComponent = __decorate([ Component({ selector: 'lightbox-common', template: '' }) ], LightboxCommonComponent); return LightboxCommonComponent; }()); export { LightboxCommonComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRib3gtY29tbW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjcnlzdGFsdWkvYW5ndWxhci1saWdodGJveC8iLCJzb3VyY2VzIjpbImxpYi9saWdodGJveC1jb21tb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBR3JGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBT2hDO0lBOExJLGlDQUFtQixZQUEwQjtRQUExQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQTVMN0Msc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBQzlCLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUd0QixvQkFBZSxHQUFRO1lBQ25CLFVBQVUsRUFBRSxFQUFFO1lBQ2QsU0FBUyxFQUFFLEVBQUU7WUFDYixLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRSxFQUFFO1lBQ1YsT0FBTyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBQ0YsMEJBQXFCLEdBQW9ELFlBQVksQ0FBQztRQWtMbEYsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQXRLRCxzQkFBSSxrREFBYTthQUFqQjtZQUNJLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHlEQUFvQjthQUF4QjtZQUNJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBQztnQkFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQzthQUMzQztRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0RBQTBCO2FBQTlCO1lBQ0ksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQzthQUNsRDtRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksOERBQXlCO2FBQTdCO1lBQ0ksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQzthQUNqRDtRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksMENBQUs7YUFBVDtZQUNJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2xDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0NBQVU7YUFBZDtZQUNJLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDeEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSwyQ0FBTTthQUFWO1lBQ0ksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakUsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxtREFBYzthQUFsQjtZQUNJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDN0QsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSwyREFBc0I7YUFBMUI7WUFDSSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN2RCxDQUFDOzs7T0FBQTtJQUdELHNCQUFJLDBEQUFxQjtRQUR6QixrREFBa0Q7YUFDbEQ7WUFDSSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUM7WUFDN0MsSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzQyxJQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QyxJQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBRXhDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFDO2dCQUN6QixJQUFJLE1BQU0sR0FBRyxZQUFZLEVBQUM7b0JBQ3RCLE1BQU0sR0FBRyxZQUFZLENBQUM7b0JBQ3RCLEtBQUssR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUMxQztnQkFFRCxJQUFJLEtBQUssR0FBRyxXQUFXLEVBQUM7b0JBQ3BCLEtBQUssR0FBRyxXQUFXLENBQUM7b0JBQ3BCLE1BQU0sR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2lCQUMxQzthQUNKO2lCQUFNO2dCQUNILEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUM7Z0JBQ3ZDLE1BQU0sR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUM7YUFDNUM7WUFFRCxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUM7Z0JBQzdDLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQzthQUNwQztZQUVELE9BQU8sRUFBQyxLQUFLLE9BQUEsRUFBRSxNQUFNLFFBQUEsRUFBQyxDQUFDO1FBQzNCLENBQUM7OztPQUFBO0lBRUQsc0JBQUksNkRBQXdCO2FBQTVCO1lBQ0ksSUFBTSxLQUFLLEdBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN4RixJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDO1lBQzVDLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7WUFDOUMsT0FBTyxTQUFTLEdBQUUsS0FBSyxHQUFFLFVBQVUsR0FBRSxLQUFLLEdBQUUsR0FBRyxHQUFFLElBQUksR0FBRSxHQUFHLEdBQUUsR0FBRyxHQUFFLEdBQUcsQ0FBQztRQUN6RSxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLGdFQUEyQjthQUEvQjtZQUNJLElBQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRixJQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6RSxPQUFPLGNBQWMsR0FBRSxJQUFJLEdBQUUsTUFBTSxHQUFFLEdBQUcsR0FBRSxRQUFRLENBQUM7UUFDdkQsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxtREFBYzthQUFsQjtZQUNJLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO1FBQ2hGLENBQUM7OztPQUFBO0lBRUQsc0JBQUkscURBQWdCO2FBQXBCO1lBQ0ksT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUNoRixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHdEQUFtQjthQUF2QjtZQUNJLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQ3pELElBQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1lBQzNELElBQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzlDLElBQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDeEMsT0FBTyxpQkFBaUIsR0FBRyxXQUFXLElBQUksa0JBQWtCLEdBQUcsWUFBWSxDQUFDO1FBQ2hGLENBQUM7OztPQUFBO0lBRUQsc0JBQUksaURBQVk7YUFBaEI7WUFDSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFDO2dCQUNyQixPQUFPLEtBQUssQ0FBQzthQUNoQjtpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDO2FBQzNCO1FBQ0wsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxnREFBVzthQUFmO1lBQ0ksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBQztnQkFDckIsT0FBTyxLQUFLLENBQUM7YUFDaEI7aUJBQU07Z0JBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUMvQztRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUkscURBQWdCO2FBQXBCO1lBQ0ksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxvREFBZTthQUFuQjtZQUNJLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7WUFDbEQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7WUFDOUMsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO2dCQUNuQixPQUFPLGdCQUFnQixHQUFHLE9BQU8sR0FBRSxHQUFHLENBQUM7YUFDMUM7aUJBQU07Z0JBQ0gsT0FBTyxzQkFBc0IsR0FBRyxPQUFPLEdBQUUsR0FBRyxDQUFDO2FBQ2hEO1FBQ0wsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSxzREFBaUI7YUFBckI7WUFDSSxJQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7WUFFNUQsSUFBSSxPQUFPLGlCQUFpQixLQUFLLFFBQVEsRUFBQztnQkFDdEMsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0gsT0FBTyxpQkFBaUIsQ0FBQzthQUM1QjtRQUNMLENBQUM7OztPQUFBO0lBRUQsc0JBQUksa0RBQWE7YUFBakI7WUFDSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxPQUFPLEVBQUM7Z0JBQ3ZDLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDREQUF1QjthQUEzQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQztRQUNuRCxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLG9EQUFlO2FBQW5CO1lBQ0ksT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUMzQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHFEQUFnQjthQUFwQjtZQUNJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDRDQUFPO2FBQVg7WUFDSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25GLENBQUM7OztPQUFBO0lBTUQsMkNBQVMsR0FBVCxVQUFVLElBQUksRUFBRSxLQUFLO1FBQ2pCLElBQUksS0FBSyxLQUFLLHVCQUF1QjtZQUNqQyxLQUFLLEtBQUssZ0JBQWdCLEVBQUM7WUFDM0IsT0FBTztTQUNWO1FBRUQsSUFBSSxLQUFLLEtBQUssaUJBQWlCO1lBQzNCLEtBQUssS0FBSyx5QkFBeUIsRUFBQztZQUNwQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUM7WUFDOUIsSUFBSSxFQUFFLElBQUksR0FBQyxHQUFHLEdBQUMsS0FBSztTQUN2QixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsOENBQVksR0FBWixVQUFhLEtBQWdCO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxpREFBZSxHQUFmLFVBQWdCLEtBQW1CO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxzREFBb0IsR0FBcEI7UUFDSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLEdBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFDLElBQUksQ0FBQztRQUMzRSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsR0FBRyxNQUFNLEdBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFDLEtBQUssR0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdkcsQ0FBQztJQUVELG9EQUFrQixHQUFsQjtRQUNJLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3pELENBQUM7SUFFRCxvREFBa0IsR0FBbEI7UUFDSSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVELG9EQUFrQixHQUFsQjtRQUNJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELG9EQUFrQixHQUFsQjtRQUNJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELHlEQUF1QixHQUF2QjtRQUNJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztJQUNuRSxDQUFDOztnQkFyRGdDLFlBQVk7O0lBOUtwQztRQUFSLEtBQUssRUFBRTtpRUFBNEI7SUFFRTtRQUFyQyxXQUFXLENBQUMsdUJBQXVCLENBQUM7NkVBQWtDO0lBQ3RDO1FBQWhDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQzt3RUFBNkI7SUFFbEI7UUFBMUMsU0FBUyxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztnRUFBeUI7SUFDdkI7UUFBM0MsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztpRUFBMEI7SUFDM0I7UUFBekMsU0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzsrREFBd0I7SUFDbkI7UUFBN0MsU0FBUyxDQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzttRUFBNEI7SUF4QmhFLHVCQUF1QjtRQUxuQyxTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLFFBQVEsRUFBRSxFQUFFO1NBQ2YsQ0FBQztPQUVXLHVCQUF1QixDQW9QbkM7SUFBRCw4QkFBQztDQUFBLEFBcFBELElBb1BDO1NBcFBZLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEhvc3RCaW5kaW5nLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpZ2h0Ym94RGF0YSwgUHJvcGVydGllcyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTaG93U3RhdGUsIENsb3NpbmdTdGF0ZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi91dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGlnaHRib3gtY29tbW9uJyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5cbmV4cG9ydCBjbGFzcyBMaWdodGJveENvbW1vbkNvbXBvbmVudCB7XG5cbiAgICBjdXJyZW50SW1hZ2VJbmRleDogbnVtYmVyID0gMDtcbiAgICBpbmRleEN1cnJlbnRTbGlkZSA9IDE7XG4gICAgc2hvd1N0YXRlOiBTaG93U3RhdGU7XG4gICAgY2xvc2luZ1N0YXRlOiBDbG9zaW5nU3RhdGU7XG4gICAgY29udGFpbmVyU3R5bGVzOiBhbnkgPSB7XG4gICAgICAgIHRyYW5zaXRpb246ICcnLFxuICAgICAgICB0cmFuc2Zvcm06ICcnLFxuICAgICAgICB3aWR0aDogJycsXG4gICAgICAgIGhlaWdodDogJycsXG4gICAgICAgIG9wYWNpdHk6ICcnXG4gICAgfTtcbiAgICBjdXJySW1hZ2VMb2FkaW5nU3RhdGU6ICdub3QtbG9hZGVkJyB8ICdsb2FkaW5nJyB8ICd1cGxvYWRlZCcgfCAnZXJyb3InID0gJ25vdC1sb2FkZWQnO1xuICAgIGlzTW9iaWxlOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgbGlnaHRib3hEYXRhOiBMaWdodGJveERhdGE7XG5cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmJhY2tncm91bmRDb2xvcicpIGhvc3RTdHlsZUJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNpdGlvbicpIGhvc3RTdHlsZVRyYW5zaXRpb246IHN0cmluZztcblxuICAgIEBWaWV3Q2hpbGQoJ2ltYWdlRmlyc3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfaW1hZ2VGaXJzdDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdpbWFnZVNlY29uZCcsIHsgc3RhdGljOiB0cnVlIH0pIF9pbWFnZVNlY29uZDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdpbWFnZUxhc3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfaW1hZ2VMYXN0OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2xpZ2h0Ym94SW1hZ2UnLCB7IHN0YXRpYzogdHJ1ZSB9KSBfbGlnaHRib3hJbWFnZTogRWxlbWVudFJlZjtcblxuICAgIGdldCBsaWdodGJveEltYWdlKCl7XG4gICAgICAgIHJldHVybiB0aGlzLl9saWdodGJveEltYWdlO1xuICAgIH1cblxuICAgIGdldCBsaWdodGJveEltYWdlRWxlbWVudCgpe1xuICAgICAgICBpZiAodGhpcy5saWdodGJveEltYWdlKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpZ2h0Ym94SW1hZ2UubmF0aXZlRWxlbWVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBsaWdodGJveEltYWdlTmF0dXJhbEhlaWdodCgpe1xuICAgICAgICBpZiAodGhpcy5saWdodGJveEltYWdlRWxlbWVudCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5saWdodGJveEltYWdlRWxlbWVudC5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGxpZ2h0Ym94SW1hZ2VOYXR1cmFsV2lkdGgoKXtcbiAgICAgICAgaWYgKHRoaXMubGlnaHRib3hJbWFnZUVsZW1lbnQpe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlnaHRib3hJbWFnZUVsZW1lbnQubmF0dXJhbFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGluZGV4KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRJbWFnZUluZGV4O1xuICAgIH1cblxuICAgIGdldCBwcm9wZXJ0aWVzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLmxpZ2h0Ym94RGF0YS5wcm9wZXJ0aWVzO1xuICAgIH1cblxuICAgIGdldCBpbWFnZXMoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlnaHRib3hEYXRhLmltYWdlcyB8fCBbdGhpcy5saWdodGJveERhdGEuaW1hZ2VdO1xuICAgIH1cblxuICAgIGdldCB0aHVtYm5haWxJbWFnZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXNbdGhpcy5jdXJyZW50SW1hZ2VJbmRleF0ubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICBnZXQgdGh1bWJuYWlsSW1hZ2VQb3NpdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxJbWFnZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG5cbiAgICAvLyBJbWFnZSBzaXplIGlmIGl0IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZVxuICAgIGdldCB2aXJ0dWFsSW1hZ2VEaW1lbnNpb24oKXtcbiAgICAgICAgbGV0IGhlaWdodCA9IHRoaXMubGlnaHRib3hJbWFnZU5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIHRoaXMuaW1hZ2VBc3BlY3RSYXRpbztcbiAgICAgICAgY29uc3Qgd2luZG93V2lkdGggPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuICAgICAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJbWFnZUxhcmdlcldpbmRvdyl7XG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gd2luZG93SGVpZ2h0KXtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aW5kb3dIZWlnaHQ7XG4gICAgICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB0aGlzLmltYWdlQXNwZWN0UmF0aW87XG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBpZiAod2lkdGggPiB3aW5kb3dXaWR0aCl7XG4gICAgICAgICAgICAgICAgd2lkdGggPSB3aW5kb3dXaWR0aDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAvIHRoaXMuaW1hZ2VBc3BlY3RSYXRpbztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdpZHRoID0gdGhpcy5saWdodGJveEltYWdlTmF0dXJhbFdpZHRoO1xuICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5saWdodGJveEltYWdlTmF0dXJhbEhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBOdW1iZXIucGFyc2VJbnQoaGVpZ2h0KSA9PT0gMCl7XG4gICAgICAgICAgICByZXR1cm4ge3dpZHRoOiAyMDAsIGhlaWdodDogMjAwfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gICAgfVxuXG4gICAgZ2V0IGNvbnRhaW5lckluaXRpYWxQb3NpdGlvbigpe1xuICAgICAgICBjb25zdCBzY2FsZSA9ICAodGhpcy5zaG93U3RhdGUgPT09ICdpbml0aWFsLXRodW1ibmFpbC1pbWFnZScpID8gMSA6IHRoaXMuY29udGFpbmVyU2NhbGU7IFxuICAgICAgICBjb25zdCB0b3AgPSB0aGlzLnRodW1ibmFpbEltYWdlUG9zaXRpb24udG9wO1xuICAgICAgICBjb25zdCBsZWZ0ID0gdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLmxlZnQ7XG4gICAgICAgIHJldHVybiAnbWF0cml4KCcrIHNjYWxlICsnLCAwLCAwLCAnKyBzY2FsZSArJywnKyBsZWZ0ICsnLCcrIHRvcCArJyknO1xuICAgIH1cblxuICAgIGdldCBjb250YWluZXJGdWxsc2NyZWVuUG9zaXRpb24oKXtcbiAgICAgICAgY29uc3QgbGVmdCA9IChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIC0gdGhpcy52aXJ0dWFsSW1hZ2VEaW1lbnNpb24ud2lkdGgpIC8gMjtcbiAgICAgICAgY29uc3QgdG9wID0gKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMudmlydHVhbEltYWdlRGltZW5zaW9uLmhlaWdodCkgLyAyO1xuXG4gICAgICAgIHJldHVybiAndHJhbnNsYXRlM2QoJysgbGVmdCArJ3B4LCAnKyB0b3AgKydweCwgMCknO1xuICAgIH1cblxuICAgIGdldCBjb250YWluZXJTY2FsZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLndpZHRoIC8gdGhpcy52aXJ0dWFsSW1hZ2VEaW1lbnNpb24ud2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGltYWdlQXNwZWN0UmF0aW8oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsSW1hZ2UubmF0dXJhbFdpZHRoIC8gdGhpcy50aHVtYm5haWxJbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgIH1cblxuICAgIGdldCBpc0ltYWdlTGFyZ2VyV2luZG93KCk6Ym9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGltYWdlTmF0dXJhbFdpZHRoID0gdGhpcy5saWdodGJveEltYWdlTmF0dXJhbFdpZHRoO1xuICAgICAgICBjb25zdCBpbWFnZU5hdHVyYWxIZWlnaHQgPSB0aGlzLmxpZ2h0Ym94SW1hZ2VOYXR1cmFsSGVpZ2h0O1xuICAgICAgICBjb25zdCB3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgICAgcmV0dXJuIGltYWdlTmF0dXJhbFdpZHRoID4gd2luZG93V2lkdGggfHwgaW1hZ2VOYXR1cmFsSGVpZ2h0ID4gd2luZG93SGVpZ2h0O1xuICAgIH1cblxuICAgIGdldCBpc0ZpcnN0SW1hZ2UoKXtcbiAgICAgICAgaWYgKHRoaXMucHJvcGVydGllcy5sb29wKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV4ID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlzTGFzdEltYWdlKCl7XG4gICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMubG9vcCl7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gdGhpcy5sYXRlc3RJbWFnZUluZGV4O1xuICAgICAgICB9ICAgICAgICBcbiAgICB9XG5cbiAgICBnZXQgbGF0ZXN0SW1hZ2VJbmRleCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMTtcbiAgICB9XG5cbiAgICBnZXQgYmFja2dyb3VuZENvbG9yKCl7XG4gICAgICAgIGNvbnN0IG9wYWNpdHkgPSB0aGlzLnByb3BlcnRpZXMuYmFja2dyb3VuZE9wYWNpdHk7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5wcm9wZXJ0aWVzLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgaWYgKGNvbG9yID09PSAnYmxhY2snKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3JnYmEoMCwgMCwgMCwgJyArIG9wYWNpdHkgKycpJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmdiYSgyNTUsIDI1NSwgMjU1LCAnICsgb3BhY2l0eSArJyknO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGFuaW1hdGlvbkR1cmF0aW9uKCl7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbkR1cmF0aW9uID0gdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvbkR1cmF0aW9uO1xuXG4gICAgICAgIGlmICh0eXBlb2YgYW5pbWF0aW9uRHVyYXRpb24gPT09IFwic3RyaW5nXCIpe1xuICAgICAgICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChhbmltYXRpb25EdXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYW5pbWF0aW9uRHVyYXRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYW5pbWF0aW9uTW9kZSgpe1xuICAgICAgICBpZiAodGhpcy5jdXJySW1hZ2VMb2FkaW5nU3RhdGUgPT09ICdlcnJvcicpe1xuICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmFuaW1hdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgZ2V0IGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247XG4gICAgfVxuXG4gICAgZ2V0IGNsb3NlQnV0dG9uVGV4dCgpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmNsb3NlQnV0dG9uVGV4dDtcbiAgICB9XG5cbiAgICBnZXQgY291bnRlclNlcGFyYXRvcigpe1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmNvdW50ZXJTZXBhcmF0b3I7XG4gICAgfVxuXG4gICAgZ2V0IGNvdW50ZXIoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudEltYWdlSW5kZXggKyAxICsgdGhpcy5jb3VudGVyU2VwYXJhdG9yICsgdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSl7XG4gICAgICAgIHRoaXMuaXNNb2JpbGUgPSBVdGlscy5tb2JpbGVDaGVjaygpO1xuICAgIH1cblxuICAgIGVtaXRTdGF0ZSh0eXBlLCBzdGF0ZSl7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2luaXRpYWwtdmlydHVhbC1pbWFnZScgfHwgXG4gICAgICAgICAgICBzdGF0ZSA9PT0gJ2luaXRpYWwtc3R5bGVzJyl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUgPT09ICdpbml0aWFsLWRlZmF1bHQnIHx8IFxuICAgICAgICAgICAgc3RhdGUgPT09ICdpbml0aWFsLXRodW1ibmFpbC1pbWFnZScpe1xuICAgICAgICAgICAgc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5lbWl0Q2hhbmdlRXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogdHlwZSsnOicrc3RhdGVcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0U2hvd1N0YXRlKHN0YXRlOiBTaG93U3RhdGUpe1xuICAgICAgICB0aGlzLnNob3dTdGF0ZSA9IHN0YXRlO1xuICAgICAgICB0aGlzLmVtaXRTdGF0ZSgnc2hvdy1zdGF0ZScsIHN0YXRlKVxuICAgIH1cblxuICAgIHNldENsb3NpbmdTdGF0ZShzdGF0ZTogQ2xvc2luZ1N0YXRlKXtcbiAgICAgICAgdGhpcy5jbG9zaW5nU3RhdGUgPSBzdGF0ZTsgXG4gICAgICAgIHRoaXMuZW1pdFN0YXRlKCdjbG9zaW5nLXN0YXRlJywgc3RhdGUpO1xuICAgIH1cblxuICAgIHNldEFuaW1hdGlvbkR1cmF0aW9uKCl7XG4gICAgICAgIHRoaXMuaG9zdFN0eWxlVHJhbnNpdGlvbiA9ICdiYWNrZ3JvdW5kLWNvbG9yICcrdGhpcy5hbmltYXRpb25EdXJhdGlvbisnbXMnO1xuICAgICAgICB0aGlzLmNvbnRhaW5lclN0eWxlcy50cmFuc2l0aW9uID0gJ2FsbCAnK3RoaXMuYW5pbWF0aW9uRHVyYXRpb24rJ21zICcrdGhpcy5hbmltYXRpb25UaW1pbmdGdW5jdGlvbjtcbiAgICB9XG5cbiAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoKXtcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmJhY2tncm91bmRDb2xvcjtcbiAgICB9XG5cbiAgICBnZXRDb250YWluZXJIZWlnaHQoKTpzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxJbWFnZVBvc2l0aW9uLmhlaWdodCAvIHRoaXMuY29udGFpbmVyU2NhbGUgKyAncHgnO1xuICAgIH1cblxuICAgIHNob3dUaHVtYm5haWxJbWFnZSgpIHtcbiAgICAgICAgdGhpcy50aHVtYm5haWxJbWFnZS5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gICAgfVxuXG4gICAgaGlkZVRodW1ibmFpbEltYWdlKCl7XG4gICAgICAgIHRoaXMudGh1bWJuYWlsSW1hZ2Uuc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgfVxuXG4gICAgdXBkYXRlVGh1bWJuYWlsUG9zaXRpb24oKXtcbiAgICAgICAgdGhpcy5jb250YWluZXJTdHlsZXMudHJhbnNmb3JtID0gdGhpcy5jb250YWluZXJJbml0aWFsUG9zaXRpb247XG4gICAgfVxufSBcbiJdfQ==