UNPKG

@coreui/angular

Version:

CoreUI Components Library for Angular

145 lines 21.6 kB
import { booleanAttribute, computed, Directive, effect, ElementRef, inject, input, output, Renderer2, signal } from '@angular/core'; import { AnimationBuilder, useAnimation } from '@angular/animations'; import { collapseAnimation, collapseHorizontalAnimation, expandAnimation, expandHorizontalAnimation } from './collapse.animations'; import * as i0 from "@angular/core"; export class CollapseDirective { constructor() { this.#hostElement = inject(ElementRef); this.#renderer = inject(Renderer2); this.#animationBuilder = inject(AnimationBuilder); this.#player = undefined; /** * @ignore */ this.animateInput = input(true, { transform: booleanAttribute, alias: 'animate' }); this.animate = signal(true); this.animateInputEffect = effect(() => { this.animate.set(this.animateInput()); }, { allowSignalWrites: true }); /** * Set horizontal collapsing to transition the width instead of height. * @type boolean * @default false */ this.horizontal = input(false, { transform: booleanAttribute }); /** * Toggle the visibility of collapsible element. * @type boolean * @default false */ this.visibleInput = input(false, { transform: booleanAttribute, alias: 'visible' }); this.visibleChange = output(); this.visibleInputEffect = effect(() => { this.visible.set(this.visibleInput()); }, { allowSignalWrites: true }); this.visible = signal(false); this.#init = false; this.visibleEffect = effect(() => { const visible = this.visible(); (this.#init || visible) && this.createPlayer(visible); this.#init = true; }, { allowSignalWrites: true }); /** * Add `navbar` prop for grouping and hiding navbar contents by a parent breakpoint. * @type boolean * @default false */ this.navbar = input(false, { transform: booleanAttribute }); /** * @ignore */ this.duration = input('350ms'); /** * @ignore */ this.transition = input('ease'); /** * Event emitted on visibility change. [docs] * @type string */ this.collapseChange = output(); this.hostClasses = computed(() => { return { 'navbar-collapse': this.navbar(), 'collapse-horizontal': this.horizontal() }; }); } #hostElement; #renderer; #animationBuilder; #player; #init; ngOnDestroy() { this.destroyPlayer(); } toggle(visible = !this.visible()) { this.visible.set(visible); } destroyPlayer() { this.#player?.destroy(); this.#player = undefined; } createPlayer(visible = this.visible()) { if (this.#player?.hasStarted()) { this.destroyPlayer(); } const host = this.#hostElement.nativeElement; if (visible) { this.#renderer.removeStyle(host, 'display'); } const duration = this.animate() ? this.duration() : '0ms'; const expand = this.horizontal() ? expandHorizontalAnimation : expandAnimation; const collapse = this.horizontal() ? collapseHorizontalAnimation : collapseAnimation; const dimension = this.horizontal() ? 'width' : 'height'; const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); const scrollSize = `scroll${capitalizedDimension}`; const animationFactory = this.#animationBuilder?.build(useAnimation(visible ? expand : collapse, { params: { time: duration, easing: this.transition() } })); this.#player = animationFactory.create(host); !visible && host.offsetHeight && host.style[dimension] && host.scrollHeight; this.#renderer.setStyle(host, dimension, visible ? 0 : `${host.getBoundingClientRect()[dimension]}px`); this.#player.onStart(() => { this.setMaxSize(); this.#renderer.removeClass(host, 'collapse'); this.#renderer.addClass(host, 'collapsing'); this.#renderer.removeClass(host, 'show'); this.#renderer.setStyle(host, dimension, visible ? `${host[scrollSize]}px` : ''); this.collapseChange?.emit(visible ? 'opening' : 'collapsing'); }); this.#player.onDone(() => { this.#renderer.removeClass(host, 'collapsing'); this.#renderer.addClass(host, 'collapse'); if (visible) { this.#renderer.addClass(host, 'show'); this.#renderer.setStyle(host, dimension, ''); } else { this.#renderer.removeClass(host, 'show'); } this.collapseChange?.emit(visible ? 'open' : 'collapsed'); this.destroyPlayer(); this.visibleChange.emit(visible); }); this.#player?.play(); } setMaxSize() { const host = this.#hostElement.nativeElement; if (this.horizontal()) { host.scrollWidth > 0 && this.#renderer.setStyle(host, 'maxWidth', `${host.scrollWidth}px`); // } else { // host.scrollHeight > 0 && this.#renderer.setStyle(host, 'maxHeight', `${host.scrollHeight}px`); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CollapseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.12", type: CollapseDirective, isStandalone: true, selector: "[cCollapse]", inputs: { animateInput: { classPropertyName: "animateInput", publicName: "animate", isSignal: true, isRequired: false, transformFunction: null }, horizontal: { classPropertyName: "horizontal", publicName: "horizontal", isSignal: true, isRequired: false, transformFunction: null }, visibleInput: { classPropertyName: "visibleInput", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, navbar: { classPropertyName: "navbar", publicName: "navbar", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, transition: { classPropertyName: "transition", publicName: "transition", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visibleChange: "visibleChange", collapseChange: "collapseChange" }, host: { properties: { "class": "hostClasses()", "style": "{display: \"none\"}" } }, exportAs: ["cCollapse"], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CollapseDirective, decorators: [{ type: Directive, args: [{ selector: '[cCollapse]', exportAs: 'cCollapse', standalone: true, host: { '[class]': 'hostClasses()', '[style]': '{display: "none"}' } }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2UuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZXVpLWFuZ3VsYXIvc3JjL2xpYi9jb2xsYXBzZS9jb2xsYXBzZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsMkJBQTJCLEVBQzNCLGVBQWUsRUFDZix5QkFBeUIsRUFDMUIsTUFBTSx1QkFBdUIsQ0FBQzs7QUFRL0IsTUFBTSxPQUFPLGlCQUFpQjtJQU45QjtRQU9XLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUIsc0JBQWlCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEQsWUFBTyxHQUFnQyxTQUFTLENBQUM7UUFFakQ7O1dBRUc7UUFDTSxpQkFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFOUUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2Qix1QkFBa0IsR0FBRyxNQUFNLENBQ2xDLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsRUFDRCxFQUFF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UyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7WUFDM0YsV0FBVztZQUNYLG1HQUFtRztRQUNyRyxDQUFDO0lBQ0gsQ0FBQzsrR0FuS1UsaUJBQWlCO21HQUFqQixpQkFBaUI7OzRGQUFqQixpQkFBaUI7a0JBTjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFFBQVEsRUFBRSxXQUFXO29CQUNyQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUU7aUJBQ3JFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgY29tcHV0ZWQsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIG91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbmltYXRpb25CdWlsZGVyLCBBbmltYXRpb25QbGF5ZXIsIHVzZUFuaW1hdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5pbXBvcnQge1xuICBjb2xsYXBzZUFuaW1hdGlvbixcbiAgY29sbGFwc2VIb3Jpem9udGFsQW5pbWF0aW9uLFxuICBleHBhbmRBbmltYXRpb24sXG4gIGV4cGFuZEhvcml6b250YWxBbmltYXRpb25cbn0gZnJvbSAnLi9jb2xsYXBzZS5hbmltYXRpb25zJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2NDb2xsYXBzZV0nLFxuICBleHBvcnRBczogJ2NDb2xsYXBzZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGhvc3Q6IHsgJ1tjbGFzc10nOiAnaG9zdENsYXNzZXMoKScsICdbc3R5bGVdJzogJ3tkaXNwbGF5OiBcIm5vbmVcIn0nIH1cbn0pXG5leHBvcnQgY2xhc3MgQ29sbGFwc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICByZWFkb25seSAjaG9zdEVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHJlYWRvbmx5ICNyZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICByZWFkb25seSAjYW5pbWF0aW9uQnVpbGRlciA9IGluamVjdChBbmltYXRpb25CdWlsZGVyKTtcbiAgI3BsYXllcjogQW5pbWF0aW9uUGxheWVyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWFkb25seSBhbmltYXRlSW5wdXQgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICdhbmltYXRlJyB9KTtcblxuICByZWFkb25seSBhbmltYXRlID0gc2lnbmFsKHRydWUpO1xuXG4gIHJlYWRvbmx5IGFuaW1hdGVJbnB1dEVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGUuc2V0KHRoaXMuYW5pbWF0ZUlucHV0KCkpO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgLyoqXG4gICAqIFNldCBob3Jpem9udGFsIGNvbGxhcHNpbmcgdG8gdHJhbnNpdGlvbiB0aGUgd2lkdGggaW5zdGVhZCBvZiBoZWlnaHQuXG4gICAqIEB0eXBlIGJvb2xlYW5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGhvcml6b250YWwgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSB0aGUgdmlzaWJpbGl0eSBvZiBjb2xsYXBzaWJsZSBlbGVtZW50LlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2aXNpYmxlSW5wdXQgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndmlzaWJsZScgfSk7XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUNoYW5nZSA9IG91dHB1dDxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IHZpc2libGVJbnB1dEVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICB0aGlzLnZpc2libGUuc2V0KHRoaXMudmlzaWJsZUlucHV0KCkpO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICk7XG5cbiAgcmVhZG9ubHkgdmlzaWJsZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgI2luaXQgPSBmYWxzZTtcblxuICByZWFkb25seSB2aXNpYmxlRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLnZpc2libGUoKTtcblxuICAgICAgKHRoaXMuI2luaXQgfHwgdmlzaWJsZSkgJiYgdGhpcy5jcmVhdGVQbGF5ZXIodmlzaWJsZSk7XG4gICAgICB0aGlzLiNpbml0ID0gdHJ1ZTtcbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICApO1xuXG4gIC8qKlxuICAgKiBBZGQgYG5hdmJhcmAgcHJvcCBmb3IgZ3JvdXBpbmcgYW5kIGhpZGluZyBuYXZiYXIgY29udGVudHMgYnkgYSBwYXJlbnQgYnJlYWtwb2ludC5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgbmF2YmFyID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWFkb25seSBkdXJhdGlvbiA9IGlucHV0KCczNTBtcycpO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWFkb25seSB0cmFuc2l0aW9uID0gaW5wdXQoJ2Vhc2UnKTtcblxuICAvKipcbiAgICogRXZlbnQgZW1pdHRlZCBvbiB2aXNpYmlsaXR5IGNoYW5nZS4gW2RvY3NdXG4gICAqIEB0eXBlIHN0cmluZ1xuICAgKi9cbiAgcmVhZG9ubHkgY29sbGFwc2VDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IGhvc3RDbGFzc2VzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAnbmF2YmFyLWNvbGxhcHNlJzogdGhpcy5uYXZiYXIoKSxcbiAgICAgICdjb2xsYXBzZS1ob3Jpem9udGFsJzogdGhpcy5ob3Jpem9udGFsKClcbiAgICB9IGFzIFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICB9KTtcblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lQbGF5ZXIoKTtcbiAgfVxuXG4gIHRvZ2dsZSh2aXNpYmxlID0gIXRoaXMudmlzaWJsZSgpKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlLnNldCh2aXNpYmxlKTtcbiAgfVxuXG4gIGRlc3Ryb3lQbGF5ZXIoKTogdm9pZCB7XG4gICAgdGhpcy4jcGxheWVyPy5kZXN0cm95KCk7XG4gICAgdGhpcy4jcGxheWVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgY3JlYXRlUGxheWVyKHZpc2libGU6IGJvb2xlYW4gPSB0aGlzLnZpc2libGUoKSk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNwbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgdGhpcy5kZXN0cm95UGxheWVyKCk7XG4gICAgfVxuXG4gICAgY29uc3QgaG9zdDogSFRNTEVsZW1lbnQgPSB0aGlzLiNob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKHZpc2libGUpIHtcbiAgICAgIHRoaXMuI3JlbmRlcmVyLnJlbW92ZVN0eWxlKGhvc3QsICdkaXNwbGF5Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmFuaW1hdGUoKSA/IHRoaXMuZHVyYXRpb24oKSA6ICcwbXMnO1xuXG4gICAgY29uc3QgZXhwYW5kID0gdGhpcy5ob3Jpem9udGFsKCkgPyBleHBhbmRIb3Jpem9udGFsQW5pbWF0aW9uIDogZXhwYW5kQW5pbWF0aW9uO1xuICAgIGNvbnN0IGNvbGxhcHNlID0gdGhpcy5ob3Jpem9udGFsKCkgPyBjb2xsYXBzZUhvcml6b250YWxBbmltYXRpb24gOiBjb2xsYXBzZUFuaW1hdGlvbjtcblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuaG9yaXpvbnRhbCgpID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIGNvbnN0IGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSk7XG4gICAgY29uc3Qgc2Nyb2xsU2l6ZSA9IGBzY3JvbGwke2NhcGl0YWxpemVkRGltZW5zaW9ufWA7XG5cbiAgICBjb25zdCBhbmltYXRpb25GYWN0b3J5ID0gdGhpcy4jYW5pbWF0aW9uQnVpbGRlcj8uYnVpbGQoXG4gICAgICB1c2VBbmltYXRpb24odmlzaWJsZSA/IGV4cGFuZCA6IGNvbGxhcHNlLCB7IHBhcmFtczogeyB0aW1lOiBkdXJhdGlvbiwgZWFzaW5nOiB0aGlzLnRyYW5zaXRpb24oKSB9IH0pXG4gICAgKTtcblxuICAgIHRoaXMuI3BsYXllciA9IGFuaW1hdGlvbkZhY3RvcnkuY3JlYXRlKGhvc3QpO1xuXG4gICAgIXZpc2libGUgJiYgaG9zdC5vZmZzZXRIZWlnaHQgJiYgaG9zdC5zdHlsZVtkaW1lbnNpb25dICYmIGhvc3Quc2Nyb2xsSGVpZ2h0O1xuXG4gICAgdGhpcy4jcmVuZGVyZXIuc2V0U3R5bGUoaG9zdCwgZGltZW5zaW9uLCB2aXNpYmxlID8gMCA6IGAke2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXX1weGApO1xuXG4gICAgdGhpcy4jcGxheWVyLm9uU3RhcnQoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRNYXhTaXplKCk7XG4gICAgICB0aGlzLiNyZW5kZXJlci5yZW1vdmVDbGFzcyhob3N0LCAnY29sbGFwc2UnKTtcbiAgICAgIHRoaXMuI3JlbmRlcmVyLmFkZENsYXNzKGhvc3QsICdjb2xsYXBzaW5nJyk7XG4gICAgICB0aGlzLiNyZW5kZXJlci5yZW1vdmVDbGFzcyhob3N0LCAnc2hvdycpO1xuICAgICAgdGhpcy4jcmVuZGVyZXIuc2V0U3R5bGUoaG9zdCwgZGltZW5zaW9uLCB2aXNpYmxlID8gYCR7KGhvc3QgYXMgYW55KVtzY3JvbGxTaXplXX1weGAgOiAnJyk7XG4gICAgICB0aGlzLmNvbGxhcHNlQ2hhbmdlPy5lbWl0KHZpc2libGUgPyAnb3BlbmluZycgOiAnY29sbGFwc2luZycpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4jcGxheWVyLm9uRG9uZSgoKSA9PiB7XG4gICAgICB0aGlzLiNyZW5kZXJlci5yZW1vdmVDbGFzcyhob3N0LCAnY29sbGFwc2luZycpO1xuICAgICAgdGhpcy4jcmVuZGVyZXIuYWRkQ2xhc3MoaG9zdCwgJ2NvbGxhcHNlJyk7XG4gICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICB0aGlzLiNyZW5kZXJlci5hZGRDbGFzcyhob3N0LCAnc2hvdycpO1xuICAgICAgICB0aGlzLiNyZW5kZXJlci5zZXRTdHlsZShob3N0LCBkaW1lbnNpb24sICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuI3JlbmRlcmVyLnJlbW92ZUNsYXNzKGhvc3QsICdzaG93Jyk7XG4gICAgICB9XG4gICAgICB0aGlzLmNvbGxhcHNlQ2hhbmdlPy5lbWl0KHZpc2libGUgPyAnb3BlbicgOiAnY29sbGFwc2VkJyk7XG4gICAgICB0aGlzLmRlc3Ryb3lQbGF5ZXIoKTtcbiAgICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHZpc2libGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4jcGxheWVyPy5wbGF5KCk7XG4gIH1cblxuICBzZXRNYXhTaXplKCkge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLiNob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmhvcml6b250YWwoKSkge1xuICAgICAgaG9zdC5zY3JvbGxXaWR0aCA+IDAgJiYgdGhpcy4jcmVuZGVyZXIuc2V0U3R5bGUoaG9zdCwgJ21heFdpZHRoJywgYCR7aG9zdC5zY3JvbGxXaWR0aH1weGApO1xuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgaG9zdC5zY3JvbGxIZWlnaHQgPiAwICYmIHRoaXMuI3JlbmRlcmVyLnNldFN0eWxlKGhvc3QsICdtYXhIZWlnaHQnLCBgJHtob3N0LnNjcm9sbEhlaWdodH1weGApO1xuICAgIH1cbiAgfVxufVxuIl19