ngsl-carousel
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.4.
238 lines (237 loc) • 22.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, ContentChildren, Directive, ElementRef, Input, QueryList, ViewChild, ViewChildren } from '@angular/core';
import { NgslCarouselItemDirective } from './ngsl-carousel-item.directive';
import { NgslCarouselDotDirective } from './ngsl-carousel-dot.directive';
import { animate, AnimationBuilder, style } from '@angular/animations';
// tslint:disable-next-line:directive-class-suffix
export class CarouselItemElement {
}
CarouselItemElement.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '.ngsl-carousel-item-directive'
},] }
];
// tslint:disable-next-line:directive-class-suffix
export class CarouselDotElement {
}
CarouselDotElement.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '.ngsl-carousel-dot-directive'
},] }
];
export class NgslCarouselComponent {
/**
* @param {?} builder
*/
constructor(builder) {
this.builder = builder;
/* carousel end dot */
/* Input props start*/
this.timing = 450;
this.rewindTiming = 900;
this.arrows = true;
this.dots = true;
this.infinity = true;
this.dynamicTiming = false;
this.autoplay = true;
this.perView = 1;
this.action = null;
this.currentSlide = 0;
this.prevSlide = null;
this.nextSlide = null;
this.trackWidth = {};
}
/**
* @param {?} offset
* @return {?}
*/
buildAnimation(offset) {
/** @type {?} */
const duration = this.action === 'REWIND' ? this.rewindTiming : this.timing;
return this.builder.build([
animate(`${duration}ms cubic-bezier(0.165, 0.840, 0.440, 1.000)`, style({ transform: `translateX(${offset}%)` }))
]);
}
/**
* @param {?} action
* @return {?}
*/
changeSlide(action) {
this.setSlidesIndex();
/** @type {?} */
const itemW = (100 / this.items.length) / this.perView;
/** @type {?} */
const offset = (itemW * this.currentSlide) * this.perView;
/** @type {?} */
const myAnimation = this.buildAnimation(-offset);
this.player = myAnimation.create(this.carousel.nativeElement);
this.player.play();
// console.log(`changeSlide action: ${action}, is current slide: `, this.currentSlide + 1);
}
/**
* @param {?} index
* @return {?}
*/
goToSlide(index) {
if (this.dynamicTiming) {
// В разработке, тестовая опция
this.timing = this.timing + (55 * (index - this.currentSlide));
}
this.currentSlide = index;
this.changeSlide('go to slide');
}
/**
* @return {?}
*/
next() {
/** @type {?} */
const countSlides = this.items.length;
if (this.currentSlide + 1 === countSlides && this.infinity) {
this.currentSlide = 0;
this.action = 'REWIND';
this.changeSlide('rewind to first slide');
return;
}
if (this.currentSlide + 1 === countSlides && !this.infinity) {
return;
}
this.currentSlide++;
this.action = 'NEXT_SLIDE';
this.changeSlide('next slide');
}
/**
* @return {?}
*/
prev() {
/** @type {?} */
const countSlides = this.items.length;
if (this.currentSlide === 0 && this.infinity) {
this.currentSlide = countSlides - 1;
this.action = 'REWIND';
this.changeSlide('rewind to last slide');
return;
}
if (this.currentSlide === 0 && !this.infinity) {
return;
}
this.currentSlide--;
this.action = 'PREV_SLIDE';
this.changeSlide('prev slide');
}
/**
* @return {?}
*/
setSlidesIndex() {
this.prevSlide = this.currentSlide === 0 ? this.items.length - 1 : this.currentSlide - 1;
this.nextSlide = this.currentSlide === this.items.length - 1 ? 0 : this.currentSlide + 1;
}
/**
* @return {?}
*/
removeDotsInDomElements() {
/** @type {?} */
const position = this.perView > 1 ? this.dotsList.length - this.perView : null;
this.dotsList.toArray().forEach((dot, i) => {
if (i > position) {
dot.isVisible = false;
}
});
}
/**
* @return {?}
*/
setInitValues() {
this.setSlidesIndex();
if (this.perView > 1) {
this.removeDotsInDomElements();
}
this.trackWidth = {
width: `${(100 * this.items.length) / this.perView}%`
};
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.setInitValues();
}
}
NgslCarouselComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'ngsl-carousel',
exportAs: 'ngsl-carousel',
template: "<div class=\"ngsl-carousel\">\n <div *ngIf=\"dots\" class=\"dots\" #dotsTrack>\n <div *ngFor=\"let item of dotsList; let i = index\"\n class=\"ngsl-carousel-dot-directive dot\"\n (click)=\"goToSlide(i)\"\n [class.is-current-item]=\"currentSlide === i\">\n <ng-container *ngIf=\"item.isVisible\" [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n <div class=\"slide\">\n <div class=\"content\">\n <div *ngIf=\"arrows\" class=\"slide-arrows\">\n <input type=\"button\" (click)=\"prev()\" class=\"prev\" [class.is-disabled]=\"currentSlide === 0\" />\n <input type=\"button\" (click)=\"next()\" class=\"next\" [class.is-disabled]=\"currentSlide === items.length - 1\" />\n </div>\n <div class=\"slide-track\" #track [ngStyle]=\"trackWidth\">\n <div *ngFor=\"let item of items\" class=\"ngsl-carousel-item-directive\">\n <ng-container [ngTemplateOutlet]=\"item.tpl\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n</div>\n",
styles: [".ngsl-carousel{overflow:hidden;position:relative}.ngsl-carousel .dots{position:absolute;top:30px;right:40px;font-size:0;z-index:10}.ngsl-carousel .dots .dot{display:inline-block;vertical-align:middle;width:10px;height:10px;border-radius:100%;background-color:#768692;box-sizing:border-box;cursor:pointer}.ngsl-carousel .dots .dot+.dot{margin-left:10px}.ngsl-carousel .dots .dot.is-current-item{width:22px;height:22px;position:relative;border:1px solid #fff;background-color:transparent}.ngsl-carousel .dots .dot.is-current-item:after{content:\"\";position:absolute;left:50%;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);width:10px;height:10px;border-radius:100%;background-color:#fff}.slide-track{display:flex;flex-direction:row;flex-wrap:nowrap;height:100%}.ngsl-carousel-item-directive{width:100%;height:100%}.slide-arrows input[type=button]{z-index:10;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);width:40px;height:40px;background-color:#768692;opacity:.7;border:0;cursor:pointer;background-repeat:no-repeat;background-position:center}.slide-arrows input[type=button]:hover{opacity:.9}.slide-arrows input[type=button].is-disabled{background-color:#c4bcb7}.slide-arrows input[type=button].is-disabled:hover{opacity:.7}.slide-arrows input[type=button]:focus{outline:0}.slide-arrows input[type=button].prev{-webkit-transform:translateY(-50%) rotate(-180deg);transform:translateY(-50%) rotate(-180deg)}.slide-arrows input[type=button].next{left:auto;right:0}"]
}] }
];
/** @nocollapse */
NgslCarouselComponent.ctorParameters = () => [
{ type: AnimationBuilder }
];
NgslCarouselComponent.propDecorators = {
items: [{ type: ContentChildren, args: [NgslCarouselItemDirective,] }],
itemsElements: [{ type: ViewChildren, args: [CarouselItemElement, { read: ElementRef },] }],
carousel: [{ type: ViewChild, args: ['track',] }],
dotsList: [{ type: ContentChildren, args: [NgslCarouselDotDirective,] }],
dotElements: [{ type: ViewChildren, args: [CarouselDotElement, { read: ElementRef },] }],
dotTrack: [{ type: ViewChild, args: ['dotTrack',] }],
timing: [{ type: Input }],
rewindTiming: [{ type: Input }],
arrows: [{ type: Input }],
dots: [{ type: Input }],
infinity: [{ type: Input }],
dynamicTiming: [{ type: Input }],
autoplay: [{ type: Input }],
perView: [{ type: Input }]
};
if (false) {
/** @type {?} */
NgslCarouselComponent.prototype.items;
/** @type {?} */
NgslCarouselComponent.prototype.itemsElements;
/** @type {?} */
NgslCarouselComponent.prototype.carousel;
/** @type {?} */
NgslCarouselComponent.prototype.dotsList;
/** @type {?} */
NgslCarouselComponent.prototype.dotElements;
/** @type {?} */
NgslCarouselComponent.prototype.dotTrack;
/** @type {?} */
NgslCarouselComponent.prototype.timing;
/** @type {?} */
NgslCarouselComponent.prototype.rewindTiming;
/** @type {?} */
NgslCarouselComponent.prototype.arrows;
/** @type {?} */
NgslCarouselComponent.prototype.dots;
/** @type {?} */
NgslCarouselComponent.prototype.infinity;
/** @type {?} */
NgslCarouselComponent.prototype.dynamicTiming;
/** @type {?} */
NgslCarouselComponent.prototype.autoplay;
/** @type {?} */
NgslCarouselComponent.prototype.perView;
/** @type {?} */
NgslCarouselComponent.prototype.player;
/** @type {?} */
NgslCarouselComponent.prototype.action;
/** @type {?} */
NgslCarouselComponent.prototype.currentSlide;
/** @type {?} */
NgslCarouselComponent.prototype.prevSlide;
/** @type {?} */
NgslCarouselComponent.prototype.nextSlide;
/** @type {?} */
NgslCarouselComponent.prototype.trackWidth;
/** @type {?} */
NgslCarouselComponent.prototype.builder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbC1jYXJvdXNlbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3NsLWNhcm91c2VsLyIsInNvdXJjZXMiOlsic3JjL2FwcC9uZ3NsLWNhcm91c2VsL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsT0FBTyxFQUNQLGdCQUFnQixFQUdoQixLQUFLLEVBQ04sTUFBTSxxQkFBcUIsQ0FBQztBQUU3QjtBQUtBLE1BQU07OztZQUxMLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLCtCQUErQjthQUMxQzs7QUFHRDtBQUtBLE1BQU07OztZQUxMLFNBQVMsU0FBQzs7Z0JBRVQsUUFBUSxFQUFFLDhCQUE4QjthQUN6Qzs7QUFXRCxNQUFNOzs7O0lBZ0hKLFlBQW9CLE9BQXlCO1FBQXpCLFlBQU8sR0FBUCxPQUFPLENBQWtCOzs7c0JBbEczQixHQUFHOzRCQUNHLEdBQUc7c0JBQ1QsSUFBSTtvQkFDTixJQUFJO3dCQUNBLElBQUk7NkJBQ0MsS0FBSzt3QkFDVixJQUFJO3VCQUNMLENBQUM7c0JBR0gsSUFBSTs0QkFDTixDQUFDO3lCQUNKLElBQUk7eUJBQ0osSUFBSTswQkFDSCxFQUFFO0tBb0ZrQzs7Ozs7SUFsRnpDLGNBQWMsQ0FBQyxNQUFNOztRQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFB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U0FBUyxTQUFDOztnQkFFVCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLDhoQ0FBNkM7O2FBRTlDOzs7O1lBekJDLGdCQUFnQjs7O29CQTRCZixlQUFlLFNBQUMseUJBQXlCOzRCQUN6QyxZQUFZLFNBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO3VCQUN0RCxTQUFTLFNBQUMsT0FBTzt1QkFJakIsZUFBZSxTQUFDLHdCQUF3QjswQkFDeEMsWUFBWSxTQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTt1QkFDckQsU0FBUyxTQUFDLFVBQVU7cUJBSXBCLEtBQUs7MkJBQ0wsS0FBSztxQkFDTCxLQUFLO21CQUNMLEtBQUs7dUJBQ0wsS0FBSzs0QkFDTCxLQUFLO3VCQUNMLEtBQUs7c0JBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSB9IGZyb20gJy4vbmdzbC1jYXJvdXNlbC1kb3QuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIGFuaW1hdGUsXG4gIEFuaW1hdGlvbkJ1aWxkZXIsXG4gIEFuaW1hdGlvbkZhY3RvcnksXG4gIEFuaW1hdGlvblBsYXllcixcbiAgc3R5bGVcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnLm5nc2wtY2Fyb3VzZWwtaXRlbS1kaXJlY3RpdmUnXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbEl0ZW1FbGVtZW50IHt9XG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJy5uZ3NsLWNhcm91c2VsLWRvdC1kaXJlY3RpdmUnXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDYXJvdXNlbERvdEVsZW1lbnQge31cblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICduZ3NsLWNhcm91c2VsJyxcbiAgZXhwb3J0QXM6ICduZ3NsLWNhcm91c2VsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmdzbENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIC8qIGNhcm91c2VsIHN0YXJ0IGl0ZW0gKi9cbiAgQENvbnRlbnRDaGlsZHJlbihOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlKSBpdGVtczogUXVlcnlMaXN0PE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmU+O1xuICBAVmlld0NoaWxkcmVuKENhcm91c2VsSXRlbUVsZW1lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIGl0ZW1zRWxlbWVudHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgndHJhY2snKSBwcml2YXRlIGNhcm91c2VsOiBFbGVtZW50UmVmO1xuICAvKiBjYXJvdXNlbCBlbmQgaXRlbSAqL1xuXG4gIC8qIGNhcm91c2VsIHN0YXJ0IGRvdCAqL1xuICBAQ29udGVudENoaWxkcmVuKE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSkgZG90c0xpc3Q6IFF1ZXJ5TGlzdDxOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmU+O1xuICBAVmlld0NoaWxkcmVuKENhcm91c2VsRG90RWxlbWVudCwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHByaXZhdGUgZG90RWxlbWVudHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnZG90VHJhY2snKSBwcml2YXRlIGRvdFRyYWNrOiBFbGVtZW50UmVmO1xuICAvKiBjYXJvdXNlbCBlbmQgZG90ICovXG5cbiAgLyogSW5wdXQgcHJvcHMgc3RhcnQqL1xuICBASW5wdXQoKSB0aW1pbmcgPSA0NTA7XG4gIEBJbnB1dCgpIHJld2luZFRpbWluZyA9IDkwMDtcbiAgQElucHV0KCkgYXJyb3dzID0gdHJ1ZTtcbiAgQElucHV0KCkgZG90cyA9IHRydWU7XG4gIEBJbnB1dCgpIGluZmluaXR5ID0gdHJ1ZTtcbiAgQElucHV0KCkgZHluYW1pY1RpbWluZyA9IGZhbHNlO1xuICBASW5wdXQoKSBhdXRvcGxheSA9IHRydWU7XG4gIEBJbnB1dCgpIHBlclZpZXcgPSAxO1xuICAvKiBJbnB1dCBwcm9wcyBlbmQqL1xuICBwcml2YXRlIHBsYXllcjogQW5pbWF0aW9uUGxheWVyO1xuICBwcml2YXRlIGFjdGlvbiA9IG51bGw7XG4gIGN1cnJlbnRTbGlkZSA9IDA7XG4gIHByZXZTbGlkZSA9IG51bGw7XG4gIG5leHRTbGlkZSA9IG51bGw7XG4gIHRyYWNrV2lkdGggPSB7fTtcblxuICBwcml2YXRlIGJ1aWxkQW5pbWF0aW9uKG9mZnNldCkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5hY3Rpb24gPT09ICdSRVdJTkQnID8gdGhpcy5yZXdpbmRUaW1pbmcgOiB0aGlzLnRpbWluZztcbiAgICByZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkKFtcbiAgICAgIGFuaW1hdGUoYCR7ZHVyYXRpb259bXMgY3ViaWMtYmV6aWVyKDAuMTY1LCAwLjg0MCwgMC40NDAsIDEuMDAwKWAsIHN0eWxlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke29mZnNldH0lKWAgfSkpXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIGNoYW5nZVNsaWRlKGFjdGlvbikge1xuICAgIHRoaXMuc2V0U2xpZGVzSW5kZXgoKTtcbiAgICBjb25zdCBpdGVtVyA9ICgxMDAgLyB0aGlzLml0ZW1zLmxlbmd0aCkgLyB0aGlzLnBlclZpZXc7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKGl0ZW1XICogdGhpcy5jdXJyZW50U2xpZGUpICogdGhpcy5wZXJWaWV3O1xuICAgIGNvbnN0IG15QW5pbWF0aW9uOiBBbmltYXRpb25GYWN0b3J5ID0gdGhpcy5idWlsZEFuaW1hdGlvbigtb2Zmc2V0KTtcbiAgICB0aGlzLnBsYXllciA9IG15QW5pbWF0aW9uLmNyZWF0ZSh0aGlzLmNhcm91c2VsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAvLyBjb25zb2xlLmxvZyhgY2hhbmdlU2xpZGUgYWN0aW9uOiAke2FjdGlvbn0sIGlzIGN1cnJlbnQgc2xpZGU6IGAsIHRoaXMuY3VycmVudFNsaWRlICsgMSk7XG4gIH1cblxuICBnb1RvU2xpZGUoaW5kZXgpIHtcbiAgICBpZiAodGhpcy5keW5hbWljVGltaW5nKSB7XG4gICAgICAvLyDQkiDRgNCw0LfRgNCw0LHQvtGC0LrQtSwg0YLQtdGB0YLQvtCy0LDRjyDQvtC/0YbQuNGPXG4gICAgICB0aGlzLnRpbWluZyA9IHRoaXMudGltaW5nICsgKDU1ICogKGluZGV4IC0gdGhpcy5jdXJyZW50U2xpZGUpKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U2xpZGUgPSBpbmRleDtcbiAgICB0aGlzLmNoYW5nZVNsaWRlKCdnbyB0byBzbGlkZScpO1xuICB9XG5cbiAgbmV4dCgpIHtcbiAgICBjb25zdCBjb3VudFNsaWRlcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSArIDEgPT09IGNvdW50U2xpZGVzICYmIHRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gMDtcbiAgICAgIHRoaXMuYWN0aW9uID0gJ1JFV0lORCc7XG4gICAgICB0aGlzLmNoYW5nZVNsaWRlKCdyZXdpbmQgdG8gZmlyc3Qgc2xpZGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlICsgMSA9PT0gY291bnRTbGlkZXMgJiYgIXRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRTbGlkZSsrO1xuICAgIHRoaXMuYWN0aW9uID0gJ05FWFRfU0xJREUnO1xuICAgIHRoaXMuY2hhbmdlU2xpZGUoJ25leHQgc2xpZGUnKTtcbiAgfVxuXG4gIHByZXYoKSB7XG4gICAgY29uc3QgY291bnRTbGlkZXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgPT09IDAgJiYgdGhpcy5pbmZpbml0eSkge1xuICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSBjb3VudFNsaWRlcyAtIDE7XG4gICAgICB0aGlzLmFjdGlvbiA9ICdSRVdJTkQnO1xuICAgICAgdGhpcy5jaGFuZ2VTbGlkZSgncmV3aW5kIHRvIGxhc3Qgc2xpZGUnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlID09PSAwICYmICF0aGlzLmluZmluaXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50U2xpZGUtLTtcbiAgICB0aGlzLmFjdGlvbiA9ICdQUkVWX1NMSURFJztcbiAgICB0aGlzLmNoYW5nZVNsaWRlKCdwcmV2IHNsaWRlJyk7XG4gIH1cblxuICBwcml2YXRlIHNldFNsaWRlc0luZGV4KCkge1xuICAgIHRoaXMucHJldlNsaWRlID0gdGhpcy5jdXJyZW50U2xpZGUgPT09IDAgPyB0aGlzLml0ZW1zLmxlbmd0aCAtIDEgOiB0aGlzLmN1cnJlbnRTbGlkZSAtIDE7XG4gICAgdGhpcy5uZXh0U2xpZGUgPSB0aGlzLmN1cnJlbnRTbGlkZSA9PT0gdGhpcy5pdGVtcy5sZW5ndGggLSAxID8gMCA6IHRoaXMuY3VycmVudFNsaWRlICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRG90c0luRG9tRWxlbWVudHMoKSB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBlclZpZXcgPiAxID8gdGhpcy5kb3RzTGlzdC5sZW5ndGggLSB0aGlzLnBlclZpZXcgOiBudWxsO1xuICAgIHRoaXMuZG90c0xpc3QudG9BcnJheSgpLmZvckVhY2goKGRvdCwgaSkgPT4ge1xuICAgICAgaWYgKGkgPiBwb3NpdGlvbikgeyBkb3QuaXNWaXNpYmxlID0gZmFsc2U7IH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5pdFZhbHVlcygpIHtcbiAgICB0aGlzLnNldFNsaWRlc0luZGV4KCk7XG4gICAgaWYgKHRoaXMucGVyVmlldyA+IDEpIHtcbiAgICAgIHRoaXMucmVtb3ZlRG90c0luRG9tRWxlbWVudHMoKTtcbiAgICB9XG4gICAgdGhpcy50cmFja1dpZHRoID0ge1xuICAgICAgd2lkdGg6IGAkeygxMDAgKiB0aGlzLml0ZW1zLmxlbmd0aCkgLyB0aGlzLnBlclZpZXd9JWBcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnNldEluaXRWYWx1ZXMoKTtcbiAgfVxufVxuIl19