@alauda-fe/common
Version:
Alauda frontend team common codes.
229 lines • 38.6 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { DOCUMENT } from '@angular/common';
import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, ElementRef, EventEmitter, Inject, Input, NgZone, Output, QueryList, Renderer2, ViewChild, } from '@angular/core';
import { NEVER, Observable, startWith, switchMap, merge, iif, exhaustMap, take, map, Subject, takeUntil, filter, distinctUntilChanged, } from 'rxjs';
import { isEqual, ObservableInput } from '../../../core/public-api';
import { GRID_DRAG_HANDLER, } from '../../directives/drag-handler.directive';
import { GridItemPlaceholderDirective, GRID_ITEM_PLACEHOLDER, } from '../../directives/placeholder.directive';
import { GRID_REMOVE_HANDLER, } from '../../directives/remove-handler.directive';
import { GRID_RESIZE_HANDLER, } from '../../directives/resize-handler.directive';
import { GridLayoutService } from '../../grid-layout.service';
import { parseRenderItemToPixels } from '../../utils/grid.utils';
import { accessPointerMoveThreshold, getMouseClick$, getMouseDown$, getMouseEnd$, getMouseMove$, } from '../../utils/mouse.utils';
import { runOutsideZone$ } from '../../utils/operator';
import * as i0 from "@angular/core";
import * as i1 from "../../grid-layout.service";
import * as i2 from "@alauda/ui";
const _c0 = ["resizeElem"];
const _c1 = ["removeElem"];
const _c2 = ["*"];
const ANIMATION_DURATION_MS = 250;
export class GridItemComponent {
constructor(elementRef, document, renderer, ngZone, layoutService) {
this.elementRef = elementRef;
this.document = document;
this.renderer = renderer;
this.ngZone = ngZone;
this.layoutService = layoutService;
/** CSS transition style */
this.transition = `transform ${ANIMATION_DURATION_MS}ms ease, width ${ANIMATION_DURATION_MS}ms ease, height ${ANIMATION_DURATION_MS}ms ease`;
/** Minimum amount of pixels that the user should move before it starts the drag sequence. */
this.dragStartThreshold = 0;
/** Whether the item is draggable or not. Defaults to true. */
this.draggable = true;
/** Whether the item is resizable or not. Defaults to true. */
this.resizable = true;
this.removable = true;
this.destroy$$ = new Subject();
this.dragStartSubject = new Subject();
this.resizeStartSubject = new Subject();
this.dragStart$ = this.dragStartSubject.asObservable();
this.resizeStart$ = this.resizeStartSubject.asObservable();
this.remove = new EventEmitter();
}
ngOnInit() {
this.layoutService.gridRenderItemsData$$
.pipe(map(({ data, animation }) => ({ data: data?.[this.id], animation })), distinctUntilChanged((a, b) => isEqual(a.data, b.data)), takeUntil(this.destroy$$))
.subscribe(({ data, animation }) => {
this.setStyles(parseRenderItemToPixels(data), animation);
});
}
ngAfterContentInit() {
this.setupDragStartListener();
this.setupResizeStartListener();
this.setupRemoveListener();
}
ngOnDestroy() {
this.destroy$$.next();
this.destroy$$.complete();
}
setStyles({ top, left, width, height, }, animation) {
this.renderer.setStyle(this.elementRef.nativeElement, 'transform', `translateX(${left}) translateY(${top})`);
this.renderer.setStyle(this.elementRef.nativeElement, 'transition', animation ? this.transition : 'none');
requestAnimationFrame(() => {
this.renderer.setStyle(this.elementRef.nativeElement, 'display', `block`);
if (width != null) {
this.renderer.setStyle(this.elementRef.nativeElement, 'width', width);
}
if (height != null) {
this.renderer.setStyle(this.elementRef.nativeElement, 'height', height);
}
});
}
setupDragStartListener() {
const document = this.document.documentElement;
this.draggable$
.pipe(takeUntil(this.destroy$$), startWith(this.draggable), switchMap(draggable => {
if (!draggable) {
return NEVER;
}
return this.dragHandles.changes.pipe(startWith(this.dragHandles), switchMap((dragHandles) => iif(() => dragHandles.length > 0, merge(...dragHandles
.toArray()
.map(dragHandle => getMouseDown$(dragHandle.element.nativeElement))), getMouseDown$(this.elementRef.nativeElement)).pipe(exhaustMap(startEvent => {
// Prevent browser default drag/drop action, we handle all scenes
if (startEvent.target &&
startEvent.target.draggable &&
startEvent.type === 'mousedown') {
startEvent.preventDefault();
startEvent.stopImmediatePropagation();
}
return getMouseMove$(this.document.documentElement).pipe(takeUntil(getMouseEnd$(document)), runOutsideZone$(this.ngZone), filter(moveEvent => {
moveEvent.preventDefault();
return accessPointerMoveThreshold(startEvent, moveEvent, this.dragStartThreshold);
}), take(1), map(() => startEvent));
}))));
}))
.subscribe(this.dragStartSubject);
}
setupRemoveListener() {
this.removable$
.pipe(takeUntil(this.destroy$$), startWith(this.removable), switchMap(removable => {
if (!removable) {
this.renderer.setStyle(this.removeElem.nativeElement, 'display', 'none');
return NEVER;
}
return this.removeHandles.changes.pipe(startWith(this.removeHandles), switchMap((removeHandles) => {
if (removeHandles.length > 0) {
this.renderer.setStyle(this.removeElem.nativeElement, 'display', 'none');
return merge(...removeHandles
.toArray()
.map(removeHandle => getMouseClick$(removeHandle.element.nativeElement)));
}
this.renderer.setStyle(this.removeElem.nativeElement, 'display', 'block');
return getMouseDown$(this.removeElem.nativeElement);
}));
}))
.subscribe(evt => {
evt.preventDefault();
this.remove.emit(this.id);
});
}
setupResizeStartListener() {
this.resizable$
.pipe(takeUntil(this.destroy$$), startWith(this.resizable), switchMap(resizable => {
if (!resizable) {
this.renderer.setStyle(this.resizeElem.nativeElement, 'display', 'none');
return NEVER;
}
return this.resizeHandles.changes.pipe(startWith(this.resizeHandles), switchMap((resizeHandles) => {
if (resizeHandles.length > 0) {
this.renderer.setStyle(this.resizeElem.nativeElement, 'display', 'none');
return merge(...resizeHandles
.toArray()
.map(resizeHandle => getMouseDown$(resizeHandle.element.nativeElement)));
}
this.renderer.setStyle(this.resizeElem.nativeElement, 'display', 'block');
return getMouseDown$(this.resizeElem.nativeElement);
}));
}))
.subscribe(this.resizeStartSubject);
}
static { this.ɵfac = function GridItemComponent_Factory(t) { return new (t || GridItemComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(DOCUMENT), i0.ɵɵdirectiveInject(i0.Renderer2), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i1.GridLayoutService)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GridItemComponent, selectors: [["acl-grid-item"]], contentQueries: function GridItemComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
i0.ɵɵcontentQuery(dirIndex, GRID_ITEM_PLACEHOLDER, 5);
i0.ɵɵcontentQuery(dirIndex, GRID_DRAG_HANDLER, 5);
i0.ɵɵcontentQuery(dirIndex, GRID_RESIZE_HANDLER, 5);
i0.ɵɵcontentQuery(dirIndex, GRID_REMOVE_HANDLER, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.placeholder = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dragHandles = _t);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.resizeHandles = _t);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.removeHandles = _t);
} }, viewQuery: function GridItemComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 7, ElementRef);
i0.ɵɵviewQuery(_c1, 7, ElementRef);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.resizeElem = _t.first);
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.removeElem = _t.first);
} }, inputs: { id: "id", minW: "minW", minH: "minH", maxW: "maxW", maxH: "maxH", transition: "transition", dragStartThreshold: "dragStartThreshold", draggable: "draggable", resizable: "resizable", removable: "removable" }, outputs: { remove: "remove" }, ngContentSelectors: _c2, decls: 6, vars: 0, consts: [["resizeElem", ""], ["removeElem", ""], [1, "grid-item-default-resize-icon"], [1, "grid-item-default-remove"], ["icon", "xmark"]], template: function GridItemComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵprojectionDef();
i0.ɵɵprojection(0);
i0.ɵɵelement(1, "div", 2, 0);
i0.ɵɵelementStart(3, "div", 3, 1);
i0.ɵɵelement(5, "aui-icon", 4);
i0.ɵɵelementEnd();
} }, dependencies: [i2.IconComponent], styles: ["[_nghost-%COMP%]{display:none;position:absolute;z-index:1;overflow:hidden}[_nghost-%COMP%] div[_ngcontent-%COMP%]{position:absolute;user-select:none;z-index:10}[_nghost-%COMP%] div.grid-item-default-remove[_ngcontent-%COMP%]{position:absolute;top:12px;right:12px}[_nghost-%COMP%] div.grid-item-default-remove[_ngcontent-%COMP%] aui-icon[_ngcontent-%COMP%]{font-size:16px}[_nghost-%COMP%] div.grid-item-default-remove[_ngcontent-%COMP%] aui-icon[_ngcontent-%COMP%]:hover{cursor:pointer}[_nghost-%COMP%] div.grid-item-default-resize-icon[_ngcontent-%COMP%]{cursor:se-resize;width:20px;height:20px;bottom:0;right:0;color:inherit}[_nghost-%COMP%] div.grid-item-default-resize-icon[_ngcontent-%COMP%]:after{content:\"\";position:absolute;right:8px;bottom:8px;width:12px;height:12px;border-right:2px solid rgb(var(--aui-color-n-4));border-bottom:2px solid rgb(var(--aui-color-n-4))}.display-none[_ngcontent-%COMP%]{display:none!important}"], changeDetection: 0 }); }
}
__decorate([
ObservableInput(),
__metadata("design:type", Observable)
], GridItemComponent.prototype, "draggable$", void 0);
__decorate([
ObservableInput(),
__metadata("design:type", Observable)
], GridItemComponent.prototype, "resizable$", void 0);
__decorate([
ObservableInput(),
__metadata("design:type", Observable)
], GridItemComponent.prototype, "removable$", void 0);
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(GridItemComponent, [{
type: Component,
args: [{ selector: 'acl-grid-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n<div\n #resizeElem\n class=\"grid-item-default-resize-icon\"\n></div>\n<div\n #removeElem\n class=\"grid-item-default-remove\"\n>\n <aui-icon icon=\"xmark\"></aui-icon>\n</div>\n", styles: [":host{display:none;position:absolute;z-index:1;overflow:hidden}:host div{position:absolute;user-select:none;z-index:10}:host div.grid-item-default-remove{position:absolute;top:12px;right:12px}:host div.grid-item-default-remove aui-icon{font-size:16px}:host div.grid-item-default-remove aui-icon:hover{cursor:pointer}:host div.grid-item-default-resize-icon{cursor:se-resize;width:20px;height:20px;bottom:0;right:0;color:inherit}:host div.grid-item-default-resize-icon:after{content:\"\";position:absolute;right:8px;bottom:8px;width:12px;height:12px;border-right:2px solid rgb(var(--aui-color-n-4));border-bottom:2px solid rgb(var(--aui-color-n-4))}.display-none{display:none!important}\n"] }]
}], () => [{ type: i0.ElementRef }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i1.GridLayoutService }], { id: [{
type: Input
}], dragHandles: [{
type: ContentChildren,
args: [GRID_DRAG_HANDLER, { descendants: true }]
}], resizeHandles: [{
type: ContentChildren,
args: [GRID_RESIZE_HANDLER, { descendants: true }]
}], removeHandles: [{
type: ContentChildren,
args: [GRID_REMOVE_HANDLER, { descendants: true }]
}], resizeElem: [{
type: ViewChild,
args: ['resizeElem', { static: true, read: ElementRef }]
}], removeElem: [{
type: ViewChild,
args: ['removeElem', { static: true, read: ElementRef }]
}], placeholder: [{
type: ContentChild,
args: [GRID_ITEM_PLACEHOLDER]
}], minW: [{
type: Input
}], minH: [{
type: Input
}], maxW: [{
type: Input
}], maxH: [{
type: Input
}], transition: [{
type: Input
}], dragStartThreshold: [{
type: Input
}], draggable: [{
type: Input
}], draggable$: [], resizable: [{
type: Input
}], resizable$: [], removable: [{
type: Input
}], removable$: [], remove: [{
type: Output
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GridItemComponent, { className: "GridItemComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2dyaWQtbGF5b3V0L2NvbXBvbmVudHMvZ3JpZC1pdGVtcy9jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvZ3JpZC1sYXlvdXQvY29tcG9uZW50cy9ncmlkLWl0ZW1zL3RlbXBsYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEVBQ1YsSUFBSSxFQUNKLEdBQUcsRUFDSCxPQUFPLEVBQ1AsU0FBUyxFQUNULE1BQU0sRUFDTixvQkFBb0IsR0FDckIsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFFTCxpQkFBaUIsR0FDbEIsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHFCQUFxQixHQUN0QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFFTCxtQkFBbUIsR0FDcEIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLEVBRUwsbUJBQW1CLEdBQ3BCLE1BQU0sMkNBQTJDLENBQUM7QUFDbkQsT0FBTyxFQUFFLGlCQUFp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QUFFO1lBSTFDLGFBQWE7a0JBRDdCLGVBQWU7bUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO1lBSTNELFVBQVU7a0JBRFQsU0FBUzttQkFBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7WUFJM0QsVUFBVTtrQkFEVCxTQUFTO21CQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUkzRCxXQUFXO2tCQURWLFlBQVk7bUJBQUMscUJBQXFCO1lBRzFCLElBQUk7a0JBQVosS0FBSztZQUNHLElBQUk7a0JBQVosS0FBSztZQUNHLElBQUk7a0JBQVosS0FBSztZQUNHLElBQUk7a0JBQVosS0FBSztZQUlOLFVBQVU7a0JBRFQsS0FBSztZQU1OLGtCQUFrQjtrQkFEakIsS0FBSztZQUtOLFNBQVM7a0JBRFIsS0FBSztZQUlOLFVBQVUsTUFJVixTQUFTO2tCQURSLEtBQUs7WUFJTixVQUFVLE1BR1YsU0FBUztrQkFEUixLQUFLO1lBSU4sVUFBVSxNQW1CVixNQUFNO2tCQURMLE1BQU07O2tGQXhFSSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgTkVWRVIsXG4gIE9ic2VydmFibGUsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICBtZXJnZSxcbiAgaWlmLFxuICBleGhhdXN0TWFwLFxuICB0YWtlLFxuICBtYXAsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbiAgZmlsdGVyLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGlzRXF1YWwsIE9ic2VydmFibGVJbnB1dCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQge1xuICBHcmlkRHJhZ0hhbmRsZXJEaXJlY3RpdmUsXG4gIEdSSURfRFJBR19IQU5ETEVSLFxufSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2RyYWctaGFuZGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgR3JpZEl0ZW1QbGFjZWhvbGRlckRpcmVjdGl2ZSxcbiAgR1JJRF9JVEVNX1BMQUNFSE9MREVSLFxufSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3BsYWNlaG9sZGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICBHcmlkUmVtb3ZlSGFuZGxlckRpcmVjdGl2ZSxcbiAgR1JJRF9SRU1PVkVfSEFORExFUixcbn0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9yZW1vdmUtaGFuZGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgR3JpZFJlc2l6ZUhhbmRsZXJEaXJlY3RpdmUsXG4gIEdSSURfUkVTSVpFX0hBTkRMRVIsXG59IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcmVzaXplLWhhbmRsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IEdyaWRMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZ3JpZC1sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBwYXJzZVJlbmRlckl0ZW1Ub1BpeGVscyB9IGZyb20gJy4uLy4uL3V0aWxzL2dyaWQudXRpbHMnO1xuaW1wb3J0IHtcbiAgYWNjZXNzUG9pbnRlck1vdmVUaHJlc2hvbGQsXG4gIGdldE1vdXNlQ2xpY2skLFxuICBnZXRNb3VzZURvd24kLFxuICBnZXRNb3VzZUVuZCQsXG4gIGdldE1vdXNlTW92ZSQsXG59IGZyb20gJy4uLy4uL3V0aWxzL21vdXNlLnV0aWxzJztcbmltcG9ydCB7IHJ1bk91dHNpZGVab25lJCB9IGZyb20gJy4uLy4uL3V0aWxzL29wZXJhdG9yJztcblxuY29uc3QgQU5JTUFUSU9OX0RVUkFUSU9OX01TID0gMjUwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhY2wtZ3JpZC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHcmlkSXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgQElucHV0KClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihHUklEX0RSQUdfSEFORExFUiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwcml2YXRlIHJlYWRvbmx5IGRyYWdIYW5kbGVzOiBRdWVyeUxpc3Q8R3JpZERyYWdIYW5kbGVyRGlyZWN0aXZlPjtcblxuICBAQ29udGVudENoaWxkcmVuKEdSSURfUkVTSVpFX0hBTkRMRVIsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJpdmF0ZSByZWFkb25seSByZXNpemVIYW5kbGVzOiBRdWVyeUxpc3Q8R3JpZFJlc2l6ZUhhbmRsZXJEaXJlY3RpdmU+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oR1JJRF9SRU1PVkVfSEFORExFUiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwcml2YXRlIHJlYWRvbmx5IHJlbW92ZUhhbmRsZXM6IFF1ZXJ5TGlzdDxHcmlkUmVtb3ZlSGFuZGxlckRpcmVjdGl2ZT47XG5cbiAgQFZpZXdDaGlsZCgncmVzaXplRWxlbScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHJlc2l6ZUVsZW06IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZCgncmVtb3ZlRWxlbScsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0pXG4gIHJlbW92ZUVsZW06IEVsZW1lbnRSZWY7XG5cbiAgQENvbnRlbnRDaGlsZChHUklEX0lURU1fUExBQ0VIT0xERVIpXG4gIHBsYWNlaG9sZGVyOiBHcmlkSXRlbVBsYWNlaG9sZGVyRGlyZWN0aXZlO1xuXG4gIEBJbnB1dCgpIG1pblc/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG1pbkg/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG1heFc/OiBudW1iZXI7XG4gIEBJbnB1dCgpIG1heEg/OiBudW1iZXI7XG5cbiAgLyoqIENTUyB0cmFuc2l0aW9uIHN0eWxlICovXG4gIEBJbnB1dCgpXG4gIHRyYW5zaXRpb24gPVxuICAgIGB0cmFuc2Zvcm0gJHtBTklNQVRJT05fRFVSQVRJT05fTVN9bXMgZWFzZSwgd2lkdGggJHtBTklNQVRJT05fRFVSQVRJT05fTVN9bXMgZWFzZSwgaGVpZ2h0ICR7QU5JTUFUSU9OX0RVUkFUSU9OX01TfW1zIGVhc2VgO1xuXG4gIC8qKiBNaW5pbXVtIGFtb3VudCBvZiBwaXhlbHMgdGhhdCB0aGUgdXNlciBzaG91bGQgbW92ZSBiZWZvcmUgaXQgc3RhcnRzIHRoZSBkcmFnIHNlcXVlbmNlLiAqL1xuICBASW5wdXQoKVxuICBkcmFnU3RhcnRUaHJlc2hvbGQgPSAwO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBpdGVtIGlzIGRyYWdnYWJsZSBvciBub3QuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIEBJbnB1dCgpXG4gIGRyYWdnYWJsZSA9IHRydWU7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIGRyYWdnYWJsZSQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBpdGVtIGlzIHJlc2l6YWJsZSBvciBub3QuIERlZmF1bHRzIHRvIHRydWUuICovXG4gIEBJbnB1dCgpXG4gIHJlc2l6YWJsZSA9IHRydWU7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlc2l6YWJsZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgQElucHV0KClcbiAgcmVtb3ZhYmxlID0gdHJ1ZTtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgcmVtb3ZhYmxlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJhZ1N0YXJ0U3ViamVjdCA9IG5ldyBTdWJqZWN0PE1vdXNlRXZlbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzaXplU3RhcnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8TW91c2VFdmVudD4oKTtcblxuICBkcmFnU3RhcnQkID0gdGhpcy5kcmFnU3RhcnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICByZXNpemVTdGFydCQgPSB0aGlzLnJlc2l6ZVN0YXJ0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheW91dFNlcnZpY2U6IEdyaWRMYXlvdXRTZXJ2aWNlLFxuICApIHt9XG5cbiAgQE91dHB1dCgpXG4gIHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxheW91dFNlcnZpY2UuZ3JpZFJlbmRlckl0ZW1zRGF0YSQkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGRhdGEsIGFuaW1hdGlvbiB9KSA9PiAoeyBkYXRhOiBkYXRhPy5bdGhpcy5pZF0sIGFuaW1hdGlvbiB9KSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc0VxdWFsKGEuZGF0YSwgYi5kYXRhKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh7IGRhdGEsIGFuaW1hdGlvbiB9KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3R5bGVzKHBhcnNlUmVuZGVySXRlbVRvUGl4ZWxzKGRhdGEpLCBhbmltYXRpb24pO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5zZXR1cERyYWdTdGFydExpc3RlbmVyKCk7XG4gICAgdGhpcy5zZXR1cFJlc2l6ZVN0YXJ0TGlzdGVuZXIoKTtcbiAgICB0aGlzLnNldHVwUmVtb3ZlTGlzdGVuZXIoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc2V0U3R5bGVzKFxuICAgIHtcbiAgICAgIHRvcCxcbiAgICAgIGxlZnQsXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICB9OiB7XG4gICAgICB0b3A6IHN0cmluZztcbiAgICAgIGxlZnQ6IHN0cmluZztcbiAgICAgIHdpZHRoPzogc3RyaW5nO1xuICAgICAgaGVpZ2h0Pzogc3RyaW5nO1xuICAgIH0sXG4gICAgYW5pbWF0aW9uOiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAndHJhbnNmb3JtJyxcbiAgICAgIGB0cmFuc2xhdGVYKCR7bGVmdH0pIHRyYW5zbGF0ZVkoJHt0b3B9KWAsXG4gICAgKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICd0cmFuc2l0aW9uJyxcbiAgICAgIGFuaW1hdGlvbiA/IHRoaXMudHJhbnNpdGlvbiA6ICdub25lJyxcbiAgICApO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzcGxheScsIGBibG9ja2ApO1xuICAgICAgaWYgKHdpZHRoICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3dpZHRoJywgd2lkdGgpO1xuICAgICAgfVxuICAgICAgaWYgKGhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCBoZWlnaHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cERyYWdTdGFydExpc3RlbmVyKCkge1xuICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdGhpcy5kcmFnZ2FibGUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuZHJhZ2dhYmxlKSxcbiAgICAgICAgc3dpdGNoTWFwKGRyYWdnYWJsZSA9PiB7XG4gICAgICAgICAgaWYgKCFkcmFnZ2FibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0hhbmRsZXMuY2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuZHJhZ0hhbmRsZXMpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChkcmFnSGFuZGxlczogUXVlcnlMaXN0PEdyaWREcmFnSGFuZGxlckRpcmVjdGl2ZT4pID0+XG4gICAgICAgICAgICAgIGlpZihcbiAgICAgICAgICAgICAgICAoKSA9PiBkcmFnSGFuZGxlcy5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgLi4uZHJhZ0hhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGRyYWdIYW5kbGUgPT5cbiAgICAgICAgICAgICAgICAgICAgICBnZXRNb3VzZURvd24kKGRyYWdIYW5kbGUuZWxlbWVudC5uYXRpdmVFbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGdldE1vdXNlRG93biQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLFxuICAgICAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICAgICAgZXhoYXVzdE1hcChzdGFydEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgYnJvd3NlciBkZWZhdWx0IGRyYWcvZHJvcCBhY3Rpb24sIHdlIGhhbmRsZSBhbGwgc2NlbmVzXG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnQudGFyZ2V0ICYmXG4gICAgICAgICAgICAgICAgICAgIChzdGFydEV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZHJhZ2dhYmxlICYmXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnQudHlwZSA9PT0gJ21vdXNlZG93bidcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRNb3VzZU1vdmUkKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoZ2V0TW91c2VFbmQkKGRvY3VtZW50KSksXG4gICAgICAgICAgICAgICAgICAgIHJ1bk91dHNpZGVab25lJCh0aGlzLm5nWm9uZSksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcihtb3ZlRXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIG1vdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3NQb2ludGVyTW92ZVRocmVzaG9sZChcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFRocmVzaG9sZCxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHN0YXJ0RXZlbnQpLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHRoaXMuZHJhZ1N0YXJ0U3ViamVjdCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVtb3ZlTGlzdGVuZXIoKSB7XG4gICAgdGhpcy5yZW1vdmFibGUkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMucmVtb3ZhYmxlKSxcbiAgICAgICAgc3dpdGNoTWFwKHJlbW92YWJsZSA9PiB7XG4gICAgICAgICAgaWYgKCFyZW1vdmFibGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbS5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAnZGlzcGxheScsXG4gICAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gTkVWRVI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZUhhbmRsZXMuY2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMucmVtb3ZlSGFuZGxlcyksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoXG4gICAgICAgICAgICAgIChyZW1vdmVIYW5kbGVzOiBRdWVyeUxpc3Q8R3JpZFJlbW92ZUhhbmRsZXJEaXJlY3RpdmU+KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZUhhbmRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFbGVtLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgICAgICAgICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAuLi5yZW1vdmVIYW5kbGVzXG4gICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVtb3ZlSGFuZGxlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRNb3VzZUNsaWNrJChyZW1vdmVIYW5kbGUuZWxlbWVudC5uYXRpdmVFbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbS5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknLFxuICAgICAgICAgICAgICAgICAgJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXRNb3VzZURvd24kKHRoaXMucmVtb3ZlRWxlbS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGV2dCA9PiB7XG4gICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnJlbW92ZS5lbWl0KHRoaXMuaWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVzaXplU3RhcnRMaXN0ZW5lcigpIHtcbiAgICB0aGlzLnJlc2l6YWJsZSRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpLFxuICAgICAgICBzdGFydFdpdGgodGhpcy5yZXNpemFibGUpLFxuICAgICAgICBzd2l0Y2hNYXAocmVzaXphYmxlID0+IHtcbiAgICAgICAgICBpZiAoIXJlc2l6YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgICAgdGhpcy5yZXNpemVFbGVtLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVzaXplSGFuZGxlcy5jaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICBzdGFydFdpdGgodGhpcy5yZXNpemVIYW5kbGVzKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChcbiAgICAgICAgICAgICAgKHJlc2l6ZUhhbmRsZXM6IFF1ZXJ5TGlzdDxHcmlkUmVzaXplSGFuZGxlckRpcmVjdGl2ZT4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzaXplSGFuZGxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZUVsZW0ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknLFxuICAgICAgICAgICAgICAgICAgICAnbm9uZScsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc2l6ZUhhbmRsZXNcbiAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheSgpXG4gICAgICAgICAgICAgICAgICAgICAgLm1hcChyZXNpemVIYW5kbGUgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vdXNlRG93biQocmVzaXplSGFuZGxlLmVsZW1lbnQubmF0aXZlRWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZUVsZW0ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICdkaXNwbGF5JyxcbiAgICAgICAgICAgICAgICAgICdibG9jaycsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TW91c2VEb3duJCh0aGlzLnJlc2l6ZUVsZW0ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLnJlc2l6ZVN0YXJ0U3ViamVjdCk7XG4gIH1cbn1cbiIsIjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjxkaXZcbiAgI3Jlc2l6ZUVsZW1cbiAgY2xhc3M9XCJncmlkLWl0ZW0tZGVmYXVsdC1yZXNpemUtaWNvblwiXG4+PC9kaXY+XG48ZGl2XG4gICNyZW1vdmVFbGVtXG4gIGNsYXNzPVwiZ3JpZC1pdGVtLWRlZmF1bHQtcmVtb3ZlXCJcbj5cbiAgPGF1aS1pY29uIGljb249XCJ4bWFya1wiPjwvYXVpLWljb24+XG48L2Rpdj5cbiJdfQ==