@firestitch/2fa 12.0.3 → 12.0.6
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/2fa-verification/2fa-verification.component.d.ts +17 -8
- package/app/components/2fa-verification-methods/2fa-verification-methods.component.d.ts +7 -8
- package/app/fs-2fa.module.d.ts +17 -17
- package/bundles/firestitch-2fa.umd.js +159 -187
- package/bundles/firestitch-2fa.umd.js.map +1 -1
- package/esm2015/app/components/2fa-verification/2fa-verification.component.js +62 -20
- package/esm2015/app/components/2fa-verification-code/2fa-verification-code.component.js +2 -2
- package/esm2015/app/components/2fa-verification-methods/2fa-verification-methods.component.js +27 -28
- package/esm2015/app/fs-2fa.module.js +9 -8
- package/fesm2015/firestitch-2fa.js +115 -137
- package/fesm2015/firestitch-2fa.js.map +1 -1
- package/package.json +5 -1
- package/app/components/2fa-verification-form/2fa-verification-form.component.d.ts +0 -21
- package/esm2015/app/components/2fa-verification-form/2fa-verification-form.component.js +0 -69
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Input, Output, } from '@angular/core';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
import { takeUntil, tap } from 'rxjs/operators';
|
|
4
|
-
import { FS_2FA_VERIFICATION_PROVIDER } from '../../tokens/verification.token';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../2fa-verification-otp/2fa-verification-otp.component";
|
|
7
|
-
import * as i2 from "../2fa-verification-code/2fa-verification-code.component";
|
|
8
|
-
import * as i3 from "@angular/material/checkbox";
|
|
9
|
-
import * as i4 from "@angular/material/button";
|
|
10
|
-
import * as i5 from "@angular/material/progress-spinner";
|
|
11
|
-
import * as i6 from "@angular/forms";
|
|
12
|
-
import * as i7 from "@firestitch/form";
|
|
13
|
-
import * as i8 from "@angular/common";
|
|
14
|
-
import * as i9 from "@angular/material/form-field";
|
|
15
|
-
export class Fs2FAVerificationFormComponent {
|
|
16
|
-
constructor(verificationProvider, _cdRef) {
|
|
17
|
-
this.verificationProvider = verificationProvider;
|
|
18
|
-
this._cdRef = _cdRef;
|
|
19
|
-
this.verified = new EventEmitter();
|
|
20
|
-
this.resendInProgress = false;
|
|
21
|
-
this.trustedDevice = false;
|
|
22
|
-
this._destroy$ = new Subject();
|
|
23
|
-
this.verify = () => {
|
|
24
|
-
return this.verificationProvider
|
|
25
|
-
.verify(this._code, this.trustedDevice)
|
|
26
|
-
.pipe(tap((response) => {
|
|
27
|
-
this.verified.emit(response);
|
|
28
|
-
}));
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
ngOnDestroy() {
|
|
32
|
-
this._destroy$.next();
|
|
33
|
-
this._destroy$.complete();
|
|
34
|
-
}
|
|
35
|
-
codeChanged(code) {
|
|
36
|
-
this._code = code;
|
|
37
|
-
}
|
|
38
|
-
resend() {
|
|
39
|
-
this.resendInProgress = true;
|
|
40
|
-
this.verificationProvider
|
|
41
|
-
.resend()
|
|
42
|
-
.pipe(takeUntil(this._destroy$))
|
|
43
|
-
.subscribe(() => {
|
|
44
|
-
this.resendInProgress = false;
|
|
45
|
-
this._cdRef.markForCheck();
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
Fs2FAVerificationFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: Fs2FAVerificationFormComponent, deps: [{ token: FS_2FA_VERIFICATION_PROVIDER }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
-
Fs2FAVerificationFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: Fs2FAVerificationFormComponent, selector: "fs-2fa-verification-form", inputs: { method: "method" }, outputs: { verified: "verified" }, ngImport: i0, template: "<form fsForm [submit]=\"verify\">\n <h2>2-Step Verification</h2>\n\n <div class=\"code-container\">\n <ng-container *ngIf=\"method.type === 'authenticator' else code\">\n <fs-2fa-verification-otp class=\"otp\"></fs-2fa-verification-otp>\n </ng-container>\n\n <ng-template #code>\n <fs-2fa-verification-code\n [method]=\"method\"\n (codeChange)=\"codeChanged($event)\">\n </fs-2fa-verification-code>\n </ng-template>\n </div>\n\n <div class=\"additional\">\n <mat-checkbox\n name=\"trust-device\"\n [(ngModel)]=\"trustedDevice\">\n Trust this device\n </mat-checkbox>\n\n <span matSuffix>\n <button mat-button\n type=\"button\"\n color=\"primary\"\n (click)=\"resend()\"\n [disabled]=\"resendInProgress\"\n class=\"resend-code-btn\">\n <ng-container *ngIf=\"!resendInProgress else sending\">\n Resend Code\n </ng-container>\n <ng-template #sending>\n <mat-spinner [diameter]=\"12\"></mat-spinner> Sending\n </ng-template>\n </button>\n </span>\n </div>\n\n <div class=\"actions\">\n <button mat-raised-button\n color=\"primary\"\n type=\"submit\">\n Verify\n </button>\n\n <ng-content></ng-content>\n </div>\n</form>\n", styles: ["h2,.code-container{text-align:center}.code-container .otp{margin-bottom:15px}:host ::ng-deep .actions{margin:10px 0}:host ::ng-deep .actions a{width:100%;font-weight:400}:host ::ng-deep .actions button{width:100%}:host ::ng-deep .actions button[type=button]{font-weight:400;text-transform:none}.additional{display:flex;justify-content:space-between;align-items:baseline;margin-top:-5px}.additional .resend-code-btn{text-transform:none}.additional .resend-code-btn mat-spinner{display:inline-block;vertical-align:middle}\n"], components: [{ type: i1.Fs2FAVerificationOTPComponent, selector: "fs-2fa-verification-otp", outputs: ["codeChange"] }, { type: i2.Fs2FAVerificationSMSComponent, selector: "fs-2fa-verification-code", inputs: ["method"], outputs: ["codeChange"] }, { type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.FsFormDirective, selector: "[fsForm]", inputs: ["wrapperSelector", "messageSelector", "hintSelector", "labelSelector", "autocomplete", "shortcuts", "confirm", "confirmDialog", "confirmDrawer", "confirmBrowser", "confirmTabs", "dirtySubmitButton", "successDelay", "errorDelay", "submit", "tabGroup"], outputs: ["fsForm", "invalid", "valid", "submitted", "reseted", "cleared"] }, { type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.MatSuffix, selector: "[matSuffix]" }, { type: i7.ɵw, selector: "button[type=\"submit\"]", inputs: ["dirtySubmit", "name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
51
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: Fs2FAVerificationFormComponent, decorators: [{
|
|
52
|
-
type: Component,
|
|
53
|
-
args: [{
|
|
54
|
-
selector: 'fs-2fa-verification-form',
|
|
55
|
-
templateUrl: './2fa-verification-form.component.html',
|
|
56
|
-
styleUrls: [
|
|
57
|
-
'./2fa-verification-form.component.scss',
|
|
58
|
-
],
|
|
59
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
60
|
-
}]
|
|
61
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
62
|
-
type: Inject,
|
|
63
|
-
args: [FS_2FA_VERIFICATION_PROVIDER]
|
|
64
|
-
}] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { method: [{
|
|
65
|
-
type: Input
|
|
66
|
-
}], verified: [{
|
|
67
|
-
type: Output
|
|
68
|
-
}] } });
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMmZhLXZlcmlmaWNhdGlvbi1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy8yZmEtdmVyaWZpY2F0aW9uLWZvcm0vMmZhLXZlcmlmaWNhdGlvbi1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy8yZmEtdmVyaWZpY2F0aW9uLWZvcm0vMmZhLXZlcmlmaWNhdGlvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7OztBQVkvRSxNQUFNLE9BQU8sOEJBQThCO0lBY3pDLFlBRVMsb0JBQTZDLEVBQzVDLE1BQXlCO1FBRDFCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBeUI7UUFDNUMsV0FBTSxHQUFOLE1BQU0sQ0FBbUI7UUFYNUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBR3JCLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBYWpDLFdBQU0sR0FBRyxHQUFHLEVBQUU7WUFDbkIsT0FBTyxJQUFJLENBQUMsb0JBQW9CO2lCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUN0QyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNOLENBQUMsQ0FBQztJQWZDLENBQUM7SUFFRyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBWU0sV0FBVyxDQUFDLElBQVk7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRTdCLElBQUksQ0FBQyxvQkFBb0I7YUFDdEIsTUFBTSxFQUFFO2FBQ1IsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQzFCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFFOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7OzRIQXBEVSw4QkFBOEIsa0JBZS9CLDRCQUE0QjtnSEFmM0IsOEJBQThCLGlJQzNCM0MsMnlDQWtEQTs0RkR2QmEsOEJBQThCO2tCQVIxQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7b0JBQ3BDLFdBQVcsRUFBRSx3Q0FBd0M7b0JBQ3JELFNBQVMsRUFBRTt3QkFDVCx3Q0FBd0M7cUJBQ3pDO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7MEJBZ0JJLE1BQU07MkJBQUMsNEJBQTRCOzRFQVovQixNQUFNO3NCQURaLEtBQUs7Z0JBSUMsUUFBUTtzQkFEZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCwgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBJRnNWZXJpZmljYXRpb25NZXRob2QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3ZlcmlmaWNhdGlvbi1tZXRob2QuaW50ZXJmYWNlJztcbmltcG9ydCB7IEZTXzJGQV9WRVJJRklDQVRJT05fUFJPVklERVIgfSBmcm9tICcuLi8uLi90b2tlbnMvdmVyaWZpY2F0aW9uLnRva2VuJztcbmltcG9ydCB7IElGc1ZlcmlmaWNhdGlvblByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy92ZXJpZmljYXRpb24tcHJvdmlkZXIuaW50ZXJmYWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy0yZmEtdmVyaWZpY2F0aW9uLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vMmZhLXZlcmlmaWNhdGlvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vMmZhLXZlcmlmaWNhdGlvbi1mb3JtLmNvbXBvbmVudC5zY3NzJyxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZzMkZBVmVyaWZpY2F0aW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1ldGhvZDogSUZzVmVyaWZpY2F0aW9uTWV0aG9kO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdmVyaWZpZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHVibGljIHJlc2VuZEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgcHVibGljIHRydXN0ZWREZXZpY2UgPSBmYWxzZTtcblxuICBwcml2YXRlIF9jb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEZTXzJGQV9WRVJJRklDQVRJT05fUFJPVklERVIpXG4gICAgcHVibGljIHZlcmlmaWNhdGlvblByb3ZpZGVyOiBJRnNWZXJpZmljYXRpb25Qcm92aWRlcixcbiAgICBwcml2YXRlIF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgdmVyaWZ5ID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnZlcmlmaWNhdGlvblByb3ZpZGVyXG4gICAgICAudmVyaWZ5KHRoaXMuX2NvZGUsIHRoaXMudHJ1c3RlZERldmljZSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy52ZXJpZmllZC5lbWl0KHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9O1xuXG4gIHB1YmxpYyBjb2RlQ2hhbmdlZChjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2RlID0gY29kZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNlbmQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNlbmRJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIHRoaXMudmVyaWZpY2F0aW9uUHJvdmlkZXJcbiAgICAgIC5yZXNlbmQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNlbmRJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICB9XG5cbn1cbiIsIjxmb3JtIGZzRm9ybSBbc3VibWl0XT1cInZlcmlmeVwiPlxuICA8aDI+Mi1TdGVwIFZlcmlmaWNhdGlvbjwvaDI+XG5cbiAgPGRpdiBjbGFzcz1cImNvZGUtY29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1ldGhvZC50eXBlID09PSAnYXV0aGVudGljYXRvcicgZWxzZSBjb2RlXCI+XG4gICAgICA8ZnMtMmZhLXZlcmlmaWNhdGlvbi1vdHAgY2xhc3M9XCJvdHBcIj48L2ZzLTJmYS12ZXJpZmljYXRpb24tb3RwPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNjb2RlPlxuICAgICAgPGZzLTJmYS12ZXJpZmljYXRpb24tY29kZVxuICAgICAgICBbbWV0aG9kXT1cIm1ldGhvZFwiXG4gICAgICAgIChjb2RlQ2hhbmdlKT1cImNvZGVDaGFuZ2VkKCRldmVudClcIj5cbiAgICAgIDwvZnMtMmZhLXZlcmlmaWNhdGlvbi1jb2RlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJhZGRpdGlvbmFsXCI+XG4gICAgPG1hdC1jaGVja2JveFxuICAgICAgbmFtZT1cInRydXN0LWRldmljZVwiXG4gICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWREZXZpY2VcIj5cbiAgICAgIFRydXN0IHRoaXMgZGV2aWNlXG4gICAgPC9tYXQtY2hlY2tib3g+XG5cbiAgICA8c3BhbiBtYXRTdWZmaXg+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVzZW5kKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlc2VuZEluUHJvZ3Jlc3NcIlxuICAgICAgICAgICAgY2xhc3M9XCJyZXNlbmQtY29kZS1idG5cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVzZW5kSW5Qcm9ncmVzcyBlbHNlIHNlbmRpbmdcIj5cbiAgICAgICAgUmVzZW5kIENvZGVcbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLXRlbXBsYXRlICNzZW5kaW5nPlxuICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjEyXCI+PC9tYXQtc3Bpbm5lcj4gU2VuZGluZ1xuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2J1dHRvbj5cbiAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCI+XG4gICAgICBWZXJpZnlcbiAgICA8L2J1dHRvbj5cblxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
|