UNPKG

@3kles/kles-ng-carousel

Version:

@3kles/kles-ng-carousel is a angular library to create carousel.

104 lines 19.9 kB
import { Component, Input } from '@angular/core'; import { trigger, transition, useAnimation } from '@angular/animations'; import { AnimationType, scaleIn, scaleOut, fadeIn, fadeOut, flipIn, flipOut, jackIn, jackOut } from './carousel.animations'; import { IndicatorsPosition } from './carousel.position'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class KlesCarouselComponent { constructor() { this.animationType = AnimationType.Fade; this.indicatorsPosition = IndicatorsPosition.On; this.indicatorsPositionEnum = IndicatorsPosition; this.currentSlide = 0; } onPreviousClick() { const previous = this.currentSlide - 1; this.currentSlide = previous < 0 ? this.slides.length - 1 : previous; } onNextClick() { const next = this.currentSlide + 1; this.currentSlide = next === this.slides.length ? 0 : next; } onClickIndicator(index) { console.log('ici', index); const next = index; this.currentSlide = next === this.slides.length ? 0 : next; } ngOnInit() { } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KlesCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: KlesCarouselComponent, selector: "kles-carousel", inputs: { slides: "slides", animationType: "animationType", indicatorsPosition: "indicatorsPosition" }, ngImport: i0, template: "<!-- carousel -->\n<div class=\"carousel\" [ngClass]=\"indicatorsPosition === indicatorsPositionEnum.Below ? 'carousel-indicators' : ''\">\n @for (slide of slides; track slide.src) {\n @if ($index === currentSlide) {\n <img [src]=\"slide.src\" class=\"slide\" [@slideAnimation]=\"animationType\"/>\n }\n }\n\n <!-- controls -->\n <button class=\"control prev\" (click)=\"onPreviousClick()\">\n <span class=\"arrow left\"></span>\n </button>\n <button class=\"control next\" (click)=\"onNextClick()\">\n <span class=\"arrow right\"></span>\n </button>\n\n @if (indicatorsPosition === indicatorsPositionEnum.On) {\n <ul class=\"indicators inside\">\n @for (slide of slides; track slide.src) {\n <li [ngClass]=\"{'active': currentSlide === $index }\" (click)=\"onClickIndicator($index)\"></li>\n }\n </ul>\n }\n</div>\n\n@if (indicatorsPosition === indicatorsPositionEnum.Below) {\n <ul class=\"indicators\">\n @for (slide of slides; track slide.src) {\n <li [ngClass]=\"{'active': currentSlide === $index }\" (click)=\"onClickIndicator($index)\"></li>\n }\n </ul>\n}", styles: [":host{flex:1;height:100%}.carousel{position:relative;min-height:200px;height:100%;width:inherit;overflow:hidden;border-radius:.5em}.carousel-indicators{height:calc(100% - 32px)}.slide{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;transition:transform .15s cubic-bezier(.25,.46,.45,.84);border-radius:.5em}.slide:hover{transform:scale(1.1)}.control{border:none;background-color:transparent;outline:0;position:absolute;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.5em;color:#fff;font-weight:700;font-size:3em;-webkit-user-select:none;user-select:none;height:100%;opacity:80%;transition:opacity .15s cubic-bezier(.25,.46,.45,.84)}.control:hover,.control:focus{opacity:1}.control.next{right:0}.control.prev{left:0}.arrow{display:block;border-left:.1em solid rgba(0,0,0,.24);border-bottom:.1em solid rgba(0,0,0,.24);width:.5em;height:.5em}.arrow.left{transform:rotate(45deg)}.arrow.right{transform:rotate(225deg)}.indicators{list-style:none;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;right:0;left:0;display:flex}.inside{position:absolute;bottom:10px}.indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:25px;height:4px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:#b9b9b94d;-webkit-box-shadow:0px 0px 3px 0px rgba(0,0,0,.65);-moz-box-shadow:0px 0px 3px 0px rgba(0,0,0,.65);box-shadow:0 0 3px #000000a6;cursor:pointer}.indicators .active{background-color:#fff}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [ trigger('slideAnimation', [ /* scale */ transition('void => scale', [ useAnimation(scaleIn, { params: { time: '500ms' } }) ]), transition('scale => void', [ useAnimation(scaleOut, { params: { time: '500ms' } }) ]), /* fade */ transition('void => fade', [ useAnimation(fadeIn, { params: { time: '500ms' } }) ]), transition('fade => void', [ useAnimation(fadeOut, { params: { time: '500ms' } }) ]), /* flip */ transition('void => flip', [ useAnimation(flipIn, { params: { time: '500ms' } }) ]), transition('flip => void', [ useAnimation(flipOut, { params: { time: '500ms' } }) ]), /* JackInTheBox */ transition('void => jackInTheBox', [ useAnimation(jackIn, { params: { time: '700ms' } }) ]), transition('jackInTheBox => void', [ useAnimation(jackOut, { params: { time: '700ms' } }) ]) ]) ] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KlesCarouselComponent, decorators: [{ type: Component, args: [{ selector: 'kles-carousel', animations: [ trigger('slideAnimation', [ /* scale */ transition('void => scale', [ useAnimation(scaleIn, { params: { time: '500ms' } }) ]), transition('scale => void', [ useAnimation(scaleOut, { params: { time: '500ms' } }) ]), /* fade */ transition('void => fade', [ useAnimation(fadeIn, { params: { time: '500ms' } }) ]), transition('fade => void', [ useAnimation(fadeOut, { params: { time: '500ms' } }) ]), /* flip */ transition('void => flip', [ useAnimation(flipIn, { params: { time: '500ms' } }) ]), transition('flip => void', [ useAnimation(flipOut, { params: { time: '500ms' } }) ]), /* JackInTheBox */ transition('void => jackInTheBox', [ useAnimation(jackIn, { params: { time: '700ms' } }) ]), transition('jackInTheBox => void', [ useAnimation(jackOut, { params: { time: '700ms' } }) ]) ]) ], template: "<!-- carousel -->\n<div class=\"carousel\" [ngClass]=\"indicatorsPosition === indicatorsPositionEnum.Below ? 'carousel-indicators' : ''\">\n @for (slide of slides; track slide.src) {\n @if ($index === currentSlide) {\n <img [src]=\"slide.src\" class=\"slide\" [@slideAnimation]=\"animationType\"/>\n }\n }\n\n <!-- controls -->\n <button class=\"control prev\" (click)=\"onPreviousClick()\">\n <span class=\"arrow left\"></span>\n </button>\n <button class=\"control next\" (click)=\"onNextClick()\">\n <span class=\"arrow right\"></span>\n </button>\n\n @if (indicatorsPosition === indicatorsPositionEnum.On) {\n <ul class=\"indicators inside\">\n @for (slide of slides; track slide.src) {\n <li [ngClass]=\"{'active': currentSlide === $index }\" (click)=\"onClickIndicator($index)\"></li>\n }\n </ul>\n }\n</div>\n\n@if (indicatorsPosition === indicatorsPositionEnum.Below) {\n <ul class=\"indicators\">\n @for (slide of slides; track slide.src) {\n <li [ngClass]=\"{'active': currentSlide === $index }\" (click)=\"onClickIndicator($index)\"></li>\n }\n </ul>\n}", styles: [":host{flex:1;height:100%}.carousel{position:relative;min-height:200px;height:100%;width:inherit;overflow:hidden;border-radius:.5em}.carousel-indicators{height:calc(100% - 32px)}.slide{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;transition:transform .15s cubic-bezier(.25,.46,.45,.84);border-radius:.5em}.slide:hover{transform:scale(1.1)}.control{border:none;background-color:transparent;outline:0;position:absolute;cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.5em;color:#fff;font-weight:700;font-size:3em;-webkit-user-select:none;user-select:none;height:100%;opacity:80%;transition:opacity .15s cubic-bezier(.25,.46,.45,.84)}.control:hover,.control:focus{opacity:1}.control.next{right:0}.control.prev{left:0}.arrow{display:block;border-left:.1em solid rgba(0,0,0,.24);border-bottom:.1em solid rgba(0,0,0,.24);width:.5em;height:.5em}.arrow.left{transform:rotate(45deg)}.arrow.right{transform:rotate(225deg)}.indicators{list-style:none;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;right:0;left:0;display:flex}.inside{position:absolute;bottom:10px}.indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:25px;height:4px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:#b9b9b94d;-webkit-box-shadow:0px 0px 3px 0px rgba(0,0,0,.65);-moz-box-shadow:0px 0px 3px 0px rgba(0,0,0,.65);box-shadow:0 0 3px #000000a6;cursor:pointer}.indicators .active{background-color:#fff}\n"] }] }], ctorParameters: () => [], propDecorators: { slides: [{ type: Input }], animationType: [{ type: Input }], indicatorsPosition: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMva2xlcy1uZy1jYXJvdXNlbC9zcmMvbGliL2Nhcm91c2VsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL2tsZXMtbmctY2Fyb3VzZWwvc3JjL2xpYi9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLE9BQU8sRUFDUCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sT0FBTyxFQUNQLE1BQU0sRUFDTixPQUFPLEVBQ1IsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBMEN6RCxNQUFNLE9BQU8scUJBQXFCO0lBU2hDO1FBUFMsa0JBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ25DLHVCQUFrQixHQUFHLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztRQUVwRCwyQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQztRQUU1QyxpQkFBWSxHQUFHLENBQUMsQ0FBQztJQUVELENBQUM7SUFFakIsZUFBZTtRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkUsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFN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QUFDLGNBQWMsRUFBRTtnQ0FDekIsWUFBWSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDOzZCQUNwRCxDQUFDOzRCQUNGLFVBQVUsQ0FBQyxjQUFjLEVBQUU7Z0NBQ3pCLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQzs2QkFDckQsQ0FBQzs0QkFFRixVQUFVOzRCQUNWLFVBQVUsQ0FBQyxjQUFjLEVBQUU7Z0NBQ3pCLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQzs2QkFDcEQsQ0FBQzs0QkFDRixVQUFVLENBQUMsY0FBYyxFQUFFO2dDQUN6QixZQUFZLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7NkJBQ3JELENBQUM7NEJBRUYsa0JBQWtCOzRCQUNsQixVQUFVLENBQUMsc0JBQXNCLEVBQUU7Z0NBQ2pDLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQzs2QkFDcEQsQ0FBQzs0QkFDRixVQUFVLENBQUMsc0JBQXNCLEVBQUU7Z0NBQ2pDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQzs2QkFDckQsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIO3dEQUdRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgS2xlc1NsaWRlIH0gZnJvbSAnLi9jYXJvdXNlbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgdXNlQW5pbWF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbmltcG9ydCB7XG4gIEFuaW1hdGlvblR5cGUsXG4gIHNjYWxlSW4sXG4gIHNjYWxlT3V0LFxuICBmYWRlSW4sXG4gIGZhZGVPdXQsXG4gIGZsaXBJbixcbiAgZmxpcE91dCxcbiAgamFja0luLFxuICBqYWNrT3V0XG59IGZyb20gJy4vY2Fyb3VzZWwuYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBJbmRpY2F0b3JzUG9zaXRpb24gfSBmcm9tICcuL2Nhcm91c2VsLnBvc2l0aW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAna2xlcy1jYXJvdXNlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Nhcm91c2VsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdzbGlkZUFuaW1hdGlvbicsIFtcbiAgICAgIC8qIHNjYWxlICovXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IHNjYWxlJywgW1xuICAgICAgICB1c2VBbmltYXRpb24oc2NhbGVJbiwgeyBwYXJhbXM6IHsgdGltZTogJzUwMG1zJyB9IH0pXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oJ3NjYWxlID0+IHZvaWQnLCBbXG4gICAgICAgIHVzZUFuaW1hdGlvbihzY2FsZU91dCwgeyBwYXJhbXM6IHsgdGltZTogJzUwMG1zJyB9IH0pXG4gICAgICBdKSxcblxuICAgICAgLyogZmFkZSAqL1xuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiBmYWRlJywgW1xuICAgICAgICB1c2VBbmltYXRpb24oZmFkZUluLCB7IHBhcmFtczogeyB0aW1lOiAnNTAwbXMnIH0gfSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignZmFkZSA9PiB2b2lkJywgW1xuICAgICAgICB1c2VBbmltYXRpb24oZmFkZU91dCwgeyBwYXJhbXM6IHsgdGltZTogJzUwMG1zJyB9IH0pXG4gICAgICBdKSxcblxuICAgICAgLyogZmxpcCAqL1xuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiBmbGlwJywgW1xuICAgICAgICB1c2VBbmltYXRpb24oZmxpcEluLCB7IHBhcmFtczogeyB0aW1lOiAnNTAwbXMnIH0gfSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignZmxpcCA9PiB2b2lkJywgW1xuICAgICAgICB1c2VBbmltYXRpb24oZmxpcE91dCwgeyBwYXJhbXM6IHsgdGltZTogJzUwMG1zJyB9IH0pXG4gICAgICBdKSxcblxuICAgICAgLyogSmFja0luVGhlQm94ICovXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGphY2tJblRoZUJveCcsIFtcbiAgICAgICAgdXNlQW5pbWF0aW9uKGphY2tJbiwgeyBwYXJhbXM6IHsgdGltZTogJzcwMG1zJyB9IH0pXG4gICAgICBdKSxcbiAgICAgIHRyYW5zaXRpb24oJ2phY2tJblRoZUJveCA9PiB2b2lkJywgW1xuICAgICAgICB1c2VBbmltYXRpb24oamFja091dCwgeyBwYXJhbXM6IHsgdGltZTogJzcwMG1zJyB9IH0pXG4gICAgICBdKVxuICAgIF0pXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgS2xlc0Nhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2xpZGVzOiBLbGVzU2xpZGVbXTtcbiAgQElucHV0KCkgYW5pbWF0aW9uVHlwZSA9IEFuaW1hdGlvblR5cGUuRmFkZTtcbiAgQElucHV0KCkgaW5kaWNhdG9yc1Bvc2l0aW9uID0gSW5kaWNhdG9yc1Bvc2l0aW9uLk9uO1xuXG4gIGluZGljYXRvcnNQb3NpdGlvbkVudW0gPSBJbmRpY2F0b3JzUG9zaXRpb247XG5cbiAgY3VycmVudFNsaWRlID0gMDtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG9uUHJldmlvdXNDbGljaygpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuY3VycmVudFNsaWRlIC0gMTtcbiAgICB0aGlzLmN1cnJlbnRTbGlkZSA9IHByZXZpb3VzIDwgMCA/IHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEgOiBwcmV2aW91cztcbiAgfVxuXG4gIG9uTmV4dENsaWNrKCkge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmN1cnJlbnRTbGlkZSArIDE7XG4gICAgdGhpcy5jdXJyZW50U2xpZGUgPSBuZXh0ID09PSB0aGlzLnNsaWRlcy5sZW5ndGggPyAwIDogbmV4dDtcbiAgfVxuXG4gIG9uQ2xpY2tJbmRpY2F0b3IoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnNvbGUubG9nKCdpY2knLCBpbmRleClcbiAgICBjb25zdCBuZXh0ID0gaW5kZXg7XG4gICAgdGhpcy5jdXJyZW50U2xpZGUgPSBuZXh0ID09PSB0aGlzLnNsaWRlcy5sZW5ndGggPyAwIDogbmV4dDtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gIH1cbn1cbiIsIjwhLS0gY2Fyb3VzZWwgLS0+XG48ZGl2IGNsYXNzPVwiY2Fyb3VzZWxcIiBbbmdDbGFzc109XCJpbmRpY2F0b3JzUG9zaXRpb24gPT09IGluZGljYXRvcnNQb3NpdGlvbkVudW0uQmVsb3cgPyAnY2Fyb3VzZWwtaW5kaWNhdG9ycycgOiAnJ1wiPlxuICBAZm9yIChzbGlkZSBvZiBzbGlkZXM7IHRyYWNrIHNsaWRlLnNyYykge1xuICAgIEBpZiAoJGluZGV4ID09PSBjdXJyZW50U2xpZGUpIHtcbiAgICAgIDxpbWcgW3NyY109XCJzbGlkZS5zcmNcIiBjbGFzcz1cInNsaWRlXCIgW0BzbGlkZUFuaW1hdGlvbl09XCJhbmltYXRpb25UeXBlXCIvPlxuICAgIH1cbiAgfVxuXG4gIDwhLS0gY29udHJvbHMgLS0+XG4gIDxidXR0b24gY2xhc3M9XCJjb250cm9sIHByZXZcIiAoY2xpY2spPVwib25QcmV2aW91c0NsaWNrKClcIj5cbiAgICA8c3BhbiBjbGFzcz1cImFycm93IGxlZnRcIj48L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uIGNsYXNzPVwiY29udHJvbCBuZXh0XCIgKGNsaWNrKT1cIm9uTmV4dENsaWNrKClcIj5cbiAgICA8c3BhbiBjbGFzcz1cImFycm93IHJpZ2h0XCI+PC9zcGFuPlxuICA8L2J1dHRvbj5cblxuICBAaWYgKGluZGljYXRvcnNQb3NpdGlvbiA9PT0gaW5kaWNhdG9yc1Bvc2l0aW9uRW51bS5Pbikge1xuICAgIDx1bCBjbGFzcz1cImluZGljYXRvcnMgaW5zaWRlXCI+XG4gICAgICBAZm9yIChzbGlkZSBvZiBzbGlkZXM7IHRyYWNrIHNsaWRlLnNyYykge1xuICAgICAgICA8bGkgW25nQ2xhc3NdPVwieydhY3RpdmUnOiBjdXJyZW50U2xpZGUgPT09ICRpbmRleCB9XCIgKGNsaWNrKT1cIm9uQ2xpY2tJbmRpY2F0b3IoJGluZGV4KVwiPjwvbGk+XG4gICAgICB9XG4gICAgPC91bD5cbiAgfVxuPC9kaXY+XG5cbkBpZiAoaW5kaWNhdG9yc1Bvc2l0aW9uID09PSBpbmRpY2F0b3JzUG9zaXRpb25FbnVtLkJlbG93KSB7XG4gIDx1bCBjbGFzcz1cImluZGljYXRvcnNcIj5cbiAgICBAZm9yIChzbGlkZSBvZiBzbGlkZXM7IHRyYWNrIHNsaWRlLnNyYykge1xuICAgICAgPGxpIFtuZ0NsYXNzXT1cInsnYWN0aXZlJzogY3VycmVudFNsaWRlID09PSAkaW5kZXggfVwiIChjbGljayk9XCJvbkNsaWNrSW5kaWNhdG9yKCRpbmRleClcIj48L2xpPlxuICAgIH1cbiAgPC91bD5cbn0iXX0=