@firestitch/2fa 15.0.1 → 16.0.0
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/enums/index.d.ts +1 -1
- package/app/enums/verification-method-type.enum.d.ts +5 -5
- package/app/interfaces/index.d.ts +1 -1
- package/app/interfaces/verification-method.interface.d.ts +11 -11
- package/app/modules/code-input/code-input.module.d.ts +11 -11
- package/app/modules/code-input/components/code-input/code-input.component.d.ts +15 -15
- package/app/modules/code-input/components/code-input/index.d.ts +1 -1
- package/app/modules/code-input/index.d.ts +1 -1
- package/app/modules/defaulted/components/defaulted/defaulted.component.d.ts +5 -5
- package/app/modules/defaulted/components/defaulted/index.d.ts +1 -1
- package/app/modules/defaulted/defaulted.module.d.ts +7 -7
- package/app/modules/manage/components/2fa-manage/2fa-manage.component.d.ts +30 -30
- package/app/modules/manage/components/2fa-manage/index.d.ts +1 -1
- package/app/modules/manage/components/app/app.component.d.ts +32 -32
- package/app/modules/manage/components/app/index.d.ts +1 -1
- package/app/modules/manage/components/email/email.component.d.ts +27 -27
- package/app/modules/manage/components/email/index.d.ts +1 -1
- package/app/modules/manage/components/emails/emails.component.d.ts +19 -19
- package/app/modules/manage/components/emails/index.d.ts +1 -1
- package/app/modules/manage/components/manage-methods/index.d.ts +1 -1
- package/app/modules/manage/components/manage-methods/manage-methods.component.d.ts +35 -35
- package/app/modules/manage/components/number/index.d.ts +1 -1
- package/app/modules/manage/components/number/number.component.d.ts +28 -28
- package/app/modules/manage/components/numbers/index.d.ts +1 -1
- package/app/modules/manage/components/numbers/numbers.component.d.ts +20 -20
- package/app/modules/manage/fs-2f-manage.module.d.ts +33 -33
- package/app/modules/manage/services/index.d.ts +1 -1
- package/app/modules/manage/services/two-factor-manage.service.d.ts +52 -52
- package/app/modules/resend/components/resend/index.d.ts +1 -1
- package/app/modules/resend/components/resend/resend.component.d.ts +14 -14
- package/app/modules/resend/resend.module.d.ts +9 -9
- package/app/modules/verification/components/2fa-verification/2fa-verification.component.d.ts +39 -39
- package/app/modules/verification/components/2fa-verification-code/2fa-verification-code.component.d.ts +22 -22
- package/app/modules/verification/components/2fa-verification-methods/2fa-verification-methods.component.d.ts +22 -22
- package/app/modules/verification/directives/2fa-verification-resend.directive.d.ts +11 -11
- package/app/modules/verification/directives/index.d.ts +1 -1
- package/app/modules/verification/fs-2fa-verification.module.d.ts +25 -25
- package/app/modules/verification-methods/components/verification-methods/index.d.ts +1 -1
- package/app/modules/verification-methods/components/verification-methods/verification-methods.component.d.ts +26 -26
- package/app/modules/verification-methods/fs-2f-verification-methods.module.d.ts +14 -14
- package/app/modules/verification-methods/index.d.ts +1 -1
- package/{esm2020 → esm2022}/app/enums/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/enums/verification-method-type.enum.mjs +6 -6
- package/{esm2020 → esm2022}/app/interfaces/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/interfaces/verification-method.interface.mjs +1 -1
- package/{esm2020 → esm2022}/app/modules/code-input/code-input.module.mjs +36 -36
- package/esm2022/app/modules/code-input/components/code-input/code-input.component.mjs +41 -0
- package/{esm2020 → esm2022}/app/modules/code-input/components/code-input/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/modules/code-input/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/modules/defaulted/components/defaulted/defaulted.component.mjs +11 -11
- package/{esm2020 → esm2022}/app/modules/defaulted/components/defaulted/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/modules/defaulted/defaulted.module.mjs +18 -18
- package/esm2022/app/modules/manage/components/2fa-manage/2fa-manage.component.mjs +111 -0
- package/{esm2020 → esm2022}/app/modules/manage/components/2fa-manage/index.mjs +1 -1
- package/esm2022/app/modules/manage/components/app/app.component.mjs +96 -0
- package/{esm2020 → esm2022}/app/modules/manage/components/app/index.mjs +1 -1
- package/esm2022/app/modules/manage/components/email/email.component.mjs +92 -0
- package/{esm2020 → esm2022}/app/modules/manage/components/email/index.mjs +1 -1
- package/esm2022/app/modules/manage/components/emails/emails.component.mjs +52 -0
- package/{esm2020 → esm2022}/app/modules/manage/components/emails/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/modules/manage/components/manage-methods/index.mjs +1 -1
- package/esm2022/app/modules/manage/components/manage-methods/manage-methods.component.mjs +132 -0
- package/{esm2020 → esm2022}/app/modules/manage/components/number/index.mjs +1 -1
- package/esm2022/app/modules/manage/components/number/number.component.mjs +97 -0
- package/{esm2020 → esm2022}/app/modules/manage/components/numbers/index.mjs +1 -1
- package/esm2022/app/modules/manage/components/numbers/numbers.component.mjs +54 -0
- package/{esm2020 → esm2022}/app/modules/manage/fs-2f-manage.module.mjs +116 -116
- package/{esm2020 → esm2022}/app/modules/manage/services/index.mjs +1 -1
- package/esm2022/app/modules/manage/services/two-factor-manage.service.mjs +169 -0
- package/{esm2020 → esm2022}/app/modules/resend/components/resend/index.mjs +1 -1
- package/esm2022/app/modules/resend/components/resend/resend.component.mjs +37 -0
- package/{esm2020 → esm2022}/app/modules/resend/resend.module.mjs +28 -28
- package/esm2022/app/modules/verification/components/2fa-verification/2fa-verification.component.mjs +131 -0
- package/esm2022/app/modules/verification/components/2fa-verification-code/2fa-verification-code.component.mjs +66 -0
- package/esm2022/app/modules/verification/components/2fa-verification-methods/2fa-verification-methods.component.mjs +63 -0
- package/esm2022/app/modules/verification/directives/2fa-verification-resend.directive.mjs +34 -0
- package/{esm2020 → esm2022}/app/modules/verification/directives/index.mjs +1 -1
- package/{esm2020 → esm2022}/app/modules/verification/fs-2fa-verification.module.mjs +95 -95
- package/{esm2020 → esm2022}/app/modules/verification-methods/components/verification-methods/index.mjs +1 -1
- package/esm2022/app/modules/verification-methods/components/verification-methods/verification-methods.component.mjs +126 -0
- package/{esm2020 → esm2022}/app/modules/verification-methods/fs-2f-verification-methods.module.mjs +46 -46
- package/{esm2020 → esm2022}/app/modules/verification-methods/index.mjs +1 -1
- package/{esm2020 → esm2022}/firestitch-2fa.mjs +4 -4
- package/{esm2020 → esm2022}/public_api.mjs +8 -8
- package/fesm2022/firestitch-2fa.mjs +1438 -0
- package/{fesm2020 → fesm2022}/firestitch-2fa.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/package.json +5 -11
- package/public_api.d.ts +9 -9
- package/esm2020/app/modules/code-input/components/code-input/code-input.component.mjs +0 -40
- package/esm2020/app/modules/manage/components/2fa-manage/2fa-manage.component.mjs +0 -98
- package/esm2020/app/modules/manage/components/app/app.component.mjs +0 -84
- package/esm2020/app/modules/manage/components/email/email.component.mjs +0 -83
- package/esm2020/app/modules/manage/components/emails/emails.component.mjs +0 -47
- package/esm2020/app/modules/manage/components/manage-methods/manage-methods.component.mjs +0 -125
- package/esm2020/app/modules/manage/components/number/number.component.mjs +0 -87
- package/esm2020/app/modules/manage/components/numbers/numbers.component.mjs +0 -48
- package/esm2020/app/modules/manage/services/two-factor-manage.service.mjs +0 -161
- package/esm2020/app/modules/resend/components/resend/resend.component.mjs +0 -35
- package/esm2020/app/modules/verification/components/2fa-verification/2fa-verification.component.mjs +0 -121
- package/esm2020/app/modules/verification/components/2fa-verification-code/2fa-verification-code.component.mjs +0 -60
- package/esm2020/app/modules/verification/components/2fa-verification-methods/2fa-verification-methods.component.mjs +0 -56
- package/esm2020/app/modules/verification/directives/2fa-verification-resend.directive.mjs +0 -32
- package/esm2020/app/modules/verification-methods/components/verification-methods/verification-methods.component.mjs +0 -117
- package/fesm2015/firestitch-2fa.mjs +0 -1345
- package/fesm2015/firestitch-2fa.mjs.map +0 -1
- package/fesm2020/firestitch-2fa.mjs +0 -1331
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { Component, ChangeDetectionStrategy, Input, ViewChild, Output, EventEmitter, } from '@angular/core';
|
|
2
|
-
import { FsListComponent } from '@firestitch/list';
|
|
3
|
-
import { FsPrompt } from '@firestitch/prompt';
|
|
4
|
-
import { map, switchMap } from 'rxjs/operators';
|
|
5
|
-
import { VerificationMethodType } from '../../../../enums';
|
|
6
|
-
import { TwoFactorManageService } from '../../../manage/services';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@firestitch/prompt";
|
|
9
|
-
import * as i2 from "@angular/common";
|
|
10
|
-
import * as i3 from "@angular/material/icon";
|
|
11
|
-
import * as i4 from "@firestitch/list";
|
|
12
|
-
import * as i5 from "@firestitch/country";
|
|
13
|
-
import * as i6 from "../../../defaulted/components/defaulted/defaulted.component";
|
|
14
|
-
import * as i7 from "@firestitch/phone";
|
|
15
|
-
export class VerificationMethodsComponent {
|
|
16
|
-
constructor(_prompt) {
|
|
17
|
-
this._prompt = _prompt;
|
|
18
|
-
this.deleted = new EventEmitter();
|
|
19
|
-
this.VerificationMethodType = VerificationMethodType;
|
|
20
|
-
}
|
|
21
|
-
ngOnInit() {
|
|
22
|
-
if (!this.verificationMethodDefault && this.twoFactorManageService?.hasVerificationMethodDefault) {
|
|
23
|
-
this.verificationMethodDefault = (verificationMethod) => {
|
|
24
|
-
return this.twoFactorManageService.verificationMethodDefault$(verificationMethod);
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
if (!this.verificationMethodDelete && this.twoFactorManageService?.hasVerificationMethodDelete) {
|
|
28
|
-
this.verificationMethodDelete = (verificationMethod) => {
|
|
29
|
-
return this.twoFactorManageService.verificationMethodDelete$(verificationMethod);
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
if (!this.verificationMethodsFetch && this.twoFactorManageService?.hasVerificationMethodsFetch) {
|
|
33
|
-
this.verificationMethodsFetch = (query) => {
|
|
34
|
-
return this.twoFactorManageService.verificationMethodsFetch$(query);
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
if (!this.accountVerify && this.twoFactorManageService?.hasVerificationMethodVerify) {
|
|
38
|
-
this.accountVerify = () => {
|
|
39
|
-
return this.twoFactorManageService?.accountVerify$();
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
this.listConfig = {
|
|
43
|
-
paging: false,
|
|
44
|
-
rowActions: [
|
|
45
|
-
{
|
|
46
|
-
click: (verificationMethod) => {
|
|
47
|
-
this.accountVerify()
|
|
48
|
-
.pipe(switchMap(() => this.verificationMethodDefault(verificationMethod)))
|
|
49
|
-
.subscribe(() => {
|
|
50
|
-
this.list.reload();
|
|
51
|
-
});
|
|
52
|
-
},
|
|
53
|
-
show: (data) => {
|
|
54
|
-
return !!this.verificationMethodDefault && !data.default;
|
|
55
|
-
},
|
|
56
|
-
label: 'Set as Default',
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
click: (verificationMethod) => {
|
|
60
|
-
this._prompt.confirm({
|
|
61
|
-
title: 'Confirm',
|
|
62
|
-
template: 'Would you like to delete this verification method?',
|
|
63
|
-
})
|
|
64
|
-
.pipe(switchMap(() => this.accountVerify()), switchMap(() => this.verificationMethodDelete(verificationMethod)))
|
|
65
|
-
.subscribe(() => {
|
|
66
|
-
this.deleted.emit();
|
|
67
|
-
this.list.reload();
|
|
68
|
-
});
|
|
69
|
-
},
|
|
70
|
-
show: () => {
|
|
71
|
-
return !!this.verificationMethodDelete;
|
|
72
|
-
},
|
|
73
|
-
label: 'Delete',
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
fetch: (query) => {
|
|
77
|
-
query = {
|
|
78
|
-
...query,
|
|
79
|
-
type: this.type,
|
|
80
|
-
};
|
|
81
|
-
return this.verificationMethodsFetch(query)
|
|
82
|
-
.pipe(map((verificationMethods) => ({
|
|
83
|
-
data: verificationMethods.filter((verificationMethod) => {
|
|
84
|
-
return !this.type || verificationMethod.type === this.type;
|
|
85
|
-
}),
|
|
86
|
-
})));
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
reload() {
|
|
91
|
-
this.list.reload();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
VerificationMethodsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VerificationMethodsComponent, deps: [{ token: i1.FsPrompt }], target: i0.ɵɵFactoryTarget.Component });
|
|
95
|
-
VerificationMethodsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: VerificationMethodsComponent, selector: "fs-2fa-verification-methods", inputs: { type: "type", accountVerify: "accountVerify", verificationMethodsFetch: "verificationMethodsFetch", verificationMethodDelete: "verificationMethodDelete", verificationMethodDefault: "verificationMethodDefault", twoFactorManageService: "twoFactorManageService" }, outputs: { deleted: "deleted" }, viewQueries: [{ propertyName: "list", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "<fs-list [config]=\"listConfig\">\n <fs-list-column class=\"col-icon\" width=\"1%\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.type === VerificationMethodType.Sms\">\n <mat-icon>textsms</mat-icon>\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.Email\">\n <mat-icon>email</mat-icon>\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.App\">\n <mat-icon>phone_iphone</mat-icon>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column class=\"col-name\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"row\">\n <ng-container *ngIf=\"row.type === VerificationMethodType.Sms\">\n <div class=\"row\">\n <fs-country [code]=\"row.phoneCountry\" [showName]=\"false\"></fs-country> \n <span>{{row.phoneNumber | fsPhone}}</span>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.Email\">\n {{row.email}}\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.App\">\n App\n </ng-container>\n\n <app-defaulted *ngIf=\"row.default\"></app-defaulted>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>", styles: [":host ::ng-deep .col-name .row{display:flex;align-items:center}:host ::ng-deep .col-name fs-country img{display:flex}fs-country{margin-right:5px}app-defaulted{margin-left:5px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { 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: "component", type: i5.FsCountryComponent, selector: "fs-country", inputs: ["code", "showIcon", "showName", "region", "width"] }, { kind: "component", type: i6.DefaultedComponent, selector: "app-defaulted" }, { kind: "pipe", type: i7.FsPhonePipe, name: "fsPhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
96
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: VerificationMethodsComponent, decorators: [{
|
|
97
|
-
type: Component,
|
|
98
|
-
args: [{ selector: 'fs-2fa-verification-methods', changeDetection: ChangeDetectionStrategy.OnPush, template: "<fs-list [config]=\"listConfig\">\n <fs-list-column class=\"col-icon\" width=\"1%\">\n <ng-template fs-list-cell let-row=\"row\">\n <ng-container *ngIf=\"row.type === VerificationMethodType.Sms\">\n <mat-icon>textsms</mat-icon>\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.Email\">\n <mat-icon>email</mat-icon>\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.App\">\n <mat-icon>phone_iphone</mat-icon>\n </ng-container>\n </ng-template>\n </fs-list-column>\n <fs-list-column class=\"col-name\">\n <ng-template fs-list-cell let-row=\"row\">\n <div class=\"row\">\n <ng-container *ngIf=\"row.type === VerificationMethodType.Sms\">\n <div class=\"row\">\n <fs-country [code]=\"row.phoneCountry\" [showName]=\"false\"></fs-country> \n <span>{{row.phoneNumber | fsPhone}}</span>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.Email\">\n {{row.email}}\n </ng-container>\n\n <ng-container *ngIf=\"row.type === VerificationMethodType.App\">\n App\n </ng-container>\n\n <app-defaulted *ngIf=\"row.default\"></app-defaulted>\n </div>\n </ng-template>\n </fs-list-column>\n</fs-list>", styles: [":host ::ng-deep .col-name .row{display:flex;align-items:center}:host ::ng-deep .col-name fs-country img{display:flex}fs-country{margin-right:5px}app-defaulted{margin-left:5px}\n"] }]
|
|
99
|
-
}], ctorParameters: function () { return [{ type: i1.FsPrompt }]; }, propDecorators: { list: [{
|
|
100
|
-
type: ViewChild,
|
|
101
|
-
args: [FsListComponent]
|
|
102
|
-
}], type: [{
|
|
103
|
-
type: Input
|
|
104
|
-
}], accountVerify: [{
|
|
105
|
-
type: Input
|
|
106
|
-
}], verificationMethodsFetch: [{
|
|
107
|
-
type: Input
|
|
108
|
-
}], verificationMethodDelete: [{
|
|
109
|
-
type: Input
|
|
110
|
-
}], verificationMethodDefault: [{
|
|
111
|
-
type: Input
|
|
112
|
-
}], twoFactorManageService: [{
|
|
113
|
-
type: Input
|
|
114
|
-
}], deleted: [{
|
|
115
|
-
type: Output
|
|
116
|
-
}] } });
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZpY2F0aW9uLW1ldGhvZHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3ZlcmlmaWNhdGlvbi1tZXRob2RzL2NvbXBvbmVudHMvdmVyaWZpY2F0aW9uLW1ldGhvZHMvdmVyaWZpY2F0aW9uLW1ldGhvZHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3ZlcmlmaWNhdGlvbi1tZXRob2RzL2NvbXBvbmVudHMvdmVyaWZpY2F0aW9uLW1ldGhvZHMvdmVyaWZpY2F0aW9uLW1ldGhvZHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSx1QkFBdUIsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEdBQ25GLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7OztBQVNsRSxNQUFNLE9BQU8sNEJBQTRCO0lBaUJ2QyxZQUNVLE9BQWlCO1FBQWpCLFlBQU8sR0FBUCxPQUFPLENBQVU7UUFOVixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd2QywyQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztJQUlwRCxDQUFDO0lBRUcsUUFBUTtRQUNiLElBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLHNCQUFzQixF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b0JBQ1IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2lCQUNoQixDQUFDO2dCQUVGLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQztxQkFDeEMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUM1QixJQUFJLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBRTt3QkFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksa0JBQWtCLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQzdELENBQUMsQ0FBQztpQkFDSCxDQUFDLENBQ0QsQ0FDRixDQUFDO1lBQ04sQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckIsQ0FBQzs7MEhBMUdVLDRCQUE0Qjs4R0FBNUIsNEJBQTRCLDBaQUU1QixlQUFlLGdEQ3ZCNUIsdTFDQXNDVTs0RkRqQkcsNEJBQTRCO2tCQU54QyxTQUFTOytCQUNFLDZCQUE2QixtQkFHdEIsdUJBQXVCLENBQUMsTUFBTTsrRkFLeEMsSUFBSTtzQkFEVixTQUFTO3VCQUFDLGVBQWU7Z0JBR1YsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLHdCQUF3QjtzQkFBdkMsS0FBSztnQkFDVSx3QkFBd0I7c0JBQXZDLEtBQUs7Z0JBQ1UseUJBQXlCO3NCQUF4QyxLQUFLO2dCQUNVLHNCQUFzQjtzQkFBckMsS0FBSztnQkFFVyxPQUFPO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBPdXRwdXQsIEV2ZW50RW1pdHRlcixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzTGlzdENvbXBvbmVudCwgRnNMaXN0Q29uZmlnIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5pbXBvcnQgeyBGc1Byb21wdCB9IGZyb20gJ0BmaXJlc3RpdGNoL3Byb21wdCc7XG5cbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSUZzVmVyaWZpY2F0aW9uTWV0aG9kIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBWZXJpZmljYXRpb25NZXRob2RUeXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgVHdvRmFjdG9yTWFuYWdlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL21hbmFnZS9zZXJ2aWNlcyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtMmZhLXZlcmlmaWNhdGlvbi1tZXRob2RzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZlcmlmaWNhdGlvbi1tZXRob2RzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmVyaWZpY2F0aW9uLW1ldGhvZHMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFZlcmlmaWNhdGlvbk1ldGhvZHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgbGlzdDogRnNMaXN0Q29tcG9uZW50O1xuXG4gIEBJbnB1dCgpIHB1YmxpYyB0eXBlOiBWZXJpZmljYXRpb25NZXRob2RUeXBlO1xuICBASW5wdXQoKSBwdWJsaWMgYWNjb3VudFZlcmlmeTogKCkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgdmVyaWZpY2F0aW9uTWV0aG9kc0ZldGNoOiAocXVlcnk6IGFueSkgPT4gT2JzZXJ2YWJsZTxJRnNWZXJpZmljYXRpb25NZXRob2RbXT47XG4gIEBJbnB1dCgpIHB1YmxpYyB2ZXJpZmljYXRpb25NZXRob2REZWxldGU6ICh2ZXJpZmljYXRpb25NZXRob2Q6IElGc1ZlcmlmaWNhdGlvbk1ldGhvZCkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICBASW5wdXQoKSBwdWJsaWMgdmVyaWZpY2F0aW9uTWV0aG9kRGVmYXVsdDogKHZlcmlmaWNhdGlvbk1ldGhvZDogSUZzVmVyaWZpY2F0aW9uTWV0aG9kKSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIEBJbnB1dCgpIHB1YmxpYyB0d29GYWN0b3JNYW5hZ2VTZXJ2aWNlOiBUd29GYWN0b3JNYW5hZ2VTZXJ2aWNlO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgZGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG4gIHB1YmxpYyBWZXJpZmljYXRpb25NZXRob2RUeXBlID0gVmVyaWZpY2F0aW9uTWV0aG9kVHlwZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9wcm9tcHQ6IEZzUHJvbXB0LFxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKCF0aGlzLnZlcmlmaWNhdGlvbk1ldGhvZERlZmF1bHQgJiYgdGhpcy50d29GYWN0b3JNYW5hZ2VTZXJ2aWNlPy5oYXNWZXJpZmljYXRpb25NZXRob2REZWZhdWx0KSB7XG4gICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldGhvZERlZmF1bHQgPSAodmVyaWZpY2F0aW9uTWV0aG9kOiBJRnNWZXJpZmljYXRpb25NZXRob2QpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHdvRmFjdG9yTWFuYWdlU2VydmljZS52ZXJpZmljYXRpb25NZXRob2REZWZhdWx0JCh2ZXJpZmljYXRpb25NZXRob2QpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZighdGhpcy52ZXJpZmljYXRpb25NZXRob2REZWxldGUgJiYgdGhpcy50d29GYWN0b3JNYW5hZ2VTZXJ2aWNlPy5oYXNWZXJpZmljYXRpb25NZXRob2REZWxldGUpIHtcbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0aG9kRGVsZXRlID0gKHZlcmlmaWNhdGlvbk1ldGhvZDogSUZzVmVyaWZpY2F0aW9uTWV0aG9kKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR3b0ZhY3Rvck1hbmFnZVNlcnZpY2UudmVyaWZpY2F0aW9uTWV0aG9kRGVsZXRlJCh2ZXJpZmljYXRpb25NZXRob2QpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZighdGhpcy52ZXJpZmljYXRpb25NZXRob2RzRmV0Y2ggJiYgdGhpcy50d29GYWN0b3JNYW5hZ2VTZXJ2aWNlPy5oYXNWZXJpZmljYXRpb25NZXRob2RzRmV0Y2gpIHtcbiAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0aG9kc0ZldGNoID0gIChxdWVyeSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy50d29GYWN0b3JNYW5hZ2VTZXJ2aWNlLnZlcmlmaWNhdGlvbk1ldGhvZHNGZXRjaCQocXVlcnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZighdGhpcy5hY2NvdW50VmVyaWZ5ICYmIHRoaXMudHdvRmFjdG9yTWFuYWdlU2VydmljZT8uaGFzVmVyaWZpY2F0aW9uTWV0aG9kVmVyaWZ5KSB7XG4gICAgICB0aGlzLmFjY291bnRWZXJpZnkgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnR3b0ZhY3Rvck1hbmFnZVNlcnZpY2U/LmFjY291bnRWZXJpZnkkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saXN0Q29uZmlnID0ge1xuICAgICAgcGFnaW5nOiBmYWxzZSxcbiAgICAgIHJvd0FjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNsaWNrOiAodmVyaWZpY2F0aW9uTWV0aG9kKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjY291bnRWZXJpZnkoKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy52ZXJpZmljYXRpb25NZXRob2REZWZhdWx0KHZlcmlmaWNhdGlvbk1ldGhvZCkpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdC5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzaG93OiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy52ZXJpZmljYXRpb25NZXRob2REZWZhdWx0ICYmICFkYXRhLmRlZmF1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYWJlbDogJ1NldCBhcyBEZWZhdWx0JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNsaWNrOiAodmVyaWZpY2F0aW9uTWV0aG9kKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9wcm9tcHQuY29uZmlybSh7XG4gICAgICAgICAgICAgIHRpdGxlOiAnQ29uZmlybScsXG4gICAgICAgICAgICAgIHRlbXBsYXRlOiAnV291bGQgeW91IGxpa2UgdG8gZGVsZXRlIHRoaXMgdmVyaWZpY2F0aW9uIG1ldGhvZD8nLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYWNjb3VudFZlcmlmeSgpKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy52ZXJpZmljYXRpb25NZXRob2REZWxldGUodmVyaWZpY2F0aW9uTWV0aG9kKSksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkLmVtaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3QucmVsb2FkKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2hvdzogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy52ZXJpZmljYXRpb25NZXRob2REZWxldGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBsYWJlbDogJ0RlbGV0ZScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZmV0Y2g6IChxdWVyeSkgPT4ge1xuICAgICAgICBxdWVyeSA9IHtcbiAgICAgICAgICAuLi5xdWVyeSxcbiAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVyaWZpY2F0aW9uTWV0aG9kc0ZldGNoKHF1ZXJ5KSBcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG1hcCgodmVyaWZpY2F0aW9uTWV0aG9kcykgPT4gKHtcbiAgICAgICAgICAgICAgZGF0YTogdmVyaWZpY2F0aW9uTWV0aG9kcy5maWx0ZXIoKHZlcmlmaWNhdGlvbk1ldGhvZCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy50eXBlIHx8IHZlcmlmaWNhdGlvbk1ldGhvZC50eXBlID09PSB0aGlzLnR5cGU7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdC5yZWxvYWQoKTtcbiAgfVxufVxuIiwiPGZzLWxpc3QgW2NvbmZpZ109XCJsaXN0Q29uZmlnXCI+XG4gIDxmcy1saXN0LWNvbHVtbiBjbGFzcz1cImNvbC1pY29uXCIgd2lkdGg9XCIxJVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWNlbGwgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy50eXBlID09PSBWZXJpZmljYXRpb25NZXRob2RUeXBlLlNtc1wiPlxuICAgICAgICA8bWF0LWljb24+dGV4dHNtczwvbWF0LWljb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy50eXBlID09PSBWZXJpZmljYXRpb25NZXRob2RUeXBlLkVtYWlsXCI+XG4gICAgICAgIDxtYXQtaWNvbj5lbWFpbDwvbWF0LWljb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy50eXBlID09PSBWZXJpZmljYXRpb25NZXRob2RUeXBlLkFwcFwiPlxuICAgICAgICA8bWF0LWljb24+cGhvbmVfaXBob25lPC9tYXQtaWNvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG4gIDxmcy1saXN0LWNvbHVtbiBjbGFzcz1cImNvbC1uYW1lXCI+XG4gICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtY2VsbCBsZXQtcm93PVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cudHlwZSA9PT0gVmVyaWZpY2F0aW9uTWV0aG9kVHlwZS5TbXNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZnMtY291bnRyeSBbY29kZV09XCJyb3cucGhvbmVDb3VudHJ5XCIgW3Nob3dOYW1lXT1cImZhbHNlXCI+PC9mcy1jb3VudHJ5PiBcbiAgICAgICAgICAgIDxzcGFuPnt7cm93LnBob25lTnVtYmVyIHwgZnNQaG9uZX19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnR5cGUgPT09IFZlcmlmaWNhdGlvbk1ldGhvZFR5cGUuRW1haWxcIj5cbiAgICAgICAgICB7e3Jvdy5lbWFpbH19XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cudHlwZSA9PT0gVmVyaWZpY2F0aW9uTWV0aG9kVHlwZS5BcHBcIj5cbiAgICAgICAgICBBcHBcbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGFwcC1kZWZhdWx0ZWQgKm5nSWY9XCJyb3cuZGVmYXVsdFwiPjwvYXBwLWRlZmF1bHRlZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZnMtbGlzdC1jb2x1bW4+XG48L2ZzLWxpc3Q+Il19
|