angular-firebase-authorizator
Version:
Beta version of authorizator for angular linked to firebase, it creates a model in firestore to assign permissions to users an roles, and creates a view to update this permissions
150 lines • 21.2 kB
JavaScript
import { __decorate, __extends, __metadata } from "tslib";
import { Component, Input } from '@angular/core';
import { AuthorizatorService } from '../../services/authorizator.service';
import { BehaviorSubject } from 'rxjs';
import { DataSource } from '@angular/cdk/table';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
import { UpsertUserComponent } from './upsert-user/upsert-user.component';
import { DeleteUserWarningComponent } from './delete-user-warning/delete-user-warning.component';
import { PermissionManagerComponent } from '../permission-manager/permission-manager.component';
import { ProgressbarService } from '../../services/progressbar.service';
var UsersDatabase = /** @class */ (function () {
function UsersDatabase() {
this.dataChange = new BehaviorSubject([]);
}
Object.defineProperty(UsersDatabase.prototype, "data", {
get: function () { return this.dataChange.value; },
enumerable: true,
configurable: true
});
return UsersDatabase;
}());
export { UsersDatabase };
var UsersDataSource = /** @class */ (function (_super) {
__extends(UsersDataSource, _super);
function UsersDataSource(usersDatabase) {
var _this = _super.call(this) || this;
_this.usersDatabase = usersDatabase;
return _this;
}
UsersDataSource.prototype.connect = function () {
return this.usersDatabase.dataChange;
};
UsersDataSource.prototype.disconnect = function () { };
return UsersDataSource;
}(DataSource));
export { UsersDataSource };
var UsersComponent = /** @class */ (function () {
function UsersComponent(authorizatorservice, dialog, snackbar, progressbarservice) {
this.authorizatorservice = authorizatorservice;
this.dialog = dialog;
this.snackbar = snackbar;
this.progressbarservice = progressbarservice;
this.displayedColumns = ['remove', 'user', 'permissions'];
this.usersDatabase = new UsersDatabase();
this.users = [];
}
UsersComponent.prototype.ngOnInit = function () {
var _this = this;
this.progressbarservice.showUsersWaitBar(true);
this.authorizatorservice.getUsers(this.rootFirebasePath).then(function (users) {
_this.progressbarservice.showUsersWaitBar(false);
if (users) {
_this.users = users.sort(function (prev, curr) {
if (prev.data.name > curr.data.name) {
return 1;
}
if (prev.data.name < curr.data.name) {
return -1;
}
return 0;
});
_this.usersDataSource = new UsersDataSource(_this.usersDatabase);
_this.usersDatabase.dataChange.next(users);
}
});
};
UsersComponent.prototype.addUser = function () {
var _this = this;
var dialogRef = this.dialog.open(UpsertUserComponent, {
width: '300px',
data: { type: 'add', user: null, rootFirebasePath: this.rootFirebasePath }
});
dialogRef.afterClosed().subscribe(function (userAdded) {
if (userAdded) {
_this.users.push(userAdded);
_this.users = _this.users.sort(function (prev, curr) {
if (prev.data.name > curr.data.name) {
return 1;
}
if (prev.data.name < curr.data.name) {
return -1;
}
return 0;
});
_this.usersDatabase.dataChange.next(_this.users);
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
_this.snackbar.open('User added successfully', null, config);
}
});
};
UsersComponent.prototype.removeUser = function (user) {
var _this = this;
var dialogRef = this.dialog.open(DeleteUserWarningComponent, {
width: '300px',
data: user
});
dialogRef.afterClosed().subscribe(function (response) {
if (response) {
_this.progressbarservice.showUsersWaitBar(true);
_this.authorizatorservice.removeUser(_this.rootFirebasePath, user.id).then(function () {
_this.progressbarservice.showUsersWaitBar(false);
_this.users.splice(_this.users.findIndex(function (userArr) { return userArr.id === user.id; }), 1);
_this.usersDatabase.dataChange.next(_this.users);
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
_this.snackbar.open('User removed successfully', null, config);
}).catch(function (error) {
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['error-bar'];
_this.snackbar.open(error.message, null, config);
});
}
});
};
UsersComponent.prototype.setPermissions = function (userInput) {
var dialogRef = this.dialog.open(PermissionManagerComponent, {
width: '95%',
maxWidth: '600px',
data: { rootFirebasePath: this.rootFirebasePath, user: userInput }
});
};
UsersComponent.ctorParameters = function () { return [
{ type: AuthorizatorService },
{ type: MatDialog },
{ type: MatSnackBar },
{ type: ProgressbarService }
]; };
__decorate([
Input(),
__metadata("design:type", String)
], UsersComponent.prototype, "rootFirebasePath", void 0);
UsersComponent = __decorate([
Component({
selector: 'lib-users',
template: "<div class=\"users-container\">\n <button mat-raised-button (click)=\"addUser()\"><mat-icon color=\"primary\">person_add</mat-icon> Add User</button>\n <table mat-table [dataSource]=\"usersDataSource\" style=\"width: 100%;\">\n <!--- Note that these columns can be defined in any order.\n The actual rendered columns are set as a property on the row definition\" -->\n \n <!-- Remove Column -->\n <ng-container matColumnDef=\"remove\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'icon-column'\"></th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"removeUser(user)\">\n <mat-icon color=\"primary\" aria-label=\"Remove user\">delete</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <!-- User Column -->\n <ng-container matColumnDef=\"user\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'users-column'\"> User </th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'users-column'\">\n <div>{{user.data.name}}</div>\n <div>{{user.data.email}}</div>\n </td>\n </ng-container>\n \n <!-- Permissions Column -->\n <ng-container matColumnDef=\"permissions\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'permissions-column'\">Permissions</th>\n <td mat-cell *matCellDef=\"let user\" [ngClass]=\"'permissions-column'\">\n <button mat-button (click)=\"setPermissions(user)\">\n <mat-icon color=\"primary\" aria-label=\"Set permissions\">vpn_key</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n</div>\n",
styles: [".icon-column{-webkit-box-flex:0;flex:0 0 50px}.permissions-column{-webkit-box-flex:0;flex:0 0 100px}.users-column{-webkit-box-flex:0;flex:0 0 300px}.users-container{width:470px;margin:auto;padding:20px}"]
}),
__metadata("design:paramtypes", [AuthorizatorService, MatDialog,
MatSnackBar,
ProgressbarService])
], UsersComponent);
return UsersComponent;
}());
export { UsersComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1maXJlYmFzZS1hdXRob3JpemF0b3IvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy91c2Vycy91c2Vycy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFjLE1BQU0scUNBQXFDLENBQUM7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUFrQixNQUFNLG9EQUFvRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFO0lBSUU7UUFIQSxlQUFVLEdBQStCLElBQUksZUFBZSxDQUFZLEVBQUUsQ0FBQyxDQUFDO0lBRzVELENBQUM7SUFGakIsc0JBQUksK0JBQUk7YUFBUixjQUF3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFHekQsb0JBQUM7QUFBRCxDQUFDLEFBTEQsSUFLQzs7QUFFRDtJQUFxQyxtQ0FBZTtJQUNsRCx5QkFBb0IsYUFBNEI7UUFBaEQsWUFDRSxpQkFBTyxTQUNSO1FBRm1CLG1CQUFhLEdBQWIsYUFBYSxDQUFlOztJQUVo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O2dCQUNELGtCQUFrQjs7SUFSdkM7UUFBUixLQUFLLEVBQUU7OzREQUEwQjtJQUR2QixjQUFjO1FBTDFCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxXQUFXO1lBQ3JCLDJ3REFBcUM7O1NBRXRDLENBQUM7eUNBUStCLG1CQUFtQixFQUFpQixTQUFTO1lBQ3hELFdBQVc7WUFDRCxrQkFBa0I7T0FUckMsY0FBYyxDQStGMUI7SUFBRCxxQkFBQztDQUFBLEFBL0ZELElBK0ZDO1NBL0ZZLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF1dGhvcml6YXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdXRob3JpemF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHsgVXNlck9iaiB9IGZyb20gJy4uLy4uL2NsYXNzZXMvdXNlci1vYmonO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyLCBNYXRTbmFja0JhckNvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBVcHNlcnRVc2VyQ29tcG9uZW50LCBEaWFsb2dEYXRhIH0gZnJvbSAnLi91cHNlcnQtdXNlci91cHNlcnQtdXNlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVsZXRlVXNlcldhcm5pbmdDb21wb25lbnQgfSBmcm9tICcuL2RlbGV0ZS11c2VyLXdhcm5pbmcvZGVsZXRlLXVzZXItd2FybmluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGVybWlzc2lvbk1hbmFnZXJDb21wb25lbnQsIFBlcm1pc3Npb25EYXRhIH0gZnJvbSAnLi4vcGVybWlzc2lvbi1tYW5hZ2VyL3Blcm1pc3Npb24tbWFuYWdlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUHJvZ3Jlc3NiYXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvZ3Jlc3NiYXIuc2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBVc2Vyc0RhdGFiYXNlIHtcbiAgZGF0YUNoYW5nZTogQmVoYXZpb3JTdWJqZWN0PFVzZXJPYmpbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFVzZXJPYmpbXT4oW10pO1xuICBnZXQgZGF0YSgpOiBVc2VyT2JqW10geyByZXR1cm4gdGhpcy5kYXRhQ2hhbmdlLnZhbHVlOyB9XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJzRGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2U8YW55PiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdXNlcnNEYXRhYmFzZTogVXNlcnNEYXRhYmFzZSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBjb25uZWN0KCk6IE9ic2VydmFibGU8VXNlck9ialtdPiB7XG4gICAgcmV0dXJuIHRoaXMudXNlcnNEYXRhYmFzZS5kYXRhQ2hhbmdlO1xuICB9XG5cbiAgZGlzY29ubmVjdCgpIHt9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXVzZXJzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXNlcnMuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBVc2Vyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHJvb3RGaXJlYmFzZVBhdGg6IHN0cmluZztcbiAgcHVibGljIGRpc3BsYXllZENvbHVtbnMgPSBbJ3JlbW92ZScsICd1c2VyJywgJ3Blcm1pc3Npb25zJ107XG4gIHByaXZhdGUgdXNlcnNEYXRhYmFzZSA9IG5ldyBVc2Vyc0RhdGFiYXNlKCk7XG4gIHB1YmxpYyB1c2Vyc0RhdGFTb3VyY2U6IFVzZXJzRGF0YVNvdXJjZSB8IG51bGw7XG4gIHB1YmxpYyB1c2VyczogVXNlck9ialtdID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aG9yaXphdG9yc2VydmljZTogQXV0aG9yaXphdG9yU2VydmljZSwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc25hY2tiYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgcHJvZ3Jlc3NiYXJzZXJ2aWNlOiBQcm9ncmVzc2JhclNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnByb2dyZXNzYmFyc2VydmljZS5zaG93VXNlcnNXYWl0QmFyKHRydWUpO1xuICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS5nZXRVc2Vycyh0aGlzLnJvb3RGaXJlYmFzZVBhdGgpLnRoZW4odXNlcnMgPT4ge1xuICAgICAgdGhpcy5wcm9ncmVzc2JhcnNlcnZpY2Uuc2hvd1VzZXJzV2FpdEJhcihmYWxzZSk7XG4gICAgICBpZiAodXNlcnMpIHtcbiAgICAgICAgdGhpcy51c2VycyA9IHVzZXJzLnNvcnQoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPiBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwcmV2LmRhdGEubmFtZSA8IGN1cnIuZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51c2Vyc0RhdGFTb3VyY2UgPSBuZXcgVXNlcnNEYXRhU291cmNlKHRoaXMudXNlcnNEYXRhYmFzZSk7XG4gICAgICAgIHRoaXMudXNlcnNEYXRhYmFzZS5kYXRhQ2hhbmdlLm5leHQodXNlcnMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWRkVXNlcigpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFVwc2VydFVzZXJDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnMzAwcHgnLFxuICAgICAgZGF0YTogeyB0eXBlOiAnYWRkJywgdXNlcjogbnVsbCwgcm9vdEZpcmViYXNlUGF0aDogdGhpcy5yb290RmlyZWJhc2VQYXRoIH0gYXMgRGlhbG9nRGF0YVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHVzZXJBZGRlZCA9PiB7XG4gICAgICBpZiAodXNlckFkZGVkKSB7XG4gICAgICAgIHRoaXMudXNlcnMucHVzaCh1c2VyQWRkZWQpO1xuICAgICAgICB0aGlzLnVzZXJzID0gdGhpcy51c2Vycy5zb3J0KChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lID4gY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPCBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXNlcnNEYXRhYmFzZS5kYXRhQ2hhbmdlLm5leHQodGhpcy51c2Vycyk7XG4gICAgICAgIGNvbnN0IGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcgPSBuZXcgTWF0U25hY2tCYXJDb25maWcoKTtcbiAgICAgICAgY29uZmlnLmR1cmF0aW9uID0gMzAwMDtcbiAgICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSBbJ3N1Y2Nlc3MtYmFyJ107XG4gICAgICAgIHRoaXMuc25hY2tiYXIub3BlbignVXNlciBhZGRlZCBzdWNjZXNzZnVsbHknLCBudWxsLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlVXNlcih1c2VyOiBVc2VyT2JqKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVVc2VyV2FybmluZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICczMDBweCcsXG4gICAgICBkYXRhOiB1c2VyXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NiYXJzZXJ2aWNlLnNob3dVc2Vyc1dhaXRCYXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS5yZW1vdmVVc2VyKHRoaXMucm9vdEZpcmViYXNlUGF0aCwgdXNlci5pZCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzc2JhcnNlcnZpY2Uuc2hvd1VzZXJzV2FpdEJhcihmYWxzZSk7XG4gICAgICAgICAgdGhpcy51c2Vycy5zcGxpY2UoXG4gICAgICAgICAgICB0aGlzLnVzZXJzLmZpbmRJbmRleCh1c2VyQXJyID0+IHVzZXJBcnIuaWQgPT09IHVzZXIuaWQpLCAxXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnVzZXJzRGF0YWJhc2UuZGF0YUNoYW5nZS5uZXh0KHRoaXMudXNlcnMpO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcgPSBuZXcgTWF0U25hY2tCYXJDb25maWcoKTtcbiAgICAgICAgICBjb25maWcuZHVyYXRpb24gPSAzMDAwO1xuICAgICAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gWydzdWNjZXNzLWJhciddO1xuICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbignVXNlciByZW1vdmVkIHN1Y2Nlc3NmdWxseScsIG51bGwsIGNvbmZpZyk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zdCBjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnID0gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7XG4gICAgICAgICAgY29uZmlnLmR1cmF0aW9uID0gMzAwMDtcbiAgICAgICAgICBjb25maWcucGFuZWxDbGFzcyA9IFsnZXJyb3ItYmFyJ107XG4gICAgICAgICAgdGhpcy5zbmFja2Jhci5vcGVuKGVycm9yLm1lc3NhZ2UsIG51bGwsIGNvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0UGVybWlzc2lvbnModXNlcklucHV0OiBVc2VyT2JqKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihQZXJtaXNzaW9uTWFuYWdlckNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc5NSUnLFxuICAgICAgbWF4V2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiB7IHJvb3RGaXJlYmFzZVBhdGg6IHRoaXMucm9vdEZpcmViYXNlUGF0aCwgdXNlcjogdXNlcklucHV0IH0gYXMgUGVybWlzc2lvbkRhdGFcbiAgICB9KTtcbiAgfVxufVxuIl19