UNPKG

@taiga-ui/core

Version:

Core library for creating Angular components and applications using Taiga UI

124 lines 19.7 kB
import { NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, DestroyRef, inject, Input, TemplateRef, ViewChild, } from '@angular/core'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { tuiParentAnimation } from '@taiga-ui/core/animations'; import { TuiLoader } from '@taiga-ui/core/components/loader'; import { timer } from 'rxjs'; import { TuiExpandContent } from './expand-content.directive'; import * as i0 from "@angular/core"; const State = { Idle: 0, Loading: 1, Prepared: 2, Animated: 3, }; const LOADER_HEIGHT = 48; /** * An event indicating that async data for expand has finished loading. * Dispatch to finish loading states for {@link TuiExpandComponent}. */ export const TUI_EXPAND_LOADED = 'tui-expand-loaded'; /** * @deprecated use {@link TuiExpand} from @taiga-ui/experimental */ class TuiExpandComponent { constructor() { this.cdr = inject(ChangeDetectorRef); this.destroyRef = inject(DestroyRef); this.state = State.Idle; this.content = null; this.expanded = null; this.async = false; } set expandedSetter(expanded) { if (this.expanded === null) { this.expanded = expanded; return; } if (this.state !== State.Idle) { this.expanded = expanded; this.state = State.Animated; return; } this.expanded = expanded; this.retrigger(this.async && expanded ? State.Loading : State.Animated); } get contentVisible() { return this.expanded || this.state !== State.Idle; } get overflow() { return this.state !== State.Idle; } get loading() { return !!this.expanded && this.async && this.state === State.Loading; } get height() { const { expanded, state, contentWrapper } = this; if ((expanded && state === State.Prepared) || (!expanded && state === State.Animated)) { return 0; } if (contentWrapper && ((!expanded && state === State.Prepared) || (expanded && state === State.Animated))) { return contentWrapper.nativeElement.offsetHeight; } if (contentWrapper && expanded && state === State.Loading) { return Math.max(contentWrapper.nativeElement.offsetHeight, LOADER_HEIGHT); } return null; } onTransitionEnd({ propertyName, pseudoElement }) { if (propertyName === 'opacity' && !pseudoElement && this.state === State.Animated) { this.state = State.Idle; } } onExpandLoaded(event) { event.stopPropagation(); if (this.state === State.Loading) { this.retrigger(State.Animated); } } retrigger(state) { this.state = State.Prepared; timer(0) .pipe(takeUntilDestroyed(this.destroyRef)) .subscribe(() => { // We need delay to re-trigger CSS height transition from the correct number if (this.state !== State.Prepared) { return; } this.state = state; this.cdr.markForCheck(); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiExpandComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiExpandComponent, isStandalone: true, selector: "tui-expand", inputs: { async: "async", expandedSetter: ["expanded", "expandedSetter"] }, host: { listeners: { "transitionend.self": "onTransitionEnd($event)", "tui-expand-loaded": "onExpandLoaded($event)" }, properties: { "style.height.px": "height", "class._loading": "loading", "class._overflow": "overflow", "class._expanded": "expanded", "attr.aria-expanded": "expanded" } }, queries: [{ propertyName: "content", first: true, predicate: TuiExpandContent, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "contentWrapper", first: true, predicate: ["wrapper"], descendants: true }], ngImport: i0, template: "<div\n #wrapper\n class=\"t-wrapper\"\n @tuiParentAnimation\n [@.disabled]=\"overflow\"\n>\n <ng-container *ngIf=\"contentVisible\">\n <ng-content />\n <tui-loader\n *ngIf=\"async; else content\"\n size=\"l\"\n [overlay]=\"true\"\n [showLoader]=\"loading\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </tui-loader>\n </ng-container>\n</div>\n", styles: [":host{transition-property:opacity,height,visibility;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;display:block;opacity:0;transition-delay:1ms}:host._overflow{overflow:hidden}:host._expanded{opacity:1}:host._loading{opacity:.99}.t-wrapper:before,.t-wrapper:after{content:\"\";display:table}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }], animations: [tuiParentAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiExpandComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiExpandComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-expand', imports: [NgIf, NgTemplateOutlet, TuiLoader], changeDetection: ChangeDetectionStrategy.OnPush, animations: [tuiParentAnimation], host: { '[style.height.px]': 'height', '[class._loading]': 'loading', '[class._overflow]': 'overflow', '[class._expanded]': 'expanded', '[attr.aria-expanded]': 'expanded', '(transitionend.self)': 'onTransitionEnd($event)', [`(${TUI_EXPAND_LOADED})`]: 'onExpandLoaded($event)', }, template: "<div\n #wrapper\n class=\"t-wrapper\"\n @tuiParentAnimation\n [@.disabled]=\"overflow\"\n>\n <ng-container *ngIf=\"contentVisible\">\n <ng-content />\n <tui-loader\n *ngIf=\"async; else content\"\n size=\"l\"\n [overlay]=\"true\"\n [showLoader]=\"loading\"\n >\n <ng-container [ngTemplateOutlet]=\"content\" />\n </tui-loader>\n </ng-container>\n</div>\n", styles: [":host{transition-property:opacity,height,visibility;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;display:block;opacity:0;transition-delay:1ms}:host._overflow{overflow:hidden}:host._expanded{opacity:1}:host._loading{opacity:.99}.t-wrapper:before,.t-wrapper:after{content:\"\";display:table}\n"] }] }], propDecorators: { contentWrapper: [{ type: ViewChild, args: ['wrapper'] }], content: [{ type: ContentChild, args: [TuiExpandContent, { read: TemplateRef }] }], async: [{ type: Input }], expandedSetter: [{ type: Input, args: ['expanded'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY29tcG9uZW50cy9leHBhbmQvZXhwYW5kLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY29tcG9uZW50cy9leHBhbmQvZXhwYW5kLnRlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLElBQUksRUFBb0IsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFFVixNQUFNLEVBQ04sS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFM0IsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7O0FBRTVELE1BQU0sS0FBSyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7Q0FDTCxDQUFDO0FBRVgsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO0FBRXpCOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLG1CQUFtQixDQUFDO0FBRXJEOztHQUVHO0FBQ0gsTUFrQmEsa0JBQWtCO0lBbEIvQjtRQXNCcUIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFB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O3NCQUQ5QixTQUFTO3VCQUFDLFNBQVM7Z0JBUVYsT0FBTztzQkFEaEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUM7Z0JBTTVDLEtBQUs7c0JBRFgsS0FBSztnQkFJSyxjQUFjO3NCQUR4QixLQUFLO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05nSWYsIHR5cGUgTmdJZkNvbnRleHQsIE5nVGVtcGxhdGVPdXRsZXR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgRGVzdHJveVJlZixcbiAgICB0eXBlIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHt0eXBlIFR1aVZhbHVlc09mfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3R5cGVzJztcbmltcG9ydCB7dHVpUGFyZW50QW5pbWF0aW9ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9hbmltYXRpb25zJztcbmltcG9ydCB7VHVpTG9hZGVyfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2xvYWRlcic7XG5pbXBvcnQge3RpbWVyfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUdWlFeHBhbmRDb250ZW50fSBmcm9tICcuL2V4cGFuZC1jb250ZW50LmRpcmVjdGl2ZSc7XG5cbmNvbnN0IFN0YXRlID0ge1xuICAgIElkbGU6IDAsXG4gICAgTG9hZGluZzogMSxcbiAgICBQcmVwYXJlZDogMixcbiAgICBBbmltYXRlZDogMyxcbn0gYXMgY29uc3Q7XG5cbmNvbnN0IExPQURFUl9IRUlHSFQgPSA0ODtcblxuLyoqXG4gKiBBbiBldmVudCBpbmRpY2F0aW5nIHRoYXQgYXN5bmMgZGF0YSBmb3IgZXhwYW5kIGhhcyBmaW5pc2hlZCBsb2FkaW5nLlxuICogRGlzcGF0Y2ggdG8gZmluaXNoIGxvYWRpbmcgc3RhdGVzIGZvciB7QGxpbmsgVHVpRXhwYW5kQ29tcG9uZW50fS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRVSV9FWFBBTkRfTE9BREVEID0gJ3R1aS1leHBhbmQtbG9hZGVkJztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFR1aUV4cGFuZH0gZnJvbSBAdGFpZ2EtdWkvZXhwZXJpbWVudGFsXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktZXhwYW5kJyxcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgVHVpTG9hZGVyXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZXhwYW5kLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2V4cGFuZC5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgYW5pbWF0aW9uczogW3R1aVBhcmVudEFuaW1hdGlvbl0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW3N0eWxlLmhlaWdodC5weF0nOiAnaGVpZ2h0JyxcbiAgICAgICAgJ1tjbGFzcy5fbG9hZGluZ10nOiAnbG9hZGluZycsXG4gICAgICAgICdbY2xhc3MuX292ZXJmbG93XSc6ICdvdmVyZmxvdycsXG4gICAgICAgICdbY2xhc3MuX2V4cGFuZGVkXSc6ICdleHBhbmRlZCcsXG4gICAgICAgICdbYXR0ci5hcmlhLWV4cGFuZGVkXSc6ICdleHBhbmRlZCcsXG4gICAgICAgICcodHJhbnNpdGlvbmVuZC5zZWxmKSc6ICdvblRyYW5zaXRpb25FbmQoJGV2ZW50KScsXG4gICAgICAgIFtgKCR7VFVJX0VYUEFORF9MT0FERUR9KWBdOiAnb25FeHBhbmRMb2FkZWQoJGV2ZW50KScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpRXhwYW5kQ29tcG9uZW50IHtcbiAgICBAVmlld0NoaWxkKCd3cmFwcGVyJylcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnRXcmFwcGVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICAgIHByaXZhdGUgc3RhdGU6IFR1aVZhbHVlc09mPHR5cGVvZiBTdGF0ZT4gPSBTdGF0ZS5JZGxlO1xuXG4gICAgQENvbnRlbnRDaGlsZChUdWlFeHBhbmRDb250ZW50LCB7cmVhZDogVGVtcGxhdGVSZWZ9KVxuICAgIHByb3RlY3RlZCBjb250ZW50OiBUZW1wbGF0ZVJlZjxOZ0lmQ29udGV4dDxib29sZWFuPj4gfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCBleHBhbmRlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXN5bmMgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgnZXhwYW5kZWQnKVxuICAgIHB1YmxpYyBzZXQgZXhwYW5kZWRTZXR0ZXIoZXhwYW5kZWQ6IGJvb2xlYW4gfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmV4cGFuZGVkID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlICE9PSBTdGF0ZS5JZGxlKSB7XG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZXhwYW5kZWQ7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuQW5pbWF0ZWQ7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwYW5kZWQgPSBleHBhbmRlZDtcbiAgICAgICAgdGhpcy5yZXRyaWdnZXIodGhpcy5hc3luYyAmJiBleHBhbmRlZCA/IFN0YXRlLkxvYWRpbmcgOiBTdGF0ZS5BbmltYXRlZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb250ZW50VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwYW5kZWQgfHwgdGhpcy5zdGF0ZSAhPT0gU3RhdGUuSWRsZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IG92ZXJmbG93KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSAhPT0gU3RhdGUuSWRsZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGxvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZXhwYW5kZWQgJiYgdGhpcy5hc3luYyAmJiB0aGlzLnN0YXRlID09PSBTdGF0ZS5Mb2FkaW5nO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaGVpZ2h0KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCB7ZXhwYW5kZWQsIHN0YXRlLCBjb250ZW50V3JhcHBlcn0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChleHBhbmRlZCAmJiBzdGF0ZSA9PT0gU3RhdGUuUHJlcGFyZWQpIHx8XG4gICAgICAgICAgICAoIWV4cGFuZGVkICYmIHN0YXRlID09PSBTdGF0ZS5BbmltYXRlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbnRlbnRXcmFwcGVyICYmXG4gICAgICAgICAgICAoKCFleHBhbmRlZCAmJiBzdGF0ZSA9PT0gU3RhdGUuUHJlcGFyZWQpIHx8XG4gICAgICAgICAgICAgICAgKGV4cGFuZGVkICYmIHN0YXRlID09PSBTdGF0ZS5BbmltYXRlZCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRlbnRXcmFwcGVyICYmIGV4cGFuZGVkICYmIHN0YXRlID09PSBTdGF0ZS5Mb2FkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoY29udGVudFdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsIExPQURFUl9IRUlHSFQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uVHJhbnNpdGlvbkVuZCh7cHJvcGVydHlOYW1lLCBwc2V1ZG9FbGVtZW50fTogVHJhbnNpdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9PT0gJ29wYWNpdHknICYmXG4gICAgICAgICAgICAhcHNldWRvRWxlbWVudCAmJlxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9PT0gU3RhdGUuQW5pbWF0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuSWRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkV4cGFuZExvYWRlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFN0YXRlLkxvYWRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmV0cmlnZ2VyKFN0YXRlLkFuaW1hdGVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmV0cmlnZ2VyKHN0YXRlOiBUdWlWYWx1ZXNPZjx0eXBlb2YgU3RhdGU+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5QcmVwYXJlZDtcblxuICAgICAgICB0aW1lcigwKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIGRlbGF5IHRvIHJlLXRyaWdnZXIgQ1NTIGhlaWdodCB0cmFuc2l0aW9uIGZyb20gdGhlIGNvcnJlY3QgbnVtYmVyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgIT09IFN0YXRlLlByZXBhcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI3dyYXBwZXJcbiAgICBjbGFzcz1cInQtd3JhcHBlclwiXG4gICAgQHR1aVBhcmVudEFuaW1hdGlvblxuICAgIFtALmRpc2FibGVkXT1cIm92ZXJmbG93XCJcbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFZpc2libGVcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgPHR1aS1sb2FkZXJcbiAgICAgICAgICAgICpuZ0lmPVwiYXN5bmM7IGVsc2UgY29udGVudFwiXG4gICAgICAgICAgICBzaXplPVwibFwiXG4gICAgICAgICAgICBbb3ZlcmxheV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzaG93TG9hZGVyXT1cImxvYWRpbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRcIiAvPlxuICAgICAgICA8L3R1aS1sb2FkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==