ems-web-app-cognito 1.0.8 → 1.0.10
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/esm2020/lib/cognito.component.mjs +10 -6
- package/fesm2015/ems-web-app-cognito.mjs +9 -5
- package/fesm2015/ems-web-app-cognito.mjs.map +1 -1
- package/fesm2020/ems-web-app-cognito.mjs +9 -5
- package/fesm2020/ems-web-app-cognito.mjs.map +1 -1
- package/lib/cognito.component.d.ts +2 -0
- package/package.json +1 -1
|
@@ -39,6 +39,7 @@ export class CognitoComponent {
|
|
|
39
39
|
this.strings = CognitoStrings;
|
|
40
40
|
this.showPasswordField = true;
|
|
41
41
|
this.showEmailSubmitButton = true;
|
|
42
|
+
this.disableUsername = false;
|
|
42
43
|
this.session = null;
|
|
43
44
|
this.user = null;
|
|
44
45
|
}
|
|
@@ -54,9 +55,7 @@ export class CognitoComponent {
|
|
|
54
55
|
this.cognito.user$.subscribe(user => {
|
|
55
56
|
this.user = user;
|
|
56
57
|
});
|
|
57
|
-
|
|
58
|
-
this.showPasswordField = false;
|
|
59
|
-
}
|
|
58
|
+
this.updateButtons();
|
|
60
59
|
}
|
|
61
60
|
ngAfterViewInit() {
|
|
62
61
|
setTimeout(() => this.initialize());
|
|
@@ -65,6 +64,11 @@ export class CognitoComponent {
|
|
|
65
64
|
this.showEmailSubmitButton = false;
|
|
66
65
|
this.onUsernameEntered.emit(this.model.username.replace(/\s+/gim, ""));
|
|
67
66
|
}
|
|
67
|
+
updateButtons() {
|
|
68
|
+
if (this.otp || this.magicLink || this.passkeys) {
|
|
69
|
+
this.showPasswordField = false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
68
72
|
async login() {
|
|
69
73
|
if (!this.srp && this.otp) {
|
|
70
74
|
return this.getOtp();
|
|
@@ -489,10 +493,10 @@ export class CognitoComponent {
|
|
|
489
493
|
}
|
|
490
494
|
}
|
|
491
495
|
CognitoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CognitoComponent, deps: [{ token: i1.CognitoService }], target: i0.ɵɵFactoryTarget.Component });
|
|
492
|
-
CognitoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CognitoComponent, selector: "cognito", inputs: { poolId: ["pool-id", "poolId"], providerName: ["provider-name", "providerName"], clientId: ["client-id", "clientId"], cognitoUrl: ["cognito-signin-url", "cognitoUrl"], region: "region", modalBackground: ["modal-background", "modalBackground"], zIndex: ["z-index", "zIndex"], hook: "hook", srp: "srp", otp: "otp", magicLink: ["magic-link", "magicLink"], magicLinkGenerator: ["magic-link-generator", "magicLinkGenerator"], reloadAfterLinkAuthentication: ["reload-after-link-authentication", "reloadAfterLinkAuthentication"], passkeys: "passkeys", getUserId: ["passkeys-get-user-id", "getUserId"], generateAuthenticationOptions: ["passkeys-generate-authentication-options", "generateAuthenticationOptions"], generateRegistrationOptions: ["passkeys-generate-registration-options", "generateRegistrationOptions"], verifyRegistration: ["passkeys-verify-registration", "verifyRegistration"], verifyAuthentication: ["passkeys-verify-authentication", "verifyAuthentication"] }, outputs: { onReady: "ready", onConnecting: "connecting", onAuthenticated: "authenticated", onResponse: "response", onUsernameEntered: "usernameEntered" }, host: { properties: { "style": "this.hostStyle", "class.render": "this.showForm", "class.transitioning": "this.transitioning" } }, ngImport: i0, template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "labeler": i4.LabelerPipe } });
|
|
496
|
+
CognitoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CognitoComponent, selector: "cognito", inputs: { poolId: ["pool-id", "poolId"], providerName: ["provider-name", "providerName"], clientId: ["client-id", "clientId"], cognitoUrl: ["cognito-signin-url", "cognitoUrl"], region: "region", modalBackground: ["modal-background", "modalBackground"], zIndex: ["z-index", "zIndex"], hook: "hook", srp: "srp", otp: "otp", magicLink: ["magic-link", "magicLink"], magicLinkGenerator: ["magic-link-generator", "magicLinkGenerator"], reloadAfterLinkAuthentication: ["reload-after-link-authentication", "reloadAfterLinkAuthentication"], passkeys: "passkeys", getUserId: ["passkeys-get-user-id", "getUserId"], generateAuthenticationOptions: ["passkeys-generate-authentication-options", "generateAuthenticationOptions"], generateRegistrationOptions: ["passkeys-generate-registration-options", "generateRegistrationOptions"], verifyRegistration: ["passkeys-verify-registration", "verifyRegistration"], verifyAuthentication: ["passkeys-verify-authentication", "verifyAuthentication"] }, outputs: { onReady: "ready", onConnecting: "connecting", onAuthenticated: "authenticated", onResponse: "response", onUsernameEntered: "usernameEntered" }, host: { properties: { "style": "this.hostStyle", "class.render": "this.showForm", "class.transitioning": "this.transitioning" } }, ngImport: i0, template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" [disabled]=\"disableUsername\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "labeler": i4.LabelerPipe } });
|
|
493
497
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CognitoComponent, decorators: [{
|
|
494
498
|
type: Component,
|
|
495
|
-
args: [{ selector: 'cognito', template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"] }]
|
|
499
|
+
args: [{ selector: 'cognito', template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" [disabled]=\"disableUsername\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"] }]
|
|
496
500
|
}], ctorParameters: function () { return [{ type: i1.CognitoService }]; }, propDecorators: { hostStyle: [{
|
|
497
501
|
type: HostBinding,
|
|
498
502
|
args: ["style"]
|
|
@@ -575,4 +579,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
|
|
|
575
579
|
type: Output,
|
|
576
580
|
args: ["usernameEntered"]
|
|
577
581
|
}] } });
|
|
578
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvZ25pdG8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFpQixLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRyxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU8sNEJBQTRCLENBQUM7QUFFbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBVSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBT2pGLE1BQU0sT0FBTyxnQkFBZ0I7SUFtRDNCLFlBQW9CLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBaERyQixjQUFTLEdBQW9DLEVBQUUsQ0FBQztRQUN6QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRzNDLGlCQUFZLEdBQVcsUUFBUSxDQUFDO1FBSTdCLG9CQUFlLEdBQVcsdUJBQXVCLENBQUM7UUFDM0QsV0FBTSxHQUFXLElBQUksQ0FBQztRQUUxQixRQUFHLEdBQVksSUFBSSxDQUFDO1FBQ3BCLFFBQUcsR0FBWSxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRUwsa0NBQTZCLEdBQVksSUFBSSxDQUFDO1FBQ3RF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LCBPbkluaXQsIEhvc3RCaW5kaW5nLCBBZnRlclZpZXdJbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvZ25pdG9TZXJ2aWNlIH0gZnJvbSBcIi4vY29nbml0by5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBDb2duaXRvVXNlciwgQ29nbml0b1VzZXJTZXNzaW9uLCBDb2duaXRvSWRUb2tlbiwgQ29nbml0b0FjY2Vzc1Rva2VuIH0gIGZyb20gJ2FtYXpvbi1jb2duaXRvLWlkZW50aXR5LWpzJztcbmltcG9ydCB7IElDb2duaXRvUmVzcG9uc2UsIElDb2duaXRvVXNlckRhdGEgfSBmcm9tIFwiLi9jb2duaXRvLmludGVyZmFjZXNcIjtcbmltcG9ydCB7IENvZ25pdG9TdHJpbmdzIH0gZnJvbSBcIi4vY29nbml0by5jbGFzc2VzXCI7XG5pbXBvcnQgeyBDb2duaXRvUmVzcG9uc2VUeXBlLCBDb2duaXRvUmVxdWVzdFR5cGUsIENvZ25pdG9Gb3JtVHlwZSB9IGZyb20gXCIuL2NvZ25pdG8udHlwZXNcIjtcbmltcG9ydCB7IHVuc25ha2UsIHRpY2ssIHBhcmFtcywgdHJpbSB9IGZyb20gXCIuL2NvZ25pdG8udXRpbHNcIjtcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgc3RhcnRBdXRoZW50aWNhdGlvbiwgc3RhcnRSZWdpc3RyYXRpb24gfSBmcm9tICdAc2ltcGxld2ViYXV0aG4vYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvZ25pdG8nLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NvZ25pdG8uY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbIFwiLi9jb2duaXRvLmNvbXBvbmVudC5sZXNzXCIgXVxufSlcbmV4cG9ydCBjbGFzcyBDb2duaXRvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcblxuXG4gIEBIb3N0QmluZGluZyhcInN0eWxlXCIpIGhvc3RTdHlsZTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5yZW5kZXJcIikgc2hvd0Zvcm06IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MudHJhbnNpdGlvbmluZ1wiKSB0cmFuc2l0aW9uaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KFwicG9vbC1pZFwiKSBwb29sSWQhOiBzdHJpbmc7XG4gIEBJbnB1dChcInByb3ZpZGVyLW5hbWVcIikgcHJvdmlkZXJOYW1lOiBzdHJpbmcgPSBcIkdvb2dsZVwiO1xuICBASW5wdXQoXCJjbGllbnQtaWRcIikgY2xpZW50SWQhOiBzdHJpbmc7XG4gIEBJbnB1dChcImNvZ25pdG8tc2lnbmluLXVybFwiKSBjb2duaXRvVXJsPzogc3RyaW5nO1xuICBASW5wdXQoXCJyZWdpb25cIikgcmVnaW9uITogc3RyaW5nO1xuICBASW5wdXQoXCJtb2RhbC1iYWNrZ3JvdW5kXCIpIG1vZGFsQmFja2dyb3VuZDogc3RyaW5nID0gXCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIjtcbiAgQElucHV0KFwiei1pbmRleFwiKSB6SW5kZXg6IG51bWJlciA9IDEwMDA7XG4gIEBJbnB1dChcImhvb2tcIikgaG9vaz86IChzdGF0ZTogYW55KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBASW5wdXQoXCJzcnBcIikgc3JwOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KFwib3RwXCIpIG90cDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoXCJtYWdpYy1saW5rXCIpIG1hZ2ljTGluazogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoXCJtYWdpYy1saW5rLWdlbmVyYXRvclwiKSBtYWdpY0xpbmtHZW5lcmF0b3I/OiBQcm9taXNlPGJvb2xlYW4+O1xuICBASW5wdXQoXCJyZWxvYWQtYWZ0ZXItbGluay1hdXRoZW50aWNhdGlvblwiKSByZWxvYWRBZnRlckxpbmtBdXRoZW50aWNhdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dChcInBhc3NrZXlzXCIpIHBhc3NrZXlzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KFwicGFzc2tleXMtZ2V0LXVzZXItaWRcIikgZ2V0VXNlcklkITogKHVzZXJuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbiAgQElucHV0KFwicGFzc2tleXMtZ2VuZXJhdGUtYXV0aGVudGljYXRpb24tb3B0aW9uc1wiKSBnZW5lcmF0ZUF1dGhlbnRpY2F0aW9uT3B0aW9ucyE6IChlbWFpbDogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gIEBJbnB1dChcInBhc3NrZXlzLWdlbmVyYXRlLXJlZ2lzdHJhdGlvbi1vcHRpb25zXCIpIGdlbmVyYXRlUmVnaXN0cmF0aW9uT3B0aW9ucyE6ICh0b2tlbjogc3RyaW5nKSA9PiBQcm9taXNlPGFueT47XG4gIEBJbnB1dChcInBhc3NrZXlzLXZlcmlmeS1yZWdpc3RyYXRpb25cIikgdmVyaWZ5UmVnaXN0cmF0aW9uITogKGlucHV0OiBhbnksIHRva2VuOiBzdHJpbmcgKSA9PiBQcm9taXNlPGFueT47XG4gIEBJbnB1dChcInBhc3NrZXlzLXZlcmlmeS1hdXRoZW50aWNhdGlvblwiKSB2ZXJpZnlBdXRoZW50aWNhdGlvbiE6IChpbnB1dDogYW55KSA9PiBQcm9taXNlPGFueT47XG5cbiAgQE91dHB1dChcInJlYWR5XCIpIG9uUmVhZHk6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwiY29ubmVjdGluZ1wiKSBvbkNvbm5lY3Rpbmc6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dChcImF1dGhlbnRpY2F0ZWRcIikgb25BdXRoZW50aWNhdGVkOiBFdmVudEVtaXR0ZXI8SUNvZ25pdG9Vc2VyRGF0YSB8IG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwicmVzcG9uc2VcIikgb25SZXNwb25zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7IFxuICBAT3V0cHV0KFwidXNlcm5hbWVFbnRlcmVkXCIpIG9uVXNlcm5hbWVFbnRlcmVkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBwdWJsaWMgbW9kZWw6IGFueSA9IHsgdXNlcm5hbWU6IG51bGwsIHBhc3N3b3JkOiBudWxsfTtcbiAgcHVibGljIGNvbXBvbmVudFN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gIHB1YmxpYyBmb3JtVHlwZTogQ29nbml0b0Zvcm1UeXBlIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBDb2duaXRvRm9ybVR5cGUgPSBDb2duaXRvRm9ybVR5cGU7XG4gIHB1YmxpYyByb3dzOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgZXJyb3I6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgcHJvbXB0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGNhY2hlOiBJQ29nbml0b1Jlc3BvbnNlIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBzdHJpbmdzID0gQ29nbml0b1N0cmluZ3M7XG4gIHB1YmxpYyBzaG93UGFzc3dvcmRGaWVsZDogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBzaG93RW1haWxTdWJtaXRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgc2Vzc2lvbjogQ29nbml0b1VzZXJTZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdXNlcjogQ29nbml0b1VzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHBhc3NrZXlBdXRoT3B0aW9ucz86IGFueTtcbiAgcHVibGljIHBhc3NrZXlSZWdPcHRpb25zPzogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29nbml0bzogQ29nbml0b1NlcnZpY2UpIHtcbiAgICBcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIFxuICAgIHRoaXMuY29nbml0by5pbml0aWFsaXplKHRoaXMucG9vbElkLCB0aGlzLmNsaWVudElkKTtcblxuICAgIHRoaXMuY29nbml0by5mb3JtJC5zdWJzY3JpYmUoZm9ybSA9PiB7XG4gICAgICB0aGlzLmZvcm1UeXBlID0gZm9ybTtcbiAgICAgIHRoaXMuc2hvd0N1cnJlbnRGb3JtKCk7XG4gICAgfSk7XG4gICAgXG4gICAgdGhpcy5jb2duaXRvLnNlc3Npb24kLnN1YnNjcmliZShzZXNzaW9uID0+IHtcbiAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgfSk7XG4gICAgdGhpcy5jb2duaXRvLnVzZXIkLnN1YnNjcmliZSh1c2VyID0+IHtcbiAgICAgIHRoaXMudXNlciA9IHVzZXI7XG4gICAgfSk7XG5cbiAgICBpZih0aGlzLm90cCB8fCB0aGlzLm1hZ2ljTGluaykge1xuICAgICAgdGhpcy5zaG93UGFzc3dvcmRGaWVsZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdGlhbGl6ZSgpKTtcbiAgfVxuXG4gIG9uRW50ZXJVc2VybmFtZSgpIHtcbiAgICB0aGlzLnNob3dFbWFpbFN1Ym1pdEJ1dHRvbiA9IGZhbHNlO1xuICAgIHRoaXMub25Vc2VybmFtZUVudGVyZWQuZW1pdCh0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKSk7XG4gIH1cblxuICBhc3luYyBsb2dpbigpIHtcblxuICAgIGlmKCF0aGlzLnNycCAmJiB0aGlzLm90cCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3RwKCk7XG4gICAgfSBlbHNlIGlmKCF0aGlzLnNycCAmJiB0aGlzLm1hZ2ljTGluaykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TWFnaWNMaW5rKCk7XG4gICAgfSBlbHNlIGlmKCF0aGlzLnNycCAmJiB0aGlzLnBhc3NrZXlzKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQYXNza2V5KCk7XG4gICAgfSBlbHNlIGlmKCF0aGlzLnNycCkge1xuICAgICAgcmV0dXJuIHRoaXMub25FbnRlclVzZXJuYW1lKCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMubW9kZWwucGFzc3dvcmQgPSB0cmltKHRoaXMubW9kZWwucGFzc3dvcmQpO1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS1sb2dpblwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvZ25pdG8uYXV0aGVudGljYXRlKHVzZXJuYW1lLCB0aGlzLm1vZGVsLnBhc3N3b3JkISk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHJlc3BvbnNlID0gZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZShyZXNwb25zZSEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldE90cCgpIHtcbiAgICBsZXQgcmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2U7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcblxuICAgICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICAgIGNvbnN0IG90cCA9IHRoaXMubW9kZWwub3RwID8gdHJpbSh0aGlzLm1vZGVsLm90cCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMuc3JwID0gZmFsc2U7XG4gICAgICB0aGlzLm1hZ2ljTGluayA9IGZhbHNlO1xuICAgICAgdGhpcy5wYXNza2V5cyA9IGZhbHNlO1xuXG4gICAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtb3RwLXJlcXVlc3RcIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm4gdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmVzcG9uc2UgID0gYXdhaXQgdGhpcy5jb2duaXRvLm90cEF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgb3RwKTtcblxuICAgICAgaWYodGhpcy5ob29rKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImFmdGVyLW90cC1yZXF1ZXN0XCIsIG1vZGVsOiB0aGlzLm1vZGVsLCBzZXNzaW9uSWQ6IHJlc3BvbnNlLnVzZXIuU2Vzc2lvbiB9KTtcbiAgICAgICAgaWYoIXByb2NlZWQpIHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwcm9jZWVkXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRNYWdpY0xpbmsoKSB7XG4gICAgXG4gICAgbGV0IHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuXG4gICAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtbWFnaWMtbGluay1yZXF1ZXN0XCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgICBpZighcHJvY2VlZCkgcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLm1hZ2ljTGlua0F1dGhlbnRpY2F0ZSh1c2VybmFtZSk7XG4gICAgICBcbiAgICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJhZnRlci1tYWdpYy1saW5rLXJlcXVlc3RcIiwgbW9kZWw6IHRoaXMubW9kZWwsIHNlc3Npb25JZDogcmVzcG9uc2UudXNlci5TZXNzaW9uIH0pO1xuICAgICAgICBpZighcHJvY2VlZCkgcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHJlc3BvbnNlID0gZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcm9jZXNzTWFnaWNMaW5rKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgc2Vzc2lvbklkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuY29nbml0by5tYWdpY0xpbmtBdXRoZW50aWNhdGUoZW1haWwsIGNvZGUsIHNlc3Npb25JZCk7XG4gICAgICBpZih0aGlzLnJlbG9hZEFmdGVyTGlua0F1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTsgLy9jb25uZWN0ZWRcbiAgICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZTogYW55KSB7IH0gXG4gIH1cblxuICBhc3luYyBnZXRQYXNza2V5KCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgdGhpcy5wYXNza2V5QXV0aE9wdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlQXV0aGVudGljYXRpb25PcHRpb25zKHVzZXJuYW1lKTtcbiAgICBcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHRoaXMucGFzc2tleUF1dGhPcHRpb25zPy5hbGxvd0NyZWRlbnRpYWxzID8/IFtdO1xuICAgIGlmKCFjcmVkZW50aWFscy5sZW5ndGggJiYgIXRoaXMubW9kZWwucGFzc2tleSkgdGhpcy5zZW5kUGFzc2tleUNvZGUoKTtcbiAgICBlbHNlIGlmKCFjcmVkZW50aWFscy5sZW5ndGgpIHRoaXMucmVnaXN0ZXJQYXNza2V5KCk7XG4gICAgZWxzZSB0aGlzLnVzZVBhc3NrZXkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VuZFBhc3NrZXlDb2RlKCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFVzZXJJZCh1c2VybmFtZSk7XG4gICAgdGhpcy5zcnAgPSBmYWxzZTtcbiAgICB0aGlzLm90cCA9IGZhbHNlO1xuICAgIHRoaXMubWFnaWNMaW5rID0gZmFsc2U7XG4gICAgdGhpcy5tb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VQYXNza2V5KCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICBjb25zdCBhdXRoZW50aWNhdGlvbiA9IGF3YWl0IHN0YXJ0QXV0aGVudGljYXRpb24odGhpcy5wYXNza2V5QXV0aE9wdGlvbnMpO1xuICAgIGNvbnN0IG91dGNvbWUgPSBhd2FpdCB0aGlzLnZlcmlmeUF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uKTtcbiAgICBhd2FpdCB0aGlzLmNvZ25pdG8ucGFzc2tleUF1dGhlbnRpY2F0ZSh1c2VybmFtZSk7XG4gICAgXG4gICAgaWYob3V0Y29tZS52ZXJpZmllZCkge1xuICAgICAgYXdhaXQgdGhpcy5jb2duaXRvLnBhc3NrZXlBdXRoZW50aWNhdGUodXNlcm5hbWUsIG91dGNvbWUudWlkKTtcbiAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTtcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclBhc3NrZXkoKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICBjb25zdCBjb2RlID0gdGhpcy5tb2RlbC5wYXNza2V5IS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcblxuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVSZWdpc3RyYXRpb25PcHRpb25zKGNvZGUpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IHN0YXJ0UmVnaXN0cmF0aW9uKG9wdGlvbnMpO1xuICAgIGNvbnN0IG91dGNvbWUgPSBhd2FpdCB0aGlzLnZlcmlmeVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24sIGNvZGUpO1xuICAgIGF3YWl0IHRoaXMuY29nbml0by5wYXNza2V5QXV0aGVudGljYXRlKHVzZXJuYW1lKTtcbiAgICBcbiAgICBpZihvdXRjb21lLnZlcmlmaWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvZ25pdG8ucGFzc2tleUF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgb3V0Y29tZS51aWQpO1xuICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpO1xuICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvbk5ld1VzZXIoKSB7XG4gICAgbGV0IHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMubW9kZWwubmV3UGFzc3dvcmQgPSB0cmltKHRoaXMubW9kZWwubmV3UGFzc3dvcmQpO1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS1yZWdpc3RyYXRpb25cIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLmNvbXBsZXRlUGFzc3dvcmRVcGRhdGUodGhpcy5tb2RlbC5uZXdQYXNzd29yZCEsIHRoaXMuY2FjaGUhLnVzZXIsIHRoaXMuZ2V0VXNlckF0dHJpYnV0ZXMoKSk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHJlc3BvbnNlID0gZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZShyZXNwb25zZSEpO1xuICAgIH1cblxuICB9XG5cbiAgYXN5bmMgb25Gb3JjZVBhc3N3b3JkUmVzZXQoKSB7XG4gICAgXG4gICAgdGhpcy5tb2RlbC5jb2RlID0gdHJpbSh0aGlzLm1vZGVsLmNvZGUpO1xuICAgIHRoaXMubW9kZWwubmV3UGFzc3dvcmQgPSB0cmltKHRoaXMubW9kZWwubmV3UGFzc3dvcmQpO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG5cbiAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLWZvcmNlLXBhc3N3b3JkLXJlc2V0XCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgaWYoIXByb2NlZWQpIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLmNvbmZpcm1QYXNzd29yZCh0aGlzLmNhY2hlIS51c2VyLCB0aGlzLm1vZGVsLmNvZGUsIHRoaXMubW9kZWwubmV3UGFzc3dvcmQpO1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgYXdhaXQgdGljaygyNTApO1xuICAgICAgdGhpcy5mb3JtVHlwZSA9IENvZ25pdG9Gb3JtVHlwZS5Mb2dpbjtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKHJlc3BvbnNlLCBDb2duaXRvU3RyaW5ncy5vblVzZXJQYXNzd29yZENoYW5nZVN1Y2Nlc3NmdWwpO1xuICAgICAgYXdhaXQgdGljaygwKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhlIGFzIElDb2duaXRvUmVzcG9uc2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblVzZXJQYXNzd29yZFJlc2V0KCkge1xuXG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcblxuICAgIHRoaXMubW9kZWwucGFzc3dvcmQgPSB0cmltKHRoaXMubW9kZWwucGFzc3dvcmQpO1xuICAgIHRoaXMubW9kZWwubmV3UGFzc3dvcmQgPSB0cmltKHRoaXMubW9kZWwubmV3UGFzc3dvcmQpO1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS11c2VyLXBhc3N3b3JkLXJlc2V0XCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgaWYoIXByb2NlZWQpIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLnJlc2V0UGFzc3dvcmQodGhpcy51c2VyISwgdGhpcy5tb2RlbC5wYXNzd29yZCEsIHRoaXMubW9kZWwubmV3UGFzc3dvcmQpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuZm9ybVR5cGUgPSBDb2duaXRvRm9ybVR5cGUuUGFzc3dvcmRVcGRhdGVTdWNjZXNzZnVsO1xuICAgICAgdGhpcy5wcm9tcHQgPSBDb2duaXRvU3RyaW5ncy5vblBhc3N3b3JkVXBkYXRlZDtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgYXdhaXQgdGljaygpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICB9XG5cbiAgYXN5bmMgb25Gb3Jnb3RQYXNzd29yZCgkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgXG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBhd2FpdCB0aWNrKDI1MCk7XG4gICAgdGhpcy5mb3JtVHlwZSA9IENvZ25pdG9Gb3JtVHlwZS5Vc2VyVmVyaWZpY2F0aW9uUmVxdWVzdDtcbiAgICB0aGlzLnByb21wdCA9IENvZ25pdG9TdHJpbmdzLm9uVmVyaWZpY2F0aW9uQ29kZVNlbnQ7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgYXdhaXQgdGljaygpO1xuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgb25SZXF1ZXN0VmVyaWZpY2F0aW9uQ29kZSgpIHtcblxuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgY29uc3QgbW9kZWwgPSB7IHVzZXJuYW1lIH07XG5cbiAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwicmVxdWVzdC12ZXJpZmljYXRpb24tY29kZVwiLCBcInVzZXJuYW1lXCI6IHVzZXJuYW1lLCBtb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgICB0aGlzLm1vZGVsLnVzZXJuYW1lID0gbW9kZWwudXNlcm5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvZ25pdG8ucmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUobW9kZWwudXNlcm5hbWUpO1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKHJlc3BvbnNlLCBDb2duaXRvU3RyaW5ncy5vbk5ld1Bhc3N3b3JkUmVxdWlyZWQpO1xuICAgICAgdGhpcy5zaG93UGFzc3dvcmRSZXNldEZvcm0ocmVzcG9uc2UsIGZhbHNlKTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcoZSBhcyBJQ29nbml0b1Jlc3BvbnNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBuZXdVc2VyRm9ybURpc2FibGVkKCkge1xuICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2FjaGU/LnJlcXVpcmVkQXR0cmlidXRlcz8uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYoIXRoaXMubW9kZWxba2V5XSkgZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYoIXRoaXMubW9kZWwubmV3UGFzc3dvcmQgfHwgIXRoaXMubW9kZWwubmV3UGFzc3dvcmRDb25maXJtKSB7XG4gICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYodGhpcy5tb2RlbC5uZXdQYXNzd29yZCAhPT0gdGhpcy5tb2RlbC5uZXdQYXNzd29yZENvbmZpcm0pIHtcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemUoKSB7XG5cblxuICAgIHRyeSB7XG4gICAgICBpZih0aGlzLmNvZ25pdG9VcmwgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJlbXNfYWNjZXNzX3Rva2VuXCIpKSB7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5jb2duaXRvLmdldFVzZXJJbmZvKHRoaXMuY29nbml0b1VybCkgYXMgSUNvZ25pdG9Vc2VyRGF0YTtcblxuICAgICAgICAvL2VtdWxhdGUgY29nbml0byB1c2VyL3Nlc3Npb24gZm9yIGZlZGVyYXRlZCBsb2dpblxuICAgICAgICB0aGlzLnNlc3Npb24gPSBuZXcgQ29nbml0b1VzZXJTZXNzaW9uKHtcbiAgICAgICAgICBJZFRva2VuOiBuZXcgQ29nbml0b0lkVG9rZW4oeyBJZFRva2VuOiBpbmZvLmlkVG9rZW4gfSksXG4gICAgICAgICAgQWNjZXNzVG9rZW46IG5ldyBDb2duaXRvQWNjZXNzVG9rZW4oeyBBY2Nlc3NUb2tlbjogaW5mby5hY2Nlc3NUb2tlbiB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29nbml0by5jcmVhdGVGZWRlcmF0ZWRTZXNzaW9uKGluZm8uaWRUb2tlbiwgaW5mby5hY2Nlc3NUb2tlbilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmKHRoaXMuc2Vzc2lvbikge1xuICAgICAgICB0aGlzLm9uQXV0aGVudGljYXRlZC5lbWl0KHRoaXMuZ2V0VXNlckRhdGEoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZXNwb25zZShyZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZSkge1xuXG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICBcbiAgICBhd2FpdCB0aWNrKDI1MCk7XG5cbiAgICB0aGlzLnNldE1lc3NhZ2luZyhyZXNwb25zZSk7XG4gICAgdGhpcy5jYWNoZSA9IHJlc3BvbnNlLnVzZXJBdHRyaWJ1dGVzID8gcmVzcG9uc2UgOiB0aGlzLmNhY2hlO1xuXG4gICAgaWYocmVzcG9uc2UuZXJyb3I/LmNvZGUgPT09IENvZ25pdG9SZXNwb25zZVR5cGUuTm90QXV0aG9yaXplZCAmJiByZXNwb25zZS5yZXF1ZXN0ID09PSBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb24pIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7IC8vbGlrZWx5IGJhZCBwYXNzd29yZCBvciB0b28gbWFueSBhdHRlbXB0c1xuICAgIH0gZWxzZSBpZihyZXNwb25zZS5lcnJvcj8uY29kZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXQgJiYgcmVzcG9uc2UucmVxdWVzdCA9PT0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICB0aGlzLmluaXRpYXRlUGFzc3dvcmRSZXNldChyZXNwb25zZSk7IC8vYWRtaW4gaGFzIGZvcmNlZCB1c2VyIHBhc3N3b3JkIHJlc2V0XG4gICAgfSBlbHNlIGlmKHJlc3BvbnNlLnR5cGUgPT09IENvZ25pdG9SZXNwb25zZVR5cGUuT3RwQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLm1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeSA9IHRydWU7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgIH0gZWxzZSBpZihyZXNwb25zZS50eXBlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLlBhc3N3b3JkUmVzZXQgJiYgcmVzcG9uc2UucmVxdWVzdCA9PT0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICB0aGlzLnByb21wdCA9IENvZ25pdG9TdHJpbmdzLm9uRmlyc3RMb2dpbjtcbiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3BvbnNlKTsgLy9uZXcgdXNlclxuICAgIH0gZWxzZSBpZighcmVzcG9uc2UuZXJyb3I/LmNvZGUgJiYgKHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbiB8fCByZXNwb25zZS50eXBlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLkF1dGhlbnRpY2F0ZWQgKSkge1xuICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpOyAvL2Nvbm5lY3RlZFxuICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTsgLy91bnN1cHBvcnRlZCByZXNwb25zZSAtLSBob3BlZnVsbHkgZGVzY3JpYmVkIGluIG1lc3NhZ2luZ1xuICAgIH1cblxuICAgIHRoaXMub25SZXNwb25zZS5lbWl0KHsgcmVzcG9uc2UsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWF0ZVBhc3N3b3JkUmVzZXQocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UpIHtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb2duaXRvLmZvcmdvdFBhc3N3b3JkKHJlc3BvbnNlLnVzZXIpO1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcocmVzdWx0LCBDb2duaXRvU3RyaW5ncy5vbk5ld1Bhc3N3b3JkUmVxdWlyZWQpO1xuICAgICAgYXdhaXQgdGljaygyNTApO1xuICAgICAgdGhpcy5zaG93UGFzc3dvcmRSZXNldEZvcm0ocmVzcG9uc2UsIGZhbHNlKTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcoZSBhcyBJQ29nbml0b1Jlc3BvbnNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldE1lc3NhZ2luZyhyZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZSwgcHJvbXB0OiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIGlmKHJlc3BvbnNlLmVycm9yPy5jb2RlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLkxpbWl0RXhjZWVkZWRFeGNlcHRpb24pIHtcbiAgICAgIHRoaXMuZXJyb3IgPSBDb2duaXRvU3RyaW5ncy5vblRvb01hbnlBdHRlbXB0cztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lcnJvciA9IHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlID8/IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9tcHQgPSBwcm9tcHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3Rpb25Db21wbGV0ZSgpIHtcbiAgICBhd2FpdCB0aWNrKCk7XG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dDdXJyZW50Rm9ybSgpIHtcbiAgICBpZighdGhpcy5mb3JtVHlwZSkgcmV0dXJuO1xuXG4gICAgaWYodGhpcy5mb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLkdvb2dsZVNpZ25Jbikge1xuICAgICAgcmV0dXJuIHRoaXMuc2lnbkluV2l0aEdvb2dsZSgpO1xuICAgIH1cblxuICAgIHRoaXMuaG9zdFN0eWxlID0ge1xuICAgICAgXCJiYWNrZ3JvdW5kXCI6IHRoaXMubW9kYWxCYWNrZ3JvdW5kLFxuICAgICAgXCJ6LWluZGV4XCI6IHRoaXMuekluZGV4XG4gICAgfVxuXG4gICAgYXdhaXQgdGljaygpO1xuXG4gICAgdGhpcy5zaG93Rm9ybSA9IHRydWU7XG4gICAgdGhpcy5vblJlYWR5LmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3VsdDogSUNvZ25pdG9SZXNwb25zZSwgaXNOZXdVc2VyOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRoaXMuY2FjaGUgPSByZXN1bHQ7XG4gICAgdGhpcy5yb3dzID0gW107XG4gICAgdGhpcy5mb3JtVHlwZSA9IGlzTmV3VXNlciA/IENvZ25pdG9Gb3JtVHlwZS5OZXdVc2VyIDogQ29nbml0b0Zvcm1UeXBlLkZvcmNlUGFzc3dvcmRSZXNldDtcbiAgICBcbiAgICAvL2J1YmJsZSBmaXJzdCBhbmQgbGFzdCBuYW1lIGZpZWxkcyB0byB0aGUgdG9wIG9mIHRoZSBhdHRyaWJ1dGVzIGxpc3RcbiAgICByZXN1bHQucmVxdWlyZWRBdHRyaWJ1dGVzPy5zb3J0KChhLGIpID0+IHtcbiAgICAgIGlmKGEgPT09IFwiZ2l2ZW5fbmFtZVwiICYmIGIgPT09IFwiZmFtaWx5X25hbWVcIikgcmV0dXJuIC0xO1xuICAgICAgaWYoYiA9PT0gXCJnaXZlbl9uYW1lXCIgJiYgYSA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gMTtcbiAgICAgIGlmKGEgPT09IFwiZ2l2ZW5fbmFtZVwiKSByZXR1cm4gLTE7XG4gICAgICBpZihhID09PSBcImZhbWlseV9uYW1lXCIpIHJldHVybiAtIDE7XG4gICAgICBpZihiID09PSBcImdpdmVuX25hbWVcIikgcmV0dXJuIDE7XG4gICAgICBpZihiID09PSBcImZhbWlseV9uYW1lXCIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIGEgPiBiID8gMSA6IC0xO1xuICAgIH0pO1xuXG4gICAgLy9pbmplY3QgZm9ybXJvd3MgZm9yIHJlcXVpcmVkIGF0dHJpYnV0ZXNcbiAgICByZXN1bHQucmVxdWlyZWRBdHRyaWJ1dGVzPy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZihrZXkubWF0Y2goL15lbWFpbC8pKSByZXR1cm47XG4gICAgICBjb25zdCB2YWx1ZSA9IHJlc3VsdC51c2VyQXR0cmlidXRlcyFba2V5XVxuICAgICAgdGhpcy5yb3dzLnB1c2goe1xuICAgICAgICBsYWJlbDogdW5zbmFrZShrZXkpLFxuICAgICAgICBrZXlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tb2RlbFtrZXldID0gdmFsdWUgJiYgdmFsdWUubGVuZ3RoID8gdmFsdWUgOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIGF3YWl0IHRpY2soKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVc2VyQXR0cmlidXRlcygpOiBSZWNvcmQ8c3RyaW5nLHN0cmluZz4ge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLHN0cmluZz47XG4gICAgaWYoIXRoaXMuY2FjaGU/LnJlcXVpcmVkQXR0cmlidXRlcykgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgdGhpcy5jYWNoZSEucmVxdWlyZWRBdHRyaWJ1dGVzIS5mb3JFYWNoKGtleSA9PiBhdHRyaWJ1dGVzW2tleV0gPSB0aGlzLm1vZGVsW2tleV0pO1xuICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBzaWduSW5XaXRoR29vZ2xlKCkge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29nbml0b1VybH0vb2F1dGgyL2F1dGhvcml6ZT9pZGVudGl0eV9wcm92aWRlcj0ke3RoaXMucHJvdmlkZXJOYW1lfSZyZWRpcmVjdF91cmk9JHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufSZyZXNwb25zZV90eXBlPVRPS0VOJmNsaWVudF9pZD0ke3RoaXMuY2xpZW50SWR9JnNjb3BlPWVtYWlsIG9wZW5pZCBwcm9maWxlIGF3cy5jb2duaXRvLnNpZ25pbi51c2VyLmFkbWluYDtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckRhdGEoKTogSUNvZ25pdG9Vc2VyRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVtYWlsOiB0aGlzLnNlc3Npb24hLmdldElkVG9rZW4oKS5wYXlsb2FkW1wiZW1haWxcIl0sXG4gICAgICB1c2VybmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImNvZ25pdG86dXNlcm5hbWVcIl0sXG4gICAgICBzdWI6ICB0aGlzLnNlc3Npb24hLmdldElkVG9rZW4oKS5wYXlsb2FkW1wic3ViXCJdLFxuICAgICAgZmlyc3ROYW1lOiB0aGlzLnNlc3Npb24hLmdldElkVG9rZW4oKS5wYXlsb2FkW1wiZ2l2ZW5fbmFtZVwiXSxcbiAgICAgIGxhc3ROYW1lOiB0aGlzLnNlc3Npb24hLmdldElkVG9rZW4oKS5wYXlsb2FkW1wiZmFtaWx5X25hbWVcIl0sXG4gICAgICBpZFRva2VuOiAgdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkuZ2V0Snd0VG9rZW4oKSxcbiAgICAgIGFjY2Vzc1Rva2VuOiAgdGhpcy5zZXNzaW9uIS5nZXRBY2Nlc3NUb2tlbigpLmdldEp3dFRva2VuKCksXG4gICAgfVxuICB9XG5cbn1cbiIsIjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Mb2dpblwiIGNsYXNzPVwiY29nbml0by1mb3JtXCIgKHN1Ym1pdCk9XCJsb2dpbigpXCI+XG5cdDxidXR0b24gY2xhc3M9XCJidXR0b24gY2xvc2VcIiAoY2xpY2spPVwic2hvd0Zvcm09ZmFsc2VcIiB0eXBlPVwiYnV0dG9uXCI+PHNwYW4gY2xhc3M9XCJidXR0b250ZXh0XCI+e3sgc3RyaW5ncy5sYWJlbENsb3NlIH19PC9zcGFuPjwvYnV0dG9uPlxuXHQ8ZGl2ICpuZ0lmPVwicHJvbXB0XCIgY2xhc3M9XCJwcm9tcHRcIiBbaW5uZXJIdG1sXT1cInByb21wdFwiPjwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInVzZXJuYW1lXCI+e3sgc3RyaW5ncy5sYWJlbEVtYWlsIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJ1c2VybmFtZVwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJ1c2VybmFtZVwiIFsobmdNb2RlbCldPVwibW9kZWwudXNlcm5hbWVcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwiIXNycCAmJiAhb3RwICYmICFwYXNza2V5cyAmJiAhbWFnaWNMaW5rICYmIHNob3dFbWFpbFN1Ym1pdEJ1dHRvblwiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uRW50ZXJVc2VybmFtZSgpXCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxTdWJtaXQgfX08L2J1dHRvbj5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCJzcnAgJiYgIXNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2hvd1Bhc3N3b3JkRmllbGQgPSB0cnVlOyBvdHAgPSBmYWxzZTsgbWFnaWNMaW5rID0gZmFsc2U7IHBhc3NrZXlzID0gZmFsc2VcIiBbZGlzYWJsZWRdPVwiIW1vZGVsLnVzZXJuYW1lXCI+e3sgc3RyaW5ncy5sYWJlbFVzZVJlZ3VsYXJQYXNzd29yZCB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cInNycCAmJiBzaG93UGFzc3dvcmRGaWVsZFwiIGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbFBhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJwYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cInNycCAmJiBzaG93UGFzc3dvcmRGaWVsZFwiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhXCIgKGNsaWNrKT1cIm9uRm9yZ290UGFzc3dvcmQoJGV2ZW50KVwiPnt7IHN0cmluZ3MubGFiZWxGb3Jnb3RQYXNzd29yZCB9fTwvYnV0dG9uPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW3ZhbHVlXT1cInN0cmluZ3MubGFiZWxTdWJtaXRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwib3RwICYmIG1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeVwiIGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cIm90cFwiPnt7IHN0cmluZ3MubGFiZWxPdHBFbnRlciB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwib3RwXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm90cFwiIFsobmdNb2RlbCldPVwibW9kZWwub3RwXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cInBhc3NrZXlzICYmIG1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeVwiIGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInBhc3NrZXktcmVnXCI+e3sgc3RyaW5ncy5sYWJlbFBhc3NrZXlFbnRlciB9fTwvbGFiZWw+XG5cdFx0PHRleHRhcmVhIGlkPVwicGFzc2tleS1yZWdcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgbmFtZT1cInBhc3NrZXktcmVnXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5wYXNza2V5XCI+PC90ZXh0YXJlYT5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCJvdHBcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZXRPdHAoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBtb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPyBzdHJpbmdzLmxhYmVsU3VibWl0IDogc3RyaW5ncy5sYWJlbE90cCB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwibWFnaWNMaW5rXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZ2V0TWFnaWNMaW5rKClcIiBbZGlzYWJsZWRdPVwiIW1vZGVsLnVzZXJuYW1lXCI+e3sgc3RyaW5ncy5sYWJlbE1hZ2ljTGluayB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwicGFzc2tleXNcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZXRQYXNza2V5KClcIiBbZGlzYWJsZWRdPVwiIW1vZGVsLnVzZXJuYW1lXCI+e3sgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5ID8gc3RyaW5ncy5sYWJlbFN1Ym1pdCA6IHN0cmluZ3MubGFiZWxQYXNza2V5cyB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLk5ld1VzZXJcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwib25OZXdVc2VyKClcIj5cblx0PGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBjbG9zZVwiIChjbGljayk9XCJzaG93Rm9ybT1mYWxzZVwiIHR5cGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbnRleHRcIj57eyBzdHJpbmdzLmxhYmVsQ2xvc2UgfX08L3NwYW4+PC9idXR0b24+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwidXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsRW1haWwgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInVzZXJuYW1lXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJuYW1lXCIgWyhuZ01vZGVsKV09XCJtb2RlbC51c2VybmFtZVwiIGRpc2FibGVkIC8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbCBuby1tYlwiIGZvcj1cIm5ldy1wYXNzd29yZFwiPnt7IHN0cmluZ3MubGFiZWxOZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PHAgY2xhc3M9XCJjb2duaXRvLXN1YmxhYmVsXCI+e3sgc3RyaW5ncy5sYWJlbFBhc3N3b3JkUmVxdWlyZW1lbnQgfX08L3A+XG5cdFx0PGlucHV0IGlkPVwibmV3LXBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1uZXdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJwYXNzd29yZC1jb25maXJtXCI+e3sgc3RyaW5ncy5sYWJlbENvbmZpcm1OZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwicGFzc3dvcmQtY29uZmlybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtY29uZmlybVwiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRDb25maXJtXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93c1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHJvdy5sYWJlbHxsYWJlbGVyIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgW2lkXT1cInJvdy5rZXlcIiAgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgW25hbWVdPVwicm93LmtleVwiIFsobmdNb2RlbCldPVwibW9kZWxbcm93LmtleV1cIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGlucHV0IGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwibmV3VXNlckZvcm1EaXNhYmxlZCgpXCIgW3ZhbHVlXT1cInN0cmluZ3MubGFiZWxTdWJtaXRcIi8+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIdG1sXT1cImVycm9yXCI+PC9kaXY+XG48L2Zvcm0+XG48Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuRm9yY2VQYXNzd29yZFJlc2V0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uRm9yY2VQYXNzd29yZFJlc2V0KClcIj5cblx0PGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBjbG9zZVwiIChjbGljayk9XCJzaG93Rm9ybT1mYWxzZVwiIHR5cGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbnRleHRcIj57eyBzdHJpbmdzLmxhYmVsQ2xvc2UgfX08L3NwYW4+PC9idXR0b24+XG5cdDxkaXYgKm5nSWY9XCJwcm9tcHRcIiBjbGFzcz1cInByb21wdFwiIFtpbm5lckh0bWxdPVwicHJvbXB0XCI+PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwidXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsRW1haWwgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInVzZXJuYW1lXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJuYW1lXCIgWyhuZ01vZGVsKV09XCJtb2RlbC51c2VybmFtZVwiIGRpc2FibGVkIC8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cImNvZGVcIj57eyBzdHJpbmdzLmxhYmVsQ29kZSB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwiY29kZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjb2RlXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5jb2RlXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJuZXctcGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxwIGNsYXNzPVwiY29nbml0by1zdWJsYWJlbFwiPnt7IHN0cmluZ3MubGFiZWxQYXNzd29yZFJlcXVpcmVtZW50IH19PC9wPlxuXHRcdDxpbnB1dCBpZD1cIm5ldy1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtbmV3XCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmQtY29uZmlybVwiPnt7IHN0cmluZ3MubGFiZWxDb25maXJtTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkLWNvbmZpcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLWNvbmZpcm1cIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Vc2VyVmVyaWZpY2F0aW9uUmVxdWVzdFwiIGNsYXNzPVwiY29nbml0by1mb3JtXCIgKHN1Ym1pdCk9XCJvblJlcXVlc3RWZXJpZmljYXRpb25Db2RlKClcIj5cblx0PGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBjbG9zZVwiIChjbGljayk9XCJzaG93Rm9ybT1mYWxzZVwiIHR5cGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbnRleHRcIj57eyBzdHJpbmdzLmxhYmVsQ2xvc2UgfX08L3NwYW4+PC9idXR0b24+XG5cdDxkaXYgKm5nSWY9XCJwcm9tcHRcIiBjbGFzcz1cInByb21wdFwiIFtpbm5lckh0bWxdPVwicHJvbXB0XCI+PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwidXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsRW1haWwgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInVzZXJuYW1lXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJuYW1lXCIgWyhuZ01vZGVsKV09XCJtb2RlbC51c2VybmFtZVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Vc2VyUGFzc3dvcmRSZXNldFwiIGNsYXNzPVwiY29nbml0by1mb3JtXCIgKHN1Ym1pdCk9XCJvblVzZXJQYXNzd29yZFJlc2V0KClcIj5cblx0PGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBjbG9zZVwiIChjbGljayk9XCJzaG93Rm9ybT1mYWxzZVwiIHR5cGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbnRleHRcIj57eyBzdHJpbmdzLmxhYmVsQ2xvc2UgfX08L3NwYW4+PC9idXR0b24+XG5cdDxkaXYgKm5nSWY9XCJwcm9tcHRcIiBjbGFzcz1cInByb21wdFwiIFtpbm5lckh0bWxdPVwicHJvbXB0XCI+PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwiY3VycmVudC1wYXNzd29yZFwiPnt7IHN0cmluZ3MubGFiZWxDdXJyZW50UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cImN1cnJlbnQtcGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5wYXNzd29yZFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwibmV3LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbE5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8cCBjbGFzcz1cImNvZ25pdG8tc3VibGFiZWxcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmRSZXF1aXJlbWVudCB9fTwvcD5cblx0XHQ8aW5wdXQgaWQ9XCJuZXctcGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLW5ld1wiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInBhc3N3b3JkLWNvbmZpcm1cIj57eyBzdHJpbmdzLmxhYmVsQ29uZmlybU5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJwYXNzd29yZC1jb25maXJtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1jb25maXJtXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZENvbmZpcm1cIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGlucHV0IGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiBbZGlzYWJsZWRdPVwibmV3VXNlckZvcm1EaXNhYmxlZCgpXCIgW3ZhbHVlXT1cInN0cmluZ3MubGFiZWxTdWJtaXRcIi8+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIdG1sXT1cImVycm9yXCI+PC9kaXY+XG48L2Zvcm0+XG48Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuUGFzc3dvcmRVcGRhdGVTdWNjZXNzZnVsXCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cInNob3dGb3JtID0gZmFsc2VcIj5cblx0PGRpdiBjbGFzcz1cInByb21wdFwiIFtpbm5lckh0bWxdPVwicHJvbXB0XCI+PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsQ2xvc2VcIi8+XG5cdDwvZGl2Plx0XG48L2Zvcm0+Il19
|
|
582
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvZ25pdG8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFpQixLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRyxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU8sNEJBQTRCLENBQUM7QUFFbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBVSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBT2pGLE1BQU0sT0FBTyxnQkFBZ0I7SUFvRDNCLFlBQW9CLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBakRyQixjQUFTLEdBQW9DLEVBQUUsQ0FBQztRQUN6QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRzNDLGlCQUFZLEdBQVcsUUFBUSxDQUFDO1FBSTdCLG9CQUFlLEdBQVcsdUJBQXVCLENBQUM7UUFDM0QsV0FBTSxHQUFXLElBQUksQ0FBQztRQUUxQixRQUFHLEdBQVksSUFBSSxDQUFDO1FBQ3BCLFFBQUcsR0FBWSxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRUwsa0NBQTZCLEdBQVksSUFBSSxDQUFDO1FBQ3RF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QkFBN0IsTUFBTTt1QkFBQyxVQUFVO2dCQUNTLGlCQUFpQjtzQkFBM0MsTUFBTTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIEFmdGVyVmlld0luaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29nbml0b1NlcnZpY2UgfSBmcm9tIFwiLi9jb2duaXRvLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvZ25pdG9Vc2VyLCBDb2duaXRvVXNlclNlc3Npb24sIENvZ25pdG9JZFRva2VuLCBDb2duaXRvQWNjZXNzVG9rZW4gfSAgZnJvbSAnYW1hem9uLWNvZ25pdG8taWRlbnRpdHktanMnO1xuaW1wb3J0IHsgSUNvZ25pdG9SZXNwb25zZSwgSUNvZ25pdG9Vc2VyRGF0YSB9IGZyb20gXCIuL2NvZ25pdG8uaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQ29nbml0b1N0cmluZ3MgfSBmcm9tIFwiLi9jb2duaXRvLmNsYXNzZXNcIjtcbmltcG9ydCB7IENvZ25pdG9SZXNwb25zZVR5cGUsIENvZ25pdG9SZXF1ZXN0VHlwZSwgQ29nbml0b0Zvcm1UeXBlIH0gZnJvbSBcIi4vY29nbml0by50eXBlc1wiO1xuaW1wb3J0IHsgdW5zbmFrZSwgdGljaywgcGFyYW1zLCB0cmltIH0gZnJvbSBcIi4vY29nbml0by51dGlsc1wiO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBzdGFydEF1dGhlbnRpY2F0aW9uLCBzdGFydFJlZ2lzdHJhdGlvbiB9IGZyb20gJ0BzaW1wbGV3ZWJhdXRobi9icm93c2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29nbml0bycsXG4gIHRlbXBsYXRlVXJsOiBcIi4vY29nbml0by5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFsgXCIuL2NvZ25pdG8uY29tcG9uZW50Lmxlc3NcIiBdXG59KVxuZXhwb3J0IGNsYXNzIENvZ25pdG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGVcIikgaG9zdFN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gIEBIb3N0QmluZGluZyhcImNsYXNzLnJlbmRlclwiKSBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoXCJjbGFzcy50cmFuc2l0aW9uaW5nXCIpIHRyYW5zaXRpb25pbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoXCJwb29sLWlkXCIpIHBvb2xJZCE6IHN0cmluZztcbiAgQElucHV0KFwicHJvdmlkZXItbmFtZVwiKSBwcm92aWRlck5hbWU6IHN0cmluZyA9IFwiR29vZ2xlXCI7XG4gIEBJbnB1dChcImNsaWVudC1pZFwiKSBjbGllbnRJZCE6IHN0cmluZztcbiAgQElucHV0KFwiY29nbml0by1zaWduaW4tdXJsXCIpIGNvZ25pdG9Vcmw/OiBzdHJpbmc7XG4gIEBJbnB1dChcInJlZ2lvblwiKSByZWdpb24hOiBzdHJpbmc7XG4gIEBJbnB1dChcIm1vZGFsLWJhY2tncm91bmRcIikgbW9kYWxCYWNrZ3JvdW5kOiBzdHJpbmcgPSBcInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiO1xuICBASW5wdXQoXCJ6LWluZGV4XCIpIHpJbmRleDogbnVtYmVyID0gMTAwMDtcbiAgQElucHV0KFwiaG9va1wiKSBob29rPzogKHN0YXRlOiBhbnkpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIEBJbnB1dChcInNycFwiKSBzcnA6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoXCJvdHBcIikgb3RwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dChcIm1hZ2ljLWxpbmtcIikgbWFnaWNMaW5rOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dChcIm1hZ2ljLWxpbmstZ2VuZXJhdG9yXCIpIG1hZ2ljTGlua0dlbmVyYXRvcj86IFByb21pc2U8Ym9vbGVhbj47XG4gIEBJbnB1dChcInJlbG9hZC1hZnRlci1saW5rLWF1dGhlbnRpY2F0aW9uXCIpIHJlbG9hZEFmdGVyTGlua0F1dGhlbnRpY2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KFwicGFzc2tleXNcIikgcGFzc2tleXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoXCJwYXNza2V5cy1nZXQtdXNlci1pZFwiKSBnZXRVc2VySWQhOiAodXNlcm5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICBASW5wdXQoXCJwYXNza2V5cy1nZW5lcmF0ZS1hdXRoZW50aWNhdGlvbi1vcHRpb25zXCIpIGdlbmVyYXRlQXV0aGVudGljYXRpb25PcHRpb25zITogKGVtYWlsOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtZ2VuZXJhdGUtcmVnaXN0cmF0aW9uLW9wdGlvbnNcIikgZ2VuZXJhdGVSZWdpc3RyYXRpb25PcHRpb25zITogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtdmVyaWZ5LXJlZ2lzdHJhdGlvblwiKSB2ZXJpZnlSZWdpc3RyYXRpb24hOiAoaW5wdXQ6IGFueSwgdG9rZW46IHN0cmluZyApID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtdmVyaWZ5LWF1dGhlbnRpY2F0aW9uXCIpIHZlcmlmeUF1dGhlbnRpY2F0aW9uITogKGlucHV0OiBhbnkpID0+IFByb21pc2U8YW55PjtcblxuICBAT3V0cHV0KFwicmVhZHlcIikgb25SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJjb25uZWN0aW5nXCIpIG9uQ29ubmVjdGluZzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwiYXV0aGVudGljYXRlZFwiKSBvbkF1dGhlbnRpY2F0ZWQ6IEV2ZW50RW1pdHRlcjxJQ29nbml0b1VzZXJEYXRhIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJyZXNwb25zZVwiKSBvblJlc3BvbnNlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgXG4gIEBPdXRwdXQoXCJ1c2VybmFtZUVudGVyZWRcIikgb25Vc2VybmFtZUVudGVyZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBtb2RlbDogYW55ID0geyB1c2VybmFtZTogbnVsbCwgcGFzc3dvcmQ6IG51bGx9O1xuICBwdWJsaWMgY29tcG9uZW50U3R5bGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fTtcbiAgcHVibGljIGZvcm1UeXBlOiBDb2duaXRvRm9ybVR5cGUgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIENvZ25pdG9Gb3JtVHlwZSA9IENvZ25pdG9Gb3JtVHlwZTtcbiAgcHVibGljIHJvd3M6IGFueVtdID0gW107XG4gIHB1YmxpYyBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwcm9tcHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgY2FjaGU6IElDb2duaXRvUmVzcG9uc2UgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHN0cmluZ3MgPSBDb2duaXRvU3RyaW5ncztcbiAgcHVibGljIHNob3dQYXNzd29yZEZpZWxkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHNob3dFbWFpbFN1Ym1pdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBkaXNhYmxlVXNlcm5hbWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHNlc3Npb246IENvZ25pdG9Vc2VyU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXI6IENvZ25pdG9Vc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwYXNza2V5QXV0aE9wdGlvbnM/OiBhbnk7XG4gIHB1YmxpYyBwYXNza2V5UmVnT3B0aW9ucz86IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvZ25pdG86IENvZ25pdG9TZXJ2aWNlKSB7XG4gICAgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBcbiAgICB0aGlzLmNvZ25pdG8uaW5pdGlhbGl6ZSh0aGlzLnBvb2xJZCwgdGhpcy5jbGllbnRJZCk7XG5cbiAgICB0aGlzLmNvZ25pdG8uZm9ybSQuc3Vic2NyaWJlKGZvcm0gPT4ge1xuICAgICAgdGhpcy5mb3JtVHlwZSA9IGZvcm07XG4gICAgICB0aGlzLnNob3dDdXJyZW50Rm9ybSgpO1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29nbml0by5zZXNzaW9uJC5zdWJzY3JpYmUoc2Vzc2lvbiA9PiB7XG4gICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIH0pO1xuICAgIHRoaXMuY29nbml0by51c2VyJC5zdWJzY3JpYmUodXNlciA9PiB7XG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRpYWxpemUoKSk7XG4gIH1cblxuICBvbkVudGVyVXNlcm5hbWUoKSB7XG4gICAgdGhpcy5zaG93RW1haWxTdWJtaXRCdXR0b24gPSBmYWxzZTtcbiAgICB0aGlzLm9uVXNlcm5hbWVFbnRlcmVkLmVtaXQodGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIikpO1xuICB9XG5cbiAgdXBkYXRlQnV0dG9ucygpIHtcbiAgICBpZih0aGlzLm90cCB8fCB0aGlzLm1hZ2ljTGluayB8fCB0aGlzLnBhc3NrZXlzKSB7XG4gICAgICB0aGlzLnNob3dQYXNzd29yZEZpZWxkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oKSB7XG5cbiAgICBpZighdGhpcy5zcnAgJiYgdGhpcy5vdHApIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE90cCgpO1xuICAgIH0gZWxzZSBpZighdGhpcy5zcnAgJiYgdGhpcy5tYWdpY0xpbmspIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1hZ2ljTGluaygpO1xuICAgIH0gZWxzZSBpZighdGhpcy5zcnAgJiYgdGhpcy5wYXNza2V5cykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFzc2tleSgpO1xuICAgIH0gZWxzZSBpZighdGhpcy5zcnApIHtcbiAgICAgIHJldHVybiB0aGlzLm9uRW50ZXJVc2VybmFtZSgpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLm1vZGVsLnBhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLnBhc3N3b3JkKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtbG9naW5cIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgdGhpcy5tb2RlbC5wYXNzd29yZCEpO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRPdHAoKSB7XG4gICAgbGV0IHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgICBjb25zdCBvdHAgPSB0aGlzLm1vZGVsLm90cCA/IHRyaW0odGhpcy5tb2RlbC5vdHApIDogdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnNycCA9IGZhbHNlO1xuICAgICAgdGhpcy5tYWdpY0xpbmsgPSBmYWxzZTtcbiAgICAgIHRoaXMucGFzc2tleXMgPSBmYWxzZTtcblxuICAgICAgaWYodGhpcy5ob29rKSB7XG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLW90cC1yZXF1ZXN0XCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgICBpZighcHJvY2VlZCkgcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJlc3BvbnNlICA9IGF3YWl0IHRoaXMuY29nbml0by5vdHBBdXRoZW50aWNhdGUodXNlcm5hbWUsIG90cCk7XG5cbiAgICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJhZnRlci1vdHAtcmVxdWVzdFwiLCBtb2RlbDogdGhpcy5tb2RlbCwgc2Vzc2lvbklkOiByZXNwb25zZS51c2VyLlNlc3Npb24gfSk7XG4gICAgICAgIGlmKCFwcm9jZWVkKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcHJvY2VlZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlISk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0TWFnaWNMaW5rKCkge1xuICAgIFxuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcblxuICAgICAgaWYodGhpcy5ob29rKSB7XG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLW1hZ2ljLWxpbmstcmVxdWVzdFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgICAgaWYoIXByb2NlZWQpIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5tYWdpY0xpbmtBdXRoZW50aWNhdGUodXNlcm5hbWUpO1xuICAgICAgXG4gICAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYWZ0ZXItbWFnaWMtbGluay1yZXF1ZXN0XCIsIG1vZGVsOiB0aGlzLm1vZGVsLCBzZXNzaW9uSWQ6IHJlc3BvbnNlLnVzZXIuU2Vzc2lvbiB9KTtcbiAgICAgICAgaWYoIXByb2NlZWQpIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc01hZ2ljTGluayhlbWFpbDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLmNvZ25pdG8ubWFnaWNMaW5rQXV0aGVudGljYXRlKGVtYWlsLCBjb2RlLCBzZXNzaW9uSWQpO1xuICAgICAgaWYodGhpcy5yZWxvYWRBZnRlckxpbmtBdXRoZW50aWNhdGlvbikge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQXV0aGVudGljYXRlZC5lbWl0KHRoaXMuZ2V0VXNlckRhdGEoKSk7IC8vY29ubmVjdGVkXG4gICAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGU6IGFueSkgeyB9IFxuICB9XG5cbiAgYXN5bmMgZ2V0UGFzc2tleSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIHRoaXMucGFzc2tleUF1dGhPcHRpb25zID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uT3B0aW9ucyh1c2VybmFtZSk7XG4gICAgXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB0aGlzLnBhc3NrZXlBdXRoT3B0aW9ucz8uYWxsb3dDcmVkZW50aWFscyA/PyBbXTtcbiAgICBpZighY3JlZGVudGlhbHMubGVuZ3RoICYmICF0aGlzLm1vZGVsLnBhc3NrZXkpIHRoaXMuc2VuZFBhc3NrZXlDb2RlKCk7XG4gICAgZWxzZSBpZighY3JlZGVudGlhbHMubGVuZ3RoKSB0aGlzLnJlZ2lzdGVyUGFzc2tleSgpO1xuICAgIGVsc2UgdGhpcy51c2VQYXNza2V5KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRQYXNza2V5Q29kZSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRVc2VySWQodXNlcm5hbWUpO1xuICAgIHRoaXMuc3JwID0gZmFsc2U7XG4gICAgdGhpcy5vdHAgPSBmYWxzZTtcbiAgICB0aGlzLm1hZ2ljTGluayA9IGZhbHNlO1xuICAgIHRoaXMubW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5ID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXNlUGFzc2tleSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgY29uc3QgYXV0aGVudGljYXRpb24gPSBhd2FpdCBzdGFydEF1dGhlbnRpY2F0aW9uKHRoaXMucGFzc2tleUF1dGhPcHRpb25zKTtcbiAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgdGhpcy52ZXJpZnlBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbik7XG4gICAgYXdhaXQgdGhpcy5jb2duaXRvLnBhc3NrZXlBdXRoZW50aWNhdGUodXNlcm5hbWUpO1xuICAgIFxuICAgIGlmKG91dGNvbWUudmVyaWZpZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29nbml0by5wYXNza2V5QXV0aGVudGljYXRlKHVzZXJuYW1lLCBvdXRjb21lLnVpZCk7XG4gICAgICB0aGlzLm9uQXV0aGVudGljYXRlZC5lbWl0KHRoaXMuZ2V0VXNlckRhdGEoKSk7XG4gICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQYXNza2V5KCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgY29uc3QgY29kZSA9IHRoaXMubW9kZWwucGFzc2tleSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG5cbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlUmVnaXN0cmF0aW9uT3B0aW9ucyhjb2RlKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBzdGFydFJlZ2lzdHJhdGlvbihvcHRpb25zKTtcbiAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgdGhpcy52ZXJpZnlSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uLCBjb2RlKTtcbiAgICBhd2FpdCB0aGlzLmNvZ25pdG8ucGFzc2tleUF1dGhlbnRpY2F0ZSh1c2VybmFtZSk7XG4gICAgXG4gICAgaWYob3V0Y29tZS52ZXJpZmllZCkge1xuICAgICAgYXdhaXQgdGhpcy5jb2duaXRvLnBhc3NrZXlBdXRoZW50aWNhdGUodXNlcm5hbWUsIG91dGNvbWUudWlkKTtcbiAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTtcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25OZXdVc2VyKCkge1xuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtcmVnaXN0cmF0aW9uXCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgaWYoIXByb2NlZWQpIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5jb21wbGV0ZVBhc3N3b3JkVXBkYXRlKHRoaXMubW9kZWwubmV3UGFzc3dvcmQhLCB0aGlzLmNhY2hlIS51c2VyLCB0aGlzLmdldFVzZXJBdHRyaWJ1dGVzKCkpO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UhKTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIG9uRm9yY2VQYXNzd29yZFJlc2V0KCkge1xuICAgIFxuICAgIHRoaXMubW9kZWwuY29kZSA9IHRyaW0odGhpcy5tb2RlbC5jb2RlKTtcbiAgICB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS1mb3JjZS1wYXNzd29yZC1yZXNldFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5jb25maXJtUGFzc3dvcmQodGhpcy5jYWNoZSEudXNlciwgdGhpcy5tb2RlbC5jb2RlLCB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuZm9ybVR5cGUgPSBDb2duaXRvRm9ybVR5cGUuTG9naW47XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhyZXNwb25zZSwgQ29nbml0b1N0cmluZ3Mub25Vc2VyUGFzc3dvcmRDaGFuZ2VTdWNjZXNzZnVsKTtcbiAgICAgIGF3YWl0IHRpY2soMCk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcoZSBhcyBJQ29nbml0b1Jlc3BvbnNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25Vc2VyUGFzc3dvcmRSZXNldCgpIHtcblxuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG5cbiAgICB0aGlzLm1vZGVsLnBhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLnBhc3N3b3JkKTtcbiAgICB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtdXNlci1wYXNzd29yZC1yZXNldFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5yZXNldFBhc3N3b3JkKHRoaXMudXNlciEsIHRoaXMubW9kZWwucGFzc3dvcmQhLCB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aWNrKDI1MCk7XG4gICAgICB0aGlzLmZvcm1UeXBlID0gQ29nbml0b0Zvcm1UeXBlLlBhc3N3b3JkVXBkYXRlU3VjY2Vzc2Z1bDtcbiAgICAgIHRoaXMucHJvbXB0ID0gQ29nbml0b1N0cmluZ3Mub25QYXNzd29yZFVwZGF0ZWQ7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgIGF3YWl0IHRpY2soKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhlIGFzIElDb2duaXRvUmVzcG9uc2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KGZhbHNlKTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIG9uRm9yZ290UGFzc3dvcmQoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIFxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgYXdhaXQgdGljaygyNTApO1xuICAgIHRoaXMuZm9ybVR5cGUgPSBDb2duaXRvRm9ybVR5cGUuVXNlclZlcmlmaWNhdGlvblJlcXVlc3Q7XG4gICAgdGhpcy5wcm9tcHQgPSBDb2duaXRvU3RyaW5ncy5vblZlcmlmaWNhdGlvbkNvZGVTZW50O1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIGF3YWl0IHRpY2soKTtcbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIG9uUmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoKSB7XG5cbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIGNvbnN0IG1vZGVsID0geyB1c2VybmFtZSB9O1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcInJlcXVlc3QtdmVyaWZpY2F0aW9uLWNvZGVcIiwgXCJ1c2VybmFtZVwiOiB1c2VybmFtZSwgbW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5tb2RlbC51c2VybmFtZSA9IG1vZGVsLnVzZXJuYW1lO1xuICAgIH1cblxuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLnJlcXVlc3RWZXJpZmljYXRpb25Db2RlKG1vZGVsLnVzZXJuYW1lKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aWNrKDI1MCk7XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhyZXNwb25zZSwgQ29nbml0b1N0cmluZ3Mub25OZXdQYXNzd29yZFJlcXVpcmVkKTtcbiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3BvbnNlLCBmYWxzZSk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbmV3VXNlckZvcm1EaXNhYmxlZCgpIHtcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNhY2hlPy5yZXF1aXJlZEF0dHJpYnV0ZXM/LmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmKCF0aGlzLm1vZGVsW2tleV0pIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGlmKCF0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkIHx8ICF0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybSkge1xuICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmKHRoaXMubW9kZWwubmV3UGFzc3dvcmQgIT09IHRoaXMubW9kZWwubmV3UGFzc3dvcmRDb25maXJtKSB7XG4gICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplKCkge1xuXG5cbiAgICB0cnkge1xuICAgICAgaWYodGhpcy5jb2duaXRvVXJsICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZW1zX2FjY2Vzc190b2tlblwiKSkge1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuY29nbml0by5nZXRVc2VySW5mbyh0aGlzLmNvZ25pdG9VcmwpIGFzIElDb2duaXRvVXNlckRhdGE7XG5cbiAgICAgICAgLy9lbXVsYXRlIGNvZ25pdG8gdXNlci9zZXNzaW9uIGZvciBmZWRlcmF0ZWQgbG9naW5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gbmV3IENvZ25pdG9Vc2VyU2Vzc2lvbih7XG4gICAgICAgICAgSWRUb2tlbjogbmV3IENvZ25pdG9JZFRva2VuKHsgSWRUb2tlbjogaW5mby5pZFRva2VuIH0pLFxuICAgICAgICAgIEFjY2Vzc1Rva2VuOiBuZXcgQ29nbml0b0FjY2Vzc1Rva2VuKHsgQWNjZXNzVG9rZW46IGluZm8uYWNjZXNzVG9rZW4gfSksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvZ25pdG8uY3JlYXRlRmVkZXJhdGVkU2Vzc2lvbihpbmZvLmlkVG9rZW4sIGluZm8uYWNjZXNzVG9rZW4pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZih0aGlzLnNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UpIHtcblxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgXG4gICAgYXdhaXQgdGljaygyNTApO1xuXG4gICAgdGhpcy5zZXRNZXNzYWdpbmcocmVzcG9uc2UpO1xuICAgIHRoaXMuY2FjaGUgPSByZXNwb25zZS51c2VyQXR0cmlidXRlcyA/IHJlc3BvbnNlIDogdGhpcy5jYWNoZTtcblxuICAgIGlmKHJlc3BvbnNlLmVycm9yPy5jb2RlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLk5vdEF1dGhvcml6ZWQgJiYgcmVzcG9uc2UucmVxdWVzdCA9PT0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpOyAvL2xpa2VseSBiYWQgcGFzc3dvcmQgb3IgdG9vIG1hbnkgYXR0ZW1wdHNcbiAgICB9IGVsc2UgaWYocmVzcG9uc2UuZXJyb3I/LmNvZGUgPT09IENvZ25pdG9SZXNwb25zZVR5cGUuRm9yY2VQYXNzd29yZFJlc2V0ICYmIHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhpcy5pbml0aWF0ZVBhc3N3b3JkUmVzZXQocmVzcG9uc2UpOyAvL2FkbWluIGhhcyBmb3JjZWQgdXNlciBwYXNzd29yZCByZXNldFxuICAgIH0gZWxzZSBpZihyZXNwb25zZS50eXBlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLk90cENoYWxsZW5nZSkge1xuICAgICAgdGhpcy5tb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPSB0cnVlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9IGVsc2UgaWYocmVzcG9uc2UudHlwZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5QYXNzd29yZFJlc2V0ICYmIHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhpcy5wcm9tcHQgPSBDb2duaXRvU3RyaW5ncy5vbkZpcnN0TG9naW47XG4gICAgICB0aGlzLnNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXNwb25zZSk7IC8vbmV3IHVzZXJcbiAgICB9IGVsc2UgaWYoIXJlc3BvbnNlLmVycm9yPy5jb2RlICYmIChyZXNwb25zZS5yZXF1ZXN0ID09PSBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb24gfHwgcmVzcG9uc2UudHlwZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkICkpIHtcbiAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTsgLy9jb25uZWN0ZWRcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7IC8vdW5zdXBwb3J0ZWQgcmVzcG9uc2UgLS0gaG9wZWZ1bGx5IGRlc2NyaWJlZCBpbiBtZXNzYWdpbmdcbiAgICB9XG5cbiAgICB0aGlzLm9uUmVzcG9uc2UuZW1pdCh7IHJlc3BvbnNlLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVQYXNzd29yZFJlc2V0KHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlKSB7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29nbml0by5mb3Jnb3RQYXNzd29yZChyZXNwb25zZS51c2VyKTtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKHJlc3VsdCwgQ29nbml0b1N0cmluZ3Mub25OZXdQYXNzd29yZFJlcXVpcmVkKTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3BvbnNlLCBmYWxzZSk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdpbmcocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UsIHByb21wdDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICBpZihyZXNwb25zZS5lcnJvcj8uY29kZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5MaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKSB7XG4gICAgICB0aGlzLmVycm9yID0gQ29nbml0b1N0cmluZ3Mub25Ub29NYW55QXR0ZW1wdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3IgPSByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucHJvbXB0ID0gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0aW9uQ29tcGxldGUoKSB7XG4gICAgYXdhaXQgdGljaygpO1xuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaG93Q3VycmVudEZvcm0oKSB7XG4gICAgaWYoIXRoaXMuZm9ybVR5cGUpIHJldHVybjtcblxuICAgIGlmKHRoaXMuZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Hb29nbGVTaWduSW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25JbldpdGhHb29nbGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmhvc3RTdHlsZSA9IHtcbiAgICAgIFwiYmFja2dyb3VuZFwiOiB0aGlzLm1vZGFsQmFja2dyb3VuZCxcbiAgICAgIFwiei1pbmRleFwiOiB0aGlzLnpJbmRleFxuICAgIH1cblxuICAgIGF3YWl0IHRpY2soKTtcblxuICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICAgIHRoaXMub25SZWFkeS5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UsIGlzTmV3VXNlcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLmNhY2hlID0gcmVzdWx0O1xuICAgIHRoaXMucm93cyA9IFtdO1xuICAgIHRoaXMuZm9ybVR5cGUgPSBpc05ld1VzZXIgPyBDb2duaXRvRm9ybVR5cGUuTmV3VXNlciA6IENvZ25pdG9Gb3JtVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXQ7XG4gICAgXG4gICAgLy9idWJibGUgZmlyc3QgYW5kIGxhc3QgbmFtZSBmaWVsZHMgdG8gdGhlIHRvcCBvZiB0aGUgYXR0cmlidXRlcyBsaXN0XG4gICAgcmVzdWx0LnJlcXVpcmVkQXR0cmlidXRlcz8uc29ydCgoYSxiKSA9PiB7XG4gICAgICBpZihhID09PSBcImdpdmVuX25hbWVcIiAmJiBiID09PSBcImZhbWlseV9uYW1lXCIpIHJldHVybiAtMTtcbiAgICAgIGlmKGIgPT09IFwiZ2l2ZW5fbmFtZVwiICYmIGEgPT09IFwiZmFtaWx5X25hbWVcIikgcmV0dXJuIDE7XG4gICAgICBpZihhID09PSBcImdpdmVuX25hbWVcIikgcmV0dXJuIC0xO1xuICAgICAgaWYoYSA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gLSAxO1xuICAgICAgaWYoYiA9PT0gXCJnaXZlbl9uYW1lXCIpIHJldHVybiAxO1xuICAgICAgaWYoYiA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiBhID4gYiA/IDEgOiAtMTtcbiAgICB9KTtcblxuICAgIC8vaW5qZWN0IGZvcm1yb3dzIGZvciByZXF1aXJlZCBhdHRyaWJ1dGVzXG4gICAgcmVzdWx0LnJlcXVpcmVkQXR0cmlidXRlcz8uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYoa2V5Lm1hdGNoKC9eZW1haWwvKSkgcmV0dXJuO1xuICAgICAgY29uc3QgdmFsdWUgPSByZXN1bHQudXNlckF0dHJpYnV0ZXMhW2tleV1cbiAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHVuc25ha2Uoa2V5KSxcbiAgICAgICAga2V5XG4gICAgICB9KTtcbiAgICAgIHRoaXMubW9kZWxba2V5XSA9IHZhbHVlICYmIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aWNrKCk7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZyxzdHJpbmc+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge30gYXMgUmVjb3JkPHN0cmluZyxzdHJpbmc+O1xuICAgIGlmKCF0aGlzLmNhY2hlPy5yZXF1aXJlZEF0dHJpYnV0ZXMpIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIHRoaXMuY2FjaGUhLnJlcXVpcmVkQXR0cmlidXRlcyEuZm9yRWFjaChrZXkgPT4gYXR0cmlidXRlc1trZXldID0gdGhpcy5tb2RlbFtrZXldKTtcbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfVxuXG4gIHByaXZhdGUgc2lnbkluV2l0aEdvb2dsZSgpIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvZ25pdG9Vcmx9L29hdXRoMi9hdXRob3JpemU/aWRlbnRpdHlfcHJvdmlkZXI9JHt0aGlzLnByb3ZpZGVyTmFtZX0mcmVkaXJlY3RfdXJpPSR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0mcmVzcG9uc2VfdHlwZT1UT0tFTiZjbGllbnRfaWQ9JHt0aGlzLmNsaWVudElkfSZzY29wZT1lbWFpbCBvcGVuaWQgcHJvZmlsZSBhd3MuY29nbml0by5zaWduaW4udXNlci5hZG1pbmA7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJEYXRhKCk6IElDb2duaXRvVXNlckRhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBlbWFpbDogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImVtYWlsXCJdLFxuICAgICAgdXNlcm5hbWU6IHRoaXMuc2Vzc2lvbiEuZ2V0SWRUb2tlbigpLnBheWxvYWRbXCJjb2duaXRvOnVzZXJuYW1lXCJdLFxuICAgICAgc3ViOiAgdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcInN1YlwiXSxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImdpdmVuX25hbWVcIl0sXG4gICAgICBsYXN0TmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImZhbWlseV9uYW1lXCJdLFxuICAgICAgaWRUb2tlbjogIHRoaXMuc2Vzc2lvbiEuZ2V0SWRUb2tlbigpLmdldEp3dFRva2VuKCksXG4gICAgICBhY2Nlc3NUb2tlbjogIHRoaXMuc2Vzc2lvbiEuZ2V0QWNjZXNzVG9rZW4oKS5nZXRKd3RUb2tlbigpLFxuICAgIH1cbiAgfVxuXG59XG4iLCI8Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuTG9naW5cIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwibG9naW4oKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgW2Rpc2FibGVkXT1cImRpc2FibGVVc2VybmFtZVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCIhc3JwICYmICFvdHAgJiYgIXBhc3NrZXlzICYmICFtYWdpY0xpbmsgJiYgc2hvd0VtYWlsU3VibWl0QnV0dG9uXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FbnRlclVzZXJuYW1lKClcIiBbZGlzYWJsZWRdPVwiIW1vZGVsLnVzZXJuYW1lXCI+e3sgc3RyaW5ncy5sYWJlbFN1Ym1pdCB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cInNycCAmJiAhc2hvd1Bhc3N3b3JkRmllbGRcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzaG93UGFzc3dvcmRGaWVsZCA9IHRydWU7IG90cCA9IGZhbHNlOyBtYWdpY0xpbmsgPSBmYWxzZTsgcGFzc2tleXMgPSBmYWxzZVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsVXNlUmVndWxhclBhc3N3b3JkIH19PC9idXR0b24+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwic3JwICYmIHNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZFwiIFsobmdNb2RlbCldPVwibW9kZWwucGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwic3JwICYmIHNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFcIiAoY2xpY2spPVwib25Gb3Jnb3RQYXNzd29yZCgkZXZlbnQpXCI+e3sgc3RyaW5ncy5sYWJlbEZvcmdvdFBhc3N3b3JkIH19PC9idXR0b24+XG5cdFx0PGlucHV0IGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCJvdHAgJiYgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwib3RwXCI+e3sgc3RyaW5ncy5sYWJlbE90cEVudGVyIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJvdHBcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwib3RwXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5vdHBcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwicGFzc2tleXMgJiYgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc2tleS1yZWdcIj57eyBzdHJpbmdzLmxhYmVsUGFzc2tleUVudGVyIH19PC9sYWJlbD5cblx0XHQ8dGV4dGFyZWEgaWQ9XCJwYXNza2V5LXJlZ1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiBuYW1lPVwicGFzc2tleS1yZWdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3NrZXlcIj48L3RleHRhcmVhPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cIm90cFwiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldE90cCgpXCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiPnt7IG1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeSA/IHN0cmluZ3MubGFiZWxTdWJtaXQgOiBzdHJpbmdzLmxhYmVsT3RwIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJtYWdpY0xpbmtcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZXRNYWdpY0xpbmsoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsTWFnaWNMaW5rIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJwYXNza2V5c1wiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldFBhc3NrZXkoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBtb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPyBzdHJpbmdzLmxhYmVsU3VibWl0IDogc3RyaW5ncy5sYWJlbFBhc3NrZXlzIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIdG1sXT1cImVycm9yXCI+PC9kaXY+XG48L2Zvcm0+XG48Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuTmV3VXNlclwiIGNsYXNzPVwiY29nbml0by1mb3JtXCIgKHN1Ym1pdCk9XCJvbk5ld1VzZXIoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgZGlzYWJsZWQgLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsIG5vLW1iXCIgZm9yPVwibmV3LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbE5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8cCBjbGFzcz1cImNvZ25pdG8tc3VibGFiZWxcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmRSZXF1aXJlbWVudCB9fTwvcD5cblx0XHQ8aW5wdXQgaWQ9XCJuZXctcGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLW5ld1wiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInBhc3N3b3JkLWNvbmZpcm1cIj57eyBzdHJpbmdzLmxhYmVsQ29uZmlybU5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJwYXNzd29yZC1jb25maXJtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1jb25maXJtXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZENvbmZpcm1cIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInVzZXJuYW1lXCI+e3sgcm93LmxhYmVsfGxhYmVsZXIgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBbaWRdPVwicm93LmtleVwiICBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBbbmFtZV09XCJyb3cua2V5XCIgWyhuZ01vZGVsKV09XCJtb2RlbFtyb3cua2V5XVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXRcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwib25Gb3JjZVBhc3N3b3JkUmVzZXQoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgZGlzYWJsZWQgLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwiY29kZVwiPnt7IHN0cmluZ3MubGFiZWxDb2RlIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJjb2RlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNvZGVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLmNvZGVcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cIm5ldy1wYXNzd29yZFwiPnt7IHN0cmluZ3MubGFiZWxOZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PHAgY2xhc3M9XCJjb2duaXRvLXN1YmxhYmVsXCI+e3sgc3RyaW5ncy5sYWJlbFBhc3N3b3JkUmVxdWlyZW1lbnQgfX08L3A+XG5cdFx0PGlucHV0IGlkPVwibmV3LXBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1uZXdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJwYXNzd29yZC1jb25maXJtXCI+e3sgc3RyaW5ncy5sYWJlbENvbmZpcm1OZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwicGFzc3dvcmQtY29uZmlybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtY29uZmlybVwiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRDb25maXJtXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIm5ld1VzZXJGb3JtRGlzYWJsZWQoKVwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsU3VibWl0XCIvPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLlVzZXJWZXJpZmljYXRpb25SZXF1ZXN0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uUmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsU3VibWl0XCIvPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLlVzZXJQYXNzd29yZFJlc2V0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uVXNlclBhc3N3b3JkUmVzZXQoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJjdXJyZW50LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbEN1cnJlbnRQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwiY3VycmVudC1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJuZXctcGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxwIGNsYXNzPVwiY29nbml0by1zdWJsYWJlbFwiPnt7IHN0cmluZ3MubGFiZWxQYXNzd29yZFJlcXVpcmVtZW50IH19PC9wPlxuXHRcdDxpbnB1dCBpZD1cIm5ldy1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtbmV3XCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmQtY29uZmlybVwiPnt7IHN0cmluZ3MubGFiZWxDb25maXJtTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkLWNvbmZpcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLWNvbmZpcm1cIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5QYXNzd29yZFVwZGF0ZVN1Y2Nlc3NmdWxcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwic2hvd0Zvcm0gPSBmYWxzZVwiPlxuXHQ8ZGl2IGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW3ZhbHVlXT1cInN0cmluZ3MubGFiZWxDbG9zZVwiLz5cblx0PC9kaXY+XHRcbjwvZm9ybT4iXX0=
|