@knora/action
Version:
Knora ui module: action
149 lines • 20.1 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, EventEmitter, Inject, Input, Output } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { ApiResponseData, ApiResponseError, KnoraApiConnection, LoginResponse, LogoutResponse } from '@knora/api';
import { KnoraApiConnectionToken, Session, SessionService } from '@knora/core';
var LoginFormComponent = /** @class */ (function () {
function LoginFormComponent(knoraApiConnection, _session, _fb) {
this.knoraApiConnection = knoraApiConnection;
this._session = _session;
this._fb = _fb;
/**
* Emits true when the login process was successful and false in case of error on login or false after logout process
*
* @param {EventEmitter<boolean>} status
*
*/
this.status = new EventEmitter();
// show progress indicator
this.loading = false;
// specific error messages
this.loginErrorUser = false;
this.loginErrorPw = false;
this.loginErrorServer = false;
// labels for the login form
// TODO: should be handled by translation service (i18n)
this.formLabel = {
title: 'Login here',
name: 'Username',
pw: 'Password',
submit: 'Login',
retry: 'Retry',
logout: 'LOGOUT',
remember: 'Remember me',
forgot_pw: 'Forgot password?',
error: {
failed: 'Password or username is wrong',
server: 'There\'s an error with the server connection. Try it again later or inform the Knora Team'
}
};
// error definitions for the following form fields
this.formErrors = {
'username': '',
'password': ''
};
// error messages for the form fields defined in formErrors
this.validationMessages = {
'username': {
'required': 'user name is required.'
},
'password': {
'required': 'password is required'
}
};
}
LoginFormComponent.prototype.ngOnInit = function () {
// if session is valid (a user is logged-in) show a message, otherwise build the form
if (this._session.validateSession()) {
this.session = JSON.parse(localStorage.getItem('session'));
}
else {
this.buildForm();
}
};
LoginFormComponent.prototype.buildForm = function () {
this.form = this._fb.group({
username: ['', Validators.required],
password: ['', Validators.required]
});
};
/**
* @ignore
*
* Login and set session
*/
LoginFormComponent.prototype.login = function () {
var _this = this;
this.loading = true;
// reset the error messages
this.errorMessage = undefined;
// Grab values from form
var identifier = this.form.get('username').value;
var password = this.form.get('password').value;
var identifierType = (identifier.indexOf('@') > -1 ? 'email' : 'username');
this.knoraApiConnection.v2.auth.login(identifierType, identifier, password).subscribe(function (response) {
_this._session.setSession(response.body.token, identifier, identifierType);
setTimeout(function () {
_this.status.emit(true);
_this.loading = false;
}, 2200);
}, function (error) {
// error handling
_this.loginErrorUser = (error.status === 404);
_this.loginErrorPw = (error.status === 401);
_this.loginErrorServer = (error.status === 0);
_this.errorMessage = error;
_this.loading = false;
// TODO: update error handling similar to the old method (see commented code below)
});
};
/**
* @ignore
*
* Logout and destroy session
*
*/
LoginFormComponent.prototype.logout = function () {
var _this = this;
this.loading = true;
this.knoraApiConnection.v2.auth.logout().subscribe(function (response) {
_this.status.emit(response.body.status === 0);
_this._session.destroySession();
_this.loading = false;
}, function (error) {
console.error(error);
_this.loading = false;
});
};
LoginFormComponent.ctorParameters = function () { return [
{ type: KnoraApiConnection, decorators: [{ type: Inject, args: [KnoraApiConnectionToken,] }] },
{ type: SessionService },
{ type: FormBuilder }
]; };
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], LoginFormComponent.prototype, "navigate", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], LoginFormComponent.prototype, "color", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", EventEmitter)
], LoginFormComponent.prototype, "status", void 0);
LoginFormComponent = tslib_1.__decorate([
Component({
selector: 'kui-login-form',
template: "<div class=\"login-container\" *ngIf=\"!session\">\n\n <h2 class=\"login-form-title mat-title\">{{formLabel.title}}</h2>\n\n <!-- This is the login form -->\n <form [formGroup]=\"form\" (ngSubmit)=\"login()\" class=\"login-form\">\n\n <!-- Username -->\n <mat-form-field class=\"full-width login-field\">\n <!-- <mat-icon matPrefix>person</mat-icon> -->\n\n <input matInput autofocus [placeholder]=\"formLabel.name\" autocomplete=\"username\" formControlName=\"username\"\n #username cdkFocusInitial>\n\n </mat-form-field>\n\n <!-- Password -->\n <mat-form-field class=\"full-width login-field\">\n\n <!-- <mat-icon matPrefix>lock</mat-icon> -->\n\n <input matInput type=\"password\" [placeholder]=\"formLabel.pw\" autocomplete=\"current-password\"\n formControlName=\"password\">\n\n </mat-form-field>\n\n <br>\n\n <!-- Button: Login -->\n <button mat-raised-button type=\"submit\" [disabled]=\"!form.valid\" class=\"full-width submit-button\"\n [class.mat-primary]=\"!errorMessage\" [class.mat-warn]=\"errorMessage\">\n <kui-progress-indicator [color]=\"'white'\" [status]=\"0\" *ngIf=\"loading\" class=\"login-progress\">\n </kui-progress-indicator>\n <mat-icon *ngIf=\"errorMessage && !loading\">close</mat-icon>\n {{errorMessage ? formLabel.retry : formLabel.submit}}\n </button>\n\n <br><br>\n\n <!-- Error message as an answer from knora api request -->\n <p class=\"full-width login-error\" *ngIf=\"errorMessage\">\n {{loginErrorServer ? formLabel.error.server : formLabel.error.failed}}\n </p>\n </form>\n</div>\n\n\n<!-- a user is already logged in; show who it is and a logout button -->\n<div class=\"logout-container\" *ngIf=\"session\">\n <p>A user is already logged in:</p>\n <p>Username: <strong>{{session.user.name}}</strong></p>\n <br>\n <p>Please log out if it's not you.</p>\n <button mat-raised-button (click)=\"logout()\" class=\"full-width mat-warn logout-button\">\n <kui-progress-indicator [color]=\"'white'\" [status]=\"0\" *ngIf=\"loading\" class=\"login-progress\">\n </kui-progress-indicator>\n {{formLabel.logout}}\n </button>\n</div>\n",
styles: [".full-width{width:100%}.login-form-title{text-align:center}.login-error{color:#ef5350;text-align:center}.login-progress{display:inline-block;margin-right:6px}.login-container,.logout-container{margin-left:auto;margin-right:auto;position:relative;width:280px}.logout-button,.submit-button{height:48px}.center{text-align:center}"]
}),
tslib_1.__param(0, Inject(KnoraApiConnectionToken)),
tslib_1.__metadata("design:paramtypes", [KnoraApiConnection,
SessionService,
FormBuilder])
], LoginFormComponent);
return LoginFormComponent;
}());
export { LoginFormComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvYWN0aW9uLyIsInNvdXJjZXMiOlsibGliL2xvZ2luLWZvcm0vbG9naW4tZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsSCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQU8vRTtJQTJFSSw0QkFDNkMsa0JBQXNDLEVBQ3ZFLFFBQXdCLEVBQ3hCLEdBQWdCO1FBRmlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdkUsYUFBUSxHQUFSLFFBQVEsQ0FBZ0I7UUFDeEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQTlENUI7Ozs7O1dBS0c7UUFDTyxXQUFNLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFRdEUsMEJBQTBCO1FBQzFCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFLekIsMEJBQTBCO1FBQzFCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUV6Qiw0QkFBNEI7UUFDNUIsd0RBQXdEO1FBQ3hELGNBQVMsR0FBRztZQUNSLEtBQUssRUFBRSxZQUFZO1lBQ25CLElBQUksRUFBRSxVQUFVO1lBQ2hCLEVBQUUsRUFBRSxVQUFVO1lBQ2QsTUFBTSxFQUFFLE9BQU87WUFDZixL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Q0FBQSxBQWxLRCxJQWtLQztTQWxLWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZURhdGEsIEFwaVJlc3BvbnNlRXJyb3IsIEtub3JhQXBpQ29ubmVjdGlvbiwgTG9naW5SZXNwb25zZSwgTG9nb3V0UmVzcG9uc2UgfSBmcm9tICdAa25vcmEvYXBpJztcbmltcG9ydCB7IEtub3JhQXBpQ29ubmVjdGlvblRva2VuLCBTZXNzaW9uLCBTZXNzaW9uU2VydmljZSB9IGZyb20gJ0Brbm9yYS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdrdWktbG9naW4tZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xvZ2luLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2xvZ2luLWZvcm0uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMb2dpbkZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBkZWZpbmVkIHVybCAob3IgcGF0aCkgYWZ0ZXIgc3VjY2Vzc2Z1bCBsb2dpblxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbbmF2aWdhdGVdXG4gICAgICovXG4gICAgQElucHV0KCkgbmF2aWdhdGU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgeW91ciB0aGVtZSBjb2xvciBoZXJlLFxuICAgICAqIGl0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcHJvZ3Jlc3MtaW5kaWNhdG9yIGFuZCB0aGUgYnV0dG9uc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcl1cbiAgICAgKi9cbiAgICBASW5wdXQoKSBjb2xvcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIHRydWUgd2hlbiB0aGUgbG9naW4gcHJvY2VzcyB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciBvbiBsb2dpbiBvciBmYWxzZSBhZnRlciBsb2dvdXQgcHJvY2Vzc1xuICAgICAqXG4gICAgICogQHBhcmFtICB7RXZlbnRFbWl0dGVyPGJvb2xlYW4+fSBzdGF0dXNcbiAgICAgKlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBzdGF0dXM6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8vIGlzIHRoZXJlIGFscmVhZHkgYSB2YWxpZCBzZXNzaW9uP1xuICAgIHNlc3Npb246IFNlc3Npb247XG5cbiAgICAvLyBmb3JtXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgLy8gc2hvdyBwcm9ncmVzcyBpbmRpY2F0b3JcbiAgICBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBnZW5lcmFsIGVycm9yIG1lc3NhZ2VcbiAgICBlcnJvck1lc3NhZ2U6IEFwaVJlc3BvbnNlRXJyb3I7XG5cbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlc1xuICAgIGxvZ2luRXJyb3JVc2VyID0gZmFsc2U7XG4gICAgbG9naW5FcnJvclB3ID0gZmFsc2U7XG4gICAgbG9naW5FcnJvclNlcnZlciA9IGZhbHNlO1xuXG4gICAgLy8gbGFiZWxzIGZvciB0aGUgbG9naW4gZm9ybVxuICAgIC8vIFRPRE86IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRyYW5zbGF0aW9uIHNlcnZpY2UgKGkxOG4pXG4gICAgZm9ybUxhYmVsID0ge1xuICAgICAgICB0aXRsZTogJ0xvZ2luIGhlcmUnLFxuICAgICAgICBuYW1lOiAnVXNlcm5hbWUnLFxuICAgICAgICBwdzogJ1Bhc3N3b3JkJyxcbiAgICAgICAgc3VibWl0OiAnTG9naW4nLFxuICAgICAgICByZXRyeTogJ1JldHJ5JyxcbiAgICAgICAgbG9nb3V0OiAnTE9HT1VUJyxcbiAgICAgICAgcmVtZW1iZXI6ICdSZW1lbWJlciBtZScsXG4gICAgICAgIGZvcmdvdF9wdzogJ0ZvcmdvdCBwYXNzd29yZD8nLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgZmFpbGVkOiAnUGFzc3dvcmQgb3IgdXNlcm5hbWUgaXMgd3JvbmcnLFxuICAgICAgICAgICAgc2VydmVyOiAnVGhlcmVcXCdzIGFuIGVycm9yIHdpdGggdGhlIHNlcnZlciBjb25uZWN0aW9uLiBUcnkgaXQgYWdhaW4gbGF0ZXIgb3IgaW5mb3JtIHRoZSBLbm9yYSBUZWFtJ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIGVycm9yIGRlZmluaXRpb25zIGZvciB0aGUgZm9sbG93aW5nIGZvcm0gZmllbGRzXG4gICAgZm9ybUVycm9ycyA9IHtcbiAgICAgICAgJ3VzZXJuYW1lJzogJycsXG4gICAgICAgICdwYXNzd29yZCc6ICcnXG4gICAgfTtcblxuICAgIC8vIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgZm9ybSBmaWVsZHMgZGVmaW5lZCBpbiBmb3JtRXJyb3JzXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2VzID0ge1xuICAgICAgICAndXNlcm5hbWUnOiB7XG4gICAgICAgICAgICAncmVxdWlyZWQnOiAndXNlciBuYW1lIGlzIHJlcXVpcmVkLidcbiAgICAgICAgfSxcbiAgICAgICAgJ3Bhc3N3b3JkJzoge1xuICAgICAgICAgICAgJ3JlcXVpcmVkJzogJ3Bhc3N3b3JkIGlzIHJlcXVpcmVkJ1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoS25vcmFBcGlDb25uZWN0aW9uVG9rZW4pIHByaXZhdGUga25vcmFBcGlDb25uZWN0aW9uOiBLbm9yYUFwaUNvbm5lY3Rpb24sXG4gICAgICAgIHByaXZhdGUgX3Nlc3Npb246IFNlc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXJcbiAgICApIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIC8vIGlmIHNlc3Npb24gaXMgdmFsaWQgKGEgdXNlciBpcyBsb2dnZWQtaW4pIHNob3cgYSBtZXNzYWdlLCBvdGhlcndpc2UgYnVpbGQgdGhlIGZvcm1cbiAgICAgICAgaWYgKHRoaXMuX3Nlc3Npb24udmFsaWRhdGVTZXNzaW9uKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nlc3Npb24nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLl9mYi5ncm91cCh7XG4gICAgICAgICAgICB1c2VybmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIExvZ2luIGFuZCBzZXQgc2Vzc2lvblxuICAgICAqL1xuICAgIGxvZ2luKCkge1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gcmVzZXQgdGhlIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEdyYWIgdmFsdWVzIGZyb20gZm9ybVxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5mb3JtLmdldCgndXNlcm5hbWUnKS52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFzc3dvcmQgPSB0aGlzLmZvcm0uZ2V0KCdwYXNzd29yZCcpLnZhbHVlO1xuXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJUeXBlOiAnaXJpJyB8ICdlbWFpbCcgfCAndXNlcm5hbWUnID0gKGlkZW50aWZpZXIuaW5kZXhPZignQCcpID4gLTEgPyAnZW1haWwnIDogJ3VzZXJuYW1lJyk7XG5cbiAgICAgICAgdGhpcy5rbm9yYUFwaUNvbm5lY3Rpb24udjIuYXV0aC5sb2dpbihpZGVudGlmaWVyVHlwZSwgaWRlbnRpZmllciwgcGFzc3dvcmQpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPExvZ2luUmVzcG9uc2U+KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9zZXNzaW9uLnNldFNlc3Npb24ocmVzcG9uc2UuYm9keS50b2tlbiwgaWRlbnRpZmllciwgaWRlbnRpZmllclR5cGUpO1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sIDIyMDApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogQXBpUmVzcG9uc2VFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yVXNlciA9IChlcnJvci5zdGF0dXMgPT09IDQwNCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yUHcgPSAoZXJyb3Iuc3RhdHVzID09PSA0MDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9naW5FcnJvclNlcnZlciA9IChlcnJvci5zdGF0dXMgPT09IDApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBlcnJvcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHVwZGF0ZSBlcnJvciBoYW5kbGluZyBzaW1pbGFyIHRvIHRoZSBvbGQgbWV0aG9kIChzZWUgY29tbWVudGVkIGNvZGUgYmVsb3cpXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogTG9nb3V0IGFuZCBkZXN0cm95IHNlc3Npb25cbiAgICAgKlxuICAgICAqL1xuICAgIGxvZ291dCgpIHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmtub3JhQXBpQ29ubmVjdGlvbi52Mi5hdXRoLmxvZ291dCgpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZTogQXBpUmVzcG9uc2VEYXRhPExvZ291dFJlc3BvbnNlPikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzLmVtaXQocmVzcG9uc2UuYm9keS5zdGF0dXMgPT09IDApO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nlc3Npb24uZGVzdHJveVNlc3Npb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IEFwaVJlc3BvbnNlRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgIH1cblxufVxuIl19