@taiga-ui/core
Version:
Core library for creating Angular components and applications using Taiga UI
124 lines • 19.7 kB
JavaScript
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==