@dotglitch/ngx-common 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/components/dynamic-html/dynamic-html.component.d.ts +15 -0
- package/components/dynamic-html/dynamic-html.module.d.ts +10 -0
- package/components/dynamic-html/dynamic-html.service.d.ts +18 -0
- package/components/dynamic-html/types.d.ts +12 -0
- package/components/lazy-loader/lazy-loader.component.d.ts +146 -0
- package/components/lazy-loader/lazy-loader.module.d.ts +10 -0
- package/components/lazy-loader/lazy-loader.service.d.ts +71 -0
- package/components/lazy-loader/types.d.ts +142 -0
- package/components/menu/menu.component.d.ts +52 -0
- package/components/tooltip/tooltip.component.d.ts +35 -0
- package/directives/menu.directive.d.ts +27 -0
- package/directives/tooltip.directive.d.ts +26 -0
- package/directives/utils.d.ts +8 -0
- package/esm2020/components/dynamic-html/dynamic-html.component.mjs +43 -0
- package/esm2020/components/dynamic-html/dynamic-html.module.mjs +27 -0
- package/esm2020/components/dynamic-html/dynamic-html.service.mjs +66 -0
- package/esm2020/components/dynamic-html/types.mjs +7 -0
- package/esm2020/components/lazy-loader/lazy-loader.component.mjs +360 -0
- package/esm2020/components/lazy-loader/lazy-loader.module.mjs +29 -0
- package/esm2020/components/lazy-loader/lazy-loader.service.mjs +215 -0
- package/esm2020/components/lazy-loader/types.mjs +26 -0
- package/esm2020/components/menu/menu.component.mjs +316 -0
- package/esm2020/components/tooltip/tooltip.component.mjs +135 -0
- package/esm2020/directives/menu.directive.mjs +112 -0
- package/esm2020/directives/tooltip.directive.mjs +92 -0
- package/esm2020/directives/utils.mjs +120 -0
- package/esm2020/dotglitch-ngx-common.mjs +5 -0
- package/esm2020/pipes/html-bypass.pipe.mjs +27 -0
- package/esm2020/pipes/resource-bypass.pipe.mjs +27 -0
- package/esm2020/pipes/script-bypass.pipe.mjs +27 -0
- package/esm2020/pipes/style-bypass.pipe.mjs +27 -0
- package/esm2020/pipes/url-bypass.pipe.mjs +27 -0
- package/esm2020/public-api.mjs +39 -0
- package/esm2020/services/dependency.service.mjs +55 -0
- package/esm2020/services/dialog.service.mjs +66 -0
- package/esm2020/services/fetch.service.mjs +71 -0
- package/esm2020/services/keyboard.service.mjs +128 -0
- package/esm2020/types/menu.mjs +2 -0
- package/esm2020/types/popup.mjs +2 -0
- package/esm2020/utils/index.mjs +39 -0
- package/fesm2015/dotglitch-ngx-common.mjs +1997 -0
- package/fesm2015/dotglitch-ngx-common.mjs.map +1 -0
- package/fesm2020/dotglitch-ngx-common.mjs +1977 -0
- package/fesm2020/dotglitch-ngx-common.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +60 -0
- package/pipes/html-bypass.pipe.d.ts +16 -0
- package/pipes/resource-bypass.pipe.d.ts +16 -0
- package/pipes/script-bypass.pipe.d.ts +16 -0
- package/pipes/style-bypass.pipe.d.ts +16 -0
- package/pipes/url-bypass.pipe.d.ts +16 -0
- package/public-api.d.ts +34 -0
- package/services/dependency.service.d.ts +19 -0
- package/services/dialog.service.d.ts +41 -0
- package/services/fetch.service.d.ts +28 -0
- package/services/keyboard.service.d.ts +79 -0
- package/types/menu.d.ts +90 -0
- package/types/popup.d.ts +27 -0
- package/utils/index.d.ts +19 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common';
|
|
2
|
+
import { Component, EventEmitter, HostListener, Inject, Input, Optional, Output, TemplateRef } from '@angular/core';
|
|
3
|
+
import { createApplication } from '@angular/platform-browser';
|
|
4
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
5
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
7
|
+
import { ComponentPortal, PortalModule } from '@angular/cdk/portal';
|
|
8
|
+
import { firstValueFrom } from 'rxjs';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/material/dialog";
|
|
11
|
+
import * as i2 from "@angular/cdk/portal";
|
|
12
|
+
import * as i3 from "@angular/platform-browser";
|
|
13
|
+
import * as i4 from "@angular/material/icon";
|
|
14
|
+
import * as i5 from "@angular/material/progress-spinner";
|
|
15
|
+
export const calcMenuItemBounds = async (menuItems, dataObj) => {
|
|
16
|
+
const data = {
|
|
17
|
+
data: dataObj,
|
|
18
|
+
items: menuItems,
|
|
19
|
+
config: {},
|
|
20
|
+
id: null
|
|
21
|
+
};
|
|
22
|
+
return calcComponentBounds(MenuComponent, data);
|
|
23
|
+
};
|
|
24
|
+
const calcComponentBounds = async (component, data) => {
|
|
25
|
+
// Forcibly bootstrap the ctx menu outside of the client application's zone.
|
|
26
|
+
const app = await createApplication({
|
|
27
|
+
providers: [
|
|
28
|
+
{ provide: MAT_DIALOG_DATA, useValue: data }
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
const del = document.createElement("div");
|
|
32
|
+
del.style.position = "absolute";
|
|
33
|
+
del.style.left = '-1000vw';
|
|
34
|
+
document.body.append(del);
|
|
35
|
+
const base = app.bootstrap(component, del);
|
|
36
|
+
const { instance } = base;
|
|
37
|
+
await firstValueFrom(app.isStable);
|
|
38
|
+
const el = instance.viewContainer?.element?.nativeElement;
|
|
39
|
+
const rect = el.getBoundingClientRect();
|
|
40
|
+
app.destroy();
|
|
41
|
+
del.remove();
|
|
42
|
+
return rect;
|
|
43
|
+
};
|
|
44
|
+
class TemplateWrapper {
|
|
45
|
+
constructor(dialogRef, _data, viewContainer) {
|
|
46
|
+
this.dialogRef = dialogRef;
|
|
47
|
+
this._data = _data;
|
|
48
|
+
this.viewContainer = viewContainer;
|
|
49
|
+
this.data = _data.data;
|
|
50
|
+
this.template = _data.template;
|
|
51
|
+
// TODO: This is probably invalid
|
|
52
|
+
this.templateType = this.template instanceof TemplateRef ? "template" : "component";
|
|
53
|
+
if (this.templateType == "component") {
|
|
54
|
+
this.componentPortal = new ComponentPortal(this.template);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
TemplateWrapper.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TemplateWrapper, deps: [{ token: i1.MatDialogRef, optional: true }, { token: MAT_DIALOG_DATA }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
+
TemplateWrapper.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: TemplateWrapper, isStandalone: true, selector: "ngx-menu-template-wrapper", ngImport: i0, template: `
|
|
60
|
+
<ng-container *ngIf="templateType == 'template'; else portalOutlet">
|
|
61
|
+
<ng-container
|
|
62
|
+
[ngTemplateOutlet]="template"
|
|
63
|
+
[ngTemplateOutletContext]="{ '$implicit': data, dialog: dialogRef }"
|
|
64
|
+
/>
|
|
65
|
+
</ng-container>
|
|
66
|
+
<ng-template #portalOutlet [cdkPortalOutlet]="componentPortal" ></ng-template>
|
|
67
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
68
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TemplateWrapper, decorators: [{
|
|
69
|
+
type: Component,
|
|
70
|
+
args: [{
|
|
71
|
+
selector: 'ngx-menu-template-wrapper',
|
|
72
|
+
template: `
|
|
73
|
+
<ng-container *ngIf="templateType == 'template'; else portalOutlet">
|
|
74
|
+
<ng-container
|
|
75
|
+
[ngTemplateOutlet]="template"
|
|
76
|
+
[ngTemplateOutletContext]="{ '$implicit': data, dialog: dialogRef }"
|
|
77
|
+
/>
|
|
78
|
+
</ng-container>
|
|
79
|
+
<ng-template #portalOutlet [cdkPortalOutlet]="componentPortal" ></ng-template>
|
|
80
|
+
`,
|
|
81
|
+
imports: [NgTemplateOutlet, PortalModule, NgIf],
|
|
82
|
+
standalone: true
|
|
83
|
+
}]
|
|
84
|
+
}], ctorParameters: function () { return [{ type: i1.MatDialogRef, decorators: [{
|
|
85
|
+
type: Optional
|
|
86
|
+
}] }, { type: undefined, decorators: [{
|
|
87
|
+
type: Inject,
|
|
88
|
+
args: [MAT_DIALOG_DATA]
|
|
89
|
+
}] }, { type: i0.ViewContainerRef }]; } });
|
|
90
|
+
export class MenuComponent {
|
|
91
|
+
constructor(viewContainer, sanitizer, _data, dialog, // optional only for the purpose of estimating dimensions
|
|
92
|
+
dialogRef, changeDetector) {
|
|
93
|
+
this.viewContainer = viewContainer;
|
|
94
|
+
this.sanitizer = sanitizer;
|
|
95
|
+
this._data = _data;
|
|
96
|
+
this.dialog = dialog;
|
|
97
|
+
this.dialogRef = dialogRef;
|
|
98
|
+
this.changeDetector = changeDetector;
|
|
99
|
+
this.closeSignal = new EventEmitter();
|
|
100
|
+
// Check if there are any slashes or dots -- that will clearly exclude it from being a mat icon
|
|
101
|
+
this.matIconRx = /[\/\.]/i;
|
|
102
|
+
this.showIconColumn = true;
|
|
103
|
+
this.showShortcutColumn = true;
|
|
104
|
+
// Defaults are set before @Input() hooks evaluate
|
|
105
|
+
this.data = this._data?.data;
|
|
106
|
+
this.parentCords = this._data?.parentCords;
|
|
107
|
+
this.items = this._data?.items;
|
|
108
|
+
this.config = this._data?.config;
|
|
109
|
+
this.id = this._data?.id;
|
|
110
|
+
}
|
|
111
|
+
ngOnInit() {
|
|
112
|
+
this.items?.forEach(i => {
|
|
113
|
+
if (typeof i == "string")
|
|
114
|
+
return;
|
|
115
|
+
// Set defaults
|
|
116
|
+
i['_disabled'] = false;
|
|
117
|
+
i['_visible'] = true;
|
|
118
|
+
if (i.label)
|
|
119
|
+
try {
|
|
120
|
+
i['_formattedLabel'] = this.formatLabel(i.label);
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
console.warn(e);
|
|
124
|
+
}
|
|
125
|
+
if (typeof i.isDisabled == "function")
|
|
126
|
+
try {
|
|
127
|
+
i['_disabled'] = i.isDisabled(this.data || {});
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
console.warn(e);
|
|
131
|
+
}
|
|
132
|
+
if (typeof i.isVisible == "function")
|
|
133
|
+
try {
|
|
134
|
+
i['_visible'] = i.isVisible(this.data || {});
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
console.warn(e);
|
|
138
|
+
}
|
|
139
|
+
if (typeof i.linkTemplate == "function")
|
|
140
|
+
try {
|
|
141
|
+
i['_link'] = i.linkTemplate(this.data || {});
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
console.warn(e);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
// Show the icon column if there are any items with an icon
|
|
148
|
+
this.showIconColumn = !!this.items.find(i => typeof i == "object" &&
|
|
149
|
+
typeof i['icon'] == "string" &&
|
|
150
|
+
i['icon'].length > 2);
|
|
151
|
+
this.showShortcutColumn = !!this.items.find(i => typeof i == "object" &&
|
|
152
|
+
typeof i['shortcut'] == "string" &&
|
|
153
|
+
i['shortcut'].length > 2);
|
|
154
|
+
// setTimeout(() => {
|
|
155
|
+
// this.closeOnLeave = true
|
|
156
|
+
// }, 300);
|
|
157
|
+
}
|
|
158
|
+
ngAfterViewInit() {
|
|
159
|
+
if (this.parentCords) {
|
|
160
|
+
this.selfCords = this.viewContainer?.element?.nativeElement?.getBoundingClientRect();
|
|
161
|
+
this.changeDetector.detectChanges();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
*
|
|
166
|
+
* @param item
|
|
167
|
+
* @param evt
|
|
168
|
+
* @returns
|
|
169
|
+
*/
|
|
170
|
+
async onMenuItemClick(item, row, hideBackdrop = false) {
|
|
171
|
+
if (typeof item == 'string')
|
|
172
|
+
return null;
|
|
173
|
+
if (item.separator)
|
|
174
|
+
return null;
|
|
175
|
+
// If cache is enabled, only load if we don't have any children.
|
|
176
|
+
const forceLoad = (item.cacheResolvedChildren ? !item.children : true);
|
|
177
|
+
if (item.childrenResolver && forceLoad) {
|
|
178
|
+
item['_isResolving'] = true;
|
|
179
|
+
item.children = await item.childrenResolver(this.data);
|
|
180
|
+
item['_isResolving'] = false;
|
|
181
|
+
}
|
|
182
|
+
if (!item.childTemplate && !item.children) {
|
|
183
|
+
if (item.action) {
|
|
184
|
+
item.action(this.data);
|
|
185
|
+
this.close();
|
|
186
|
+
}
|
|
187
|
+
// If no action, this is simply a text item.
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
// Need X pos, Y pos, width and height
|
|
191
|
+
const bounds = row.getBoundingClientRect();
|
|
192
|
+
const cords = {
|
|
193
|
+
top: null,
|
|
194
|
+
left: null,
|
|
195
|
+
bottom: null,
|
|
196
|
+
right: null
|
|
197
|
+
};
|
|
198
|
+
// Set position coordinates
|
|
199
|
+
const { width, height } = await (item.childTemplate
|
|
200
|
+
? calcComponentBounds(TemplateWrapper, { template: item.childTemplate })
|
|
201
|
+
: calcMenuItemBounds(item.children, this.data));
|
|
202
|
+
if (bounds.y + height > window.innerHeight)
|
|
203
|
+
cords.bottom = "0px";
|
|
204
|
+
if (bounds.x + bounds.width + width > window.innerWidth)
|
|
205
|
+
cords.left = ((bounds.x - width)) + "px";
|
|
206
|
+
if (!cords.bottom)
|
|
207
|
+
cords.top = bounds.y + "px";
|
|
208
|
+
if (!cords.left)
|
|
209
|
+
cords.left = bounds.x + bounds.width + "px";
|
|
210
|
+
const component = item.children ? MenuComponent : TemplateWrapper;
|
|
211
|
+
const dialogRef = this.dialog.open(component, {
|
|
212
|
+
position: cords,
|
|
213
|
+
panelClass: ["ngx-ctx-menu", "ngx-app-menu"].concat(this.config?.customClass || []),
|
|
214
|
+
backdropClass: "ngx-ctx-menu-backdrop",
|
|
215
|
+
hasBackdrop: !hideBackdrop,
|
|
216
|
+
data: {
|
|
217
|
+
data: this.data,
|
|
218
|
+
parentCords: this.viewContainer?.element?.nativeElement?.getBoundingClientRect(),
|
|
219
|
+
items: item.children,
|
|
220
|
+
template: item.childTemplate,
|
|
221
|
+
config: this.config
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
let _s = dialogRef
|
|
225
|
+
.afterClosed()
|
|
226
|
+
.subscribe((result) => {
|
|
227
|
+
if (result != -1) {
|
|
228
|
+
if (result && typeof item.action == 'function')
|
|
229
|
+
item.action(result);
|
|
230
|
+
this.close();
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
item['_selfclose'] = Date.now();
|
|
234
|
+
}
|
|
235
|
+
_s.unsubscribe();
|
|
236
|
+
});
|
|
237
|
+
return dialogRef;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
*
|
|
241
|
+
* @param label
|
|
242
|
+
* @returns
|
|
243
|
+
*/
|
|
244
|
+
formatLabel(label) {
|
|
245
|
+
return label.replace(/_([a-z0-9])_/i, (match, group) => `<u>${group}</u>`);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Close the context menu under these circumstances
|
|
249
|
+
*/
|
|
250
|
+
// @HostListener("window:resize", ['event'])
|
|
251
|
+
// @HostListener("window:blur", ['event'])
|
|
252
|
+
close() {
|
|
253
|
+
this.closeSignal.emit();
|
|
254
|
+
this.dialogRef?.close();
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Check if the dialog is clipping offscreen
|
|
258
|
+
* if so, move it back into view.
|
|
259
|
+
*/
|
|
260
|
+
onResize() {
|
|
261
|
+
const el = this.viewContainer?.element?.nativeElement;
|
|
262
|
+
if (!el)
|
|
263
|
+
return;
|
|
264
|
+
const { width, height, x, y } = el.getBoundingClientRect();
|
|
265
|
+
const target = document.querySelector(".ngx-ctx-menu,.ngx-app-menu");
|
|
266
|
+
if (!target)
|
|
267
|
+
return;
|
|
268
|
+
// Move back into view if we're clipping outside of the bottom
|
|
269
|
+
if (y + height > window.innerHeight) {
|
|
270
|
+
const newTop = (window.innerHeight - (height + (this.config.edgePadding || 12))) + "px";
|
|
271
|
+
target.style['margin-top'] = newTop;
|
|
272
|
+
}
|
|
273
|
+
// Move back into view if we're clipping off the right
|
|
274
|
+
if (x + width > window.innerWidth) {
|
|
275
|
+
const newLeft = (window.innerWidth - (width + (this.config.edgePadding || 12))) + "px";
|
|
276
|
+
target.style['margin-left'] = newLeft;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, deps: [{ token: i0.ViewContainerRef }, { token: i3.DomSanitizer }, { token: MAT_DIALOG_DATA, optional: true }, { token: i1.MatDialog, optional: true }, { token: i1.MatDialogRef, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
281
|
+
MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: MenuComponent, isStandalone: true, selector: "ngx-menu", inputs: { data: "data", parentCords: "parentCords", items: "items", config: "config", id: "id" }, outputs: { closeSignal: "closeSignal" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0, template: "<table>\n <tbody>\n <ng-container *ngFor=\"let item of items\">\n <ng-container>\n\n <!-- A row with a click action -->\n <tr #row\n *ngIf=\"item != 'separator' && item.separator != true && item['_visible']\"\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row)\"\n [class.hover]=\"item['children'] && row['hover']\"\n (pointerenter)=\"row['hover'] = true;\"\n (pointerleave)=\"row['hover'] = false\"\n >\n <!-- (item['children']?.length > 0 || item['childTemplate']) && onHover(item, row); closeOnLeave=true -->\n <td class=\"icon\" *ngIf=\"showIconColumn\">\n <img *ngIf=\"matIconRx.test(item.icon); else matIcon\" [src]=\"item.icon\" />\n <ng-template #matIcon>\n <mat-icon [fontIcon]=\"item.icon\"></mat-icon>\n </ng-template>\n </td>\n\n <!-- 'Normal' action based item -->\n <ng-container>\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n <ng-container\n *ngIf=\"$any(item.labelTemplate)?.prototype; else labelTemplate\"\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{ '$implicit': data, 'dialog': dialogRef }\"\n />\n\n <ng-template #labelTemplate>\n <ng-container *ngIf=\"!$any(item)?.labelTemplate\">\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n </ng-container>\n <ng-container *ngIf=\"$any(item)?.labelTemplate\">\n {{$any(item)?.labelTemplate(data || {})}}\n </ng-container>\n </ng-template>\n </a>\n </td>\n </ng-container>\n\n <td class=\"shortcut\" *ngIf=\"showShortcutColumn\">\n {{item.shortcutLabel}}\n </td>\n <td style=\"min-width: 16px\">\n <mat-icon *ngIf=\"\n (item.children && item.children.length > 0) ||\n item.childTemplate ||\n (item.childrenResolver && !item['_isResolving'])\n \"\n sytle=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n\n <mat-progress-spinner *ngIf=\"item['_isResolving']\" mode=\"indeterminate\" [diameter]=\"20\" style=\"margin-right: 4px\"/>\n </td>\n </tr>\n\n <tr *ngIf=\"item != 'separator' && item.separator == true\" class=\"disabled separator\">\n <td class=\"center\" [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n <tr *ngIf=\"item == 'separator'\" class=\"disabled separator\">\n <td [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <hr/>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n</table>\n\n<!-- <div *ngIf=\"true\" class=\"backdrop\"></div> -->\n<!-- <div\n *ngIf=\"parentCords && this.selfCords\"\n class=\"backdrop parent\"\n [style.top]=\"(parentCords.y - selfCords.y + 6) + 'px'\"\n [style.left]=\"(parentCords.x - selfCords.x + 12) + 'px'\"\n [style.width]=\"(parentCords.width) + 'px'\"\n [style.height]=\"(parentCords.height) + 'px'\"\n>\n</div> -->\n<!-- <ng-container *ngIf=\"parentCords && selfCords\">\n <div #top\n class=\"backdrop-outer\"\n [style.bottom]=\"(parentCords.y - selfCords.y)*-1 + parentCords.height + 'px'\"\n style=\"background: #f003;\"\n (pointerenter)=\"onLeave()\"\n ></div>\n <div #right\n class=\"backdrop-outer\"\n [style.left]=\"((parentCords.x - selfCords.x) + parentCords.width) + 'px'\"\n style=\"background: #0f03;\"\n (pointerenter)=\"onLeave()\"\n >\n <div>px: {{parentCords.x}}</div>\n <div>py: {{parentCords.y}}</div>\n <div>pw: {{parentCords.width}}</div>\n <div>ph: {{parentCords.height}}</div>\n <div>sx: {{selfCords.x}}</div>\n <div>sy: {{selfCords.y}}</div>\n <div>sw: {{selfCords.width}}</div>\n <div>sh: {{selfCords.height}}</div>\n </div>\n <div #bottom\n class=\"backdrop-outer\"\n [style.top]=\"((parentCords.y + parentCords.height - selfCords.y)) + 'px'\"\n style=\"background: #00f3;\"\n (pointerenter)=\"onLeave()\"\n ></div>\n <div #left\n class=\"backdrop-outer\"\n [style.right]=\"((parentCords.x - selfCords.x)*-1 + parentCords.width + 32) + 'px'\"\n style=\"background: #fff3;\"\n (pointerenter)=\"onLeave()\"\n ></div>\n</ng-container> -->\n", styles: ["::ng-deep .cdk-overlay-container .ngx-ctx-menu{--mdc-dialog-container-color: var(--ngx-ctx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-ctx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-ctx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-ctx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block;overflow:hidden auto}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-ctx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled):hover{background-color:var(--ngx-ctx-menu-hover-background-color, #94ebeb);color:var(--ngx-ctx-menu-hover-text-color, #000)}tr:not(.disabled):hover a{color:var(--ngx-ctx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-ctx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-ctx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-ctx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-ctx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-ctx-menu-item-height, 30px)}td{vertical-align:middle}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i5.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] });
|
|
282
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MenuComponent, decorators: [{
|
|
283
|
+
type: Component,
|
|
284
|
+
args: [{ selector: 'ngx-menu', imports: [
|
|
285
|
+
NgIf,
|
|
286
|
+
NgForOf,
|
|
287
|
+
NgTemplateOutlet,
|
|
288
|
+
MatIconModule,
|
|
289
|
+
MatProgressSpinnerModule
|
|
290
|
+
], standalone: true, template: "<table>\n <tbody>\n <ng-container *ngFor=\"let item of items\">\n <ng-container>\n\n <!-- A row with a click action -->\n <tr #row\n *ngIf=\"item != 'separator' && item.separator != true && item['_visible']\"\n [class.disabled]=\"item['_disabled']\"\n (click)=\"!item['_disabled'] && onMenuItemClick(item, row)\"\n [class.hover]=\"item['children'] && row['hover']\"\n (pointerenter)=\"row['hover'] = true;\"\n (pointerleave)=\"row['hover'] = false\"\n >\n <!-- (item['children']?.length > 0 || item['childTemplate']) && onHover(item, row); closeOnLeave=true -->\n <td class=\"icon\" *ngIf=\"showIconColumn\">\n <img *ngIf=\"matIconRx.test(item.icon); else matIcon\" [src]=\"item.icon\" />\n <ng-template #matIcon>\n <mat-icon [fontIcon]=\"item.icon\"></mat-icon>\n </ng-template>\n </td>\n\n <!-- 'Normal' action based item -->\n <ng-container>\n <td class=\"label\"\n [style.padding-left]=\"showIconColumn ? 0 : '16px'\"\n >\n <a\n [attr.target]=\"item.linkTarget\"\n [attr.href]=\"(item['_link'] || item.link) ? sanitizer.bypassSecurityTrustUrl(item['_link'] || item.link) : undefined\"\n >\n <ng-container\n *ngIf=\"$any(item.labelTemplate)?.prototype; else labelTemplate\"\n [ngTemplateOutlet]=\"$any(item).labelTemplate\"\n [ngTemplateOutletContext]=\"{ '$implicit': data, 'dialog': dialogRef }\"\n />\n\n <ng-template #labelTemplate>\n <ng-container *ngIf=\"!$any(item)?.labelTemplate\">\n <div [innerHTML]=\"item['_formattedLabel']\"></div>\n </ng-container>\n <ng-container *ngIf=\"$any(item)?.labelTemplate\">\n {{$any(item)?.labelTemplate(data || {})}}\n </ng-container>\n </ng-template>\n </a>\n </td>\n </ng-container>\n\n <td class=\"shortcut\" *ngIf=\"showShortcutColumn\">\n {{item.shortcutLabel}}\n </td>\n <td style=\"min-width: 16px\">\n <mat-icon *ngIf=\"\n (item.children && item.children.length > 0) ||\n item.childTemplate ||\n (item.childrenResolver && !item['_isResolving'])\n \"\n sytle=\"transform: translateY(2px)\"\n >\n chevron_right\n </mat-icon>\n\n <mat-progress-spinner *ngIf=\"item['_isResolving']\" mode=\"indeterminate\" [diameter]=\"20\" style=\"margin-right: 4px\"/>\n </td>\n </tr>\n\n <tr *ngIf=\"item != 'separator' && item.separator == true\" class=\"disabled separator\">\n <td class=\"center\" [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <span class=\"hr\">\n {{item['label'] || ''}}\n </span>\n </td>\n </tr>\n <tr *ngIf=\"item == 'separator'\" class=\"disabled separator\">\n <td [attr.colspan]=\"2 + (showIconColumn ? 1 : 0) + (showShortcutColumn ? 1 : 0)\">\n <hr/>\n </td>\n </tr>\n </ng-container>\n </ng-container>\n </tbody>\n</table>\n\n<!-- <div *ngIf=\"true\" class=\"backdrop\"></div> -->\n<!-- <div\n *ngIf=\"parentCords && this.selfCords\"\n class=\"backdrop parent\"\n [style.top]=\"(parentCords.y - selfCords.y + 6) + 'px'\"\n [style.left]=\"(parentCords.x - selfCords.x + 12) + 'px'\"\n [style.width]=\"(parentCords.width) + 'px'\"\n [style.height]=\"(parentCords.height) + 'px'\"\n>\n</div> -->\n<!-- <ng-container *ngIf=\"parentCords && selfCords\">\n <div #top\n class=\"backdrop-outer\"\n [style.bottom]=\"(parentCords.y - selfCords.y)*-1 + parentCords.height + 'px'\"\n style=\"background: #f003;\"\n (pointerenter)=\"onLeave()\"\n ></div>\n <div #right\n class=\"backdrop-outer\"\n [style.left]=\"((parentCords.x - selfCords.x) + parentCords.width) + 'px'\"\n style=\"background: #0f03;\"\n (pointerenter)=\"onLeave()\"\n >\n <div>px: {{parentCords.x}}</div>\n <div>py: {{parentCords.y}}</div>\n <div>pw: {{parentCords.width}}</div>\n <div>ph: {{parentCords.height}}</div>\n <div>sx: {{selfCords.x}}</div>\n <div>sy: {{selfCords.y}}</div>\n <div>sw: {{selfCords.width}}</div>\n <div>sh: {{selfCords.height}}</div>\n </div>\n <div #bottom\n class=\"backdrop-outer\"\n [style.top]=\"((parentCords.y + parentCords.height - selfCords.y)) + 'px'\"\n style=\"background: #00f3;\"\n (pointerenter)=\"onLeave()\"\n ></div>\n <div #left\n class=\"backdrop-outer\"\n [style.right]=\"((parentCords.x - selfCords.x)*-1 + parentCords.width + 32) + 'px'\"\n style=\"background: #fff3;\"\n (pointerenter)=\"onLeave()\"\n ></div>\n</ng-container> -->\n", styles: ["::ng-deep .cdk-overlay-container .ngx-ctx-menu{--mdc-dialog-container-color: var(--ngx-ctx-menu-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-ctx-menu .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-ctx-menu .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-pane.ngx-ctx-menu .mat-mdc-dialog-surface{overflow:visible}:host{-webkit-user-select:none;user-select:none;z-index:1;position:relative;display:block;overflow:hidden auto}table{border-spacing:0;border-radius:5px;padding:4px 0}tr{color:var(--ngx-ctx-menu-text-color, #ccc);font-size:14px;cursor:pointer;transition:background-color 75ms ease,color 75ms ease}tr:not(.disabled):hover{background-color:var(--ngx-ctx-menu-hover-background-color, #94ebeb);color:var(--ngx-ctx-menu-hover-text-color, #000)}tr:not(.disabled):hover a{color:var(--ngx-ctx-menu-hover-text-color, #000)}tr:not(.separator){height:36px}tr.disabled .label{color:var(--ngx-ctx-menu-disabled-text-color, #919191)}tr .center{text-align:center}tr a{outline:0;display:flex;align-items:center;gap:10px;justify-content:space-between;height:100%;width:100%}tr .label{min-width:100px}.hr{height:1px;text-align:center;position:relative}.hr:before,.hr:after{content:\"\";background:var(--ngx-ctx-menu-separator-color, #2a2a2a);display:block;position:absolute;top:0;bottom:0;height:1px;margin:auto;width:300px}.hr:before{right:calc(100% + 4px)}.hr:after{left:calc(100% + 4px)}hr{background:var(--ngx-ctx-menu-separator-color, #2a2a2a);border:0;height:1px;margin:0}.icon{width:24px;height:24px;padding-left:10px}.icon mat-icon{transform:translateY(2px)}.shortcut{color:var(--ngx-ctx-menu-shortcut-text-color, #848484);text-align:end;padding-right:10px;padding-left:12px}.label{height:var(--ngx-ctx-menu-item-height, 30px)}td{vertical-align:middle}\n"] }]
|
|
291
|
+
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i3.DomSanitizer }, { type: undefined, decorators: [{
|
|
292
|
+
type: Optional
|
|
293
|
+
}, {
|
|
294
|
+
type: Inject,
|
|
295
|
+
args: [MAT_DIALOG_DATA]
|
|
296
|
+
}] }, { type: i1.MatDialog, decorators: [{
|
|
297
|
+
type: Optional
|
|
298
|
+
}] }, { type: i1.MatDialogRef, decorators: [{
|
|
299
|
+
type: Optional
|
|
300
|
+
}] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
|
|
301
|
+
type: Input
|
|
302
|
+
}], parentCords: [{
|
|
303
|
+
type: Input
|
|
304
|
+
}], items: [{
|
|
305
|
+
type: Input
|
|
306
|
+
}], config: [{
|
|
307
|
+
type: Input
|
|
308
|
+
}], id: [{
|
|
309
|
+
type: Input
|
|
310
|
+
}], closeSignal: [{
|
|
311
|
+
type: Output
|
|
312
|
+
}], onResize: [{
|
|
313
|
+
type: HostListener,
|
|
314
|
+
args: ["window:resize"]
|
|
315
|
+
}] } });
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvbWVudS9tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy9tZW51L21lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZLLE9BQU8sRUFBZ0IsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RSxPQUFPLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUU5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFHdEMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUFFLFNBQXFCLEVBQUUsT0FBWSxFQUFFLEVBQUU7SUFDNUUsTUFBTSxJQUFJLEdBQUc7UUFDVCxJQUFJLEVBQUUsT0FBTztRQUNiLEtBQUssRUFBRSxTQUFTO1FBQ2hCLE1BQU0sRUFBRSxFQUFFO1FBQ1YsRUFBRSxFQUFFLElBQUk7S0FDWCxDQUFBO0lBRUQsT0FBTyxtQkFBbUIsQ0FBQyxhQUFhLEVB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LENBQUM7WUFDeEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7U0FDdkM7UUFFRCxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDL0IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQTtZQUN0RixNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLE9BQU8sQ0FBQztTQUN6QztJQUNMLENBQUM7OzBHQWpOUSxhQUFhLDhFQWtCRSxlQUFlOzhGQWxCOUIsYUFBYSx1UUNyRzFCLDgzTEFpSUEsaTNERHBDUSxJQUFJLDZGQUNKLE9BQU8sbUhBQ1AsZ0JBQWdCLG1KQUNoQixhQUFhLG1MQUNiLHdCQUF3QjsyRkFJbkIsYUFBYTtrQkFiekIsU0FBUzsrQkFDSSxVQUFVLFdBR1g7d0JBQ0wsSUFBSTt3QkFDSixPQUFPO3dCQUNQLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYix3QkFBd0I7cUJBQzNCLGNBQ1csSUFBSTs7MEJBb0JYLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZUFBZTs7MEJBQ2xDLFFBQVE7OzBCQUNSLFFBQVE7NEVBbkJHLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBQ1UsRUFBRTtzQkFBakIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQXNMQyxRQUFRO3NCQURmLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgY3JlYXRlQXBwbGljYXRpb24gfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5cbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCwgUG9ydGFsTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWVudUl0ZW0sIE1lbnVPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvbWVudSc7XG5cbmV4cG9ydCBjb25zdCBjYWxjTWVudUl0ZW1Cb3VuZHMgPSBhc3luYyAobWVudUl0ZW1zOiBNZW51SXRlbVtdLCBkYXRhT2JqOiBhbnkpID0+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICBkYXRhOiBkYXRhT2JqLFxuICAgICAgICBpdGVtczogbWVudUl0ZW1zLFxuICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICBpZDogbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBjYWxjQ29tcG9uZW50Qm91bmRzKE1lbnVDb21wb25lbnQsIGRhdGEpO1xufVxuXG5jb25zdCBjYWxjQ29tcG9uZW50Qm91bmRzID0gYXN5bmMgKGNvbXBvbmVudDogVHlwZTxhbnk+LCBkYXRhOiBhbnkpID0+IHtcbiAgICAvLyBGb3JjaWJseSBib290c3RyYXAgdGhlIGN0eCBtZW51IG91dHNpZGUgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbidzIHpvbmUuXG4gICAgY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwbGljYXRpb24oe1xuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgIHsgcHJvdmlkZTogTUFUX0RJQUxPR19EQVRBLCB1c2VWYWx1ZTogZGF0YSB9XG4gICAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IGRlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIGRlbC5zdHlsZS5sZWZ0ID0gJy0xMDAwdncnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRlbCk7XG5cbiAgICBjb25zdCBiYXNlID0gYXBwLmJvb3RzdHJhcChjb21wb25lbnQsIGRlbCk7XG4gICAgY29uc3QgeyBpbnN0YW5jZSB9ID0gYmFzZTtcblxuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSBpbnN0YW5jZS52aWV3Q29udGFpbmVyPy5lbGVtZW50Py5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGFwcC5kZXN0cm95KCk7XG4gICAgZGVsLnJlbW92ZSgpO1xuICAgIHJldHVybiByZWN0O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tZW51LXRlbXBsYXRlLXdyYXBwZXInLFxuXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGVtcGxhdGVUeXBlID09ICd0ZW1wbGF0ZSc7IGVsc2UgcG9ydGFsT3V0bGV0XCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICckaW1wbGljaXQnOiBkYXRhLCBkaWFsb2c6IGRpYWxvZ1JlZiB9XCJcbiAgICAgICAgLz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3BvcnRhbE91dGxldCBbY2RrUG9ydGFsT3V0bGV0XT1cImNvbXBvbmVudFBvcnRhbFwiID48L25nLXRlbXBsYXRlPlxuYCxcbiAgICBpbXBvcnRzOiBbIE5nVGVtcGxhdGVPdXRsZXQsIFBvcnRhbE1vZHVsZSwgTmdJZiBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5jbGFzcyBUZW1wbGF0ZVdyYXBwZXIge1xuXG4gICAgZGF0YTogT2JqZWN0O1xuICAgIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgdGVtcGxhdGVUeXBlOiBcInRlbXBsYXRlXCIgfCBcImNvbXBvbmVudFwiXG4gICAgY29tcG9uZW50UG9ydGFsOiBDb21wb25lbnRQb3J0YWw8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8YW55PixcbiAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICAgICAgcHVibGljIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWZcbiAgICApIHtcbiAgICAgICAgdGhpcy5kYXRhID0gX2RhdGEuZGF0YTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IF9kYXRhLnRlbXBsYXRlO1xuXG4gICAgICAgIC8vIFRPRE86IFRoaXMgaXMgcHJvYmFibHkgaW52YWxpZFxuICAgICAgICB0aGlzLnRlbXBsYXRlVHlwZSA9IHRoaXMudGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZiA/IFwidGVtcGxhdGVcIiA6IFwiY29tcG9uZW50XCI7XG5cbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVUeXBlID09IFwiY29tcG9uZW50XCIpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbCh0aGlzLnRlbXBsYXRlIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1lbnUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9tZW51LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0lmLFxuICAgICAgICBOZ0Zvck9mLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGVcbiAgICBdLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KCkgcHVibGljIGRhdGE6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgcGFyZW50Q29yZHM6IERPTVJlY3Q7XG4gICAgQElucHV0KCkgcHVibGljIGl0ZW1zOiBNZW51SXRlbVtdO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IE1lbnVPcHRpb25zO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpZDogc3RyaW5nO1xuXG4gICAgQE91dHB1dCgpIGNsb3NlU2lnbmFsID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgc2VsZkNvcmRzOiBET01SZWN0O1xuICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgc2xhc2hlcyBvciBkb3RzIC0tIHRoYXQgd2lsbCBjbGVhcmx5IGV4Y2x1ZGUgaXQgZnJvbSBiZWluZyBhIG1hdCBpY29uXG4gICAgcHVibGljIHJlYWRvbmx5IG1hdEljb25SeCA9IC9bXFwvXFwuXS9pO1xuICAgIHNob3dJY29uQ29sdW1uID0gdHJ1ZTtcbiAgICBzaG93U2hvcnRjdXRDb2x1bW4gPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIF9kYXRhOiBhbnksXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgLy8gb3B0aW9uYWwgb25seSBmb3IgdGhlIHB1cnBvc2Ugb2YgZXN0aW1hdGluZyBkaW1lbnNpb25zXG4gICAgICAgIEBPcHRpb25hbCgpIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxhbnk+LFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkge1xuICAgICAgICAvLyBEZWZhdWx0cyBhcmUgc2V0IGJlZm9yZSBASW5wdXQoKSBob29rcyBldmFsdWF0ZVxuICAgICAgICB0aGlzLmRhdGEgID0gdGhpcy5fZGF0YT8uZGF0YTtcbiAgICAgICAgdGhpcy5wYXJlbnRDb3JkcyAgPSB0aGlzLl9kYXRhPy5wYXJlbnRDb3JkcztcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuX2RhdGE/Lml0ZW1zO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuX2RhdGE/LmNvbmZpZztcbiAgICAgICAgdGhpcy5pZCA9IHRoaXMuX2RhdGE/LmlkO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLml0ZW1zPy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpID09IFwic3RyaW5nXCIpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHRzXG4gICAgICAgICAgICBpWydfZGlzYWJsZWQnXSA9IGZhbHNlO1xuICAgICAgICAgICAgaVsnX3Zpc2libGUnXSA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChpLmxhYmVsKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19mb3JtYXR0ZWRMYWJlbCddID0gdGhpcy5mb3JtYXRMYWJlbChpLmxhYmVsKTsgfSBjYXRjaCAoZSkgeyBjb25zb2xlLndhcm4oZSkgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGkuaXNEaXNhYmxlZCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICAgICAgdHJ5IHsgaVsnX2Rpc2FibGVkJ10gPSBpLmlzRGlzYWJsZWQodGhpcy5kYXRhIHx8IHt9KTsgfSBjYXRjaChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5pc1Zpc2libGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ192aXNpYmxlJ10gPSBpLmlzVmlzaWJsZSh0aGlzLmRhdGEgfHwge30pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaS5saW5rVGVtcGxhdGUgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHRyeSB7IGlbJ19saW5rJ10gPSBpLmxpbmtUZW1wbGF0ZSh0aGlzLmRhdGEgfHwge30pOyB9IGNhdGNoIChlKSB7IGNvbnNvbGUud2FybihlKSB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNob3cgdGhlIGljb24gY29sdW1uIGlmIHRoZXJlIGFyZSBhbnkgaXRlbXMgd2l0aCBhbiBpY29uXG4gICAgICAgIHRoaXMuc2hvd0ljb25Db2x1bW4gPSAhIXRoaXMuaXRlbXMuZmluZChpID0+XG4gICAgICAgICAgICAgICAgdHlwZW9mIGkgPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpWydpY29uJ10gPT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGlbJ2ljb24nXS5sZW5ndGggPiAyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuc2hvd1Nob3J0Y3V0Q29sdW1uID0gISF0aGlzLml0ZW1zLmZpbmQoaSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBpID09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgaVsnc2hvcnRjdXQnXSA9PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgaVsnc2hvcnRjdXQnXS5sZW5ndGggPiAyXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5jbG9zZU9uTGVhdmUgPSB0cnVlXG4gICAgICAgIC8vIH0sIDMwMCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRDb3Jkcykge1xuICAgICAgICAgICAgdGhpcy5zZWxmQ29yZHMgPSB0aGlzLnZpZXdDb250YWluZXI/LmVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtXG4gICAgICogQHBhcmFtIGV2dFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgYXN5bmMgb25NZW51SXRlbUNsaWNrKGl0ZW06IE1lbnVJdGVtLCByb3c6IEhUTUxUYWJsZVJvd0VsZW1lbnQsIGhpZGVCYWNrZHJvcCA9IGZhbHNlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PSAnc3RyaW5nJykgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChpdGVtLnNlcGFyYXRvcikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSWYgY2FjaGUgaXMgZW5hYmxlZCwgb25seSBsb2FkIGlmIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuLlxuICAgICAgICBjb25zdCBmb3JjZUxvYWQgPSAoaXRlbS5jYWNoZVJlc29sdmVkQ2hpbGRyZW4gPyAhaXRlbS5jaGlsZHJlbiA6IHRydWUpO1xuXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuUmVzb2x2ZXIgJiYgZm9yY2VMb2FkKSB7XG4gICAgICAgICAgICBpdGVtWydfaXNSZXNvbHZpbmcnXSA9IHRydWU7XG4gICAgICAgICAgICBpdGVtLmNoaWxkcmVuID0gYXdhaXQgaXRlbS5jaGlsZHJlblJlc29sdmVyKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICBpdGVtWydfaXNSZXNvbHZpbmcnXSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpdGVtLmNoaWxkVGVtcGxhdGUgJiYgIWl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmFjdGlvbikge1xuICAgICAgICAgICAgICAgIGl0ZW0uYWN0aW9uKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gYWN0aW9uLCB0aGlzIGlzIHNpbXBseSBhIHRleHQgaXRlbS5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWVkIFggcG9zLCBZIHBvcywgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICBjb25zdCBib3VuZHMgPSByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgY29uc3QgY29yZHMgPSB7XG4gICAgICAgICAgICB0b3A6IG51bGwsXG4gICAgICAgICAgICBsZWZ0OiBudWxsLFxuICAgICAgICAgICAgYm90dG9tOiBudWxsLFxuICAgICAgICAgICAgcmlnaHQ6IG51bGxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgcG9zaXRpb24gY29vcmRpbmF0ZXNcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhd2FpdCAoaXRlbS5jaGlsZFRlbXBsYXRlXG4gICAgICAgICAgICA/IGNhbGNDb21wb25lbnRCb3VuZHMoVGVtcGxhdGVXcmFwcGVyLCB7IHRlbXBsYXRlOiBpdGVtLmNoaWxkVGVtcGxhdGUgfSlcbiAgICAgICAgICAgIDogY2FsY01lbnVJdGVtQm91bmRzKGl0ZW0uY2hpbGRyZW4sIHRoaXMuZGF0YSkpO1xuXG4gICAgICAgIGlmIChib3VuZHMueSArIGhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodClcbiAgICAgICAgICAgIGNvcmRzLmJvdHRvbSA9IFwiMHB4XCI7XG4gICAgICAgIGlmIChib3VuZHMueCArIGJvdW5kcy53aWR0aCArIHdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpXG4gICAgICAgICAgICBjb3Jkcy5sZWZ0ID0gKChib3VuZHMueCAtIHdpZHRoKSkgKyBcInB4XCI7XG5cbiAgICAgICAgaWYgKCFjb3Jkcy5ib3R0b20pIGNvcmRzLnRvcCA9IGJvdW5kcy55ICsgXCJweFwiO1xuICAgICAgICBpZiAoIWNvcmRzLmxlZnQpIGNvcmRzLmxlZnQgPSBib3VuZHMueCArIGJvdW5kcy53aWR0aCArIFwicHhcIjtcblxuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBpdGVtLmNoaWxkcmVuID8gTWVudUNvbXBvbmVudCA6IFRlbXBsYXRlV3JhcHBlciBhcyBhbnk7XG5cbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3Blbihjb21wb25lbnQsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb3JkcyxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFtcIm5neC1jdHgtbWVudVwiLCBcIm5neC1hcHAtbWVudVwiXS5jb25jYXQodGhpcy5jb25maWc/LmN1c3RvbUNsYXNzIHx8IFtdKSxcbiAgICAgICAgICAgIGJhY2tkcm9wQ2xhc3M6IFwibmd4LWN0eC1tZW51LWJhY2tkcm9wXCIsXG4gICAgICAgICAgICBoYXNCYWNrZHJvcDogIWhpZGVCYWNrZHJvcCxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICAgICAgICAgICAgcGFyZW50Q29yZHM6IHRoaXMudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgICAgICAgICAgaXRlbXM6IGl0ZW0uY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGl0ZW0uY2hpbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBfcyA9IGRpYWxvZ1JlZlxuICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgaXRlbS5hY3Rpb24gPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFjdGlvbihyZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWydfc2VsZmNsb3NlJ10gPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgX3MudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGlhbG9nUmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBmb3JtYXRMYWJlbChsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGxhYmVsLnJlcGxhY2UoL18oW2EtejAtOV0pXy9pLCAobWF0Y2gsIGdyb3VwKSA9PiBgPHU+JHtncm91cH08L3U+YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGNvbnRleHQgbWVudSB1bmRlciB0aGVzZSBjaXJjdW1zdGFuY2VzXG4gICAgICovXG4gICAgLy8gQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIiwgWydldmVudCddKVxuICAgIC8vIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6Ymx1clwiLCBbJ2V2ZW50J10pXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuY2xvc2VTaWduYWwuZW1pdCgpO1xuXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBkaWFsb2cgaXMgY2xpcHBpbmcgb2Zmc2NyZWVuXG4gICAgICogaWYgc28sIG1vdmUgaXQgYmFjayBpbnRvIHZpZXcuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcbiAgICBwcml2YXRlIG9uUmVzaXplKCkge1xuICAgICAgICBjb25zdCBlbCA9IHRoaXMudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgeCwgeSB9ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5uZ3gtY3R4LW1lbnUsLm5neC1hcHAtbWVudVwiKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgICAgICAvLyBNb3ZlIGJhY2sgaW50byB2aWV3IGlmIHdlJ3JlIGNsaXBwaW5nIG91dHNpZGUgb2YgdGhlIGJvdHRvbVxuICAgICAgICBpZiAoeSArIGhlaWdodCA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbmV3VG9wID0gKHdpbmRvdy5pbm5lckhlaWdodCAtIChoZWlnaHQgKyAodGhpcy5jb25maWcuZWRnZVBhZGRpbmcgfHwgMTIpKSkgKyBcInB4XCI7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGVbJ21hcmdpbi10b3AnXSA9IG5ld1RvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1vdmUgYmFjayBpbnRvIHZpZXcgaWYgd2UncmUgY2xpcHBpbmcgb2ZmIHRoZSByaWdodFxuICAgICAgICBpZiAoeCArIHdpZHRoID4gd2luZG93LmlubmVyV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0xlZnQgPSAod2luZG93LmlubmVyV2lkdGggLSAod2lkdGggKyAodGhpcy5jb25maWcuZWRnZVBhZGRpbmcgfHwgMTIpKSkgKyBcInB4XCJcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZVsnbWFyZ2luLWxlZnQnXSA9IG5ld0xlZnQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwcml2YXRlIGhvdmVyZWRJdGVtczogTWF0RGlhbG9nUmVmPGFueT5bXTtcbiAgICAvLyBhc3luYyBvbkhvdmVyKGl0ZW0sIHJvdzogSFRNTFRhYmxlUm93RWxlbWVudCkge1xuICAgIC8vICAgICB0aGlzLmhvdmVyZWRJdGVtcy5mb3JFYWNoKGkgPT4gaS5jbG9zZSgtMSkpO1xuXG4gICAgLy8gICAgIGlmICh0eXBlb2YgaXRlbVsnX3NlbGZjbG9zZSddID09ICdudW1iZXInICYmIChEYXRlLm5vdygpIC0gaXRlbVsnX3NlbGZjbG9zZSddKSA8IDMqMTAwMCkgcmV0dXJuO1xuXG4gICAgLy8gICAgIGNvbnN0IGhpID0gYXdhaXQgdGhpcy5vbk1lbnVJdGVtQ2xpY2soaXRlbSwgcm93LCB0cnVlKTtcbiAgICAvLyAgICAgdGhpcy5ob3ZlcmVkSXRlbXMucHVzaChoaSk7XG5cbiAgICAvLyAgICAgaGkuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKS50aGVuKGUgPT4ge1xuICAgIC8vICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIC8vICAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbXMuc3BsaWNlKHRoaXMuaG92ZXJlZEl0ZW1zLmZpbmRJbmRleChpID0+IGkgPT0gaGkpLCAxKTtcbiAgICAvLyAgICAgfSlcbiAgICAvLyB9XG5cbiAgICAvLyBjbG9zZU9uTGVhdmUgPSBmYWxzZTtcbiAgICAvLyBhc3luYyBvbkxlYXZlKCkge1xuICAgIC8vICAgICBpZiAodGhpcy5jbG9zZU9uTGVhdmUpIHtcbiAgICAvLyAgICAgICAgIGlmICh0aGlzLmhvdmVyZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICAgICAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbXMuZm9yRWFjaChpID0+IGkuY2xvc2UoLTEpKTtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmhvdmVyZWRJdGVtcy5zcGxpY2UoMCk7XG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICBlbHNlIHtcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsLm5leHQoLTEpO1xuXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoLTEpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gfVxufVxuIiwiPHRhYmxlPlxuICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQSByb3cgd2l0aCBhIGNsaWNrIGFjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8dHIgI3Jvd1xuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0gIT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5zZXBhcmF0b3IgIT0gdHJ1ZSAmJiBpdGVtWydfdmlzaWJsZSddXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIml0ZW1bJ19kaXNhYmxlZCddXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiFpdGVtWydfZGlzYWJsZWQnXSAmJiBvbk1lbnVJdGVtQ2xpY2soaXRlbSwgcm93KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ob3Zlcl09XCJpdGVtWydjaGlsZHJlbiddICYmIHJvd1snaG92ZXInXVwiXG4gICAgICAgICAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwicm93Wydob3ZlciddID0gdHJ1ZTtcIlxuICAgICAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cInJvd1snaG92ZXInXSA9IGZhbHNlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSAgKGl0ZW1bJ2NoaWxkcmVuJ10/Lmxlbmd0aCA+IDAgfHwgaXRlbVsnY2hpbGRUZW1wbGF0ZSddKSAmJiBvbkhvdmVyKGl0ZW0sIHJvdyk7IGNsb3NlT25MZWF2ZT10cnVlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpY29uXCIgKm5nSWY9XCJzaG93SWNvbkNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIm1hdEljb25SeC50ZXN0KGl0ZW0uaWNvbik7IGVsc2UgbWF0SWNvblwiIFtzcmNdPVwiaXRlbS5pY29uXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWF0SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gW2ZvbnRJY29uXT1cIml0ZW0uaWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gJ05vcm1hbCcgYWN0aW9uIGJhc2VkIGl0ZW0gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdF09XCJzaG93SWNvbkNvbHVtbiA/IDAgOiAnMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhcmdldF09XCJpdGVtLmxpbmtUYXJnZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cIihpdGVtWydfbGluayddIHx8IGl0ZW0ubGluaykgPyBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFVybChpdGVtWydfbGluayddIHx8IGl0ZW0ubGluaykgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIkYW55KGl0ZW0ubGFiZWxUZW1wbGF0ZSk/LnByb3RvdHlwZTsgZWxzZSBsYWJlbFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIiRhbnkoaXRlbSkubGFiZWxUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAnJGltcGxpY2l0JzogZGF0YSwgJ2RpYWxvZyc6IGRpYWxvZ1JlZiB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiaXRlbVsnX2Zvcm1hdHRlZExhYmVsJ11cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyRhbnkoaXRlbSk/LmxhYmVsVGVtcGxhdGUoZGF0YSB8fCB7fSl9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwic2hvcnRjdXRcIiAqbmdJZj1cInNob3dTaG9ydGN1dENvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnNob3J0Y3V0TGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJtaW4td2lkdGg6IDE2cHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmNoaWxkVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5jaGlsZHJlblJlc29sdmVyICYmICFpdGVtWydfaXNSZXNvbHZpbmcnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3l0bGU9XCJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMnB4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hldnJvbl9yaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wcm9ncmVzcy1zcGlubmVyICpuZ0lmPVwiaXRlbVsnX2lzUmVzb2x2aW5nJ11cIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtkaWFtZXRlcl09XCIyMFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA0cHhcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPC90cj5cblxuICAgICAgICAgICAgICAgIDx0ciAqbmdJZj1cIml0ZW0gIT0gJ3NlcGFyYXRvcicgJiYgaXRlbS5zZXBhcmF0b3IgPT0gdHJ1ZVwiIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImNlbnRlclwiIFthdHRyLmNvbHNwYW5dPVwiMiArIChzaG93SWNvbkNvbHVtbiA/IDEgOiAwKSArIChzaG93U2hvcnRjdXRDb2x1bW4gPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaHJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bJ2xhYmVsJ10gfHwgJyd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiaXRlbSA9PSAnc2VwYXJhdG9yJ1wiIGNsYXNzPVwiZGlzYWJsZWQgc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cIjIgKyAoc2hvd0ljb25Db2x1bW4gPyAxIDogMCkgKyAoc2hvd1Nob3J0Y3V0Q29sdW1uID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aHIvPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90Ym9keT5cbjwvdGFibGU+XG5cbjwhLS0gPGRpdiAqbmdJZj1cInRydWVcIiBjbGFzcz1cImJhY2tkcm9wXCI+PC9kaXY+IC0tPlxuPCEtLSA8ZGl2XG4gICAgKm5nSWY9XCJwYXJlbnRDb3JkcyAmJiB0aGlzLnNlbGZDb3Jkc1wiXG4gICAgY2xhc3M9XCJiYWNrZHJvcCBwYXJlbnRcIlxuICAgIFtzdHlsZS50b3BdPVwiKHBhcmVudENvcmRzLnkgLSBzZWxmQ29yZHMueSArIDYpICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwiKHBhcmVudENvcmRzLnggLSBzZWxmQ29yZHMueCArIDEyKSArICdweCdcIlxuICAgIFtzdHlsZS53aWR0aF09XCIocGFyZW50Q29yZHMud2lkdGgpICsgJ3B4J1wiXG4gICAgW3N0eWxlLmhlaWdodF09XCIocGFyZW50Q29yZHMuaGVpZ2h0KSArICdweCdcIlxuPlxuPC9kaXY+IC0tPlxuPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwicGFyZW50Q29yZHMgJiYgc2VsZkNvcmRzXCI+XG4gICAgPGRpdiAjdG9wXG4gICAgICAgIGNsYXNzPVwiYmFja2Ryb3Atb3V0ZXJcIlxuICAgICAgICBbc3R5bGUuYm90dG9tXT1cIihwYXJlbnRDb3Jkcy55IC0gc2VsZkNvcmRzLnkpKi0xICsgcGFyZW50Q29yZHMuaGVpZ2h0ICsgJ3B4J1wiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogI2YwMDM7XCJcbiAgICAgICAgKHBvaW50ZXJlbnRlcik9XCJvbkxlYXZlKClcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2ICNyaWdodFxuICAgICAgICBjbGFzcz1cImJhY2tkcm9wLW91dGVyXCJcbiAgICAgICAgW3N0eWxlLmxlZnRdPVwiKChwYXJlbnRDb3Jkcy54IC0gc2VsZkNvcmRzLngpICsgcGFyZW50Q29yZHMud2lkdGgpICsgJ3B4J1wiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogIzBmMDM7XCJcbiAgICAgICAgKHBvaW50ZXJlbnRlcik9XCJvbkxlYXZlKClcIlxuICAgID5cbiAgICA8ZGl2PnB4OiB7e3BhcmVudENvcmRzLnh9fTwvZGl2PlxuICAgIDxkaXY+cHk6IHt7cGFyZW50Q29yZHMueX19PC9kaXY+XG4gICAgPGRpdj5wdzoge3twYXJlbnRDb3Jkcy53aWR0aH19PC9kaXY+XG4gICAgPGRpdj5waDoge3twYXJlbnRDb3Jkcy5oZWlnaHR9fTwvZGl2PlxuICAgIDxkaXY+c3g6IHt7c2VsZkNvcmRzLnh9fTwvZGl2PlxuICAgIDxkaXY+c3k6IHt7c2VsZkNvcmRzLnl9fTwvZGl2PlxuICAgIDxkaXY+c3c6IHt7c2VsZkNvcmRzLndpZHRofX08L2Rpdj5cbiAgICA8ZGl2PnNoOiB7e3NlbGZDb3Jkcy5oZWlnaHR9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgI2JvdHRvbVxuICAgICAgICBjbGFzcz1cImJhY2tkcm9wLW91dGVyXCJcbiAgICAgICAgW3N0eWxlLnRvcF09XCIoKHBhcmVudENvcmRzLnkgKyBwYXJlbnRDb3Jkcy5oZWlnaHQgLSBzZWxmQ29yZHMueSkpICsgJ3B4J1wiXG4gICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogIzAwZjM7XCJcbiAgICAgICAgKHBvaW50ZXJlbnRlcik9XCJvbkxlYXZlKClcIlxuICAgID48L2Rpdj5cbiAgICA8ZGl2ICNsZWZ0XG4gICAgICAgIGNsYXNzPVwiYmFja2Ryb3Atb3V0ZXJcIlxuICAgICAgICBbc3R5bGUucmlnaHRdPVwiKChwYXJlbnRDb3Jkcy54IC0gc2VsZkNvcmRzLngpKi0xICsgcGFyZW50Q29yZHMud2lkdGggKyAzMikgKyAncHgnXCJcbiAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiAjZmZmMztcIlxuICAgICAgICAocG9pbnRlcmVudGVyKT1cIm9uTGVhdmUoKVwiXG4gICAgPjwvZGl2PlxuPC9uZy1jb250YWluZXI+IC0tPlxuIl19
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, HostListener, Inject, Input, TemplateRef } from '@angular/core';
|
|
3
|
+
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
4
|
+
import { Optional } from '@angular/core';
|
|
5
|
+
import { createApplication } from '@angular/platform-browser';
|
|
6
|
+
import { firstValueFrom } from 'rxjs';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/material/dialog";
|
|
9
|
+
import * as i2 from "@angular/common";
|
|
10
|
+
export const calcTooltipBounds = async (template, data) => {
|
|
11
|
+
const args = {
|
|
12
|
+
data: data || {},
|
|
13
|
+
template,
|
|
14
|
+
config: {},
|
|
15
|
+
selfCords: { left: "0px", top: "0px" },
|
|
16
|
+
ownerCords: { x: 0, y: 0, width: 0, height: 0 },
|
|
17
|
+
id: null
|
|
18
|
+
};
|
|
19
|
+
// Forcibly bootstrap the ctx menu outside of the client application's zone.
|
|
20
|
+
const app = await createApplication({
|
|
21
|
+
providers: [
|
|
22
|
+
{ provide: MAT_DIALOG_DATA, useValue: args }
|
|
23
|
+
]
|
|
24
|
+
});
|
|
25
|
+
const del = document.createElement("div");
|
|
26
|
+
del.style.position = "absolute";
|
|
27
|
+
del.style.left = '-1000vw';
|
|
28
|
+
document.body.append(del);
|
|
29
|
+
const base = app.bootstrap(TooltipComponent, del);
|
|
30
|
+
const { instance } = base;
|
|
31
|
+
await firstValueFrom(app.isStable);
|
|
32
|
+
const el = instance.viewContainer?.element?.nativeElement;
|
|
33
|
+
const rect = el.getBoundingClientRect();
|
|
34
|
+
app.destroy();
|
|
35
|
+
del.remove();
|
|
36
|
+
return rect;
|
|
37
|
+
};
|
|
38
|
+
export class TooltipComponent {
|
|
39
|
+
constructor(viewContainer, _data, dialog, // optional only for the purpose of estimating dimensions
|
|
40
|
+
dialogRef) {
|
|
41
|
+
this.viewContainer = viewContainer;
|
|
42
|
+
this._data = _data;
|
|
43
|
+
this.dialog = dialog;
|
|
44
|
+
this.dialogRef = dialogRef;
|
|
45
|
+
this.hasBootstrapped = false;
|
|
46
|
+
this.pointerIsOnVoid = false;
|
|
47
|
+
this.coverRectCords = {
|
|
48
|
+
top: 0,
|
|
49
|
+
left: 0,
|
|
50
|
+
height: 0,
|
|
51
|
+
width: 0
|
|
52
|
+
};
|
|
53
|
+
// Defaults are set before @Input() hooks evaluate
|
|
54
|
+
this.data = this.data || this._data?.data || {};
|
|
55
|
+
this.config = this.config || this._data?.config;
|
|
56
|
+
this.template = this.template || this._data?.template;
|
|
57
|
+
this.ownerCords = this.ownerCords || this._data?.ownerCords;
|
|
58
|
+
this.selfCords = this.selfCords || this._data?.selfCords;
|
|
59
|
+
}
|
|
60
|
+
ngOnInit() {
|
|
61
|
+
const selfY = parseInt(this.selfCords.top.replace('px', ''));
|
|
62
|
+
const selfX = parseInt(this.selfCords.left.replace('px', ''));
|
|
63
|
+
this.coverRectCords = {
|
|
64
|
+
top: this.ownerCords.y - selfY - 16,
|
|
65
|
+
left: this.ownerCords.x - selfX - 16,
|
|
66
|
+
height: this.ownerCords.height + 32,
|
|
67
|
+
width: this.ownerCords.width + 32
|
|
68
|
+
};
|
|
69
|
+
if (this.template instanceof TemplateRef)
|
|
70
|
+
this.isTemplate = true;
|
|
71
|
+
else if (typeof this.template == "function")
|
|
72
|
+
this.isTemplate = false;
|
|
73
|
+
else
|
|
74
|
+
throw new Error("Unrecognized template object provided.");
|
|
75
|
+
// TODO: resolve the event hook with the .void element
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
this.hasBootstrapped = true;
|
|
78
|
+
if (this.pointerIsOnVoid)
|
|
79
|
+
this.dialogRef.close();
|
|
80
|
+
}, 10);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Close the tooltip if these actions occur
|
|
84
|
+
*/
|
|
85
|
+
onClose() {
|
|
86
|
+
this.dialogRef?.close();
|
|
87
|
+
}
|
|
88
|
+
onPointerLeave() {
|
|
89
|
+
this.dialogRef?.close();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
TooltipComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TooltipComponent, deps: [{ token: i0.ViewContainerRef }, { token: MAT_DIALOG_DATA, optional: true }, { token: i1.MatDialog, optional: true }, { token: i1.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
93
|
+
TooltipComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: TooltipComponent, isStandalone: true, selector: "ngx-tooltip", inputs: { data: "data", config: "config", ownerCords: "ownerCords", selfCords: "selfCords", template: "template" }, host: { listeners: { "window:resize": "onClose()", "window:blur": "onClose()", "pointerleave": "onPointerLeave()" } }, ngImport: i0, template: "<!-- Mouse event blocker for pointer leave -->\n<div\n *ngIf=\"coverRectCords\"\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n style=\"z-index: -1;\"\n></div>\n\n<div class=\"void\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && dialogRef.close()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && dialogRef.close()\"\n></div>\n\n<div class=\"container\">\n <ng-container\n *ngIf=\"isTemplate == false\"\n [ngComponentOutlet]=\"$any(template)\"\n >\n </ng-container>\n\n <ng-container\n *ngIf=\"isTemplate == true\"\n >\n <ng-container\n [ngTemplateOutlet]=\"$any(template)\"\n [ngTemplateOutletContext]=\"{ '$implicit': data }\"\n ></ng-container>\n </ng-container>\n</div>\n", styles: ["::ng-deep .cdk-overlay-container .ngx-tooltip{--mdc-dialog-container-color: var(--ngx-tooltip-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-tooltip .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-tooltip .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-container .ngx-tooltip .mdc-dialog__surface{overflow:visible;background-color:#0000}::ng-deep .cdk-overlay-container .context-menu-backdrop.cdk-overlay-backdrop-showing{opacity:0}::ng-deep .cdk-overlay-pane.ngx-tooltip .mat-dialog-container{padding:0}:host{min-width:2px;min-height:2px;display:block}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}.container{width:100%;height:100%;background:var(--ngx-tooltip-background-color, #333);border-radius:6px;overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type:
|
|
94
|
+
// NgIf,
|
|
95
|
+
// NgTemplateOutlet,
|
|
96
|
+
// NgComponentOutlet,
|
|
97
|
+
CommonModule }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
98
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TooltipComponent, decorators: [{
|
|
99
|
+
type: Component,
|
|
100
|
+
args: [{ selector: 'ngx-tooltip', imports: [
|
|
101
|
+
// NgIf,
|
|
102
|
+
// NgTemplateOutlet,
|
|
103
|
+
// NgComponentOutlet,
|
|
104
|
+
CommonModule,
|
|
105
|
+
], standalone: true, template: "<!-- Mouse event blocker for pointer leave -->\n<div\n *ngIf=\"coverRectCords\"\n class=\"owner-mask\"\n [style.top]=\"coverRectCords.top + 'px'\"\n [style.left]=\"coverRectCords.left + 'px'\"\n [style.height]=\"coverRectCords.height + 'px'\"\n [style.width]=\"coverRectCords.width + 'px'\"\n style=\"z-index: -1;\"\n></div>\n\n<div class=\"void\"\n (pointerenter)=\"pointerIsOnVoid = true; hasBootstrapped && dialogRef.close()\"\n (pointerleave)=\"pointerIsOnVoid = false\"\n (pointerdown)=\"hasBootstrapped && dialogRef.close()\"\n></div>\n\n<div class=\"container\">\n <ng-container\n *ngIf=\"isTemplate == false\"\n [ngComponentOutlet]=\"$any(template)\"\n >\n </ng-container>\n\n <ng-container\n *ngIf=\"isTemplate == true\"\n >\n <ng-container\n [ngTemplateOutlet]=\"$any(template)\"\n [ngTemplateOutletContext]=\"{ '$implicit': data }\"\n ></ng-container>\n </ng-container>\n</div>\n", styles: ["::ng-deep .cdk-overlay-container .ngx-tooltip{--mdc-dialog-container-color: var(--ngx-tooltip-background-color, #2f2f2f)}::ng-deep .cdk-overlay-container .ngx-tooltip .mdc-dialog__container{transform-origin:top left}::ng-deep .cdk-overlay-container .ngx-tooltip .mdc-dialog--open .mdc-dialog__container{transform:none}::ng-deep .cdk-overlay-container .ngx-tooltip .mdc-dialog__surface{overflow:visible;background-color:#0000}::ng-deep .cdk-overlay-container .context-menu-backdrop.cdk-overlay-backdrop-showing{opacity:0}::ng-deep .cdk-overlay-pane.ngx-tooltip .mat-dialog-container{padding:0}:host{min-width:2px;min-height:2px;display:block}.void,.owner-mask{position:absolute}.void{top:-100vh;right:-100vw;bottom:-100vh;left:-100vw;z-index:-2}.container{width:100%;height:100%;background:var(--ngx-tooltip-background-color, #333);border-radius:6px;overflow:hidden}\n"] }]
|
|
106
|
+
}], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{
|
|
107
|
+
type: Optional
|
|
108
|
+
}, {
|
|
109
|
+
type: Inject,
|
|
110
|
+
args: [MAT_DIALOG_DATA]
|
|
111
|
+
}] }, { type: i1.MatDialog, decorators: [{
|
|
112
|
+
type: Optional
|
|
113
|
+
}] }, { type: i1.MatDialogRef, decorators: [{
|
|
114
|
+
type: Optional
|
|
115
|
+
}] }]; }, propDecorators: { data: [{
|
|
116
|
+
type: Input
|
|
117
|
+
}], config: [{
|
|
118
|
+
type: Input
|
|
119
|
+
}], ownerCords: [{
|
|
120
|
+
type: Input
|
|
121
|
+
}], selfCords: [{
|
|
122
|
+
type: Input
|
|
123
|
+
}], template: [{
|
|
124
|
+
type: Input
|
|
125
|
+
}], onClose: [{
|
|
126
|
+
type: HostListener,
|
|
127
|
+
args: ["window:resize"]
|
|
128
|
+
}, {
|
|
129
|
+
type: HostListener,
|
|
130
|
+
args: ["window:blur"]
|
|
131
|
+
}], onPointerLeave: [{
|
|
132
|
+
type: HostListener,
|
|
133
|
+
args: ["pointerleave"]
|
|
134
|
+
}] } });
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL2NvbXBvbmVudHMvdG9vbHRpcC90b29sdGlwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvY29tcG9uZW50cy90b29sdGlwL3Rvb2x0aXAuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUEwQixNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQTJCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7OztBQUd0QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLEVBQUUsUUFBc0MsRUFBRSxJQUFTLEVBQUUsRUFBRTtJQUN6RixNQUFNLElBQUksR0FBRztRQUNULElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtRQUNoQixRQUFRO1FBQ1IsTUFBTSxFQUFFLEVBQUU7UUFDVixTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7UUFDdEMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUMvQyxFQUFFLEVBQUUsSUFBSTtLQUNYLENBQUE7SUFDRCw0RUFB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Q1IsUUFBUTs0Q0FyQkosSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkEyREUsT0FBTztzQkFGZCxZQUFZO3VCQUFDLGVBQWU7O3NCQUM1QixZQUFZO3VCQUFDLGFBQWE7Z0JBTW5CLGNBQWM7c0JBRHJCLFlBQVk7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5qZWN0LCBJbnB1dCwgVGVtcGxhdGVSZWYsIFR5cGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUG9wdXBPcHRpb25zIH0gZnJvbSAnLi4vLi4vdHlwZXMvcG9wdXAnO1xuXG5leHBvcnQgY29uc3QgY2FsY1Rvb2x0aXBCb3VuZHMgPSBhc3luYyAodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBUeXBlPGFueT4sIGRhdGE6IGFueSkgPT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgIGRhdGE6IGRhdGEgfHwge30sXG4gICAgICAgIHRlbXBsYXRlLFxuICAgICAgICBjb25maWc6IHt9LFxuICAgICAgICBzZWxmQ29yZHM6IHsgbGVmdDogXCIwcHhcIiwgdG9wOiBcIjBweFwiIH0sXG4gICAgICAgIG93bmVyQ29yZHM6IHsgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCB9LFxuICAgICAgICBpZDogbnVsbFxuICAgIH1cbiAgICAvLyBGb3JjaWJseSBib290c3RyYXAgdGhlIGN0eCBtZW51IG91dHNpZGUgb2YgdGhlIGNsaWVudCBhcHBsaWNhdGlvbidzIHpvbmUuXG4gICAgY29uc3QgYXBwID0gYXdhaXQgY3JlYXRlQXBwbGljYXRpb24oe1xuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgIHsgcHJvdmlkZTogTUFUX0RJQUxPR19EQVRBLCB1c2VWYWx1ZTogYXJncyB9XG4gICAgICAgIF1cbiAgICB9KTtcblxuICAgIGNvbnN0IGRlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGVsLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgIGRlbC5zdHlsZS5sZWZ0ID0gJy0xMDAwdncnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGRlbCk7XG5cbiAgICBjb25zdCBiYXNlID0gYXBwLmJvb3RzdHJhcChUb29sdGlwQ29tcG9uZW50LCBkZWwpO1xuICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cbiAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShhcHAuaXNTdGFibGUpO1xuXG4gICAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gaW5zdGFuY2Uudmlld0NvbnRhaW5lcj8uZWxlbWVudD8ubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhcHAuZGVzdHJveSgpO1xuICAgIGRlbC5yZW1vdmUoKTtcblxuICAgIHJldHVybiByZWN0O1xufVxuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LXRvb2x0aXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90b29sdGlwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90b29sdGlwLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaW1wb3J0czogW1xuICAgICAgICAvLyBOZ0lmLFxuICAgICAgICAvLyBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICAvLyBOZ0NvbXBvbmVudE91dGxldCxcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgIF0sXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBUb29sdGlwQ29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XG4gICAgQElucHV0KCkgY29uZmlnOiBQb3B1cE9wdGlvbnM7XG4gICAgQElucHV0KCkgb3duZXJDb3JkczogRE9NUmVjdDtcbiAgICBASW5wdXQoKSBzZWxmQ29yZHM7XG4gICAgQElucHV0KCkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBUeXBlPGFueT47XG5cbiAgICBpc1RlbXBsYXRlOiBib29sZWFuO1xuICAgIGhhc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHBvaW50ZXJJc09uVm9pZCA9IGZhbHNlO1xuXG4gICAgY292ZXJSZWN0Q29yZHMgPSB7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICB3aWR0aDogMFxuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLCAvLyBvcHRpb25hbCBvbmx5IGZvciB0aGUgcHVycG9zZSBvZiBlc3RpbWF0aW5nIGRpbWVuc2lvbnNcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPGFueT4sXG4gICAgKSB7XG4gICAgICAgIC8vIERlZmF1bHRzIGFyZSBzZXQgYmVmb3JlIEBJbnB1dCgpIGhvb2tzIGV2YWx1YXRlXG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YSB8fCB0aGlzLl9kYXRhPy5kYXRhIHx8IHt9O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHRoaXMuX2RhdGE/LmNvbmZpZztcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUgfHwgdGhpcy5fZGF0YT8udGVtcGxhdGU7XG4gICAgICAgIHRoaXMub3duZXJDb3JkcyA9IHRoaXMub3duZXJDb3JkcyB8fCB0aGlzLl9kYXRhPy5vd25lckNvcmRzO1xuICAgICAgICB0aGlzLnNlbGZDb3JkcyA9IHRoaXMuc2VsZkNvcmRzIHx8IHRoaXMuX2RhdGE/LnNlbGZDb3JkcztcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICBjb25zdCBzZWxmWSA9IHBhcnNlSW50KHRoaXMuc2VsZkNvcmRzLnRvcC5yZXBsYWNlKCdweCcsICcnKSk7XG4gICAgICAgIGNvbnN0IHNlbGZYID0gcGFyc2VJbnQodGhpcy5zZWxmQ29yZHMubGVmdC5yZXBsYWNlKCdweCcsICcnKSk7XG5cbiAgICAgICAgdGhpcy5jb3ZlclJlY3RDb3JkcyA9IHtcbiAgICAgICAgICAgIHRvcDogdGhpcy5vd25lckNvcmRzLnkgLSBzZWxmWSAtIDE2LFxuICAgICAgICAgICAgbGVmdDogdGhpcy5vd25lckNvcmRzLnggLSBzZWxmWCAtIDE2LFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLm93bmVyQ29yZHMuaGVpZ2h0ICsgMzIsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5vd25lckNvcmRzLndpZHRoICsgMzJcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpXG4gICAgICAgICAgICB0aGlzLmlzVGVtcGxhdGUgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy50ZW1wbGF0ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICB0aGlzLmlzVGVtcGxhdGUgPSBmYWxzZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHRlbXBsYXRlIG9iamVjdCBwcm92aWRlZC5cIik7XG5cbiAgICAgICAgLy8gVE9ETzogcmVzb2x2ZSB0aGUgZXZlbnQgaG9vayB3aXRoIHRoZSAudm9pZCBlbGVtZW50XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNCb290c3RyYXBwZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucG9pbnRlcklzT25Wb2lkKVxuICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIH0sIDEwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgdG9vbHRpcCBpZiB0aGVzZSBhY3Rpb25zIG9jY3VyXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzpyZXNpemVcIilcbiAgICBASG9zdExpc3RlbmVyKFwid2luZG93OmJsdXJcIilcbiAgICBwcml2YXRlIG9uQ2xvc2UoKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIilcbiAgICBwcml2YXRlIG9uUG9pbnRlckxlYXZlKCkge1xuXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmPy5jbG9zZSgpO1xuICAgIH1cbn1cbiIsIjwhLS0gTW91c2UgZXZlbnQgYmxvY2tlciBmb3IgcG9pbnRlciBsZWF2ZSAtLT5cbjxkaXZcbiAgICAqbmdJZj1cImNvdmVyUmVjdENvcmRzXCJcbiAgICBjbGFzcz1cIm93bmVyLW1hc2tcIlxuICAgIFtzdHlsZS50b3BdPVwiY292ZXJSZWN0Q29yZHMudG9wICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwiY292ZXJSZWN0Q29yZHMubGVmdCArICdweCdcIlxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY292ZXJSZWN0Q29yZHMuaGVpZ2h0ICsgJ3B4J1wiXG4gICAgW3N0eWxlLndpZHRoXT1cImNvdmVyUmVjdENvcmRzLndpZHRoICsgJ3B4J1wiXG4gICAgc3R5bGU9XCJ6LWluZGV4OiAtMTtcIlxuPjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwidm9pZFwiXG4gICAgKHBvaW50ZXJlbnRlcik9XCJwb2ludGVySXNPblZvaWQgPSB0cnVlOyBoYXNCb290c3RyYXBwZWQgJiYgZGlhbG9nUmVmLmNsb3NlKClcIlxuICAgIChwb2ludGVybGVhdmUpPVwicG9pbnRlcklzT25Wb2lkID0gZmFsc2VcIlxuICAgIChwb2ludGVyZG93bik9XCJoYXNCb290c3RyYXBwZWQgJiYgZGlhbG9nUmVmLmNsb3NlKClcIlxuPjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImlzVGVtcGxhdGUgPT0gZmFsc2VcIlxuICAgICAgICBbbmdDb21wb25lbnRPdXRsZXRdPVwiJGFueSh0ZW1wbGF0ZSlcIlxuICAgID5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJpc1RlbXBsYXRlID09IHRydWVcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiJGFueSh0ZW1wbGF0ZSlcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJyRpbXBsaWNpdCc6IGRhdGEgfVwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuIl19
|