@firestitch/system 17.0.0 → 18.0.1
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/app/modules/system/components/api-logs/api-logs.component.d.ts +1 -1
- package/app/modules/system/components/dashboard/dashboard.component.d.ts +8 -8
- package/app/modules/system/components/info/info.component.d.ts +1 -1
- package/app/modules/system/components/server-logs/server-logs.component.d.ts +2 -2
- package/app/modules/system/components/settings/settings.component.d.ts +4 -4
- package/app/modules/system/components/upgrade-logs/upgrade-logs.component.d.ts +1 -1
- package/esm2022/app/modules/query-logs/components/explain/explain.component.mjs +4 -4
- package/esm2022/app/modules/query-logs/components/index.mjs +1 -1
- package/esm2022/app/modules/query-logs/components/query-log/query-log.component.mjs +4 -4
- package/esm2022/app/modules/query-logs/components/query-logs/query-logs.component.mjs +4 -4
- package/esm2022/app/modules/query-logs/query-logs.module.mjs +5 -5
- package/esm2022/app/modules/system/components/api-log/api-log.component.mjs +4 -4
- package/esm2022/app/modules/system/components/api-log/index.mjs +1 -1
- package/esm2022/app/modules/system/components/api-logs/api-logs.component.mjs +16 -13
- package/esm2022/app/modules/system/components/api-logs/index.mjs +1 -1
- package/esm2022/app/modules/system/components/cron/cron.component.mjs +4 -4
- package/esm2022/app/modules/system/components/cron/index.mjs +1 -1
- package/esm2022/app/modules/system/components/cron-log/cron-log.component.mjs +6 -6
- package/esm2022/app/modules/system/components/cron-log/index.mjs +1 -1
- package/esm2022/app/modules/system/components/cron-next-run/cron-next-run.component.mjs +4 -4
- package/esm2022/app/modules/system/components/crons/crons.component.mjs +6 -6
- package/esm2022/app/modules/system/components/crons/index.mjs +1 -1
- package/esm2022/app/modules/system/components/dashboard/dashboard.component.mjs +26 -22
- package/esm2022/app/modules/system/components/dashboard/index.mjs +1 -1
- package/esm2022/app/modules/system/components/info/index.mjs +1 -1
- package/esm2022/app/modules/system/components/info/info.component.mjs +6 -6
- package/esm2022/app/modules/system/components/process/index.mjs +1 -1
- package/esm2022/app/modules/system/components/process/process.component.mjs +5 -5
- package/esm2022/app/modules/system/components/processes/index.mjs +1 -1
- package/esm2022/app/modules/system/components/processes/processes.component.mjs +4 -4
- package/esm2022/app/modules/system/components/server-log/index.mjs +1 -1
- package/esm2022/app/modules/system/components/server-log/server-log.component.mjs +12 -8
- package/esm2022/app/modules/system/components/server-logs/index.mjs +1 -1
- package/esm2022/app/modules/system/components/server-logs/server-logs.component.mjs +22 -19
- package/esm2022/app/modules/system/components/settings/index.mjs +1 -1
- package/esm2022/app/modules/system/components/settings/settings.component.mjs +8 -8
- package/esm2022/app/modules/system/components/upgrade-logs/index.mjs +1 -1
- package/esm2022/app/modules/system/components/upgrade-logs/upgrade-logs.component.mjs +10 -10
- package/esm2022/app/modules/system/consts/api-log-states.const.mjs +1 -1
- package/esm2022/app/modules/system/consts/process-states.const.mjs +1 -1
- package/esm2022/app/modules/system/consts/setting-interface-types.const.mjs +1 -1
- package/esm2022/app/modules/system/enums/api-log-state.enum.mjs +1 -1
- package/esm2022/app/modules/system/enums/cron-state.enum.mjs +1 -1
- package/esm2022/app/modules/system/enums/index.mjs +1 -1
- package/esm2022/app/modules/system/enums/process-state.enum.mjs +1 -1
- package/esm2022/app/modules/system/enums/setting-interface-type.enum.mjs +1 -1
- package/esm2022/app/modules/system/fs-system.module.mjs +5 -5
- package/esm2022/app/modules/system/helpers/index-name-value.mjs +1 -1
- package/esm2022/app/modules/system/injectors/system-config.injector.mjs +1 -1
- package/esm2022/app/modules/system/interfaces/dashboard-action.mjs +1 -1
- package/esm2022/app/modules/system/interfaces/process-action.mjs +1 -1
- package/esm2022/app/modules/system/interfaces/system-config.mjs +1 -1
- package/esm2022/app/modules/system/pipes/key-name-value.pipe.mjs +5 -5
- package/fesm2022/firestitch-system.mjs +124 -110
- package/fesm2022/firestitch-system.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -14,8 +14,8 @@ export declare class ApiLogsComponent implements OnInit {
|
|
|
14
14
|
apiLogStates: {};
|
|
15
15
|
constructor(_dialog: MatDialog);
|
|
16
16
|
ngOnInit(): void;
|
|
17
|
-
private _configList;
|
|
18
17
|
open(apiLog: any): void;
|
|
18
|
+
private _configList;
|
|
19
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<ApiLogsComponent, never>;
|
|
20
20
|
static ɵcmp: i0.ɵɵComponentDeclaration<ApiLogsComponent, "fs-system-api-logs", never, { "loadApiLogs": { "alias": "loadApiLogs"; "required": false; }; }, {}, never, never, false, never>;
|
|
21
21
|
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FsMessage } from '@firestitch/message';
|
|
1
|
+
import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
|
|
3
2
|
import { BuildData, FsBuildService } from '@firestitch/build';
|
|
3
|
+
import { FsMessage } from '@firestitch/message';
|
|
4
4
|
import { DashboardAction } from './../../interfaces/dashboard-action';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class DashboardComponent implements OnInit {
|
|
6
|
+
export declare class DashboardComponent implements OnInit, OnDestroy {
|
|
7
7
|
private _message;
|
|
8
8
|
private _cdRef;
|
|
9
9
|
private _buildService;
|
|
10
|
+
init: () => any;
|
|
11
|
+
upgrade: () => any;
|
|
12
|
+
load: () => any;
|
|
13
|
+
actions: DashboardAction[];
|
|
10
14
|
dashboard: any;
|
|
11
15
|
buttonActions: DashboardAction[];
|
|
12
16
|
build: BuildData;
|
|
13
17
|
menuActions: DashboardAction[];
|
|
14
18
|
private _destroy$;
|
|
15
|
-
init: Function;
|
|
16
|
-
upgrade: Function;
|
|
17
|
-
load: Function;
|
|
18
|
-
actions: DashboardAction[];
|
|
19
19
|
constructor(_message: FsMessage, _cdRef: ChangeDetectorRef, _buildService: FsBuildService);
|
|
20
20
|
ngOnInit(): void;
|
|
21
|
-
private _load;
|
|
22
21
|
ngOnDestroy(): void;
|
|
23
22
|
actionClick(action: any): void;
|
|
24
23
|
initClick(): void;
|
|
25
24
|
upgradeClick(): void;
|
|
25
|
+
private _load;
|
|
26
26
|
static ɵfac: i0.ɵɵFactoryDeclaration<DashboardComponent, never>;
|
|
27
27
|
static ɵcmp: i0.ɵɵComponentDeclaration<DashboardComponent, "fs-system-dashboard", never, { "init": { "alias": "init"; "required": false; }; "upgrade": { "alias": "upgrade"; "required": false; }; "load": { "alias": "load"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; }, {}, never, never, false, never>;
|
|
28
28
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
|
-
import { FsListConfig, FsListComponent } from '@firestitch/list';
|
|
3
2
|
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
+
import { FsListComponent, FsListConfig } from '@firestitch/list';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
export declare class ServerLogsComponent implements OnInit {
|
|
@@ -14,8 +14,8 @@ export declare class ServerLogsComponent implements OnInit {
|
|
|
14
14
|
logTypes: any[];
|
|
15
15
|
constructor(_dialog: MatDialog);
|
|
16
16
|
ngOnInit(): void;
|
|
17
|
-
private _configList;
|
|
18
17
|
open(log: any): void;
|
|
18
|
+
private _configList;
|
|
19
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<ServerLogsComponent, never>;
|
|
20
20
|
static ɵcmp: i0.ɵɵComponentDeclaration<ServerLogsComponent, "fs-system-server-logs", never, { "loadLogs": { "alias": "loadLogs"; "required": false; }; }, {}, never, never, false, never>;
|
|
21
21
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { FsPrompt } from '@firestitch/prompt';
|
|
3
|
-
import { FsMessage } from '@firestitch/message';
|
|
1
|
+
import { ChangeDetectorRef, EventEmitter, OnInit } from '@angular/core';
|
|
4
2
|
import { FsClipboard } from '@firestitch/clipboard';
|
|
5
|
-
import {
|
|
3
|
+
import { FsMessage } from '@firestitch/message';
|
|
4
|
+
import { FsPrompt } from '@firestitch/prompt';
|
|
6
5
|
import { Observable } from 'rxjs';
|
|
6
|
+
import { SettingInterfaceType } from '../../enums';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class SettingsComponent implements OnInit {
|
|
9
9
|
private _message;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { FsListComponent, FsListConfig } from '@firestitch/list';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class UpgradeLogsComponent implements OnInit {
|
|
@@ -13,14 +13,14 @@ export class ExplainComponent {
|
|
|
13
13
|
this._data = _data;
|
|
14
14
|
this.explain = _data.explain;
|
|
15
15
|
}
|
|
16
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
17
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
16
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ExplainComponent, deps: [{ token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
17
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ExplainComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog>\n <h1 mat-dialog-title>Explain</h1>\n <mat-dialog-content>\n <div class=\"explain-popover\">{{explain | json}}</div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".explain-popover{white-space:pre}\n"], dependencies: [{ kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i2.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i2.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i2.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i2.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i3.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i4.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "pipe", type: i5.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
18
18
|
}
|
|
19
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
19
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ExplainComponent, decorators: [{
|
|
20
20
|
type: Component,
|
|
21
21
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-dialog>\n <h1 mat-dialog-title>Explain</h1>\n <mat-dialog-content>\n <div class=\"explain-popover\">{{explain | json}}</div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [".explain-popover{white-space:pre}\n"] }]
|
|
22
22
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
23
23
|
type: Inject,
|
|
24
24
|
args: [MAT_DIALOG_DATA]
|
|
25
25
|
}] }] });
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbGFpbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL2V4cGxhaW4vZXhwbGFpbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL2V4cGxhaW4vZXhwbGFpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7QUFRM0QsTUFBTSxPQUFPLGdCQUFnQjtJQUtRO0lBSDVCLE9BQU8sQ0FBQztJQUVmLFlBQ21DLEtBQVU7UUFBVixVQUFLLEdBQUwsS0FBSyxDQUFLO1FBRTNDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO3VHQVJVLGdCQUFnQixrQkFLakIsZUFBZTsyRkFMZCxnQkFBZ0Isb0RDVjdCLDRYQWVBOzsyRkRMYSxnQkFBZ0I7a0JBTDVCLFNBQVM7c0NBR1MsdUJBQXVCLENBQUMsTUFBTTs7MEJBTzVDLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5cbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vZXhwbGFpbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2V4cGxhaW4uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEV4cGxhaW5Db21wb25lbnQge1xuXG4gIHB1YmxpYyBleHBsYWluO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcml2YXRlIF9kYXRhOiBhbnksXG4gICkge1xuICAgIHRoaXMuZXhwbGFpbiA9IF9kYXRhLmV4cGxhaW47XG4gIH1cbn1cbiIsIjxmcy1kaWFsb2c+XG4gIDxoMSBtYXQtZGlhbG9nLXRpdGxlPkV4cGxhaW48L2gxPlxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJleHBsYWluLXBvcG92ZXJcIj57e2V4cGxhaW4gfCBqc29ufX08L2Rpdj5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIERvbmVcbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48L2ZzLWRpYWxvZz5cbiJdfQ==
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export * from './explain';
|
|
2
2
|
export * from './query-log';
|
|
3
3
|
export * from './query-logs';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9leHBsYWluJztcclxuZXhwb3J0ICogZnJvbSAnLi9xdWVyeS1sb2cnO1xyXG5leHBvcnQgKiBmcm9tICcuL3F1ZXJ5LWxvZ3MnO1xyXG5cclxuIl19
|
|
@@ -48,14 +48,14 @@ export class QueryLogComponent {
|
|
|
48
48
|
get orderingOperation() {
|
|
49
49
|
return this.queryBlock?.orderingOperation;
|
|
50
50
|
}
|
|
51
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
52
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: QueryLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i5.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i6.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i7.FsPopoverComponent, selector: "fs-popover" }, { kind: "component", type: i8.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "component", type: i9.FsClipboardButtonComponent, selector: "fs-clipboard-button", inputs: ["content", "tooltip"] }, { kind: "pipe", type: i10.FsFormatTruncatePipe, name: "fsFormatTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
51
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: QueryLogComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
52
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: QueryLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i3.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i5.FsButtonDirective, selector: "[mat-raised-button]:not([fsFormButtonStandalone]),[mat-button]:not([fsFormButtonStandalone]),[mat-flat-button]:not([fsFormButtonStandalone]),[mat-stroked-button]:not([fsFormButtonStandalone])", inputs: ["name", "dirtySubmit", "form"] }, { kind: "component", type: i6.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i7.FsPopoverComponent, selector: "fs-popover" }, { kind: "component", type: i8.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "component", type: i9.FsClipboardButtonComponent, selector: "fs-clipboard-button", inputs: ["content", "tooltip"] }, { kind: "pipe", type: i10.FsFormatTruncatePipe, name: "fsFormatTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
53
53
|
}
|
|
54
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
54
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: QueryLogComponent, decorators: [{
|
|
55
55
|
type: Component,
|
|
56
56
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-dialog>\n <h1 mat-dialog-title>Query Log</h1>\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>Duration</fs-label>\n {{queryLog.duration}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Optimized</fs-label>\n {{queryLog.optimized ? 'Yes' : 'No'}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{queryLog.queryCost}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>Raw Explain</fs-label>\n <a (click)=\"openExplain()\">View</a>\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>URL</fs-label>\n {{queryLog.path | fsFormatTruncate: 50}}\n </fs-label-field>\n </div>\n\n <mat-tab-group>\n <mat-tab label=\"Query\">\n <fs-clipboard-button\n [content]=\"queryLog.prettyQuery\">\n </fs-clipboard-button>\n <div [innerHTML]=\"queryLog.prettyQuery\" class=\"query\"></div>\n </mat-tab>\n \n <mat-tab label=\"Explain\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock, selectId: queryBlock.selectId, costInfo: queryBlock.costInfo }\"></ng-container>\n </mat-tab>\n </mat-tab-group>\n\n </mat-dialog-content>\n <mat-dialog-actions>\n <button\n mat-button\n type=\"button\"\n color=\"primary\"\n [mat-dialog-close]=\"undefined\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n\n<ng-template #nestedLoop let-queryBlock=\"queryBlock\" let-selectId=\"selectId\" let-costInfo=\"costInfo\">\n <ng-container *ngIf=\"selectId\">\n <h1>Select {{selectId}}</h1>\n </ng-container>\n \n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <ng-container *ngIf=\"costInfo?.queryCost\">\n <fs-label-field>\n <fs-label>Query Cost</fs-label>\n {{costInfo.queryCost}}\n </fs-label-field>\n </ng-container>\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <fs-label-field>\n <fs-label>Ordering Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <fs-label-field>\n <fs-label>Grouping Operation</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </fs-label-field>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <fs-label-field>\n <fs-label>Duplicates Removal</fs-label>\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </fs-label-field>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"queryBlock.orderingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.orderingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.groupingOperation\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.groupingOperation }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.duplicatesRemoval\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: queryBlock.duplicatesRemoval }\"></ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.table\">\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: { nestedLoop: [ queryBlock ]} }\"></ng-container>\n \n <ng-container *ngIf=\"queryBlock.table.attachedSubqueries\"> \n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.table.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container> \n </ng-container>\n\n <ng-container *ngIf=\"queryBlock.nestedLoop\">\n <table class=\"fs-list-table style-line\">\n <thead>\n <tr>\n <th>Table</th>\n <th>Type</th>\n <th>Keys</th>\n <th>Ref</th>\n <th>Rows</th>\n <th>Filtered</th>\n <th>Extra</th>\n <th>Cost</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of queryBlock.nestedLoop; let index = index\">\n <tr>\n <td>\n {{item.table.tableName}}\n </td>\n <td>\n <fs-popover [template]=\"accessTypePopover\" [data]=\"item.table.accessType\">\n <span class=\"access-type\" [ngClass]=\"item.table.accessType\">{{item.table.accessType}}</span>\n </fs-popover> \n </td>\n <td>\n <fs-popover \n [template]=\"keysPopover\"\n [maxWidth]=\"null\"\n [data]=\"{ possibleKeys: item.table.possibleKeys, key: item.table.key }\">\n {{item.table.key}}\n </fs-popover>\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let ref of item.table.ref\">\n <span>{{ref}}</span>\n </ng-container>\n </div>\n </td>\n <td>\n {{item.table.rowsExaminedPerScan}}\n </td>\n <td>\n {{item.table.filtered}}\n </td>\n <td>\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"item.table.indexCondition\">\n <span>\n <fs-popover \n [template]=\"usingIndexCondition\" \n [maxWidth]=\"null\"\n [data]=\"item.table.indexCondition\">\n Using Index Condition\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.table.attachedCondition\">\n <span>\n <fs-popover \n [template]=\"usingWhere\" \n [maxWidth]=\"null\"\n [data]=\"item.table.attachedCondition\">\n Using Where\n </fs-popover>\n </span>\n </ng-container>\n <ng-container *ngIf=\"item.usingIndex\">\n <span>Using Index</span>\n </ng-container> \n <ng-container *ngIf=\"item.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"item.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n </td>\n <td> \n <fs-popover [template]=\"tableCostPopover\" [data]=\"item.table?.costInfo\">\n {{item.table?.costInfo.prefixCost}}\n </fs-popover>\n <ng-template #tableCostPopover let-data=\"data\">\n <div>Eval Cost: {{data.evalCost}}</div>\n <div>Read Cost: {{data.readCost}}</div>\n <div>Prefix Cost: {{data.prefixCost}}</div>\n <div>Data Read Per Join: {{data.dataReadPerJoin}}</div>\n </ng-template>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n <br>\n </ng-container> \n \n <ng-container *ngIf=\"queryBlock.selectListSubqueries\">\n <br>\n <fs-label>Select List Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.selectListSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container> \n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock, selectId: subquery.queryBlock.selectId, costInfo: subquery.queryBlock.costInfo }\"></ng-container>\n </ng-container>\n </ng-container>\n<!-- \n <ng-container *ngIf=\"queryBlock.queryBlockattachedSubqueries\">\n <br>\n <fs-label>Attached Subqueries</fs-label>\n <ng-container *ngFor=\"let subquery of queryBlock.attachedSubqueries\">\n <ng-container [ngTemplateOutlet]=\"queryBlockCritical\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"nestedLoop\" [ngTemplateOutletContext]=\"{ queryBlock: subquery.queryBlock }\"></ng-container>\n </ng-container>\n </ng-container> -->\n</ng-template>\n\n<ng-template #keysPopover let-data=\"data\">\n <div class=\"fs-delimit\">\n <ng-container *ngFor=\"let possibleKey of data.possibleKeys\">\n <span [ngClass]=\"{ 'query-log-used-key': possibleKey === data.key }\">{{possibleKey}}</span>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template #usingWhere let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #usingIndexCondition let-data=\"data\">\n {{data}}\n</ng-template>\n\n<ng-template #accessTypePopover let-data=\"data\">\n {{accessTypes[data]}}\n</ng-template>\n\n\n<ng-template #queryBlockCritical let-queryBlock=\"queryBlock\">\n <div class=\"fs-delimit\">\n <ng-container *ngIf=\"queryBlock.usingFilesort\">\n <span class=\"critical\">Using File Sort</span>\n </ng-container>\n \n <ng-container *ngIf=\"queryBlock.usingTemporaryTable\">\n <span class=\"critical\">Temporary Table</span>\n </ng-container>\n </div>\n</ng-template>", styles: ["::ng-deep .query-log-used-key{font-weight:700}::ng-deep .explain-popover{white-space:pre}.critical{color:red}fs-clipboard-button{float:right}.query{white-space:break-spaces}.access-type{color:green}.access-type.fulltext,.access-type.index,.access-type.range{color:orange}.access-type.ALL{color:red}\n"] }]
|
|
57
57
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
58
58
|
type: Inject,
|
|
59
59
|
args: [MAT_DIALOG_DATA]
|
|
60
60
|
}] }, { type: i1.MatDialog }] });
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9xdWVyeS1sb2dzL2NvbXBvbmVudHMvcXVlcnktbG9nL3F1ZXJ5LWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL3F1ZXJ5LWxvZy9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztBQVE5QyxNQUFNLE9BQU8saUJBQWlCO0lBa0JPO0lBQ3pCO0lBakJILFFBQVEsQ0FBQztJQUNULFdBQVcsR0FBRztRQUNuQixJQUFJLEVBQUUsNEpBQTRKO1FBQ2xLLE1BQU0sRUFBRSxvQ0FBb0M7UUFDNUMsS0FBSyxFQUFFLDJJQUEySTtRQUNsSixNQUFNLEVBQUUsd0pBQXdKO1FBQ2hLLEdBQUcsRUFBRSxpTkFBaU47UUFDdE4sUUFBUSxFQUFFLHNEQUFzRDtRQUNoRSxLQUFLLEVBQUUsa1JBQWtSO1FBQ3pSLFdBQVcsRUFBRSxzT0FBc087UUFDblAsS0FBSyxFQUFFLHlJQUF5STtRQUNoSixlQUFlLEVBQUUsRUFBRTtRQUNuQixHQUFHLEVBQUUsbURBQW1EO0tBQ3pELENBQUM7SUFFRixZQUNtQyxLQUFVLEVBQ25DLE9BQWtCO1FBRE8sVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNuQyxZQUFPLEdBQVAsT0FBTyxDQUFXO1FBRTFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNsQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7SUFDNUMsQ0FBQzt3R0F4Q1UsaUJBQWlCLGtCQWtCbEIsZUFBZTs0RkFsQmQsaUJBQWlCLG9EQ2I5QiwycFVBcVFjOzs0RkR4UEQsaUJBQWlCO2tCQUw3QixTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU07OzBCQW9CNUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuXG5pbXBvcnQgeyBFeHBsYWluQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwbGFpbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVyeS1sb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXJ5TG9nQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcXVlcnlMb2c7XG4gIHB1YmxpYyBhY2Nlc3NUeXBlcyA9IHtcbiAgICBOVUxMOiAnVGhpcyBhY2Nlc3MgbWV0aG9kIG1lYW5zIE15U1FMIGNhbiByZXNvbHZlIHRoZSBxdWVyeSBkdXJpbmcgdGhlIG9wdGltaXphdGlvbiBwaGFzZSBhbmQgd2lsbCBub3QgZXZlbiBhY2Nlc3MgdGhlIHRhYmxlIG9yIGluZGV4IGR1cmluZyB0aGUgZXhlY3V0aW9uIHN0YWdlLicsXG4gICAgc3lzdGVtOiAnVGhlIHRhYmxlIGlzIGVtcHR5IG9yIGhhcyBvbmUgcm93LicsXG4gICAgY29uc3Q6ICdUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBjYW4gYmUgdHJlYXRlZCBhcyBhIGNvbnN0YW50ICh0aGVyZSBpcyBvbmUgcm93IG1hdGNoaW5nIHRoZSBxdWVyeSkuIE5vdGU6IFByaW1hcnkgS2V5IExvb2t1cCwgVW5pcXVlIEluZGV4IExvb2t1cCcsXG4gICAgZXFfcmVmOiAnVGhlIGluZGV4IGlzIGNsdXN0ZXJlZCBhbmQgaXMgYmVpbmcgdXNlZCBieSB0aGUgb3BlcmF0aW9uIChlaXRoZXIgdGhlIGluZGV4IGlzIGEgUFJJTUFSWSBLRVkgb3IgVU5JUVVFIElOREVYIHdpdGggYWxsIGtleSBjb2x1bW5zIGRlZmluZWQgYXMgTk9UIE5VTEwpJyxcbiAgICByZWY6ICdUaGUgaW5kZXhlZCBjb2x1bW4gd2FzIGFjY2Vzc2VkIHVzaW5nIGFuIGVxdWFsaXR5IG9wZXJhdG9yIE5vdGU6IFRoZSByZWZfb3JfbnVsbCBhY2Nlc3MgdHlwZSBpcyBhIHZhcmlhdGlvbiBvbiByZWYuIEl0IG1lYW5zIE15U1FMIG11c3QgZG8gYSBzZWNvbmQgbG9va3VwIHRvIGZpbmQgTlVMTCBlbnRyaWVzIGFmdGVyIGRvaW5nIHRoZSBpbml0aWFsIGxvb2t1cC4nLFxuICAgIGZ1bGx0ZXh0OiAnT3BlcmF0aW9uIChKT0lOKSBpcyB1c2luZyB0aGUgdGFibGXigJlzIGZ1bGx0ZXh0IGluZGV4JyxcbiAgICBpbmRleDogJ1RoZSBlbnRpcmUgaW5kZXggaXMgc2Nhbm5lZCB0byBmaW5kIGEgbWF0Y2ggZm9yIHRoZSBxdWVyeS4gTm90ZTogVGhlIG1haW4gYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBhdm9pZHMgc29ydGluZy4gVGhlIGJpZ2dlc3QgZGlzYWR2YW50YWdlIGlzIHRoZSBjb3N0IG9mIHJlYWRpbmcgYW4gZW50aXJlIHRhYmxlIGluIGluZGV4IG9yZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYWNjZXNzaW5nIHRoZSByb3dzIGluIHJhbmRvbSBvcmRlciwgd2hpY2ggaXMgdmVyeSBleHBlbnNpdmUuJyxcbiAgICBpbmRleF9tZXJnZTogJ1RoaXMgam9pbiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBJbmRleCBNZXJnZSBvcHRpbWl6YXRpb24gaXMgdXNlZC4gSW4gdGhpcyBjYXNlLCB0aGUga2V5IGNvbHVtbiBpbiB0aGUgb3V0cHV0IHJvdyBjb250YWlucyBhIGxpc3Qgb2YgaW5kZXhlcyB1c2VkLiBJdCBpbmRpY2F0ZXMgYSBxdWVyeSBjYW4gbWFrZSBsaW1pdGVkIHVzZSBvZiBtdWx0aXBsZSBpbmRleGVzIG9uIGEgc2luZ2xlIHRhYmxlLicsXG4gICAgcmFuZ2U6ICdUaGlzIHR5cGUgcmVwbGFjZXMgZXFfcmVmIGZvciBzb21lIElOIHN1YnF1ZXJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtOiB2YWx1ZSBJTiAoU0VMRUNUIHByaW1hcnlfa2V5IEZST00gc2luZ2xlX3RhYmxlIFdIRVJFIHNvbWVfZXhwciknLFxuICAgIHVuaXF1ZV9zdWJxdWVyeTogJycsXG4gICAgQUxMOiAnTXlTUUwgc2NhbnMgdGhlIGVudGlyZSB0YWJsZSB0byBzYXRpc2Z5IHRoZSBxdWVyeScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgKSB7XG4gICAgdGhpcy5xdWVyeUxvZyA9IF9kYXRhLnF1ZXJ5TG9nO1xuICB9XG5cbiAgcHVibGljIG9wZW5FeHBsYWluKCkge1xuICAgIHRoaXMuX2RpYWxvZy5vcGVuKEV4cGxhaW5Db21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgZXhwbGFpbjogdGhpcy5leHBsYWluIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cGxhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlMb2cuZXhwbGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnlCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsYWluPy5xdWVyeUJsb2NrO1xuICB9XG5cbiAgcHVibGljIGdldCBvcmRlcmluZ09wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeUJsb2NrPy5vcmRlcmluZ09wZXJhdGlvbjtcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+UXVlcnkgTG9nPC9oMT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sZy53cmFwLmFsaWduLXN0YXJ0XCI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5EdXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cuZHVyYXRpb259fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+T3B0aW1pemVkPC9mcy1sYWJlbD5cbiAgICAgICAge3txdWVyeUxvZy5vcHRpbWl6ZWQgPyAnWWVzJyA6ICdObyd9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+UXVlcnkgQ29zdDwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cucXVlcnlDb3N0fX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlJhdyBFeHBsYWluPC9mcy1sYWJlbD5cbiAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW5FeHBsYWluKClcIj5WaWV3PC9hPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+VVJMPC9mcy1sYWJlbD5cbiAgICAgICAge3txdWVyeUxvZy5wYXRoIHwgZnNGb3JtYXRUcnVuY2F0ZTogNTB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdGFiLWdyb3VwPlxuICAgICAgPG1hdC10YWIgbGFiZWw9XCJRdWVyeVwiPlxuICAgICAgICA8ZnMtY2xpcGJvYXJkLWJ1dHRvblxuICAgICAgICAgIFtjb250ZW50XT1cInF1ZXJ5TG9nLnByZXR0eVF1ZXJ5XCI+XG4gICAgICAgIDwvZnMtY2xpcGJvYXJkLWJ1dHRvbj5cbiAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cInF1ZXJ5TG9nLnByZXR0eVF1ZXJ5XCIgY2xhc3M9XCJxdWVyeVwiPjwvZGl2PlxuICAgICAgPC9tYXQtdGFiPlxuICAgICAgXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIkV4cGxhaW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jaywgc2VsZWN0SWQ6IHF1ZXJ5QmxvY2suc2VsZWN0SWQsIGNvc3RJbmZvOiBxdWVyeUJsb2NrLmNvc3RJbmZvIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LXRhYj5cbiAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIERvbmVcbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48L2ZzLWRpYWxvZz5cblxuPG5nLXRlbXBsYXRlICNuZXN0ZWRMb29wIGxldC1xdWVyeUJsb2NrPVwicXVlcnlCbG9ja1wiIGxldC1zZWxlY3RJZD1cInNlbGVjdElkXCIgbGV0LWNvc3RJbmZvPVwiY29zdEluZm9cIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdElkXCI+XG4gICAgPGgxPlNlbGVjdCB7e3NlbGVjdElkfX08L2gxPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgXG4gIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxnLndyYXAuYWxpZ24tc3RhcnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29zdEluZm8/LnF1ZXJ5Q29zdFwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+UXVlcnkgQ29zdDwvZnMtbGFiZWw+XG4gICAgICAgIHt7Y29zdEluZm8ucXVlcnlDb3N0fX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sub3JkZXJpbmdPcGVyYXRpb25cIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPk9yZGVyaW5nIE9wZXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suZ3JvdXBpbmdPcGVyYXRpb25cIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkdyb3VwaW5nIE9wZXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suZHVwbGljYXRlc1JlbW92YWxcIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkR1cGxpY2F0ZXMgUmVtb3ZhbDwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2sub3JkZXJpbmdPcGVyYXRpb24gfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2suZ3JvdXBpbmdPcGVyYXRpb24gfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbFwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2suZHVwbGljYXRlc1JlbW92YWwgfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay50YWJsZVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHsgbmVzdGVkTG9vcDogWyBxdWVyeUJsb2NrIF19IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudGFibGUuYXR0YWNoZWRTdWJxdWVyaWVzXCI+ICBcbiAgICAgIDxmcy1sYWJlbD5BdHRhY2hlZCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YnF1ZXJ5IG9mIHF1ZXJ5QmxvY2sudGFibGUuYXR0YWNoZWRTdWJxdWVyaWVzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+IFxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZExvb3BcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrLCBzZWxlY3RJZDogc3VicXVlcnkucXVlcnlCbG9jay5zZWxlY3RJZCwgY29zdEluZm86IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2suY29zdEluZm8gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+ICAgIFxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5uZXN0ZWRMb29wXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwiZnMtbGlzdC10YWJsZSBzdHlsZS1saW5lXCI+XG4gICAgICAgPHRoZWFkPlxuICAgICAgICAgPHRyPlxuICAgICAgICAgICA8dGg+VGFibGU8L3RoPlxuICAgICAgICAgICA8dGg+VHlwZTwvdGg+XG4gICAgICAgICAgIDx0aD5LZXlzPC90aD5cbiAgICAgICAgICAgPHRoPlJlZjwvdGg+XG4gICAgICAgICAgIDx0aD5Sb3dzPC90aD5cbiAgICAgICAgICAgPHRoPkZpbHRlcmVkPC90aD5cbiAgICAgICAgICAgPHRoPkV4dHJhPC90aD5cbiAgICAgICAgICAgPHRoPkNvc3Q8L3RoPlxuICAgICAgICAgPC90cj5cbiAgICAgICA8L3RoZWFkPlxuICAgICAgIDx0Ym9keT5cbiAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlcnlCbG9jay5uZXN0ZWRMb29wOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAge3tpdGVtLnRhYmxlLnRhYmxlTmFtZX19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwiYWNjZXNzVHlwZVBvcG92ZXJcIiBbZGF0YV09XCJpdGVtLnRhYmxlLmFjY2Vzc1R5cGVcIj5cbiAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdHlwZVwiIFtuZ0NsYXNzXT1cIml0ZW0udGFibGUuYWNjZXNzVHlwZVwiPnt7aXRlbS50YWJsZS5hY2Nlc3NUeXBlfX08L3NwYW4+XG4gICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+ICAgICAgICAgICAgXG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwia2V5c1BvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgIFttYXhXaWR0aF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ7IHBvc3NpYmxlS2V5czogaXRlbS50YWJsZS5wb3NzaWJsZUtleXMsIGtleTogaXRlbS50YWJsZS5rZXkgfVwiPlxuICAgICAgICAgICAgICAgICB7e2l0ZW0udGFibGUua2V5fX1cbiAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1kZWxpbWl0XCI+XG4gICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlZiBvZiBpdGVtLnRhYmxlLnJlZlwiPlxuICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cmVmfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUucm93c0V4YW1pbmVkUGVyU2Nhbn19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUuZmlsdGVyZWR9fVxuICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGFibGUuaW5kZXhDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1c2luZ0luZGV4Q29uZGl0aW9uXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW0udGFibGUuaW5kZXhDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgSW5kZXggQ29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGFibGUuYXR0YWNoZWRDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1c2luZ1doZXJlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW0udGFibGUuYXR0YWNoZWRDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgV2hlcmVcbiAgICAgICAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS51c2luZ0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgPHNwYW4+VXNpbmcgSW5kZXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgICBcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS51c2luZ0ZpbGVzb3J0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyaXRpY2FsXCI+VXNpbmcgRmlsZSBTb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnVzaW5nVGVtcG9yYXJ5VGFibGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5UZW1wb3JhcnkgVGFibGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD4gICAgIFxuICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwidGFibGVDb3N0UG9wb3ZlclwiIFtkYXRhXT1cIml0ZW0udGFibGU/LmNvc3RJbmZvXCI+XG4gICAgICAgICAgICAgICAge3tpdGVtLnRhYmxlPy5jb3N0SW5mby5wcmVmaXhDb3N0fX1cbiAgICAgICAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ29zdFBvcG92ZXIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5FdmFsIENvc3Q6IHt7ZGF0YS5ldmFsQ29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5SZWFkIENvc3Q6IHt7ZGF0YS5yZWFkQ29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5QcmVmaXggQ29zdDoge3tkYXRhLnByZWZpeENvc3R9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+RGF0YSBSZWFkIFBlciBKb2luOiB7e2RhdGEuZGF0YVJlYWRQZXJKb2lufX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICA8L3RyPlxuICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgPC90Ym9keT5cbiAgICAgPC90YWJsZT5cbiAgICAgPGJyPlxuICAgPC9uZy1jb250YWluZXI+ICBcbiAgXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnNlbGVjdExpc3RTdWJxdWVyaWVzXCI+XG4gICAgPGJyPlxuICAgIDxmcy1sYWJlbD5TZWxlY3QgTGlzdCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJxdWVyeSBvZiBxdWVyeUJsb2NrLnNlbGVjdExpc3RTdWJxdWVyaWVzXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInF1ZXJ5QmxvY2tDcml0aWNhbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2sgfVwiPjwvbmctY29udGFpbmVyPiBcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2ssIHNlbGVjdElkOiBzdWJxdWVyeS5xdWVyeUJsb2NrLnNlbGVjdElkLCBjb3N0SW5mbzogc3VicXVlcnkucXVlcnlCbG9jay5jb3N0SW5mbyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPCEtLSBcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sucXVlcnlCbG9ja2F0dGFjaGVkU3VicXVlcmllc1wiPlxuICAgIDxicj5cbiAgICA8ZnMtbGFiZWw+QXR0YWNoZWQgU3VicXVlcmllczwvZnMtbGFiZWw+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VicXVlcnkgb2YgcXVlcnlCbG9jay5hdHRhY2hlZFN1YnF1ZXJpZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZExvb3BcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+IC0tPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNrZXlzUG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwb3NzaWJsZUtleSBvZiBkYXRhLnBvc3NpYmxlS2V5c1wiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAncXVlcnktbG9nLXVzZWQta2V5JzogcG9zc2libGVLZXkgPT09IGRhdGEua2V5IH1cIj57e3Bvc3NpYmxlS2V5fX08L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN1c2luZ1doZXJlIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2RhdGF9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN1c2luZ0luZGV4Q29uZGl0aW9uIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2RhdGF9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhY2Nlc3NUeXBlUG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAge3thY2Nlc3NUeXBlc1tkYXRhXX19XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjcXVlcnlCbG9ja0NyaXRpY2FsIGxldC1xdWVyeUJsb2NrPVwicXVlcnlCbG9ja1wiPlxuICA8ZGl2IGNsYXNzPVwiZnMtZGVsaW1pdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnVzaW5nRmlsZXNvcnRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5Vc2luZyBGaWxlIFNvcnQ8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudXNpbmdUZW1wb3JhcnlUYWJsZVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcml0aWNhbFwiPlRlbXBvcmFyeSBUYWJsZTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9xdWVyeS1sb2dzL2NvbXBvbmVudHMvcXVlcnktbG9nL3F1ZXJ5LWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL3F1ZXJ5LWxvZy9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztBQVE5QyxNQUFNLE9BQU8saUJBQWlCO0lBa0JPO0lBQ3pCO0lBakJILFFBQVEsQ0FBQztJQUNULFdBQVcsR0FBRztRQUNuQixJQUFJLEVBQUUsNEpBQTRKO1FBQ2xLLE1BQU0sRUFBRSxvQ0FBb0M7UUFDNUMsS0FBSyxFQUFFLDJJQUEySTtRQUNsSixNQUFNLEVBQUUsd0pBQXdKO1FBQ2hLLEdBQUcsRUFBRSxpTkFBaU47UUFDdE4sUUFBUSxFQUFFLHNEQUFzRDtRQUNoRSxLQUFLLEVBQUUsa1JBQWtSO1FBQ3pSLFdBQVcsRUFBRSxzT0FBc087UUFDblAsS0FBSyxFQUFFLHlJQUF5STtRQUNoSixlQUFlLEVBQUUsRUFBRTtRQUNuQixHQUFHLEVBQUUsbURBQW1EO0tBQ3pELENBQUM7SUFFRixZQUNtQyxLQUFVLEVBQ25DLE9BQWtCO1FBRE8sVUFBSyxHQUFMLEtBQUssQ0FBSztRQUNuQyxZQUFPLEdBQVAsT0FBTyxDQUFXO1FBRTFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUNsQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLGlCQUFpQjtRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUM7SUFDNUMsQ0FBQzt1R0F4Q1UsaUJBQWlCLGtCQWtCbEIsZUFBZTsyRkFsQmQsaUJBQWlCLG9EQ2I5QiwycFVBcVFjOzsyRkR4UEQsaUJBQWlCO2tCQUw3QixTQUFTO3NDQUdTLHVCQUF1QixDQUFDLE1BQU07OzBCQW9CNUMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuXG5pbXBvcnQgeyBFeHBsYWluQ29tcG9uZW50IH0gZnJvbSAnLi4vZXhwbGFpbic7XG5cblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1sb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVyeS1sb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFF1ZXJ5TG9nQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcXVlcnlMb2c7XG4gIHB1YmxpYyBhY2Nlc3NUeXBlcyA9IHtcbiAgICBOVUxMOiAnVGhpcyBhY2Nlc3MgbWV0aG9kIG1lYW5zIE15U1FMIGNhbiByZXNvbHZlIHRoZSBxdWVyeSBkdXJpbmcgdGhlIG9wdGltaXphdGlvbiBwaGFzZSBhbmQgd2lsbCBub3QgZXZlbiBhY2Nlc3MgdGhlIHRhYmxlIG9yIGluZGV4IGR1cmluZyB0aGUgZXhlY3V0aW9uIHN0YWdlLicsXG4gICAgc3lzdGVtOiAnVGhlIHRhYmxlIGlzIGVtcHR5IG9yIGhhcyBvbmUgcm93LicsXG4gICAgY29uc3Q6ICdUaGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBjYW4gYmUgdHJlYXRlZCBhcyBhIGNvbnN0YW50ICh0aGVyZSBpcyBvbmUgcm93IG1hdGNoaW5nIHRoZSBxdWVyeSkuIE5vdGU6IFByaW1hcnkgS2V5IExvb2t1cCwgVW5pcXVlIEluZGV4IExvb2t1cCcsXG4gICAgZXFfcmVmOiAnVGhlIGluZGV4IGlzIGNsdXN0ZXJlZCBhbmQgaXMgYmVpbmcgdXNlZCBieSB0aGUgb3BlcmF0aW9uIChlaXRoZXIgdGhlIGluZGV4IGlzIGEgUFJJTUFSWSBLRVkgb3IgVU5JUVVFIElOREVYIHdpdGggYWxsIGtleSBjb2x1bW5zIGRlZmluZWQgYXMgTk9UIE5VTEwpJyxcbiAgICByZWY6ICdUaGUgaW5kZXhlZCBjb2x1bW4gd2FzIGFjY2Vzc2VkIHVzaW5nIGFuIGVxdWFsaXR5IG9wZXJhdG9yIE5vdGU6IFRoZSByZWZfb3JfbnVsbCBhY2Nlc3MgdHlwZSBpcyBhIHZhcmlhdGlvbiBvbiByZWYuIEl0IG1lYW5zIE15U1FMIG11c3QgZG8gYSBzZWNvbmQgbG9va3VwIHRvIGZpbmQgTlVMTCBlbnRyaWVzIGFmdGVyIGRvaW5nIHRoZSBpbml0aWFsIGxvb2t1cC4nLFxuICAgIGZ1bGx0ZXh0OiAnT3BlcmF0aW9uIChKT0lOKSBpcyB1c2luZyB0aGUgdGFibGXigJlzIGZ1bGx0ZXh0IGluZGV4JyxcbiAgICBpbmRleDogJ1RoZSBlbnRpcmUgaW5kZXggaXMgc2Nhbm5lZCB0byBmaW5kIGEgbWF0Y2ggZm9yIHRoZSBxdWVyeS4gTm90ZTogVGhlIG1haW4gYWR2YW50YWdlIGlzIHRoYXQgdGhpcyBhdm9pZHMgc29ydGluZy4gVGhlIGJpZ2dlc3QgZGlzYWR2YW50YWdlIGlzIHRoZSBjb3N0IG9mIHJlYWRpbmcgYW4gZW50aXJlIHRhYmxlIGluIGluZGV4IG9yZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYWNjZXNzaW5nIHRoZSByb3dzIGluIHJhbmRvbSBvcmRlciwgd2hpY2ggaXMgdmVyeSBleHBlbnNpdmUuJyxcbiAgICBpbmRleF9tZXJnZTogJ1RoaXMgam9pbiB0eXBlIGluZGljYXRlcyB0aGF0IHRoZSBJbmRleCBNZXJnZSBvcHRpbWl6YXRpb24gaXMgdXNlZC4gSW4gdGhpcyBjYXNlLCB0aGUga2V5IGNvbHVtbiBpbiB0aGUgb3V0cHV0IHJvdyBjb250YWlucyBhIGxpc3Qgb2YgaW5kZXhlcyB1c2VkLiBJdCBpbmRpY2F0ZXMgYSBxdWVyeSBjYW4gbWFrZSBsaW1pdGVkIHVzZSBvZiBtdWx0aXBsZSBpbmRleGVzIG9uIGEgc2luZ2xlIHRhYmxlLicsXG4gICAgcmFuZ2U6ICdUaGlzIHR5cGUgcmVwbGFjZXMgZXFfcmVmIGZvciBzb21lIElOIHN1YnF1ZXJpZXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtOiB2YWx1ZSBJTiAoU0VMRUNUIHByaW1hcnlfa2V5IEZST00gc2luZ2xlX3RhYmxlIFdIRVJFIHNvbWVfZXhwciknLFxuICAgIHVuaXF1ZV9zdWJxdWVyeTogJycsXG4gICAgQUxMOiAnTXlTUUwgc2NhbnMgdGhlIGVudGlyZSB0YWJsZSB0byBzYXRpc2Z5IHRoZSBxdWVyeScsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHByaXZhdGUgX2RhdGE6IGFueSxcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgKSB7XG4gICAgdGhpcy5xdWVyeUxvZyA9IF9kYXRhLnF1ZXJ5TG9nO1xuICB9XG5cbiAgcHVibGljIG9wZW5FeHBsYWluKCkge1xuICAgIHRoaXMuX2RpYWxvZy5vcGVuKEV4cGxhaW5Db21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHsgZXhwbGFpbjogdGhpcy5leHBsYWluIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4cGxhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlMb2cuZXhwbGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnlCbG9jaygpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsYWluPy5xdWVyeUJsb2NrO1xuICB9XG5cbiAgcHVibGljIGdldCBvcmRlcmluZ09wZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeUJsb2NrPy5vcmRlcmluZ09wZXJhdGlvbjtcbiAgfVxufVxuIiwiPGZzLWRpYWxvZz5cbiAgPGgxIG1hdC1kaWFsb2ctdGl0bGU+UXVlcnkgTG9nPC9oMT5cbiAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sZy53cmFwLmFsaWduLXN0YXJ0XCI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5EdXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cuZHVyYXRpb259fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+T3B0aW1pemVkPC9mcy1sYWJlbD5cbiAgICAgICAge3txdWVyeUxvZy5vcHRpbWl6ZWQgPyAnWWVzJyA6ICdObyd9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+UXVlcnkgQ29zdDwvZnMtbGFiZWw+XG4gICAgICAgIHt7cXVlcnlMb2cucXVlcnlDb3N0fX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlJhdyBFeHBsYWluPC9mcy1sYWJlbD5cbiAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW5FeHBsYWluKClcIj5WaWV3PC9hPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+VVJMPC9mcy1sYWJlbD5cbiAgICAgICAge3txdWVyeUxvZy5wYXRoIHwgZnNGb3JtYXRUcnVuY2F0ZTogNTB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxtYXQtdGFiLWdyb3VwPlxuICAgICAgPG1hdC10YWIgbGFiZWw9XCJRdWVyeVwiPlxuICAgICAgICA8ZnMtY2xpcGJvYXJkLWJ1dHRvblxuICAgICAgICAgIFtjb250ZW50XT1cInF1ZXJ5TG9nLnByZXR0eVF1ZXJ5XCI+XG4gICAgICAgIDwvZnMtY2xpcGJvYXJkLWJ1dHRvbj5cbiAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cInF1ZXJ5TG9nLnByZXR0eVF1ZXJ5XCIgY2xhc3M9XCJxdWVyeVwiPjwvZGl2PlxuICAgICAgPC9tYXQtdGFiPlxuICAgICAgXG4gICAgICA8bWF0LXRhYiBsYWJlbD1cIkV4cGxhaW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJuZXN0ZWRMb29wXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jaywgc2VsZWN0SWQ6IHF1ZXJ5QmxvY2suc2VsZWN0SWQsIGNvc3RJbmZvOiBxdWVyeUJsb2NrLmNvc3RJbmZvIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LXRhYj5cbiAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICBbbWF0LWRpYWxvZy1jbG9zZV09XCJ1bmRlZmluZWRcIj5cbiAgICAgIERvbmVcbiAgICA8L2J1dHRvbj5cbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48L2ZzLWRpYWxvZz5cblxuPG5nLXRlbXBsYXRlICNuZXN0ZWRMb29wIGxldC1xdWVyeUJsb2NrPVwicXVlcnlCbG9ja1wiIGxldC1zZWxlY3RJZD1cInNlbGVjdElkXCIgbGV0LWNvc3RJbmZvPVwiY29zdEluZm9cIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdElkXCI+XG4gICAgPGgxPlNlbGVjdCB7e3NlbGVjdElkfX08L2gxPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgXG4gIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxnLndyYXAuYWxpZ24tc3RhcnRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29zdEluZm8/LnF1ZXJ5Q29zdFwiPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+UXVlcnkgQ29zdDwvZnMtbGFiZWw+XG4gICAgICAgIHt7Y29zdEluZm8ucXVlcnlDb3N0fX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sub3JkZXJpbmdPcGVyYXRpb25cIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPk9yZGVyaW5nIE9wZXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suZ3JvdXBpbmdPcGVyYXRpb25cIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkdyb3VwaW5nIE9wZXJhdGlvbjwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvbiB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2suZHVwbGljYXRlc1JlbW92YWxcIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPkR1cGxpY2F0ZXMgUmVtb3ZhbDwvZnMtbGFiZWw+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogcXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5vcmRlcmluZ09wZXJhdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2sub3JkZXJpbmdPcGVyYXRpb24gfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5ncm91cGluZ09wZXJhdGlvblwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2suZ3JvdXBpbmdPcGVyYXRpb24gfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5kdXBsaWNhdGVzUmVtb3ZhbFwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHF1ZXJ5QmxvY2suZHVwbGljYXRlc1JlbW92YWwgfVwiPjwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay50YWJsZVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHsgbmVzdGVkTG9vcDogWyBxdWVyeUJsb2NrIF19IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudGFibGUuYXR0YWNoZWRTdWJxdWVyaWVzXCI+ICBcbiAgICAgIDxmcy1sYWJlbD5BdHRhY2hlZCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YnF1ZXJ5IG9mIHF1ZXJ5QmxvY2sudGFibGUuYXR0YWNoZWRTdWJxdWVyaWVzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+IFxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZExvb3BcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrLCBzZWxlY3RJZDogc3VicXVlcnkucXVlcnlCbG9jay5zZWxlY3RJZCwgY29zdEluZm86IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2suY29zdEluZm8gfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+ICAgIFxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicXVlcnlCbG9jay5uZXN0ZWRMb29wXCI+XG4gICAgPHRhYmxlIGNsYXNzPVwiZnMtbGlzdC10YWJsZSBzdHlsZS1saW5lXCI+XG4gICAgICAgPHRoZWFkPlxuICAgICAgICAgPHRyPlxuICAgICAgICAgICA8dGg+VGFibGU8L3RoPlxuICAgICAgICAgICA8dGg+VHlwZTwvdGg+XG4gICAgICAgICAgIDx0aD5LZXlzPC90aD5cbiAgICAgICAgICAgPHRoPlJlZjwvdGg+XG4gICAgICAgICAgIDx0aD5Sb3dzPC90aD5cbiAgICAgICAgICAgPHRoPkZpbHRlcmVkPC90aD5cbiAgICAgICAgICAgPHRoPkV4dHJhPC90aD5cbiAgICAgICAgICAgPHRoPkNvc3Q8L3RoPlxuICAgICAgICAgPC90cj5cbiAgICAgICA8L3RoZWFkPlxuICAgICAgIDx0Ym9keT5cbiAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcXVlcnlCbG9jay5uZXN0ZWRMb29wOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAge3tpdGVtLnRhYmxlLnRhYmxlTmFtZX19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwiYWNjZXNzVHlwZVBvcG92ZXJcIiBbZGF0YV09XCJpdGVtLnRhYmxlLmFjY2Vzc1R5cGVcIj5cbiAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2Nlc3MtdHlwZVwiIFtuZ0NsYXNzXT1cIml0ZW0udGFibGUuYWNjZXNzVHlwZVwiPnt7aXRlbS50YWJsZS5hY2Nlc3NUeXBlfX08L3NwYW4+XG4gICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+ICAgICAgICAgICAgXG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwia2V5c1BvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgIFttYXhXaWR0aF09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICBbZGF0YV09XCJ7IHBvc3NpYmxlS2V5czogaXRlbS50YWJsZS5wb3NzaWJsZUtleXMsIGtleTogaXRlbS50YWJsZS5rZXkgfVwiPlxuICAgICAgICAgICAgICAgICB7e2l0ZW0udGFibGUua2V5fX1cbiAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmcy1kZWxpbWl0XCI+XG4gICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlZiBvZiBpdGVtLnRhYmxlLnJlZlwiPlxuICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7cmVmfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUucm93c0V4YW1pbmVkUGVyU2Nhbn19XG4gICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICB7e2l0ZW0udGFibGUuZmlsdGVyZWR9fVxuICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGFibGUuaW5kZXhDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1c2luZ0luZGV4Q29uZGl0aW9uXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW0udGFibGUuaW5kZXhDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgSW5kZXggQ29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgICA8L2ZzLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW0udGFibGUuYXR0YWNoZWRDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgIDxmcy1wb3BvdmVyIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJ1c2luZ1doZXJlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgW21heFdpZHRoXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhXT1cIml0ZW0udGFibGUuYXR0YWNoZWRDb25kaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgV2hlcmVcbiAgICAgICAgICAgICAgICAgICAgIDwvZnMtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS51c2luZ0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgPHNwYW4+VXNpbmcgSW5kZXg8L3NwYW4+XG4gICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAgICBcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbS51c2luZ0ZpbGVzb3J0XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyaXRpY2FsXCI+VXNpbmcgRmlsZSBTb3J0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtLnVzaW5nVGVtcG9yYXJ5VGFibGVcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5UZW1wb3JhcnkgVGFibGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgIDx0ZD4gICAgIFxuICAgICAgICAgICAgICA8ZnMtcG9wb3ZlciBbdGVtcGxhdGVdPVwidGFibGVDb3N0UG9wb3ZlclwiIFtkYXRhXT1cIml0ZW0udGFibGU/LmNvc3RJbmZvXCI+XG4gICAgICAgICAgICAgICAge3tpdGVtLnRhYmxlPy5jb3N0SW5mby5wcmVmaXhDb3N0fX1cbiAgICAgICAgICAgICAgPC9mcy1wb3BvdmVyPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ29zdFBvcG92ZXIgbGV0LWRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5FdmFsIENvc3Q6IHt7ZGF0YS5ldmFsQ29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5SZWFkIENvc3Q6IHt7ZGF0YS5yZWFkQ29zdH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5QcmVmaXggQ29zdDoge3tkYXRhLnByZWZpeENvc3R9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXY+RGF0YSBSZWFkIFBlciBKb2luOiB7e2RhdGEuZGF0YVJlYWRQZXJKb2lufX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICA8L3RyPlxuICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgPC90Ym9keT5cbiAgICAgPC90YWJsZT5cbiAgICAgPGJyPlxuICAgPC9uZy1jb250YWluZXI+ICBcbiAgXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnNlbGVjdExpc3RTdWJxdWVyaWVzXCI+XG4gICAgPGJyPlxuICAgIDxmcy1sYWJlbD5TZWxlY3QgTGlzdCBTdWJxdWVyaWVzPC9mcy1sYWJlbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJxdWVyeSBvZiBxdWVyeUJsb2NrLnNlbGVjdExpc3RTdWJxdWVyaWVzXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInF1ZXJ5QmxvY2tDcml0aWNhbFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2sgfVwiPjwvbmctY29udGFpbmVyPiBcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibmVzdGVkTG9vcFwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHF1ZXJ5QmxvY2s6IHN1YnF1ZXJ5LnF1ZXJ5QmxvY2ssIHNlbGVjdElkOiBzdWJxdWVyeS5xdWVyeUJsb2NrLnNlbGVjdElkLCBjb3N0SW5mbzogc3VicXVlcnkucXVlcnlCbG9jay5jb3N0SW5mbyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPCEtLSBcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sucXVlcnlCbG9ja2F0dGFjaGVkU3VicXVlcmllc1wiPlxuICAgIDxicj5cbiAgICA8ZnMtbGFiZWw+QXR0YWNoZWQgU3VicXVlcmllczwvZnMtbGFiZWw+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3VicXVlcnkgb2YgcXVlcnlCbG9jay5hdHRhY2hlZFN1YnF1ZXJpZXNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicXVlcnlCbG9ja0NyaXRpY2FsXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgcXVlcnlCbG9jazogc3VicXVlcnkucXVlcnlCbG9jayB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZExvb3BcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBxdWVyeUJsb2NrOiBzdWJxdWVyeS5xdWVyeUJsb2NrIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+IC0tPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNrZXlzUG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAgPGRpdiBjbGFzcz1cImZzLWRlbGltaXRcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwb3NzaWJsZUtleSBvZiBkYXRhLnBvc3NpYmxlS2V5c1wiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAncXVlcnktbG9nLXVzZWQta2V5JzogcG9zc2libGVLZXkgPT09IGRhdGEua2V5IH1cIj57e3Bvc3NpYmxlS2V5fX08L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN1c2luZ1doZXJlIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2RhdGF9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN1c2luZ0luZGV4Q29uZGl0aW9uIGxldC1kYXRhPVwiZGF0YVwiPlxuICB7e2RhdGF9fVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhY2Nlc3NUeXBlUG9wb3ZlciBsZXQtZGF0YT1cImRhdGFcIj5cbiAge3thY2Nlc3NUeXBlc1tkYXRhXX19XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjcXVlcnlCbG9ja0NyaXRpY2FsIGxldC1xdWVyeUJsb2NrPVwicXVlcnlCbG9ja1wiPlxuICA8ZGl2IGNsYXNzPVwiZnMtZGVsaW1pdFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJxdWVyeUJsb2NrLnVzaW5nRmlsZXNvcnRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiY3JpdGljYWxcIj5Vc2luZyBGaWxlIFNvcnQ8L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInF1ZXJ5QmxvY2sudXNpbmdUZW1wb3JhcnlUYWJsZVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjcml0aWNhbFwiPlRlbXBvcmFyeSBUYWJsZTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
@@ -72,10 +72,10 @@ export class QueryLogsComponent {
|
|
|
72
72
|
},
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
76
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
75
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: QueryLogsComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
76
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: QueryLogsComponent, selector: "fs-system-query-logs", inputs: { loadQueryLogs: "loadQueryLogs", purgeQueryLogs: "purgeQueryLogs" }, viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Optimized\" name=\"optimized\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <span [ngClass]=\"{ optimized: row.optimized, 'not-optimized': !row.optimized }\">\n {{row.optimized ? 'Yes' : 'No'}}\n </span>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Duration\" name=\"duration\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{row.duration}}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Cost\" name=\"query_cost\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{row.queryCost}}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Query\">\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"openQueryLog(row)\">{{ row.query | fsFormatTruncate: 500 }}</a>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Created\" name=\"query_log_id\" [sortable]=\"true\" [direction]=\"'desc'\" [sortableDefault]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n </ng-template>\n </fs-list-column>\n</fs-list>", styles: [":host ::ng-deep .optimized{color:green}:host ::ng-deep .not-optimized{color:red}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i3.FsDateAgoComponent, selector: "fs-date-ago", inputs: ["date", "showTime", "format", "showTooltip", "tooltipDateFormat"] }, { kind: "component", type: i4.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i4.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customize", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i4.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "pipe", type: i5.FsFormatTruncatePipe, name: "fsFormatTruncate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
77
77
|
}
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
78
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: QueryLogsComponent, decorators: [{
|
|
79
79
|
type: Component,
|
|
80
80
|
args: [{ selector: 'fs-system-query-logs', changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-list [config]=\"listConfig\">\n <fs-list-column title=\"Optimized\" name=\"optimized\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <span [ngClass]=\"{ optimized: row.optimized, 'not-optimized': !row.optimized }\">\n {{row.optimized ? 'Yes' : 'No'}}\n </span>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Duration\" name=\"duration\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{row.duration}}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Cost\" name=\"query_cost\" [sortable]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n {{row.queryCost}}\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Query\">\n <ng-template fs-list-cell let-row=\"row\">\n <a (click)=\"openQueryLog(row)\">{{ row.query | fsFormatTruncate: 500 }}</a>\n </ng-template>\n </fs-list-column>\n <fs-list-column title=\"Created\" name=\"query_log_id\" [sortable]=\"true\" [direction]=\"'desc'\" [sortableDefault]=\"true\">\n <ng-template fs-list-cell let-row=\"row\">\n <fs-date-ago [date]=\"row.createDate\"></fs-date-ago>\n </ng-template>\n </fs-list-column>\n</fs-list>", styles: [":host ::ng-deep .optimized{color:green}:host ::ng-deep .not-optimized{color:red}\n"] }]
|
|
81
81
|
}], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { list: [{
|
|
@@ -86,4 +86,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
86
86
|
}], purgeQueryLogs: [{
|
|
87
87
|
type: Input
|
|
88
88
|
}] } });
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbG9ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL3F1ZXJ5LWxvZ3MvcXVlcnktbG9ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9jb21wb25lbnRzL3F1ZXJ5LWxvZ3MvcXVlcnktbG9ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0YsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXJELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLGtCQUFrQixDQUFDO0FBR2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxJQUFJLENBQUM7Ozs7Ozs7QUFTdkMsTUFBTSxPQUFPLGtCQUFrQjtJQVduQjtJQVJILElBQUksQ0FBa0I7SUFFYixhQUFhLENBQXlEO0lBQ3RFLGNBQWMsQ0FBd0I7SUFFL0MsVUFBVSxDQUFlO0lBRWhDLFlBQ1UsT0FBa0I7UUFBbEIsWUFBTyxHQUFQLE9BQU8sQ0FBVztJQUN4QixDQUFDO0lBRUUsWUFBWSxDQUFDLFFBQVE7UUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDbkMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFO1lBQ2xCLEtBQUssRUFBRSxNQUFNO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsVUFBVSxHQUFHO1lBQ2hCLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU87b0JBQ3RCLEtBQUssRUFBRSxRQUFRO2lCQUNoQjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsV0FBVztvQkFDakIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNO29CQUNyQixLQUFLLEVBQUUsY0FBYztvQkFDckIsTUFBTSxFQUFFO3dCQUNOLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO3dCQUNqQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTt3QkFDOUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7cUJBQy9CO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxZQUFZO29CQUNsQixJQUFJLEVBQUUsUUFBUSxDQUFDLGFBQWE7b0JBQzVCLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7aUJBQ2hDO2dCQUNEO29CQUNFLElBQUksRUFBRSxVQUFVO29CQUNoQixJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUs7b0JBQ3BCLEtBQUssRUFBRSxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUM7aUJBQ3hDO2FBQ0Y7WUFDRCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsS0FBSyxFQUFFLE9BQU87b0JBQ2QsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFLEdBQUcsRUFBRTt3QkFDVixJQUFJLENBQUMsY0FBYyxFQUFFOzZCQUNsQixTQUFTLENBQUMsR0FBRyxFQUFFOzRCQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ3JCLENBQUMsQ0FBQyxDQUFDO29CQUNQLENBQUM7aUJBQ0Y7YUFDRjtZQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7cUJBQzdCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FDdEUsQ0FBQztZQUNOLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQzt1R0FyRVUsa0JBQWtCOzJGQUFsQixrQkFBa0IsZ0xBRWxCLGVBQWUsZ0RDckI1Qiw4c0NBNEJVOzsyRkRURyxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBQ0Usc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU07OEVBS3hDLElBQUk7c0JBRFYsU0FBUzt1QkFBQyxlQUFlO2dCQUdWLGFBQWE7c0JBQTVCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuXHJcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcclxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcclxuXHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUXVlcnlMb2dDb21wb25lbnQgfSBmcm9tICcuLic7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmcy1zeXN0ZW0tcXVlcnktbG9ncycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3F1ZXJ5LWxvZ3MuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3F1ZXJ5LWxvZ3MuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIFF1ZXJ5TG9nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxyXG4gIHB1YmxpYyBsaXN0OiBGc0xpc3RDb21wb25lbnQ7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkUXVlcnlMb2dzOiAocXVlcnk6IGFueSkgPT4gT2JzZXJ2YWJsZTx7IGRhdGE6IGFueTsgcGFnaW5nOiBhbnkgfT47XHJcbiAgQElucHV0KCkgcHVibGljIHB1cmdlUXVlcnlMb2dzOiAoKSA9PiBPYnNlcnZhYmxlPGFueT47XHJcblxyXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgKSB7IH1cclxuXHJcbiAgcHVibGljIG9wZW5RdWVyeUxvZyhxdWVyeUxvZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oUXVlcnlMb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YTogeyBxdWVyeUxvZyB9LFxyXG4gICAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XHJcbiAgICAgIGZpbHRlcnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAna2V5d29yZCcsXHJcbiAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5LZXl3b3JkLFxyXG4gICAgICAgICAgbGFiZWw6ICdTZWFyY2gnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbmFtZTogJ29wdGltaXplZCcsXHJcbiAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXHJcbiAgICAgICAgICBsYWJlbDogJ09wdGltaXphdGlvbicsXHJcbiAgICAgICAgICB2YWx1ZXM6IFtcclxuICAgICAgICAgICAgeyBuYW1lOiAnQW55JywgdmFsdWU6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgICAgICB7IG5hbWU6ICdZZXMnLCB2YWx1ZTogJ3RydWUnIH0sXHJcbiAgICAgICAgICAgIHsgbmFtZTogJ05vJywgdmFsdWU6ICdmYWxzZScgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnY3JlYXRlRGF0ZScsXHJcbiAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5EYXRlVGltZVJhbmdlLFxyXG4gICAgICAgICAgbGFiZWw6IFsnRnJvbSBEYXRlJywgJ1RvIERhdGUnXSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIG5hbWU6ICdkdXJhdGlvbicsXHJcbiAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5SYW5nZSxcclxuICAgICAgICAgIGxhYmVsOiBbJ01pbiBEdXJhdGlvbicsICdNYXggRHVyYXRpb24nXSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgbGFiZWw6ICdQdXJnZScsXHJcbiAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcclxuICAgICAgICAgIGNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucHVyZ2VRdWVyeUxvZ3MoKVxyXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0LnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICBdLFxyXG4gICAgICBmZXRjaDogKHF1ZXJ5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFF1ZXJ5TG9ncyhxdWVyeSlcclxuICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiAoeyBkYXRhOiByZXNwb25zZS5kYXRhLCBwYWdpbmc6IHJlc3BvbnNlLnBhZ2luZyB9KSksXHJcbiAgICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxmcy1saXN0IFtjb25maWddPVwibGlzdENvbmZpZ1wiPlxuICA8ZnMtbGlzdC1jb2x1bW4gdGl0bGU9XCJPcHRpbWl6ZWRcIiBuYW1lPVwib3B0aW1pemVkXCIgW3NvcnRhYmxlXT1cInRydWVcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsgb3B0aW1pemVkOiByb3cub3B0aW1pemVkLCAnbm90LW9wdGltaXplZCc6ICFyb3cub3B0aW1pemVkIH1cIj5cbiAgICAgICAge3tyb3cub3B0aW1pemVkID8gJ1llcycgOiAnTm8nfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuICA8ZnMtbGlzdC1jb2x1bW4gdGl0bGU9XCJEdXJhdGlvblwiIG5hbWU9XCJkdXJhdGlvblwiIFtzb3J0YWJsZV09XCJ0cnVlXCI+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICB7e3Jvdy5kdXJhdGlvbn19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbiAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiQ29zdFwiIG5hbWU9XCJxdWVyeV9jb3N0XCIgW3NvcnRhYmxlXT1cInRydWVcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIHt7cm93LnF1ZXJ5Q29zdH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbiAgPGZzLWxpc3QtY29sdW1uIHRpdGxlPVwiUXVlcnlcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIDxhIChjbGljayk9XCJvcGVuUXVlcnlMb2cocm93KVwiPnt7IHJvdy5xdWVyeSB8IGZzRm9ybWF0VHJ1bmNhdGU6IDUwMCB9fTwvYT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2ZzLWxpc3QtY29sdW1uPlxuICA8ZnMtbGlzdC1jb2x1bW4gdGl0bGU9XCJDcmVhdGVkXCIgbmFtZT1cInF1ZXJ5X2xvZ19pZFwiIFtzb3J0YWJsZV09XCJ0cnVlXCIgW2RpcmVjdGlvbl09XCInZGVzYydcIiBbc29ydGFibGVEZWZhdWx0XT1cInRydWVcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1jZWxsIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIDxmcy1kYXRlLWFnbyBbZGF0ZV09XCJyb3cuY3JlYXRlRGF0ZVwiPjwvZnMtZGF0ZS1hZ28+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbjwvZnMtbGlzdD4iXX0=
|
|
@@ -16,8 +16,8 @@ import { FsPopoverModule } from '@firestitch/popover';
|
|
|
16
16
|
import { ExplainComponent, QueryLogComponent, QueryLogsComponent } from './components';
|
|
17
17
|
import * as i0 from "@angular/core";
|
|
18
18
|
export class FsSystemQueryLogsModule {
|
|
19
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
20
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
19
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsSystemQueryLogsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
20
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.7", ngImport: i0, type: FsSystemQueryLogsModule, declarations: [QueryLogsComponent,
|
|
21
21
|
QueryLogComponent,
|
|
22
22
|
ExplainComponent], imports: [CommonModule,
|
|
23
23
|
RouterModule,
|
|
@@ -34,7 +34,7 @@ export class FsSystemQueryLogsModule {
|
|
|
34
34
|
FsDialogModule,
|
|
35
35
|
FsListModule,
|
|
36
36
|
FsClipboardModule], exports: [QueryLogsComponent] });
|
|
37
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
37
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsSystemQueryLogsModule, imports: [CommonModule,
|
|
38
38
|
RouterModule,
|
|
39
39
|
CommonModule,
|
|
40
40
|
FormsModule,
|
|
@@ -50,7 +50,7 @@ export class FsSystemQueryLogsModule {
|
|
|
50
50
|
FsListModule,
|
|
51
51
|
FsClipboardModule] });
|
|
52
52
|
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsSystemQueryLogsModule, decorators: [{
|
|
54
54
|
type: NgModule,
|
|
55
55
|
args: [{
|
|
56
56
|
imports: [
|
|
@@ -80,4 +80,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
80
80
|
],
|
|
81
81
|
}]
|
|
82
82
|
}] });
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktbG9ncy5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvcXVlcnktbG9ncy9xdWVyeS1sb2dzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBZ0N2RixNQUFNLE9BQU8sdUJBQXVCO3VHQUF2Qix1QkFBdUI7d0dBQXZCLHVCQUF1QixpQkFSaEMsa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixnQkFBZ0IsYUFyQmhCLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtZQUNaLFdBQVc7WUFFWCxhQUFhO1lBQ2IsZUFBZTtZQUNmLGVBQWU7WUFFZixZQUFZO1lBQ1osYUFBYTtZQUNiLGVBQWU7WUFDZixjQUFjO1lBQ2QsWUFBWTtZQUNaLGNBQWM7WUFDZCxZQUFZO1lBQ1osaUJBQWlCLGFBUWpCLGtCQUFrQjt3R0FHVCx1QkFBdUIsWUEzQmhDLFlBQVk7WUFDWixZQUFZO1lBQ1osWUFBWTtZQUNaLFdBQVc7WUFFWCxhQUFhO1lBQ2IsZUFBZTtZQUNmLGVBQWU7WUFFZixZQUFZO1lBQ1osYUFBYTtZQUNiLGVBQWU7WUFDZixjQUFjO1lBQ2QsWUFBWTtZQUNaLGNBQWM7WUFDZCxZQUFZO1lBQ1osaUJBQWlCOzsyRkFXUix1QkFBdUI7a0JBN0JuQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFlBQVk7d0JBQ1osWUFBWTt3QkFDWixXQUFXO3dCQUVYLGFBQWE7d0JBQ2IsZUFBZTt3QkFDZixlQUFlO3dCQUVmLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osaUJBQWlCO3FCQUNsQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osa0JBQWtCO3dCQUNsQixpQkFBaUI7d0JBQ2pCLGdCQUFnQjtxQkFDakI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjtxQkFDbkI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IEZzQ2xpcGJvYXJkTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY2xpcGJvYXJkJztcbmltcG9ydCB7IEZzQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgRnNEaWFsb2dNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9kaWFsb2cnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5pbXBvcnQgeyBGc0xhYmVsTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGFiZWwnO1xuaW1wb3J0IHsgRnNMaXN0TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5pbXBvcnQgeyBGc1BvcG92ZXJNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9wb3BvdmVyJztcblxuaW1wb3J0IHsgRXhwbGFpbkNvbXBvbmVudCwgUXVlcnlMb2dDb21wb25lbnQsIFF1ZXJ5TG9nc0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cyc7XG5cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSb3V0ZXJNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuXG4gICAgTWF0VGFic01vZHVsZSxcbiAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgTWF0RGlhbG9nTW9kdWxlLFxuXG4gICAgRnNGb3JtTW9kdWxlLFxuICAgIEZzTGFiZWxNb2R1bGUsXG4gICAgRnNQb3BvdmVyTW9kdWxlLFxuICAgIEZzQ29tbW9uTW9kdWxlLFxuICAgIEZzRGF0ZU1vZHVsZSxcbiAgICBGc0RpYWxvZ01vZHVsZSxcbiAgICBGc0xpc3RNb2R1bGUsXG4gICAgRnNDbGlwYm9hcmRNb2R1bGUsXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIFF1ZXJ5TG9nc0NvbXBvbmVudCxcbiAgICBRdWVyeUxvZ0NvbXBvbmVudCxcbiAgICBFeHBsYWluQ29tcG9uZW50LFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgUXVlcnlMb2dzQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBGc1N5c3RlbVF1ZXJ5TG9nc01vZHVsZSB7XG59XG4iXX0=
|
|
@@ -25,14 +25,14 @@ export class ApiLogComponent {
|
|
|
25
25
|
this.apiLog = this.data.apiLog;
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
29
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
28
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ApiLogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
29
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: ApiLogComponent, selector: "ng-component", ngImport: i0, template: "<fs-dialog *fsSkeleton=\"apiLog\">\n\n <div mat-dialog-title>API Log</div>\n\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>\n Type\n </fs-label>\n {{apiLog.type}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{apiLogStates[apiLog.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.code\">\n <fs-label>\n Code\n </fs-label>\n {{apiLog.code}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Date\n </fs-label>\n {{apiLog.createDate|fsDateFormat: 'full-date-time'}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.direction\">\n <fs-label>\n Direction\n </fs-label>\n {{apiLog.direction}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.length\">\n <fs-label>\n Duration\n </fs-label>\n {{ apiLog.length | fsDateDuration }}\n </fs-label-field>\n\n <ng-container *ngIf=\"apiLog.method\">\n <fs-label-field *ngIf=\"apiLog.method\">\n <fs-label>\n Method\n </fs-label>\n {{apiLog.method}}\n </fs-label-field>\n </ng-container>\n \n <fs-label-field *ngIf=\"apiLog.url\">\n <fs-label>\n URL\n </fs-label>\n {{apiLog.url}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"apiLog.message\">\n <fs-label>\n Message\n </fs-label>\n {{apiLog.message}}\n </fs-label-field>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.request\">\n <fs-label>\n Request\n </fs-label>\n <pre>{{apiLog.request|json}}</pre>\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.response\">\n <fs-label>\n Response\n </fs-label>\n <pre>{{apiLog.response|json}}</pre>\n </fs-label-field>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i4.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }, { kind: "component", type: i5.FsLabelComponent, selector: "fs-label" }, { kind: "component", type: i5.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["bottomMargin", "topMargin", "labelMargin"] }, { kind: "component", type: i6.FsDialogComponent, selector: "fs-dialog", inputs: ["mobileMode", "mobileButtonPlacement", "mobileWidth", "mode", "buttonLayout", "dock", "dockable", "fullscreenPercent"] }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i7.FsDateDurationPipe, name: "fsDateDuration" }, { kind: "pipe", type: i7.FsDateFormatPipe, name: "fsDateFormat" }] });
|
|
30
30
|
}
|
|
31
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ApiLogComponent, decorators: [{
|
|
32
32
|
type: Component,
|
|
33
33
|
args: [{ template: "<fs-dialog *fsSkeleton=\"apiLog\">\n\n <div mat-dialog-title>API Log</div>\n\n <mat-dialog-content>\n <div class=\"fs-row.gap-lg.wrap.align-start\">\n <fs-label-field>\n <fs-label>\n Type\n </fs-label>\n {{apiLog.type}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Status\n </fs-label>\n {{apiLogStates[apiLog.state]}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.code\">\n <fs-label>\n Code\n </fs-label>\n {{apiLog.code}}\n </fs-label-field>\n\n <fs-label-field>\n <fs-label>\n Date\n </fs-label>\n {{apiLog.createDate|fsDateFormat: 'full-date-time'}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.direction\">\n <fs-label>\n Direction\n </fs-label>\n {{apiLog.direction}}\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.length\">\n <fs-label>\n Duration\n </fs-label>\n {{ apiLog.length | fsDateDuration }}\n </fs-label-field>\n\n <ng-container *ngIf=\"apiLog.method\">\n <fs-label-field *ngIf=\"apiLog.method\">\n <fs-label>\n Method\n </fs-label>\n {{apiLog.method}}\n </fs-label-field>\n </ng-container>\n \n <fs-label-field *ngIf=\"apiLog.url\">\n <fs-label>\n URL\n </fs-label>\n {{apiLog.url}}\n </fs-label-field>\n </div>\n\n <fs-label-field *ngIf=\"apiLog.message\">\n <fs-label>\n Message\n </fs-label>\n {{apiLog.message}}\n </fs-label-field>\n\n <div>\n <fs-label-field *ngIf=\"apiLog.request\">\n <fs-label>\n Request\n </fs-label>\n <pre>{{apiLog.request|json}}</pre>\n </fs-label-field>\n\n <fs-label-field *ngIf=\"apiLog.response\">\n <fs-label>\n Response\n </fs-label>\n <pre>{{apiLog.response|json}}</pre>\n </fs-label-field>\n </div>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button \n mat-button \n [mat-dialog-close]=\"true\" \n color=\"primary\">\n Done\n </button>\n </mat-dialog-actions>\n</fs-dialog>\n" }]
|
|
34
34
|
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
|
|
35
35
|
type: Inject,
|
|
36
36
|
args: [MAT_DIALOG_DATA]
|
|
37
37
|
}] }] });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvYXBpLWxvZy9hcGktbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9hcGktbG9nL2FwaS1sb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7O0FBT2hFLE1BQU0sT0FBTyxlQUFlO0lBS047SUFDd0I7SUFKckMsTUFBTSxDQUFDO0lBQ1AsWUFBWSxDQUFDO0lBRXBCLFlBQW9CLFVBQXlDLEVBQ2pCLElBQUk7UUFENUIsZUFBVSxHQUFWLFVBQVUsQ0FBK0I7UUFDakIsU0FBSSxHQUFKLElBQUksQ0FBQTtJQUFHLENBQUM7SUFFN0MsUUFBUTtRQUViLElBQUksQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO3VHQWZVLGVBQWUsOENBTU4sZUFBZTsyRkFOeEIsZUFBZSxvRENWNUIsdXVFQWlHQTs7MkZEdkZhLGVBQWU7a0JBSjNCLFNBQVM7OzswQkFVSyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgQXBpTG9nU3RhdGVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcclxuaW1wb3J0IHsgaW5kZXhOYW1lVmFsdWUgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2luZGV4LW5hbWUtdmFsdWUnO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcGktbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hcGktbG9nLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEFwaUxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIHB1YmxpYyBhcGlMb2c7XHJcbiAgcHVibGljIGFwaUxvZ1N0YXRlcztcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QXBpTG9nQ29tcG9uZW50PixcclxuICAgICAgICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGEpIHt9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLmFwaUxvZ1N0YXRlcyA9IGluZGV4TmFtZVZhbHVlKEFwaUxvZ1N0YXRlcyk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YS5hcGlMb2cpIHtcclxuICAgICAgdGhpcy5hcGlMb2cgPSB0aGlzLmRhdGEuYXBpTG9nO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZnMtZGlhbG9nICpmc1NrZWxldG9uPVwiYXBpTG9nXCI+XG5cbiAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlPkFQSSBMb2c8L2Rpdj5cblxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLWxnLndyYXAuYWxpZ24tc3RhcnRcIj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFR5cGVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3thcGlMb2cudHlwZX19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBTdGF0dXNcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3thcGlMb2dTdGF0ZXNbYXBpTG9nLnN0YXRlXX19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJhcGlMb2cuY29kZVwiPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgQ29kZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7e2FwaUxvZy5jb2RlfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIERhdGVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3thcGlMb2cuY3JlYXRlRGF0ZXxmc0RhdGVGb3JtYXQ6ICdmdWxsLWRhdGUtdGltZSd9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cblxuICAgICAgPGZzLWxhYmVsLWZpZWxkICpuZ0lmPVwiYXBpTG9nLmRpcmVjdGlvblwiPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgRGlyZWN0aW9uXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7YXBpTG9nLmRpcmVjdGlvbn19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgICA8ZnMtbGFiZWwtZmllbGQgKm5nSWY9XCJhcGlMb2cubGVuZ3RoXCI+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBEdXJhdGlvblxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBhcGlMb2cubGVuZ3RoIHwgZnNEYXRlRHVyYXRpb24gfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcGlMb2cubWV0aG9kXCI+XG4gICAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5tZXRob2RcIj5cbiAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICBNZXRob2RcbiAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgIHt7YXBpTG9nLm1ldGhvZH19XG4gICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy51cmxcIj5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFVSTFxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7e2FwaUxvZy51cmx9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5tZXNzYWdlXCI+XG4gICAgICA8ZnMtbGFiZWw+XG4gICAgICAgIE1lc3NhZ2VcbiAgICAgIDwvZnMtbGFiZWw+XG4gICAgICB7e2FwaUxvZy5tZXNzYWdlfX1cbiAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuXG4gICAgPGRpdj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5yZXF1ZXN0XCI+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBSZXF1ZXN0XG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIDxwcmU+e3thcGlMb2cucmVxdWVzdHxqc29ufX08L3ByZT5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG5cbiAgICAgIDxmcy1sYWJlbC1maWVsZCAqbmdJZj1cImFwaUxvZy5yZXNwb25zZVwiPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgUmVzcG9uc2VcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgPHByZT57e2FwaUxvZy5yZXNwb25zZXxqc29ufX08L3ByZT5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDxidXR0b24gXG4gICAgICAgIG1hdC1idXR0b24gXG4gICAgICAgIFttYXQtZGlhbG9nLWNsb3NlXT1cInRydWVcIiBcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICBEb25lXG4gICAgPC9idXR0b24+XG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuPC9mcy1kaWFsb2c+XG4iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from './api-log.component';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvc3lzdGVtL2NvbXBvbmVudHMvYXBpLWxvZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hcGktbG9nLmNvbXBvbmVudCc7XHJcbiJdfQ==
|