ngsl-carousel
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.2.4.
312 lines (304 loc) • 26.9 kB
JavaScript
import { Directive, TemplateRef, Component, ContentChildren, ElementRef, Input, ViewChild, ViewChildren, NgModule } from '@angular/core';
import { animate, AnimationBuilder, style } from '@angular/animations';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgslCarouselItemDirective = /** @class */ (function () {
function NgslCarouselItemDirective(tpl) {
this.tpl = tpl;
}
NgslCarouselItemDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '[ngslCarouselItem]'
},] }
];
/** @nocollapse */
NgslCarouselItemDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return NgslCarouselItemDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgslCarouselDotDirective = /** @class */ (function () {
function NgslCarouselDotDirective(tpl) {
this.tpl = tpl;
this.isVisible = true;
}
NgslCarouselDotDirective.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '[ngslCarouselDot]'
},] }
];
/** @nocollapse */
NgslCarouselDotDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
return NgslCarouselDotDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var CarouselItemElement = /** @class */ (function () {
function CarouselItemElement() {
}
CarouselItemElement.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '.ngsl-carousel-item-directive'
},] }
];
return CarouselItemElement;
}());
var CarouselDotElement = /** @class */ (function () {
function CarouselDotElement() {
}
CarouselDotElement.decorators = [
{ type: Directive, args: [{
// tslint:disable-next-line:directive-selector
selector: '.ngsl-carousel-dot-directive'
},] }
];
return CarouselDotElement;
}());
var NgslCarouselComponent = /** @class */ (function () {
function NgslCarouselComponent(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 {?}
*/
NgslCarouselComponent.prototype.buildAnimation = /**
* @param {?} offset
* @return {?}
*/
function (offset) {
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.changeSlide = /**
* @param {?} action
* @return {?}
*/
function (action) {
this.setSlidesIndex();
/** @type {?} */
var itemW = (100 / this.items.length) / this.perView;
/** @type {?} */
var offset = (itemW * this.currentSlide) * this.perView;
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.goToSlide = /**
* @param {?} index
* @return {?}
*/
function (index) {
if (this.dynamicTiming) {
// В разработке, тестовая опция
this.timing = this.timing + (55 * (index - this.currentSlide));
}
this.currentSlide = index;
this.changeSlide('go to slide');
};
/**
* @return {?}
*/
NgslCarouselComponent.prototype.next = /**
* @return {?}
*/
function () {
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.prev = /**
* @return {?}
*/
function () {
/** @type {?} */
var 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 {?}
*/
NgslCarouselComponent.prototype.setSlidesIndex = /**
* @return {?}
*/
function () {
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 {?}
*/
NgslCarouselComponent.prototype.removeDotsInDomElements = /**
* @return {?}
*/
function () {
/** @type {?} */
var position = this.perView > 1 ? this.dotsList.length - this.perView : null;
this.dotsList.toArray().forEach(function (dot, i) {
if (i > position) {
dot.isVisible = false;
}
});
};
/**
* @return {?}
*/
NgslCarouselComponent.prototype.setInitValues = /**
* @return {?}
*/
function () {
this.setSlidesIndex();
if (this.perView > 1) {
this.removeDotsInDomElements();
}
this.trackWidth = {
width: (100 * this.items.length) / this.perView + "%"
};
};
/**
* @return {?}
*/
NgslCarouselComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
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 = function () { return [
{ 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 }]
};
return NgslCarouselComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var NgslCarouselModule = /** @class */ (function () {
function NgslCarouselModule() {
}
NgslCarouselModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
],
declarations: [
NgslCarouselComponent,
NgslCarouselItemDirective,
NgslCarouselDotDirective,
CarouselItemElement,
CarouselDotElement
],
exports: [
NgslCarouselComponent,
NgslCarouselItemDirective,
NgslCarouselDotDirective,
CarouselItemElement,
CarouselDotElement
]
},] }
];
return NgslCarouselModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { NgslCarouselModule, NgslCarouselDotDirective as ɵe, NgslCarouselItemDirective as ɵd, CarouselDotElement as ɵb, CarouselItemElement as ɵa, NgslCarouselComponent as ɵc };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbC1jYXJvdXNlbC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC1pdGVtLmRpcmVjdGl2ZS50cyIsIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC1kb3QuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3NsLWNhcm91c2VsL3NyYy9hcHAvbmdzbC1jYXJvdXNlbC9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudC50cyIsIm5nOi8vbmdzbC1jYXJvdXNlbC9zcmMvYXBwL25nc2wtY2Fyb3VzZWwvbmdzbC1jYXJvdXNlbC5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tuZ3NsQ2Fyb3VzZWxJdGVtXSdcbn0pXG5leHBvcnQgY2xhc3MgTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0cGw6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW25nc2xDYXJvdXNlbERvdF0nXG59KVxuZXhwb3J0IGNsYXNzIE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSB7XG4gIGlzVmlzaWJsZSA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0cGw6IFRlbXBsYXRlUmVmPGFueT4pIHt9XG59XG4iLCJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSB9IGZyb20gJy4vbmdzbC1jYXJvdXNlbC1pdGVtLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwtZG90LmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBhbmltYXRlLFxuICBBbmltYXRpb25CdWlsZGVyLFxuICBBbmltYXRpb25GYWN0b3J5LFxuICBBbmltYXRpb25QbGF5ZXIsXG4gIHN0eWxlXG59IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJy5uZ3NsLWNhcm91c2VsLWl0ZW0tZGlyZWN0aXZlJ1xufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ2Fyb3VzZWxJdGVtRWxlbWVudCB7fVxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICcubmdzbC1jYXJvdXNlbC1kb3QtZGlyZWN0aXZlJ1xufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ2Fyb3VzZWxEb3RFbGVtZW50IHt9XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbmdzbC1jYXJvdXNlbCcsXG4gIGV4cG9ydEFzOiAnbmdzbC1jYXJvdXNlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3NsLWNhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmdzbC1jYXJvdXNlbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5nc2xDYXJvdXNlbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICAvKiBjYXJvdXNlbCBzdGFydCBpdGVtICovXG4gIEBDb250ZW50Q2hpbGRyZW4oTmdzbENhcm91c2VsSXRlbURpcmVjdGl2ZSkgaXRlbXM6IFF1ZXJ5TGlzdDxOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlPjtcbiAgQFZpZXdDaGlsZHJlbihDYXJvdXNlbEl0ZW1FbGVtZW50LCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgcHJpdmF0ZSBpdGVtc0VsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ3RyYWNrJykgcHJpdmF0ZSBjYXJvdXNlbDogRWxlbWVudFJlZjtcbiAgLyogY2Fyb3VzZWwgZW5kIGl0ZW0gKi9cblxuICAvKiBjYXJvdXNlbCBzdGFydCBkb3QgKi9cbiAgQENvbnRlbnRDaGlsZHJlbihOZ3NsQ2Fyb3VzZWxEb3REaXJlY3RpdmUpIGRvdHNMaXN0OiBRdWVyeUxpc3Q8TmdzbENhcm91c2VsRG90RGlyZWN0aXZlPjtcbiAgQFZpZXdDaGlsZHJlbihDYXJvdXNlbERvdEVsZW1lbnQsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBwcml2YXRlIGRvdEVsZW1lbnRzOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG4gIEBWaWV3Q2hpbGQoJ2RvdFRyYWNrJykgcHJpdmF0ZSBkb3RUcmFjazogRWxlbWVudFJlZjtcbiAgLyogY2Fyb3VzZWwgZW5kIGRvdCAqL1xuXG4gIC8qIElucHV0IHByb3BzIHN0YXJ0Ki9cbiAgQElucHV0KCkgdGltaW5nID0gNDUwO1xuICBASW5wdXQoKSByZXdpbmRUaW1pbmcgPSA5MDA7XG4gIEBJbnB1dCgpIGFycm93cyA9IHRydWU7XG4gIEBJbnB1dCgpIGRvdHMgPSB0cnVlO1xuICBASW5wdXQoKSBpbmZpbml0eSA9IHRydWU7XG4gIEBJbnB1dCgpIGR5bmFtaWNUaW1pbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b3BsYXkgPSB0cnVlO1xuICBASW5wdXQoKSBwZXJWaWV3ID0gMTtcbiAgLyogSW5wdXQgcHJvcHMgZW5kKi9cbiAgcHJpdmF0ZSBwbGF5ZXI6IEFuaW1hdGlvblBsYXllcjtcbiAgcHJpdmF0ZSBhY3Rpb24gPSBudWxsO1xuICBjdXJyZW50U2xpZGUgPSAwO1xuICBwcmV2U2xpZGUgPSBudWxsO1xuICBuZXh0U2xpZGUgPSBudWxsO1xuICB0cmFja1dpZHRoID0ge307XG5cbiAgcHJpdmF0ZSBidWlsZEFuaW1hdGlvbihvZmZzZXQpIHtcbiAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMuYWN0aW9uID09PSAnUkVXSU5EJyA/IHRoaXMucmV3aW5kVGltaW5nIDogdGhpcy50aW1pbmc7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZChbXG4gICAgICBhbmltYXRlKGAke2R1cmF0aW9ufW1zIGN1YmljLWJlemllcigwLjE2NSwgMC44NDAsIDAuNDQwLCAxLjAwMClgLCBzdHlsZSh7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZVgoJHtvZmZzZXR9JSlgIH0pKVxuICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VTbGlkZShhY3Rpb24pIHtcbiAgICB0aGlzLnNldFNsaWRlc0luZGV4KCk7XG4gICAgY29uc3QgaXRlbVcgPSAoMTAwIC8gdGhpcy5pdGVtcy5sZW5ndGgpIC8gdGhpcy5wZXJWaWV3O1xuICAgIGNvbnN0IG9mZnNldCA9IChpdGVtVyAqIHRoaXMuY3VycmVudFNsaWRlKSAqIHRoaXMucGVyVmlldztcbiAgICBjb25zdCBteUFuaW1hdGlvbjogQW5pbWF0aW9uRmFjdG9yeSA9IHRoaXMuYnVpbGRBbmltYXRpb24oLW9mZnNldCk7XG4gICAgdGhpcy5wbGF5ZXIgPSBteUFuaW1hdGlvbi5jcmVhdGUodGhpcy5jYXJvdXNlbC5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLnBsYXllci5wbGF5KCk7XG4gICAgLy8gY29uc29sZS5sb2coYGNoYW5nZVNsaWRlIGFjdGlvbjogJHthY3Rpb259LCBpcyBjdXJyZW50IHNsaWRlOiBgLCB0aGlzLmN1cnJlbnRTbGlkZSArIDEpO1xuICB9XG5cbiAgZ29Ub1NsaWRlKGluZGV4KSB7XG4gICAgaWYgKHRoaXMuZHluYW1pY1RpbWluZykge1xuICAgICAgLy8gw5DCkiDDkcKAw5DCsMOQwrfDkcKAw5DCsMOQwrHDkMK+w5HCgsOQwrrDkMK1LCDDkcKCw5DCtcORwoHDkcKCw5DCvsOQwrLDkMKww5HCjyDDkMK+w5DCv8ORwobDkMK4w5HCj1xuICAgICAgdGhpcy50aW1pbmcgPSB0aGlzLnRpbWluZyArICg1NSAqIChpbmRleCAtIHRoaXMuY3VycmVudFNsaWRlKSk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFNsaWRlID0gaW5kZXg7XG4gICAgdGhpcy5jaGFuZ2VTbGlkZSgnZ28gdG8gc2xpZGUnKTtcbiAgfVxuXG4gIG5leHQoKSB7XG4gICAgY29uc3QgY291bnRTbGlkZXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgICBpZiAodGhpcy5jdXJyZW50U2xpZGUgKyAxID09PSBjb3VudFNsaWRlcyAmJiB0aGlzLmluZmluaXR5KSB7XG4gICAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IDA7XG4gICAgICB0aGlzLmFjdGlvbiA9ICdSRVdJTkQnO1xuICAgICAgdGhpcy5jaGFuZ2VTbGlkZSgncmV3aW5kIHRvIGZpcnN0IHNsaWRlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSArIDEgPT09IGNvdW50U2xpZGVzICYmICF0aGlzLmluZmluaXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50U2xpZGUrKztcbiAgICB0aGlzLmFjdGlvbiA9ICdORVhUX1NMSURFJztcbiAgICB0aGlzLmNoYW5nZVNsaWRlKCduZXh0IHNsaWRlJyk7XG4gIH1cblxuICBwcmV2KCkge1xuICAgIGNvbnN0IGNvdW50U2xpZGVzID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgaWYgKHRoaXMuY3VycmVudFNsaWRlID09PSAwICYmIHRoaXMuaW5maW5pdHkpIHtcbiAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gY291bnRTbGlkZXMgLSAxO1xuICAgICAgdGhpcy5hY3Rpb24gPSAnUkVXSU5EJztcbiAgICAgIHRoaXMuY2hhbmdlU2xpZGUoJ3Jld2luZCB0byBsYXN0IHNsaWRlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmN1cnJlbnRTbGlkZSA9PT0gMCAmJiAhdGhpcy5pbmZpbml0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFNsaWRlLS07XG4gICAgdGhpcy5hY3Rpb24gPSAnUFJFVl9TTElERSc7XG4gICAgdGhpcy5jaGFuZ2VTbGlkZSgncHJldiBzbGlkZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTbGlkZXNJbmRleCgpIHtcbiAgICB0aGlzLnByZXZTbGlkZSA9IHRoaXMuY3VycmVudFNsaWRlID09PSAwID8gdGhpcy5pdGVtcy5sZW5ndGggLSAxIDogdGhpcy5jdXJyZW50U2xpZGUgLSAxO1xuICAgIHRoaXMubmV4dFNsaWRlID0gdGhpcy5jdXJyZW50U2xpZGUgPT09IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSA/IDAgOiB0aGlzLmN1cnJlbnRTbGlkZSArIDE7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdHNJbkRvbUVsZW1lbnRzKCkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5wZXJWaWV3ID4gMSA/IHRoaXMuZG90c0xpc3QubGVuZ3RoIC0gdGhpcy5wZXJWaWV3IDogbnVsbDtcbiAgICB0aGlzLmRvdHNMaXN0LnRvQXJyYXkoKS5mb3JFYWNoKChkb3QsIGkpID0+IHtcbiAgICAgIGlmIChpID4gcG9zaXRpb24pIHsgZG90LmlzVmlzaWJsZSA9IGZhbHNlOyB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRWYWx1ZXMoKSB7XG4gICAgdGhpcy5zZXRTbGlkZXNJbmRleCgpO1xuICAgIGlmICh0aGlzLnBlclZpZXcgPiAxKSB7XG4gICAgICB0aGlzLnJlbW92ZURvdHNJbkRvbUVsZW1lbnRzKCk7XG4gICAgfVxuICAgIHRoaXMudHJhY2tXaWR0aCA9IHtcbiAgICAgIHdpZHRoOiBgJHsoMTAwICogdGhpcy5pdGVtcy5sZW5ndGgpIC8gdGhpcy5wZXJWaWV3fSVgXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYnVpbGRlcjogQW5pbWF0aW9uQnVpbGRlcikge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zZXRJbml0VmFsdWVzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdzbENhcm91c2VsQ29tcG9uZW50LCBDYXJvdXNlbEl0ZW1FbGVtZW50LCBDYXJvdXNlbERvdEVsZW1lbnQgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwuY29tcG9uZW50JztcbmltcG9ydCB7IE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL25nc2wtY2Fyb3VzZWwtaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTmdzbENhcm91c2VsRG90RGlyZWN0aXZlIH0gZnJvbSAnLi9uZ3NsLWNhcm91c2VsLWRvdC5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIE5nc2xDYXJvdXNlbENvbXBvbmVudCxcbiAgICBOZ3NsQ2Fyb3VzZWxJdGVtRGlyZWN0aXZlLFxuICAgIE5nc2xDYXJvdXNlbERvdERpcmVjdGl2ZSxcbiAgICBDYXJvdXNlbEl0ZW1FbGVtZW50LFxuICAgIENhcm91c2VsRG90RWxlbWVudFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgTmdzbENhcm91c2VsQ29tcG9uZW50LFxuICAgIE5nc2xDYXJvdXNlbEl0ZW1EaXJlY3RpdmUsXG4gICAgTmdzbENhcm91c2VsRG90RGlyZWN0aXZlLFxuICAgIENhcm91c2VsSXRlbUVsZW1lbnQsXG4gICAgQ2Fyb3VzZWxEb3RFbGVtZW50XG4gIF1cblxufSlcbmV4cG9ydCBjbGFzcyBOZ3NsQ2Fyb3VzZWxNb2R1bGUgeyB9XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtJQU9FLG1DQUFtQixHQUFxQjtRQUFyQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtLQUFJOztnQkFMN0MsU0FBUyxTQUFDOztvQkFFVCxRQUFRLEVBQUUsb0JBQW9CO2lCQUMvQjs7OztnQkFMbUIsV0FBVzs7b0NBQS9COzs7Ozs7O0FDQUE7SUFRRSxrQ0FBbUIsR0FBcUI7UUFBckIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7eUJBRDVCLElBQUk7S0FDNEI7O2dCQU43QyxTQUFTLFNBQUM7O29CQUVULFFBQVEsRUFBRSxtQkFBbUI7aUJBQzlCOzs7O2dCQUxtQixXQUFXOzttQ0FBL0I7Ozs7Ozs7QUNBQTs7OztnQkFzQkMsU0FBUyxTQUFDOztvQkFFVCxRQUFRLEVBQUUsK0JBQStCO2lCQUMxQzs7OEJBekJEOzs7Ozs7Z0JBNEJDLFNBQVMsU0FBQzs7b0JBRVQsUUFBUSxFQUFFLDhCQUE4QjtpQkFDekM7OzZCQS9CRDs7O0lBMEpFLCtCQUFvQixPQUF5QjtRQUF6QixZQUFPLEdBQVAsT0FBTyxDQUFrQjs7O3NCQWxHM0IsR0FBRzs0QkFDRyxHQUFHO3NCQUNULElBQUk7b0JBQ04sSUFBSTt3QkFDQSxJQUFJOzZCQUNDLEtBQUs7d0JBQ1YsSUFBSTt1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