@firestitch/app-acl 18.0.13 → 18.0.16
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/components/acl-entries/acl-entries.component.d.ts +6 -5
- package/app/components/acl-role/acl-role.component.d.ts +13 -0
- package/app/components/acl-roles/acl-roles.component.d.ts +7 -1
- package/esm2022/app/components/acl-entries/acl-entries.component.mjs +19 -16
- package/esm2022/app/components/acl-role/acl-role.component.mjs +28 -4
- package/esm2022/app/components/acl-roles/acl-roles.component.mjs +11 -2
- package/fesm2022/firestitch-app-acl.mjs +56 -20
- package/fesm2022/firestitch-app-acl.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
2
|
import { FsListAction, FsListComponent, FsListConfig } from '@firestitch/list';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
4
|
import { AclEntry } from '../../interfaces/acl-entry';
|
|
5
5
|
import { AclObjectEntry } from '../../interfaces/acl-object-entry';
|
|
6
6
|
import { AclRole } from '../../interfaces/acl-role';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class FsAclEntriesComponent implements OnInit, OnDestroy {
|
|
9
|
-
private readonly _appAclService;
|
|
10
|
-
private readonly _dialog;
|
|
11
|
-
private _confirm;
|
|
12
9
|
loadAclEntries: (query: any) => Observable<AclEntry[]>;
|
|
13
10
|
loadAclRoles: (query: any) => Observable<AclRole[]>;
|
|
14
11
|
saveAclObjectEntry: (aclObjectEntry: AclObjectEntry) => Observable<any>;
|
|
15
12
|
environmentShow: boolean;
|
|
16
13
|
environmentLabel: string;
|
|
17
14
|
environmentKey: string;
|
|
15
|
+
required: boolean;
|
|
18
16
|
actions: FsListAction[];
|
|
19
17
|
aclEntriesList: FsListComponent;
|
|
20
18
|
aclEntriesConfig: FsListConfig;
|
|
21
19
|
permissions: any[];
|
|
22
20
|
private _destroy$;
|
|
21
|
+
private readonly _appAclService;
|
|
22
|
+
private readonly _dialog;
|
|
23
|
+
private _confirm;
|
|
23
24
|
ngOnInit(): void;
|
|
24
25
|
update(aclObjectEntry: AclObjectEntry): void;
|
|
25
26
|
ngOnDestroy(): void;
|
|
26
27
|
reload(): void;
|
|
27
28
|
static ɵfac: i0.ɵɵFactoryDeclaration<FsAclEntriesComponent, never>;
|
|
28
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FsAclEntriesComponent, "fs-acl-entries", never, { "loadAclEntries": { "alias": "loadAclEntries"; "required": false; }; "loadAclRoles": { "alias": "loadAclRoles"; "required": false; }; "saveAclObjectEntry": { "alias": "saveAclObjectEntry"; "required": false; }; "environmentShow": { "alias": "environmentShow"; "required": false; }; "environmentLabel": { "alias": "environmentLabel"; "required": false; }; "environmentKey": { "alias": "environmentKey"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; }, {}, never, never, true, never>;
|
|
29
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FsAclEntriesComponent, "fs-acl-entries", never, { "loadAclEntries": { "alias": "loadAclEntries"; "required": false; }; "loadAclRoles": { "alias": "loadAclRoles"; "required": false; }; "saveAclObjectEntry": { "alias": "saveAclObjectEntry"; "required": false; }; "environmentShow": { "alias": "environmentShow"; "required": false; }; "environmentLabel": { "alias": "environmentLabel"; "required": false; }; "environmentKey": { "alias": "environmentKey"; "required": false; }; "required": { "alias": "required"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; }, {}, never, never, true, never>;
|
|
29
30
|
}
|
|
@@ -33,6 +33,7 @@ export declare class FsAclRoleComponent implements OnInit, OnDestroy {
|
|
|
33
33
|
aclRolePermissions: {};
|
|
34
34
|
loadRoleConfigs: (aclRole: AclRole, query: any) => Observable<RoleConfig[]>;
|
|
35
35
|
disabled: boolean;
|
|
36
|
+
permissionSelectable: (permission: any, access?: number) => boolean;
|
|
36
37
|
private _destroy$;
|
|
37
38
|
ngOnInit(): void;
|
|
38
39
|
bulkChange(value: number, groupChildren: any, group: any): void;
|
|
@@ -42,6 +43,18 @@ export declare class FsAclRoleComponent implements OnInit, OnDestroy {
|
|
|
42
43
|
save: () => Observable<any>;
|
|
43
44
|
close(data?: any): void;
|
|
44
45
|
allPermissionsChange(all: boolean): void;
|
|
46
|
+
/**
|
|
47
|
+
* Whether a permission may be granted at the given access. Defaults to true
|
|
48
|
+
* (selectable) when the consuming project supplies no permissionSelectable
|
|
49
|
+
* guard, so behaviour is unchanged for existing callers.
|
|
50
|
+
*/
|
|
51
|
+
isPermissionSelectable(permission: any, access?: number): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* "All permissions" is only offerable when every permission at the current
|
|
54
|
+
* level is itself selectable (enabling it would grant them all). Defaults to
|
|
55
|
+
* true when no guard is supplied.
|
|
56
|
+
*/
|
|
57
|
+
allPermissionsSelectable(): boolean;
|
|
45
58
|
ngOnDestroy(): void;
|
|
46
59
|
private _updatePermissions;
|
|
47
60
|
private _updateRoleConfigs;
|
|
@@ -19,6 +19,12 @@ export declare class FsAclRolesComponent implements OnInit, OnDestroy {
|
|
|
19
19
|
loadRoleConfigs: (aclRole: AclRole, query: any) => Observable<RoleConfig[]>;
|
|
20
20
|
aclLevels: AclLevel[];
|
|
21
21
|
disabledAclRole: (aclRole: AclRole) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Optional guard letting the consuming project decide whether a permission (at
|
|
24
|
+
* a given access) may be granted on a role. Returns true = selectable. When
|
|
25
|
+
* not provided, everything is selectable, so existing consumers are unchanged.
|
|
26
|
+
*/
|
|
27
|
+
permissionSelectable: (permission: any, access?: number) => boolean;
|
|
22
28
|
list: QueryList<FsListComponent>;
|
|
23
29
|
listConfig: FsListConfig;
|
|
24
30
|
permissions: any;
|
|
@@ -31,5 +37,5 @@ export declare class FsAclRolesComponent implements OnInit, OnDestroy {
|
|
|
31
37
|
ngOnDestroy(): void;
|
|
32
38
|
private _loadListConfig;
|
|
33
39
|
static ɵfac: i0.ɵɵFactoryDeclaration<FsAclRolesComponent, never>;
|
|
34
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FsAclRolesComponent, "fs-acl-roles", never, { "deleteAclRole": { "alias": "deleteAclRole"; "required": false; }; "restoreAclRole": { "alias": "restoreAclRole"; "required": false; }; "saveAclRole": { "alias": "saveAclRole"; "required": false; }; "loadAclRoles": { "alias": "loadAclRoles"; "required": false; }; "loadAclRole": { "alias": "loadAclRole"; "required": false; }; "loadRoleConfigs": { "alias": "loadRoleConfigs"; "required": false; }; "aclLevels": { "alias": "aclLevels"; "required": false; }; "disabledAclRole": { "alias": "disabledAclRole"; "required": false; }; }, {}, never, never, true, never>;
|
|
40
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FsAclRolesComponent, "fs-acl-roles", never, { "deleteAclRole": { "alias": "deleteAclRole"; "required": false; }; "restoreAclRole": { "alias": "restoreAclRole"; "required": false; }; "saveAclRole": { "alias": "saveAclRole"; "required": false; }; "loadAclRoles": { "alias": "loadAclRoles"; "required": false; }; "loadAclRole": { "alias": "loadAclRole"; "required": false; }; "loadRoleConfigs": { "alias": "loadRoleConfigs"; "required": false; }; "aclLevels": { "alias": "aclLevels"; "required": false; }; "disabledAclRole": { "alias": "disabledAclRole"; "required": false; }; "permissionSelectable": { "alias": "permissionSelectable"; "required": false; }; }, {}, never, never, true, never>;
|
|
35
41
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Component, Input, ViewChild, inject } from '@angular/core';
|
|
2
2
|
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
-
import {
|
|
4
|
-
import { Observable, Subject } from 'rxjs';
|
|
5
|
-
import { groupBy, sortBy } from 'lodash-es';
|
|
3
|
+
import { FsBadgeModule } from '@firestitch/badge';
|
|
6
4
|
import { FsListComponent, FsListModule } from '@firestitch/list';
|
|
7
5
|
import { FsPrompt } from '@firestitch/prompt';
|
|
8
|
-
import {
|
|
6
|
+
import { Observable, Subject } from 'rxjs';
|
|
7
|
+
import { takeUntil } from 'rxjs/operators';
|
|
8
|
+
import { groupBy, sortBy } from 'lodash-es';
|
|
9
9
|
import { FsAppAclService } from '../../services/app-acl.service';
|
|
10
10
|
import { FsAclEntryComponent } from '../acl-entry/acl-entry.component';
|
|
11
11
|
import { FsAclRolePopoverComponent } from '../acl-role-popover/acl-role-popover.component';
|
|
@@ -13,23 +13,24 @@ import * as i0 from "@angular/core";
|
|
|
13
13
|
import * as i1 from "@firestitch/list";
|
|
14
14
|
import * as i2 from "@firestitch/badge";
|
|
15
15
|
export class FsAclEntriesComponent {
|
|
16
|
-
_appAclService = inject(FsAppAclService);
|
|
17
|
-
_dialog = inject(MatDialog);
|
|
18
|
-
_confirm = inject(FsPrompt);
|
|
19
16
|
loadAclEntries;
|
|
20
17
|
loadAclRoles;
|
|
21
18
|
saveAclObjectEntry;
|
|
22
19
|
environmentShow = true;
|
|
23
20
|
environmentLabel = 'Environment';
|
|
24
21
|
environmentKey = 'environment';
|
|
22
|
+
required = true;
|
|
25
23
|
actions = [];
|
|
26
24
|
aclEntriesList = null;
|
|
27
25
|
aclEntriesConfig = null;
|
|
28
26
|
permissions = [];
|
|
29
27
|
_destroy$ = new Subject();
|
|
28
|
+
_appAclService = inject(FsAppAclService);
|
|
29
|
+
_dialog = inject(MatDialog);
|
|
30
|
+
_confirm = inject(FsPrompt);
|
|
30
31
|
ngOnInit() {
|
|
31
32
|
this._appAclService.getPermissions()
|
|
32
|
-
.subscribe(response => {
|
|
33
|
+
.subscribe((response) => {
|
|
33
34
|
this.permissions = response;
|
|
34
35
|
});
|
|
35
36
|
this.aclEntriesConfig = {
|
|
@@ -54,8 +55,8 @@ export class FsAclEntriesComponent {
|
|
|
54
55
|
this.aclEntriesList.reload();
|
|
55
56
|
});
|
|
56
57
|
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
58
|
+
},
|
|
59
|
+
},
|
|
59
60
|
],
|
|
60
61
|
fetch: () => {
|
|
61
62
|
return new Observable((observer) => {
|
|
@@ -98,7 +99,7 @@ export class FsAclEntriesComponent {
|
|
|
98
99
|
[`${this.environmentKey}Id`]: parts[1] ? parseInt(parts[1]) : null,
|
|
99
100
|
[this.environmentKey]: environments[parts[1]],
|
|
100
101
|
aclEntries: groupedAclEntries[key],
|
|
101
|
-
}
|
|
102
|
+
},
|
|
102
103
|
];
|
|
103
104
|
}, []);
|
|
104
105
|
const hasApp = aclObjectEntries.some((item) => {
|
|
@@ -127,12 +128,12 @@ export class FsAclEntriesComponent {
|
|
|
127
128
|
update(aclObjectEntry) {
|
|
128
129
|
const data = {
|
|
129
130
|
aclObjectEntry,
|
|
130
|
-
required:
|
|
131
|
+
required: this.required,
|
|
131
132
|
loadAclRoles: this.loadAclRoles,
|
|
132
|
-
saveAclObjectEntry: this.saveAclObjectEntry
|
|
133
|
+
saveAclObjectEntry: this.saveAclObjectEntry,
|
|
133
134
|
};
|
|
134
135
|
this._dialog.open(FsAclEntryComponent, {
|
|
135
|
-
data: data
|
|
136
|
+
data: data,
|
|
136
137
|
})
|
|
137
138
|
.afterClosed()
|
|
138
139
|
.pipe(takeUntil(this._destroy$))
|
|
@@ -148,7 +149,7 @@ export class FsAclEntriesComponent {
|
|
|
148
149
|
this.aclEntriesList.reload();
|
|
149
150
|
}
|
|
150
151
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAclEntriesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
151
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsAclEntriesComponent, isStandalone: true, selector: "fs-acl-entries", inputs: { loadAclEntries: "loadAclEntries", loadAclRoles: "loadAclRoles", saveAclObjectEntry: "saveAclObjectEntry", environmentShow: "environmentShow", environmentLabel: "environmentLabel", environmentKey: "environmentKey", actions: "actions" }, viewQueries: [{ propertyName: "aclEntriesList", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>\n Context\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (row.object) {\n <div class=\"fs-row.gap-sm\">\n @if (row.object.imageUrl) {\n <fs-badge\n shape=\"circle\"\n [image]=\"row.object.imageUrl\">\n </fs-badge>\n }\n <span>\n <div>\n <small>\n {{ row.object.class }}\n </small>\n </div>\n <a (click)=\"update(row)\">\n {{ row.object.name }}\n </a>\n </span>\n </div>\n } @else {\n <a (click)=\"update(row)\">\n App\n </a>\n }\n </ng-template>\n </fs-list-column>\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>\n {{ environmentLabel }}\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n {{ row.environment?.name }}\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>\n Roles\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"fs-column\">\n @for (aclEntry of row.aclEntries; track aclEntry.id) {\n <div div>\n @switch (row.level) {\n @case ('app') {\n <fs-acl-role-popover\n [aclRole]=\"aclEntry.aclRole\"\n objectName=\"App\">\n {{ aclEntry.aclRole.name }}\n </fs-acl-role-popover>\n }\n @default {\n @if (row.object) {\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">\n {{ aclEntry.aclRole.name }}\n </fs-acl-role-popover>\n }\n }\n }\n </div>\n }\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>", styles: [""], dependencies: [{ kind: "ngmodule", type: FsListModule }, { kind: "component", type: i1.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i1.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customizable", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i1.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i1.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { kind: "ngmodule", type: FsBadgeModule }, { kind: "component", type: i2.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconSizePercent", "iconColor", "backgroundSize"] }, { kind: "component", type: FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }] });
|
|
152
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsAclEntriesComponent, isStandalone: true, selector: "fs-acl-entries", inputs: { loadAclEntries: "loadAclEntries", loadAclRoles: "loadAclRoles", saveAclObjectEntry: "saveAclObjectEntry", environmentShow: "environmentShow", environmentLabel: "environmentLabel", environmentKey: "environmentKey", required: "required", actions: "actions" }, viewQueries: [{ propertyName: "aclEntriesList", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<fs-list [config]=\"aclEntriesConfig\">\n <fs-list-column>\n <ng-template fs-list-header>\n Context\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (row.object) {\n <div class=\"fs-row.gap-sm\">\n @if (row.object.imageUrl) {\n <fs-badge\n shape=\"circle\"\n [image]=\"row.object.imageUrl\">\n </fs-badge>\n }\n <span>\n <div>\n <small>\n {{ row.object.class }}\n </small>\n </div>\n <a (click)=\"update(row)\">\n {{ row.object.name }}\n </a>\n </span>\n </div>\n } @else {\n <a (click)=\"update(row)\">\n App\n </a>\n }\n </ng-template>\n </fs-list-column>\n <fs-list-column [show]=\"environmentShow\">\n <ng-template fs-list-header>\n {{ environmentLabel }}\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n {{ row.environment?.name }}\n </ng-template>\n </fs-list-column>\n <fs-list-column>\n <ng-template fs-list-header>\n Roles\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <div class=\"fs-column\">\n @for (aclEntry of row.aclEntries; track aclEntry.id) {\n <div div>\n @switch (row.level) {\n @case ('app') {\n <fs-acl-role-popover\n [aclRole]=\"aclEntry.aclRole\"\n objectName=\"App\">\n {{ aclEntry.aclRole.name }}\n </fs-acl-role-popover>\n }\n @default {\n @if (row.object) {\n <fs-acl-role-popover [aclRole]=\"aclEntry.aclRole\">\n {{ aclEntry.aclRole.name }}\n </fs-acl-role-popover>\n }\n }\n }\n </div>\n }\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>", styles: [""], dependencies: [{ kind: "ngmodule", type: FsListModule }, { kind: "component", type: i1.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines"], outputs: ["filtersReady"] }, { kind: "directive", type: i1.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customizable", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i1.FsListCellDirective, selector: "[fs-list-cell]", inputs: ["colspan", "align", "class"] }, { kind: "directive", type: i1.FsListHeaderDirective, selector: "[fs-list-header]", inputs: ["colspan", "align", "class"] }, { kind: "ngmodule", type: FsBadgeModule }, { kind: "component", type: i2.FsBadgeComponent, selector: "fs-badge", inputs: ["color", "text", "tooltip", "size", "shape", "image", "icon", "iconSize", "iconSizePercent", "iconColor", "backgroundSize"] }, { kind: "component", type: FsAclRolePopoverComponent, selector: "fs-acl-role-popover", inputs: ["aclRole", "objectName"] }] });
|
|
152
153
|
}
|
|
153
154
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAclEntriesComponent, decorators: [{
|
|
154
155
|
type: Component,
|
|
@@ -165,10 +166,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
165
166
|
type: Input
|
|
166
167
|
}], environmentKey: [{
|
|
167
168
|
type: Input
|
|
169
|
+
}], required: [{
|
|
170
|
+
type: Input
|
|
168
171
|
}], actions: [{
|
|
169
172
|
type: Input
|
|
170
173
|
}], aclEntriesList: [{
|
|
171
174
|
type: ViewChild,
|
|
172
175
|
args: [FsListComponent]
|
|
173
176
|
}] } });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWVudHJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1lbnRyaWVzL2FjbC1lbnRyaWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtZW50cmllcy9hY2wtZW50cmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE9BQU8sRUFBZ0IsZUFBZSxFQUFnQixZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBS2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7OztBQVUzRixNQUFNLE9BQU8scUJBQXFCO0lBQ2YsY0FBYyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN6QyxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsR0FB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LElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQzthQUNDLFdBQVcsRUFBRTthQUNiLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0IsQ0FBQzt1R0EzSlUscUJBQXFCOzJGQUFyQixxQkFBcUIsZ1hBY3JCLGVBQWUsZ0RDMUM1QixraEVBMkVVLHlERGpESSxZQUFZLHduQkFBRSxhQUFhLDZPQUFFLHlCQUF5Qjs7MkZBRXZELHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDSSxnQkFBZ0IsY0FHZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixDQUFDOzhCQVFuRCxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1Usa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZ3JvdXBCeSwgc29ydEJ5IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNMaXN0QWN0aW9uLCBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZywgRnNMaXN0TW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5cbmltcG9ydCB7IEZzQmFkZ2VNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9iYWRnZSc7XG5pbXBvcnQgeyBBY2xFbnRyeSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLWVudHJ5JztcbmltcG9ydCB7IEFjbEVudHJ5RGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLWVudHJ5LWRhdGEnO1xuaW1wb3J0IHsgQWNsT2JqZWN0RW50cnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1vYmplY3QtZW50cnknO1xuaW1wb3J0IHsgQWNsUm9sZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYWNsLXJvbGUnO1xuaW1wb3J0IHsgRnNBcHBBY2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLWFjbC5zZXJ2aWNlJztcbmltcG9ydCB7IEZzQWNsRW50cnlDb21wb25lbnQgfSBmcm9tICcuLi9hY2wtZW50cnkvYWNsLWVudHJ5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGc0FjbFJvbGVQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vYWNsLXJvbGUtcG9wb3Zlci9hY2wtcm9sZS1wb3BvdmVyLmNvbXBvbmVudCc7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmcy1hY2wtZW50cmllcycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FjbC1lbnRyaWVzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hY2wtZW50cmllcy5jb21wb25lbnQuc2NzcyddLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0ZzTGlzdE1vZHVsZSwgRnNCYWRnZU1vZHVsZSwgRnNBY2xSb2xlUG9wb3ZlckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgRnNBY2xFbnRyaWVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IF9hcHBBY2xTZXJ2aWNlID0gaW5qZWN0KEZzQXBwQWNsU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICBwcml2YXRlIF9jb25maXJtID0gaW5qZWN0KEZzUHJvbXB0KTtcblxuXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkQWNsRW50cmllczogKHF1ZXJ5OiBhbnkpID0+IE9ic2VydmFibGU8QWNsRW50cnlbXT47XG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkQWNsUm9sZXM6IChxdWVyeTogYW55KSA9PiBPYnNlcnZhYmxlPEFjbFJvbGVbXT47XG4gIEBJbnB1dCgpIHB1YmxpYyBzYXZlQWNsT2JqZWN0RW50cnk6IChhY2xPYmplY3RFbnRyeTogQWNsT2JqZWN0RW50cnkpID0+IE9ic2VydmFibGU8YW55PjtcbiAgQElucHV0KCkgcHVibGljIGVudmlyb25tZW50U2hvdyA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBlbnZpcm9ubWVudExhYmVsID0gJ0Vudmlyb25tZW50JztcbiAgQElucHV0KCkgcHVibGljIGVudmlyb25tZW50S2V5ID0gJ2Vudmlyb25tZW50JztcbiAgQElucHV0KCkgcHVibGljIGFjdGlvbnM6IEZzTGlzdEFjdGlvbltdID0gW107XG5cbiAgQFZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpXG4gIHB1YmxpYyBhY2xFbnRyaWVzTGlzdDogRnNMaXN0Q29tcG9uZW50ID0gbnVsbDtcblxuICBwdWJsaWMgYWNsRW50cmllc0NvbmZpZzogRnNMaXN0Q29uZmlnID0gbnVsbDtcbiAgcHVibGljIHBlcm1pc3Npb25zOiBhbnlbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fYXBwQWNsU2VydmljZS5nZXRQZXJtaXNzaW9ucygpXG4gICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHJlc3BvbnNlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmFjbEVudHJpZXNDb25maWcgPSB7XG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIGFjdGlvbnM6IHRoaXMuYWN0aW9ucyxcbiAgICAgIHJvd0FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnUmVtb3ZlIEFsbCBSb2xlcycsXG4gICAgICAgICAgY2xpY2s6IChhY2xPYmplY3RFbnRyeTogQWNsT2JqZWN0RW50cnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpcm1cbiAgICAgICAgICAgICAgLmNvbmZpcm0oe1xuICAgICAgICAgICAgICAgIHRpdGxlOiAnUmVtb3ZlIEFsbCBSb2xlcycsXG4gICAgICAgICAgICAgICAgY29tbWl0TGFiZWw6ICdTYXZlJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYFBsZWFzZSBub3RlIHRoYXQgcmVtb3Zpbmcgcm9sZXMgbWF5IHByZXZlbnQgdXNlcnMgZnJvbSBiZWluZyBhYmxlIHRvIHN1Y2Nlc3NmdWxseSBsb2dpbi48YnI+XG4gICAgICAgICAgICAgICAgICBUaGVzZSBjaGFuZ2VzIGFyZSBlZmZlY3RpdmUgaW1tZWRpYXRlbHkuPGJyPlxuICAgICAgICAgICAgICAgICAgQXJlIHlvdSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlP2AsXG4gICAgICAgICAgICAgIH0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgLi4uYWNsT2JqZWN0RW50cnksIGFjbEVudHJpZXM6IFtdIH07XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWNsT2JqZWN0RW50cnkoZGF0YSlcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjbEVudHJpZXNMaXN0LnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRBY2xFbnRyaWVzKHtcbiAgICAgICAgICAgIGFjbFJvbGVzOiB0cnVlLFxuICAgICAgICAgICAgYWNsUm9sZVBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIGFjbFJvbGVTdGF0ZTogJ2FjdGl2ZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFjbEVudHJpZXM6IEFjbEVudHJ5W10pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0cyA9IGFjbEVudHJpZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChhY2xFbnRyeSkgPT4gKCEhYWNsRW50cnkub2JqZWN0KSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChpdGVtcywgaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtLm9iamVjdC5pZF06IGl0ZW0ub2JqZWN0LFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnRzID0gYWNsRW50cmllc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGFjbEVudHJ5KSA9PiAoISFhY2xFbnRyeVt0aGlzLmVudmlyb25tZW50S2V5XSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gaXRlbVt0aGlzLmVudmlyb25tZW50S2V5XTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLml0ZW1zLFxuICAgICAgICAgICAgICAgICAgICBbZW52aXJvbm1lbnQuaWRdOiBlbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwge30pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwZWRBY2xFbnRyaWVzID0gZ3JvdXBCeShhY2xFbnRyaWVzLCAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50SWQgPSAoaXRlbVt0aGlzLmVudmlyb25tZW50S2V5XSk/LmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBbaXRlbS5hY2xSb2xlLmxldmVsLCBlbnZpcm9ubWVudElkLCBpdGVtLm9iamVjdElkXTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbGV0IGFjbE9iamVjdEVudHJpZXM6IEFjbE9iamVjdEVudHJ5W10gPSBPYmplY3Qua2V5cyhncm91cGVkQWNsRW50cmllcylcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2N1bSwga2V5OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogb2JqZWN0c1twYXJ0c1syXV0sXG4gICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHBhcnRzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtgJHt0aGlzLmVudmlyb25tZW50S2V5fUlkYF06IHBhcnRzWzFdID8gcGFyc2VJbnQocGFydHNbMV0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5lbnZpcm9ubWVudEtleV06IGVudmlyb25tZW50c1twYXJ0c1sxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgYWNsRW50cmllczogZ3JvdXBlZEFjbEVudHJpZXNba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgaGFzQXBwID0gYWNsT2JqZWN0RW50cmllcy5zb21lKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYWNsRW50cmllcy5zb21lKChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICFlbnRyeS5vYmplY3RJZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKCFoYXNBcHApIHtcbiAgICAgICAgICAgICAgICBhY2xPYmplY3RFbnRyaWVzLnVuc2hpZnQoe1xuICAgICAgICAgICAgICAgICAgb2JqZWN0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgYWNsRW50cmllczogW10sXG4gICAgICAgICAgICAgICAgICBsZXZlbDogJ2FwcCcsXG4gICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudElkOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYWNsT2JqZWN0RW50cmllcyA9IHNvcnRCeShhY2xPYmplY3RFbnRyaWVzLCAoaXRlbTogQWNsT2JqZWN0RW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5vYmplY3QgPyBpdGVtLmxldmVsIDogJyc7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhY2xPYmplY3RFbnRyaWVzIH0pO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZShhY2xPYmplY3RFbnRyeTogQWNsT2JqZWN0RW50cnkpIHtcbiAgICBjb25zdCBkYXRhOiBBY2xFbnRyeURhdGEgPSB7XG4gICAgICBhY2xPYmplY3RFbnRyeSxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGxvYWRBY2xSb2xlczogdGhpcy5sb2FkQWNsUm9sZXMsXG4gICAgICBzYXZlQWNsT2JqZWN0RW50cnk6IHRoaXMuc2F2ZUFjbE9iamVjdEVudHJ5XG4gICAgfVxuXG4gICAgdGhpcy5fZGlhbG9nLm9wZW4oRnNBY2xFbnRyeUNvbXBvbmVudCwge1xuICAgICAgZGF0YTogZGF0YVxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgfVxuXG59XG4iLCI8ZnMtbGlzdCBbY29uZmlnXT1cImFjbEVudHJpZXNDb25maWdcIj5cbiAgPGZzLWxpc3QtY29sdW1uPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgIENvbnRleHRcbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgQGlmIChyb3cub2JqZWN0KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLXNtXCI+XG4gICAgICAgICAgQGlmIChyb3cub2JqZWN0LmltYWdlVXJsKSB7XG4gICAgICAgICAgICA8ZnMtYmFkZ2VcbiAgICAgICAgICAgICAgc2hhcGU9XCJjaXJjbGVcIlxuICAgICAgICAgICAgICBbaW1hZ2VdPVwicm93Lm9iamVjdC5pbWFnZVVybFwiPlxuICAgICAgICAgICAgPC9mcy1iYWRnZT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAge3sgcm93Lm9iamVjdC5jbGFzcyB9fVxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YSAoY2xpY2spPVwidXBkYXRlKHJvdylcIj5cbiAgICAgICAgICAgICAge3sgcm93Lm9iamVjdC5uYW1lIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YSAoY2xpY2spPVwidXBkYXRlKHJvdylcIj5cbiAgICAgICAgICBBcHBcbiAgICAgICAgPC9hPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbiBbc2hvd109XCJlbnZpcm9ubWVudFNob3dcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICB7eyBlbnZpcm9ubWVudExhYmVsIH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIHt7IHJvdy5lbnZpcm9ubWVudD8ubmFtZSB9fVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICBSb2xlc1xuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uXCI+XG4gICAgICAgIEBmb3IgKGFjbEVudHJ5IG9mIHJvdy5hY2xFbnRyaWVzOyB0cmFjayBhY2xFbnRyeS5pZCkge1xuICAgICAgICAgIDxkaXYgZGl2PlxuICAgICAgICAgICAgQHN3aXRjaCAocm93LmxldmVsKSB7XG4gICAgICAgICAgICAgIEBjYXNlICgnYXBwJykge1xuICAgICAgICAgICAgICAgIDxmcy1hY2wtcm9sZS1wb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgIFthY2xSb2xlXT1cImFjbEVudHJ5LmFjbFJvbGVcIlxuICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lPVwiQXBwXCI+XG4gICAgICAgICAgICAgICAgICB7eyBhY2xFbnRyeS5hY2xSb2xlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L2ZzLWFjbC1yb2xlLXBvcG92ZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgIEBpZiAocm93Lm9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgPGZzLWFjbC1yb2xlLXBvcG92ZXIgW2FjbFJvbGVdPVwiYWNsRW50cnkuYWNsUm9sZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhY2xFbnRyeS5hY2xSb2xlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZnMtYWNsLXJvbGUtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbjwvZnMtbGlzdD4iXX0=
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNsLWVudHJpZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FjbC1lbnRyaWVzL2FjbC1lbnRyaWVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hY2wtZW50cmllcy9hY2wtZW50cmllcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBZ0IsZUFBZSxFQUFnQixZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBTzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQzs7OztBQVUzRixNQUFNLE9BQU8scUJBQXFCO0lBRWhCLGNBQWMsQ0FBeUM7SUFDdkQsWUFBWSxDQUF3QztJQUNwRCxrQkFBa0IsQ0FBc0Q7SUFDeEUsZUFBZSxHQUFHLElBQUksQ0FBQztJQUN2QixnQkFBZ0IsR0FB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LENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNyQyxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7YUFDQyxXQUFXLEVBQUU7YUFDYixJQUFJLENBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDMUI7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9CLENBQUM7dUdBOUpVLHFCQUFxQjsyRkFBckIscUJBQXFCLHNZQVdyQixlQUFlLGdEQ3pDNUIsa2hFQTJFVSx5REQvQ0UsWUFBWSx3bkJBQUUsYUFBYSw2T0FBRSx5QkFBeUI7OzJGQUVyRCxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBR2QsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSx5QkFBeUIsQ0FBQzs4QkFJakQsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgRnNCYWRnZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2JhZGdlJztcbmltcG9ydCB7IEZzTGlzdEFjdGlvbiwgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xpc3QnO1xuaW1wb3J0IHsgRnNQcm9tcHQgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9tcHQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGdyb3VwQnksIHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cblxuaW1wb3J0IHsgQWNsRW50cnkgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1lbnRyeSc7XG5pbXBvcnQgeyBBY2xFbnRyeURhdGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1lbnRyeS1kYXRhJztcbmltcG9ydCB7IEFjbE9iamVjdEVudHJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hY2wtb2JqZWN0LWVudHJ5JztcbmltcG9ydCB7IEFjbFJvbGUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FjbC1yb2xlJztcbmltcG9ydCB7IEZzQXBwQWNsU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwcC1hY2wuc2VydmljZSc7XG5pbXBvcnQgeyBGc0FjbEVudHJ5Q29tcG9uZW50IH0gZnJvbSAnLi4vYWNsLWVudHJ5L2FjbC1lbnRyeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnNBY2xSb2xlUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL2FjbC1yb2xlLXBvcG92ZXIvYWNsLXJvbGUtcG9wb3Zlci5jb21wb25lbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZzLWFjbC1lbnRyaWVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FjbC1lbnRyaWVzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWNsLWVudHJpZXMuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0ZzTGlzdE1vZHVsZSwgRnNCYWRnZU1vZHVsZSwgRnNBY2xSb2xlUG9wb3ZlckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIEZzQWNsRW50cmllc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBwdWJsaWMgbG9hZEFjbEVudHJpZXM6IChxdWVyeTogYW55KSA9PiBPYnNlcnZhYmxlPEFjbEVudHJ5W10+O1xuICBASW5wdXQoKSBwdWJsaWMgbG9hZEFjbFJvbGVzOiAocXVlcnk6IGFueSkgPT4gT2JzZXJ2YWJsZTxBY2xSb2xlW10+O1xuICBASW5wdXQoKSBwdWJsaWMgc2F2ZUFjbE9iamVjdEVudHJ5OiAoYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyBlbnZpcm9ubWVudFNob3cgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgZW52aXJvbm1lbnRMYWJlbCA9ICdFbnZpcm9ubWVudCc7XG4gIEBJbnB1dCgpIHB1YmxpYyBlbnZpcm9ubWVudEtleSA9ICdlbnZpcm9ubWVudCc7XG4gIEBJbnB1dCgpIHB1YmxpYyByZXF1aXJlZCA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25zOiBGc0xpc3RBY3Rpb25bXSA9IFtdO1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgYWNsRW50cmllc0xpc3Q6IEZzTGlzdENvbXBvbmVudCA9IG51bGw7XG5cbiAgcHVibGljIGFjbEVudHJpZXNDb25maWc6IEZzTGlzdENvbmZpZyA9IG51bGw7XG4gIHB1YmxpYyBwZXJtaXNzaW9uczogYW55W10gPSBbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FwcEFjbFNlcnZpY2UgPSBpbmplY3QoRnNBcHBBY2xTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlhbG9nID0gaW5qZWN0KE1hdERpYWxvZyk7XG4gIHByaXZhdGUgX2NvbmZpcm0gPSBpbmplY3QoRnNQcm9tcHQpO1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hcHBBY2xTZXJ2aWNlLmdldFBlcm1pc3Npb25zKClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSByZXNwb25zZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hY2xFbnRyaWVzQ29uZmlnID0ge1xuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHBhZ2luZzogZmFsc2UsXG4gICAgICBhY3Rpb25zOiB0aGlzLmFjdGlvbnMsXG4gICAgICByb3dBY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1JlbW92ZSBBbGwgUm9sZXMnLFxuICAgICAgICAgIGNsaWNrOiAoYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtXG4gICAgICAgICAgICAgIC5jb25maXJtKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1JlbW92ZSBBbGwgUm9sZXMnLFxuICAgICAgICAgICAgICAgIGNvbW1pdExhYmVsOiAnU2F2ZScsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGBQbGVhc2Ugbm90ZSB0aGF0IHJlbW92aW5nIHJvbGVzIG1heSBwcmV2ZW50IHVzZXJzIGZyb20gYmVpbmcgYWJsZSB0byBzdWNjZXNzZnVsbHkgbG9naW4uPGJyPlxuICAgICAgICAgICAgICAgICAgVGhlc2UgY2hhbmdlcyBhcmUgZWZmZWN0aXZlIGltbWVkaWF0ZWx5Ljxicj5cbiAgICAgICAgICAgICAgICAgIEFyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBjb250aW51ZT9gLFxuICAgICAgICAgICAgICB9KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IC4uLmFjbE9iamVjdEVudHJ5LCBhY2xFbnRyaWVzOiBbXSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFjbE9iamVjdEVudHJ5KGRhdGEpXG4gICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZldGNoOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRBY2xFbnRyaWVzKHtcbiAgICAgICAgICAgIGFjbFJvbGVzOiB0cnVlLFxuICAgICAgICAgICAgYWNsUm9sZVBlcm1pc3Npb25zOiB0cnVlLFxuICAgICAgICAgICAgb2JqZWN0czogdHJ1ZSxcbiAgICAgICAgICAgIGFjbFJvbGVTdGF0ZTogJ2FjdGl2ZScsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFjbEVudHJpZXM6IEFjbEVudHJ5W10pID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0cyA9IGFjbEVudHJpZXNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChhY2xFbnRyeSkgPT4gKCEhYWNsRW50cnkub2JqZWN0KSlcbiAgICAgICAgICAgICAgICAucmVkdWNlKChpdGVtcywgaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtLm9iamVjdC5pZF06IGl0ZW0ub2JqZWN0LFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnRzID0gYWNsRW50cmllc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGFjbEVudHJ5KSA9PiAoISFhY2xFbnRyeVt0aGlzLmVudmlyb25tZW50S2V5XSkpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoaXRlbXMsIGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gaXRlbVt0aGlzLmVudmlyb25tZW50S2V5XTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIFtlbnZpcm9ubWVudC5pZF06IGVudmlyb25tZW50LFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZEFjbEVudHJpZXMgPSBncm91cEJ5KGFjbEVudHJpZXMsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52aXJvbm1lbnRJZCA9IChpdGVtW3RoaXMuZW52aXJvbm1lbnRLZXldKT8uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW2l0ZW0uYWNsUm9sZS5sZXZlbCwgZW52aXJvbm1lbnRJZCwgaXRlbS5vYmplY3RJZF07XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGxldCBhY2xPYmplY3RFbnRyaWVzOiBBY2xPYmplY3RFbnRyeVtdID0gT2JqZWN0LmtleXMoZ3JvdXBlZEFjbEVudHJpZXMpXG4gICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjdW0sIGtleTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGtleS5zcGxpdCgnLCcpO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogb2JqZWN0c1twYXJ0c1syXV0sXG4gICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHBhcnRzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtgJHt0aGlzLmVudmlyb25tZW50S2V5fUlkYF06IHBhcnRzWzFdID8gcGFyc2VJbnQocGFydHNbMV0pIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5lbnZpcm9ubWVudEtleV06IGVudmlyb25tZW50c1twYXJ0c1sxXV0sXG4gICAgICAgICAgICAgICAgICAgICAgYWNsRW50cmllczogZ3JvdXBlZEFjbEVudHJpZXNba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgfSwgW10pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGhhc0FwcCA9IGFjbE9iamVjdEVudHJpZXMuc29tZSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmFjbEVudHJpZXMuc29tZSgoZW50cnkpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhZW50cnkub2JqZWN0SWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmICghaGFzQXBwKSB7XG4gICAgICAgICAgICAgICAgYWNsT2JqZWN0RW50cmllcy51bnNoaWZ0KHtcbiAgICAgICAgICAgICAgICAgIG9iamVjdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIGFjbEVudHJpZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdhcHAnLFxuICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJZDogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGFjbE9iamVjdEVudHJpZXMgPSBzb3J0QnkoYWNsT2JqZWN0RW50cmllcywgKGl0ZW06IEFjbE9iamVjdEVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ub2JqZWN0ID8gaXRlbS5sZXZlbCA6ICcnO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZGF0YTogYWNsT2JqZWN0RW50cmllcyB9KTtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUoYWNsT2JqZWN0RW50cnk6IEFjbE9iamVjdEVudHJ5KSB7XG4gICAgY29uc3QgZGF0YTogQWNsRW50cnlEYXRhID0ge1xuICAgICAgYWNsT2JqZWN0RW50cnksXG4gICAgICByZXF1aXJlZDogdGhpcy5yZXF1aXJlZCxcbiAgICAgIGxvYWRBY2xSb2xlczogdGhpcy5sb2FkQWNsUm9sZXMsXG4gICAgICBzYXZlQWNsT2JqZWN0RW50cnk6IHRoaXMuc2F2ZUFjbE9iamVjdEVudHJ5LFxuICAgIH07XG5cbiAgICB0aGlzLl9kaWFsb2cub3BlbihGc0FjbEVudHJ5Q29tcG9uZW50LCB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH0pXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5hY2xFbnRyaWVzTGlzdC5yZWxvYWQoKTtcbiAgfVxuXG59XG4iLCI8ZnMtbGlzdCBbY29uZmlnXT1cImFjbEVudHJpZXNDb25maWdcIj5cbiAgPGZzLWxpc3QtY29sdW1uPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgIENvbnRleHRcbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgQGlmIChyb3cub2JqZWN0KSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmcy1yb3cuZ2FwLXNtXCI+XG4gICAgICAgICAgQGlmIChyb3cub2JqZWN0LmltYWdlVXJsKSB7XG4gICAgICAgICAgICA8ZnMtYmFkZ2VcbiAgICAgICAgICAgICAgc2hhcGU9XCJjaXJjbGVcIlxuICAgICAgICAgICAgICBbaW1hZ2VdPVwicm93Lm9iamVjdC5pbWFnZVVybFwiPlxuICAgICAgICAgICAgPC9mcy1iYWRnZT5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAge3sgcm93Lm9iamVjdC5jbGFzcyB9fVxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YSAoY2xpY2spPVwidXBkYXRlKHJvdylcIj5cbiAgICAgICAgICAgICAge3sgcm93Lm9iamVjdC5uYW1lIH19XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8YSAoY2xpY2spPVwidXBkYXRlKHJvdylcIj5cbiAgICAgICAgICBBcHBcbiAgICAgICAgPC9hPlxuICAgICAgfVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbiBbc2hvd109XCJlbnZpcm9ubWVudFNob3dcIj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICB7eyBlbnZpcm9ubWVudExhYmVsIH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgIHt7IHJvdy5lbnZpcm9ubWVudD8ubmFtZSB9fVxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbj5cbiAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICBSb2xlc1xuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZnMtY29sdW1uXCI+XG4gICAgICAgIEBmb3IgKGFjbEVudHJ5IG9mIHJvdy5hY2xFbnRyaWVzOyB0cmFjayBhY2xFbnRyeS5pZCkge1xuICAgICAgICAgIDxkaXYgZGl2PlxuICAgICAgICAgICAgQHN3aXRjaCAocm93LmxldmVsKSB7XG4gICAgICAgICAgICAgIEBjYXNlICgnYXBwJykge1xuICAgICAgICAgICAgICAgIDxmcy1hY2wtcm9sZS1wb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgIFthY2xSb2xlXT1cImFjbEVudHJ5LmFjbFJvbGVcIlxuICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lPVwiQXBwXCI+XG4gICAgICAgICAgICAgICAgICB7eyBhY2xFbnRyeS5hY2xSb2xlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICA8L2ZzLWFjbC1yb2xlLXBvcG92ZXI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgIEBpZiAocm93Lm9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgPGZzLWFjbC1yb2xlLXBvcG92ZXIgW2FjbFJvbGVdPVwiYWNsRW50cnkuYWNsUm9sZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBhY2xFbnRyeS5hY2xSb2xlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvZnMtYWNsLXJvbGUtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9mcy1saXN0LWNvbHVtbj5cbjwvZnMtbGlzdD4iXX0=
|