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
176 lines • 25.5 kB
JavaScript
import { __decorate, __extends, __metadata } from "tslib";
import { Component, Input } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { DataSource } from '@angular/cdk/table';
import { AuthorizatorService } from '../../services/authorizator.service';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar, MatSnackBarConfig } from '@angular/material/snack-bar';
import { UpsertRoleComponent } from './upsert-role/upsert-role.component';
import { DeleteRoleWarningComponent } from './delete-role-warning/delete-role-warning.component';
import { PermissionManagerComponent } from '../permission-manager/permission-manager.component';
import { ProgressbarService } from '../../services/progressbar.service';
var RolesDatabase = /** @class */ (function () {
function RolesDatabase() {
this.dataChange = new BehaviorSubject([]);
}
Object.defineProperty(RolesDatabase.prototype, "data", {
get: function () { return this.dataChange.value; },
enumerable: true,
configurable: true
});
return RolesDatabase;
}());
export { RolesDatabase };
var RolesDataSource = /** @class */ (function (_super) {
__extends(RolesDataSource, _super);
function RolesDataSource(rolesDatabase) {
var _this = _super.call(this) || this;
_this.rolesDatabase = rolesDatabase;
return _this;
}
RolesDataSource.prototype.connect = function () {
return this.rolesDatabase.dataChange;
};
RolesDataSource.prototype.disconnect = function () { };
return RolesDataSource;
}(DataSource));
export { RolesDataSource };
var RolesComponent = /** @class */ (function () {
function RolesComponent(authorizatorservice, dialog, snackbar, progressbarservice) {
this.authorizatorservice = authorizatorservice;
this.dialog = dialog;
this.snackbar = snackbar;
this.progressbarservice = progressbarservice;
this.displayedColumns = ['remove', 'edit', 'role', 'permissions'];
this.rolesDatabase = new RolesDatabase();
this.roles = [];
}
RolesComponent.prototype.ngOnInit = function () {
var _this = this;
this.progressbarservice.showRolesWaitBar(true);
this.authorizatorservice.getRoles(this.rootFirebasePath).then(function (roles) {
if (roles) {
_this.roles = roles.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.rolesDataSource = new RolesDataSource(_this.rolesDatabase);
_this.rolesDatabase.dataChange.next(roles);
_this.progressbarservice.showRolesWaitBar(false);
}
}).catch(function (error) {
console.error(error);
}).finally(function () {
_this.progressbarservice.showRolesWaitBar(false);
});
};
RolesComponent.prototype.addRole = function () {
var _this = this;
var dialogRef = this.dialog.open(UpsertRoleComponent, {
width: '95%',
maxWidth: '500px',
data: { role: null, rootFirebasePath: this.rootFirebasePath }
});
dialogRef.afterClosed().subscribe(function (roleAdded) {
if (roleAdded) {
_this.roles.push(roleAdded);
_this.roles = _this.roles.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.rolesDatabase.dataChange.next(_this.roles);
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
_this.snackbar.open('Role added successfully', null, config);
}
});
};
RolesComponent.prototype.editRole = function (inputRole) {
var _this = this;
var dialogRef = this.dialog.open(UpsertRoleComponent, {
width: '95%',
maxWidth: '500px',
data: { role: inputRole, rootFirebasePath: this.rootFirebasePath }
});
dialogRef.afterClosed().subscribe(function (roleUpdated) {
if (roleUpdated) {
var roleUpdatedIndex = _this.roles.findIndex(function (role) { return role.id === roleUpdated.id; });
if (roleUpdatedIndex > -1) {
_this.roles[roleUpdatedIndex].data = roleUpdated.data;
_this.rolesDatabase.dataChange.next(_this.roles);
}
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
_this.snackbar.open('Role updated successfully', null, config);
}
});
};
RolesComponent.prototype.removeRole = function (role) {
var _this = this;
var dialogRef = this.dialog.open(DeleteRoleWarningComponent, {
width: '300px',
data: role
});
dialogRef.afterClosed().subscribe(function (response) {
if (response) {
_this.progressbarservice.showRolesWaitBar(true);
_this.authorizatorservice.removeRole(_this.rootFirebasePath, role.id).then(function () {
_this.roles.splice(_this.roles.findIndex(function (roleArr) { return roleArr.id === role.id; }), 1);
_this.rolesDatabase.dataChange.next(_this.roles);
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['success-bar'];
_this.snackbar.open('Role removed successfully', null, config);
_this.progressbarservice.showRolesWaitBar(false);
}).catch(function (error) {
var config = new MatSnackBarConfig();
config.duration = 3000;
config.panelClass = ['error-bar'];
_this.snackbar.open(error.message, null, config);
});
}
});
};
RolesComponent.prototype.setPermissions = function (roleInput) {
var dialogRef = this.dialog.open(PermissionManagerComponent, {
width: '95%',
maxWidth: '600px',
data: { rootFirebasePath: this.rootFirebasePath, role: roleInput }
});
};
RolesComponent.ctorParameters = function () { return [
{ type: AuthorizatorService },
{ type: MatDialog },
{ type: MatSnackBar },
{ type: ProgressbarService }
]; };
__decorate([
Input(),
__metadata("design:type", String)
], RolesComponent.prototype, "rootFirebasePath", void 0);
RolesComponent = __decorate([
Component({
selector: 'lib-roles',
template: "<div class=\"roles-container\">\n <button mat-raised-button (click)=\"addRole()\"><mat-icon color=\"primary\">group_add</mat-icon> Add Role</button>\n <table mat-table [dataSource]=\"rolesDataSource\" 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 role\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"removeRole(role)\">\n <mat-icon color=\"primary\" aria-label=\"Remove role\">delete</mat-icon>\n </button>\n </td>\n </ng-container>\n\n <!-- Edit Column -->\n <ng-container matColumnDef=\"edit\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'icon-column'\"></th>\n <td mat-cell *matCellDef=\"let role\" [ngClass]=\"'icon-column'\">\n <button mat-icon-button (click)=\"editRole(role)\">\n <mat-icon color=\"primary\" aria-label=\"Edit role\">edit</mat-icon>\n </button>\n </td>\n </ng-container>\n \n <!-- Role Column -->\n <ng-container matColumnDef=\"role\">\n <th mat-header-cell *matHeaderCellDef [ngClass]=\"'roles-column'\"> User </th>\n <td mat-cell *matCellDef=\"let role\" [ngClass]=\"'roles-column'\">\n <div>{{role.data.name}}</div>\n <div>{{role.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 role\" [ngClass]=\"'permissions-column'\">\n <button mat-button (click)=\"setPermissions(role)\">\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}.roles-column{-webkit-box-flex:0;flex:0 0 300px}.roles-container{width:470px;margin:auto;padding:20px}"]
}),
__metadata("design:paramtypes", [AuthorizatorService, MatDialog,
MatSnackBar,
ProgressbarService])
], RolesComponent);
return RolesComponent;
}());
export { RolesComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1maXJlYmFzZS1hdXRob3JpemF0b3IvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9yb2xlcy9yb2xlcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLG1CQUFtQixFQUFjLE1BQU0scUNBQXFDLENBQUM7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDakcsT0FBTyxFQUFFLDBCQUEwQixFQUFrQixNQUFNLG9EQUFvRCxDQUFDO0FBQ2hILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFO0lBSUU7UUFIQSxlQUFVLEdBQStCLElBQUksZUFBZSxDQUFZLEVBQUUsQ0FBQyxDQUFDO0lBRzVELENBQUM7SUFGakIsc0JBQUksK0JBQUk7YUFBUixjQUF3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFHekQsb0JBQUM7QUFBRCxDQUFDLEFBTEQsSUFLQzs7QUFFRDtJQUFxQyxtQ0FBZTtJQUNsRCx5QkFBb0IsYUFBNEI7UUFBaEQsWUFDRSxpQkFBTyxTQUNSO1FBRm1CLG1CQUFhLEdBQWIsYUFBYSxDQUFlOztJQUVo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QUFPO1lBQ2pCLElBQUksRUFBRSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFvQjtTQUNyRixDQUFDLENBQUM7SUFDTCxDQUFDOztnQkFsSDhCLG1CQUFtQjtnQkFBaUIsU0FBUztnQkFDeEQsV0FBVztnQkFDRCxrQkFBa0I7O0lBUnZDO1FBQVIsS0FBSyxFQUFFOzs0REFBMEI7SUFEdkIsY0FBYztRQUwxQixTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsV0FBVztZQUNyQiw2cUVBQXFDOztTQUV0QyxDQUFDO3lDQVErQixtQkFBbUIsRUFBaUIsU0FBUztZQUN4RCxXQUFXO1lBQ0Qsa0JBQWtCO09BVHJDLGNBQWMsQ0EwSDFCO0lBQUQscUJBQUM7Q0FBQSxBQTFIRCxJQTBIQztTQTFIWSxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvbGVPYmogfSBmcm9tICcuLi8uLi9jbGFzc2VzL3JvbGUtb2JqJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHsgQXV0aG9yaXphdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2F1dGhvcml6YXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgVXBzZXJ0Um9sZUNvbXBvbmVudCwgRGlhbG9nRGF0YSB9IGZyb20gJy4vdXBzZXJ0LXJvbGUvdXBzZXJ0LXJvbGUuY29tcG9uZW50JztcbmltcG9ydCB7IERlbGV0ZVJvbGVXYXJuaW5nQ29tcG9uZW50IH0gZnJvbSAnLi9kZWxldGUtcm9sZS13YXJuaW5nL2RlbGV0ZS1yb2xlLXdhcm5pbmcuY29tcG9uZW50JztcbmltcG9ydCB7IFBlcm1pc3Npb25NYW5hZ2VyQ29tcG9uZW50LCBQZXJtaXNzaW9uRGF0YSB9IGZyb20gJy4uL3Blcm1pc3Npb24tbWFuYWdlci9wZXJtaXNzaW9uLW1hbmFnZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFByb2dyZXNzYmFyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Byb2dyZXNzYmFyLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgUm9sZXNEYXRhYmFzZSB7XG4gIGRhdGFDaGFuZ2U6IEJlaGF2aW9yU3ViamVjdDxSb2xlT2JqW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSb2xlT2JqW10+KFtdKTtcbiAgZ2V0IGRhdGEoKTogUm9sZU9ialtdIHsgcmV0dXJuIHRoaXMuZGF0YUNoYW5nZS52YWx1ZTsgfVxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlc0RhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlPGFueT4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJvbGVzRGF0YWJhc2U6IFJvbGVzRGF0YWJhc2UpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgY29ubmVjdCgpOiBPYnNlcnZhYmxlPFJvbGVPYmpbXT4ge1xuICAgIHJldHVybiB0aGlzLnJvbGVzRGF0YWJhc2UuZGF0YUNoYW5nZTtcbiAgfVxuXG4gIGRpc2Nvbm5lY3QoKSB7fVxufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1yb2xlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yb2xlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JvbGVzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUm9sZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSByb290RmlyZWJhc2VQYXRoOiBzdHJpbmc7XG4gIHB1YmxpYyBkaXNwbGF5ZWRDb2x1bW5zID0gWydyZW1vdmUnLCAnZWRpdCcsICdyb2xlJywgJ3Blcm1pc3Npb25zJ107XG4gIHByaXZhdGUgcm9sZXNEYXRhYmFzZSA9IG5ldyBSb2xlc0RhdGFiYXNlKCk7XG4gIHB1YmxpYyByb2xlc0RhdGFTb3VyY2U6IFJvbGVzRGF0YVNvdXJjZSB8IG51bGw7XG4gIHB1YmxpYyByb2xlczogUm9sZU9ialtdID0gW107XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aG9yaXphdG9yc2VydmljZTogQXV0aG9yaXphdG9yU2VydmljZSwgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc25hY2tiYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgcHJvZ3Jlc3NiYXJzZXJ2aWNlOiBQcm9ncmVzc2JhclNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnByb2dyZXNzYmFyc2VydmljZS5zaG93Um9sZXNXYWl0QmFyKHRydWUpO1xuICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS5nZXRSb2xlcyh0aGlzLnJvb3RGaXJlYmFzZVBhdGgpLnRoZW4ocm9sZXMgPT4ge1xuICAgICAgaWYgKHJvbGVzKSB7XG4gICAgICAgIHRoaXMucm9sZXMgPSByb2xlcy5zb3J0KChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lID4gY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPCBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm9sZXNEYXRhU291cmNlID0gbmV3IFJvbGVzRGF0YVNvdXJjZSh0aGlzLnJvbGVzRGF0YWJhc2UpO1xuICAgICAgICB0aGlzLnJvbGVzRGF0YWJhc2UuZGF0YUNoYW5nZS5uZXh0KHJvbGVzKTtcbiAgICAgICAgdGhpcy5wcm9ncmVzc2JhcnNlcnZpY2Uuc2hvd1JvbGVzV2FpdEJhcihmYWxzZSk7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLnByb2dyZXNzYmFyc2VydmljZS5zaG93Um9sZXNXYWl0QmFyKGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFJvbGUoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihVcHNlcnRSb2xlQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzk1JScsXG4gICAgICBtYXhXaWR0aDogJzUwMHB4JyxcbiAgICAgIGRhdGE6IHsgcm9sZTogbnVsbCwgcm9vdEZpcmViYXNlUGF0aDogdGhpcy5yb290RmlyZWJhc2VQYXRoIH0gYXMgRGlhbG9nRGF0YVxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJvbGVBZGRlZCA9PiB7XG4gICAgICBpZiAocm9sZUFkZGVkKSB7XG4gICAgICAgIHRoaXMucm9sZXMucHVzaChyb2xlQWRkZWQpO1xuICAgICAgICB0aGlzLnJvbGVzID0gdGhpcy5yb2xlcy5zb3J0KChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgaWYgKHByZXYuZGF0YS5uYW1lID4gY3Vyci5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJldi5kYXRhLm5hbWUgPCBjdXJyLmRhdGEubmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucm9sZXNEYXRhYmFzZS5kYXRhQ2hhbmdlLm5leHQodGhpcy5yb2xlcyk7XG4gICAgICAgIGNvbnN0IGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcgPSBuZXcgTWF0U25hY2tCYXJDb25maWcoKTtcbiAgICAgICAgY29uZmlnLmR1cmF0aW9uID0gMzAwMDtcbiAgICAgICAgY29uZmlnLnBhbmVsQ2xhc3MgPSBbJ3N1Y2Nlc3MtYmFyJ107XG4gICAgICAgIHRoaXMuc25hY2tiYXIub3BlbignUm9sZSBhZGRlZCBzdWNjZXNzZnVsbHknLCBudWxsLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZWRpdFJvbGUoaW5wdXRSb2xlOiBSb2xlT2JqKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihVcHNlcnRSb2xlQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzk1JScsXG4gICAgICBtYXhXaWR0aDogJzUwMHB4JyxcbiAgICAgIGRhdGE6IHsgcm9sZTogaW5wdXRSb2xlLCByb290RmlyZWJhc2VQYXRoOiB0aGlzLnJvb3RGaXJlYmFzZVBhdGggfSBhcyBEaWFsb2dEYXRhXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocm9sZVVwZGF0ZWQgPT4ge1xuICAgICAgaWYgKHJvbGVVcGRhdGVkKSB7XG4gICAgICAgIGNvbnN0IHJvbGVVcGRhdGVkSW5kZXggPSB0aGlzLnJvbGVzLmZpbmRJbmRleChyb2xlID0+IHJvbGUuaWQgPT09IHJvbGVVcGRhdGVkLmlkKTtcbiAgICAgICAgaWYgKHJvbGVVcGRhdGVkSW5kZXggPiAtMSkge1xuICAgICAgICAgIHRoaXMucm9sZXNbcm9sZVVwZGF0ZWRJbmRleF0uZGF0YSA9IHJvbGVVcGRhdGVkLmRhdGE7XG4gICAgICAgICAgdGhpcy5yb2xlc0RhdGFiYXNlLmRhdGFDaGFuZ2UubmV4dCh0aGlzLnJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnID0gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7XG4gICAgICAgIGNvbmZpZy5kdXJhdGlvbiA9IDMwMDA7XG4gICAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gWydzdWNjZXNzLWJhciddO1xuICAgICAgICB0aGlzLnNuYWNrYmFyLm9wZW4oJ1JvbGUgdXBkYXRlZCBzdWNjZXNzZnVsbHknLCBudWxsLCBjb25maWcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlUm9sZShyb2xlOiBSb2xlT2JqKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEZWxldGVSb2xlV2FybmluZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICczMDBweCcsXG4gICAgICBkYXRhOiByb2xlXG4gICAgfSk7XG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NiYXJzZXJ2aWNlLnNob3dSb2xlc1dhaXRCYXIodHJ1ZSk7XG4gICAgICAgIHRoaXMuYXV0aG9yaXphdG9yc2VydmljZS5yZW1vdmVSb2xlKHRoaXMucm9vdEZpcmViYXNlUGF0aCwgcm9sZS5pZCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yb2xlcy5zcGxpY2UoXG4gICAgICAgICAgICB0aGlzLnJvbGVzLmZpbmRJbmRleChyb2xlQXJyID0+IHJvbGVBcnIuaWQgPT09IHJvbGUuaWQpLCAxXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLnJvbGVzRGF0YWJhc2UuZGF0YUNoYW5nZS5uZXh0KHRoaXMucm9sZXMpO1xuICAgICAgICAgIGNvbnN0IGNvbmZpZzogTWF0U25hY2tCYXJDb25maWcgPSBuZXcgTWF0U25hY2tCYXJDb25maWcoKTtcbiAgICAgICAgICBjb25maWcuZHVyYXRpb24gPSAzMDAwO1xuICAgICAgICAgIGNvbmZpZy5wYW5lbENsYXNzID0gWydzdWNjZXNzLWJhciddO1xuICAgICAgICAgIHRoaXMuc25hY2tiYXIub3BlbignUm9sZSByZW1vdmVkIHN1Y2Nlc3NmdWxseScsIG51bGwsIGNvbmZpZyk7XG4gICAgICAgICAgdGhpcy5wcm9ncmVzc2JhcnNlcnZpY2Uuc2hvd1JvbGVzV2FpdEJhcihmYWxzZSk7XG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zdCBjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnID0gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7XG4gICAgICAgICAgY29uZmlnLmR1cmF0aW9uID0gMzAwMDtcbiAgICAgICAgICBjb25maWcucGFuZWxDbGFzcyA9IFsnZXJyb3ItYmFyJ107XG4gICAgICAgICAgdGhpcy5zbmFja2Jhci5vcGVuKGVycm9yLm1lc3NhZ2UsIG51bGwsIGNvbmZpZyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0UGVybWlzc2lvbnMocm9sZUlucHV0OiBSb2xlT2JqKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihQZXJtaXNzaW9uTWFuYWdlckNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc5NSUnLFxuICAgICAgbWF4V2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiB7IHJvb3RGaXJlYmFzZVBhdGg6IHRoaXMucm9vdEZpcmViYXNlUGF0aCwgcm9sZTogcm9sZUlucHV0IH0gYXMgUGVybWlzc2lvbkRhdGFcbiAgICB9KTtcbiAgfVxufVxuIl19