@cause-911/management
Version:
Run `npm install @cause-911/management --save` to add this library to your project
525 lines • 40.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { ManagementGroupService } from '../shared/services/management-group.service';
import { ManagementUserService } from '../shared/services/management-user.service';
import { ManagementPermissionService } from '../shared/services/management-permission.service';
import { BreakpointObserver } from '@angular/cdk/layout';
import { map } from 'rxjs/operators';
var CauseManagementGroupComponent = /** @class */ (function () {
function CauseManagementGroupComponent(managementGroupService, managementUserService, managementPermissionService, breakpointObserver) {
var _this = this;
this.managementGroupService = managementGroupService;
this.managementUserService = managementUserService;
this.managementPermissionService = managementPermissionService;
this.hoverStatePermission = true;
this.groups = [];
this.users = [];
this.permissions = [];
this.userFullName = {};
this.showColumn = true;
this.showColumnXS = true;
this.translations = [];
this.calculateUsersCellValue = (/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var users = (e.users ? (/** @type {?} */ (e.users)) : []);
/** @type {?} */
var usersNames = [];
users.forEach((/**
* @param {?} user
* @return {?}
*/
function (user) {
/** @type {?} */
var userGroup = _this.users.filter((/**
* @param {?} u
* @return {?}
*/
function (u) { return u.id === user.idUser; }));
if (userGroup && userGroup[0]) {
usersNames.push(userGroup[0].firstName + ' ' + userGroup[0].lastName);
}
}));
usersNames = usersNames.sort((/**
* @param {?} one
* @param {?} two
* @return {?}
*/
function (one, two) { return (one < two ? -1 : 1); }));
return usersNames.join(', ');
});
this.groupNameAlreadyUsedValidation = (/**
* @param {?} e
* @return {?}
*/
function (e) {
return _this.managementGroupService.hasExistingGroupName(e.data).pipe(map((/**
* @param {?} exist
* @return {?}
*/
function (exist) {
return !exist;
}))).toPromise();
});
breakpointObserver.observe(['(max-width: 1000px)']).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
_this.showColumn = !result.matches;
}));
breakpointObserver.observe(['(max-width: 600px)']).subscribe((/**
* @param {?} result
* @return {?}
*/
function (result) {
_this.showColumnXS = !result.matches;
}));
}
/**
* @return {?}
*/
CauseManagementGroupComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.managementUserService.getAll().subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.users = data;
_this.users.forEach((/**
* @param {?} user
* @return {?}
*/
function (user) {
if (user.isActive) {
if (user.firstName !== '' && user.lastName !== '') {
_this.userFullName[user.id] = user.firstName + " " + user.lastName;
}
}
}));
}));
this.managementPermissionService.getAll().subscribe((/**
* @param {?} permissions
* @return {?}
*/
function (permissions) {
/** @type {?} */
var permissionIndex = permissions.findIndex((/**
* @param {?} c
* @return {?}
*/
function (c) {
return c.tag === 'CanAccessPermissions';
}));
if (permissionIndex !== -1) {
permissions.splice(permissionIndex, 1);
}
permissions.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
if (a.name < b.name) {
return -1;
}
if (a.name > b.name) {
return 1;
}
return 0;
}));
_this.permissions = permissions;
}));
this.getGroups();
};
/**
* @param {?} data
* @return {?}
*/
CauseManagementGroupComponent.prototype.fullName = /**
* @param {?} data
* @return {?}
*/
function (data) {
if (!data) {
return '';
}
return data.firstName + " " + data.lastName;
};
/**
* @param {?} field
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.getGroupUser = /**
* @param {?} field
* @param {?} e
* @return {?}
*/
function (field, e) {
/** @type {?} */
var users = [];
if (this.groupUsers) {
this.groupUsers.forEach((/**
* @param {?} user
* @return {?}
*/
function (user) {
users.push(user.idUser);
}));
}
e.component.option('value', users);
};
/**
* @param {?} field
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.setGroupUser = /**
* @param {?} field
* @param {?} e
* @return {?}
*/
function (field, e) {
/** @type {?} */
var groupUser = [];
e.value.forEach((/**
* @param {?} idUser
* @return {?}
*/
function (idUser) {
/** @type {?} */
var groupIndex = (field.data.users || []).findIndex((/**
* @param {?} g
* @return {?}
*/
function (g) { return g.idUser === idUser; }));
if (groupIndex === -1) {
groupUser.push((/** @type {?} */ ({ idUser: idUser, })));
}
else {
groupUser.push(field.data.users[groupIndex]);
}
}));
field.setValue(JSON.parse(JSON.stringify(groupUser)));
};
/**
* @param {?} field
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.setGroupPermission = /**
* @param {?} field
* @param {?} e
* @return {?}
*/
function (field, e) {
/** @type {?} */
var groupUser = [];
e.value.forEach((/**
* @param {?} idUser
* @return {?}
*/
function (idUser) {
groupUser.push((/** @type {?} */ ({
idUser: idUser,
})));
}));
field.setValue(JSON.parse(JSON.stringify(groupUser)));
};
/**
* @param {?} field
* @param {?} permission
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.getPermissionStatus = /**
* @param {?} field
* @param {?} permission
* @param {?} e
* @return {?}
*/
function (field, permission, e) {
/** @type {?} */
var groupPermission = (field.value || []).find((/**
* @param {?} p
* @return {?}
*/
function (p) { return p.idModulePermission === permission.id; }));
if (groupPermission) {
e.component.option('value', groupPermission.isAllowed);
}
else {
e.component.option('value', undefined);
}
};
/**
* @param {?} field
* @param {?} permission
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.checkBoxToggled = /**
* @param {?} field
* @param {?} permission
* @param {?} e
* @return {?}
*/
function (field, permission, e) {
if (e.component.skipOnValueChanged) {
e.component.skipOnValueChanged = false;
return;
}
if (e.component.setUndefinedNextTime) {
e.component.setUndefinedNextTime = false;
e.component.skipOnValueChanged = true;
e.component.option('value', undefined);
this.setPermissionStatus(field, permission, undefined);
return;
}
if (e.value === false) {
e.component.setUndefinedNextTime = true;
}
this.setPermissionStatus(field, permission, e.value);
};
/**
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.onRowInserted = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.saveGroup((/** @type {?} */ (e.data)));
};
/**
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.onRowUpdated = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.saveGroup((/** @type {?} */ (e.data)));
};
/**
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.onRowRemoved = /**
* @param {?} e
* @return {?}
*/
function (e) {
var _this = this;
/** @type {?} */
var group = ((/** @type {?} */ (e.data)));
this.managementGroupService.delete(group.id).subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.getGroups();
}));
};
/**
* @param {?} e
* @return {?}
*/
CauseManagementGroupComponent.prototype.onEditingStart = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.groupUsers = e.data.users;
};
/**
* @return {?}
*/
CauseManagementGroupComponent.prototype.onInitNewRow = /**
* @return {?}
*/
function () {
this.groupUsers = [];
};
/**
* @private
* @param {?} field
* @param {?} permission
* @param {?} value
* @return {?}
*/
CauseManagementGroupComponent.prototype.setPermissionStatus = /**
* @private
* @param {?} field
* @param {?} permission
* @param {?} value
* @return {?}
*/
function (field, permission, value) {
/** @type {?} */
var groupPermissions = field.value || [];
/** @type {?} */
var groupIndex = groupPermissions.findIndex((/**
* @param {?} p
* @return {?}
*/
function (p) { return p.idModulePermission === permission.id; }));
if (groupIndex > -1) {
groupPermissions[groupIndex].isAllowed = value;
}
else {
groupPermissions.push((/** @type {?} */ ({
idModulePermission: permission.id,
isAllowed: value,
})));
}
field.setValue(JSON.parse(JSON.stringify(groupPermissions)));
};
/**
* @private
* @param {?} group
* @return {?}
*/
CauseManagementGroupComponent.prototype.saveGroup = /**
* @private
* @param {?} group
* @return {?}
*/
function (group) {
var _this = this;
this.removePermissionUndefined(group);
if (group.users) {
group.users.forEach((/**
* @param {?} userGroup
* @return {?}
*/
function (userGroup) {
userGroup.idGroup = group.id;
}));
}
if (group.permissions) {
group.permissions.forEach((/**
* @param {?} groupPermission
* @return {?}
*/
function (groupPermission) {
groupPermission.idGroup = group.id;
}));
}
this.managementGroupService.save(group).subscribe((/**
* @return {?}
*/
function () {
_this.getGroups();
}));
this.groupUsers = [];
};
/**
* @private
* @param {?} group
* @return {?}
*/
CauseManagementGroupComponent.prototype.removePermissionUndefined = /**
* @private
* @param {?} group
* @return {?}
*/
function (group) {
group.permissions = group.permissions.filter((/**
* @param {?} permission
* @return {?}
*/
function (permission) { return permission.isAllowed !== undefined; }));
};
/**
* @private
* @return {?}
*/
CauseManagementGroupComponent.prototype.getGroups = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.managementGroupService.getAll().subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) { return _this.groups = data; }));
};
CauseManagementGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'cause-management-group',
template: "<cause-dx-data-grid\n keyExpr=\"id\"\n [dataSource]=\"groups\"\n (onRowInserted)=\"onRowInserted($event)\"\n (onInitNewRow)=\"onInitNewRow()\"\n (onRowUpdated)=\"onRowUpdated($event)\"\n (onEditingStart)=\"onEditingStart($event)\"\n (onRowRemoved)=\"onRowRemoved($event)\">\n\n <dxi-column dataField=\"name\" [caption]=\"'management.name' | translate\">\n <dxi-validation-rule type=\"async\" [message]=\"'management.groupNameAlreadyUsed' | translate\" [validationCallback]=\"groupNameAlreadyUsedValidation\"></dxi-validation-rule>\n </dxi-column>\n <dxi-column\n dataField=\"users\"\n [caption]=\"'management.users' | translate\"\n editCellTemplate=\"usersEditTemplate\"\n [calculateCellValue]=\"calculateUsersCellValue\">\n </dxi-column>\n <dxi-column\n dataField=\"permissions\"\n [caption]=\"'management.permissions' | translate\"\n [visible]=\"false\"\n editCellTemplate=\"permissionsEditTemplate\">\n </dxi-column>\n <dxo-export [enabled]=\"false\"></dxo-export>\n <dxo-editing mode=\"popup\" [allowAdding]=\"true\" [allowUpdating]=\"true\" [allowDeleting]=\"true\" [useIcons]=\"true\">\n <dxo-popup [showTitle]=\"true\" [title]=\"'management.group' | translate\" [fullScreen]=\"!showColumn\"></dxo-popup>\n <dxo-form colCount=\"1\" [labelLocation]=\"showColumnXS ? 'left' : 'top'\">\n <dxi-item dataField=\"name\" [isRequired]=\"true\"></dxi-item>\n <dxi-item dataField=\"users\"></dxi-item>\n <dxi-item dataField=\"permissions\"></dxi-item>\n </dxo-form>\n </dxo-editing>\n\n <div *dxTemplate=\"let field of 'usersEditTemplate'\">\n <dx-tag-box\n valueExpr=\"id\"\n [displayExpr]=\"fullName\"\n [dataSource]=\"users\"\n (onInitialized)=\"getGroupUser(field, $event)\"\n (onValueChanged)=\"setGroupUser(field, $event)\">\n </dx-tag-box>\n </div>\n <div *dxTemplate=\"let field of 'permissionsEditTemplate'\">\n <dx-list\n [dataSource]=\"permissions\"\n itemTemplate=\"rowTemplate\"\n [searchEnabled]=\"true\"\n [searchExpr]=\"['name', 'tag']\"\n [hoverStateEnabled]=\"hoverStatePermission\">\n <div *dxTemplate=\"let permission of 'rowTemplate'\">\n <dx-check-box\n [dataSource]=\"[true, false, undefined]\"\n [text]=\"permission.name\"\n (onInitialized)=\"getPermissionStatus(field, permission, $event)\"\n (onValueChanged)=\"checkBoxToggled(field, permission, $event)\">\n </dx-check-box>\n </div>\n </dx-list>\n </div>\n</cause-dx-data-grid>\n",
styles: [""]
}] }
];
/** @nocollapse */
CauseManagementGroupComponent.ctorParameters = function () { return [
{ type: ManagementGroupService },
{ type: ManagementUserService },
{ type: ManagementPermissionService },
{ type: BreakpointObserver }
]; };
CauseManagementGroupComponent.propDecorators = {
hoverStatePermission: [{ type: Input }]
};
return CauseManagementGroupComponent;
}());
export { CauseManagementGroupComponent };
if (false) {
/**
* @type {?}
* @private
*/
CauseManagementGroupComponent.prototype.groupUsers;
/** @type {?} */
CauseManagementGroupComponent.prototype.hoverStatePermission;
/** @type {?} */
CauseManagementGroupComponent.prototype.groups;
/** @type {?} */
CauseManagementGroupComponent.prototype.users;
/** @type {?} */
CauseManagementGroupComponent.prototype.permissions;
/** @type {?} */
CauseManagementGroupComponent.prototype.userFullName;
/** @type {?} */
CauseManagementGroupComponent.prototype.showColumn;
/** @type {?} */
CauseManagementGroupComponent.prototype.showColumnXS;
/** @type {?} */
CauseManagementGroupComponent.prototype.translations;
/** @type {?} */
CauseManagementGroupComponent.prototype.calculateUsersCellValue;
/** @type {?} */
CauseManagementGroupComponent.prototype.groupNameAlreadyUsedValidation;
/**
* @type {?}
* @private
*/
CauseManagementGroupComponent.prototype.managementGroupService;
/**
* @type {?}
* @private
*/
CauseManagementGroupComponent.prototype.managementUserService;
/**
* @type {?}
* @private
*/
CauseManagementGroupComponent.prototype.managementPermissionService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2F1c2UtbWFuYWdlbWVudC1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY2F1c2UtOTExL21hbmFnZW1lbnQvIiwic291cmNlcyI6WyJsaWIvY2F1c2UtbWFuYWdlbWVudC1ncm91cC9jYXVzZS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFNdkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFFakYsT0FBTyxFQUFDLDJCQUEyQixFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDN0YsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDO0lBa0JJLHVDQUNZLHNCQUE4QyxFQUM5QyxxQkFBNEMsRUFDNUMsMkJBQXdELEVBQ2hFLGtCQUFzQztRQUoxQyxpQkFZQztRQVhXLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1QyxnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQTZCO1FBWjdELHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWlCLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQWdCLEVBQUUsQ0FBQztRQUN4QixnQkFBVyxHQUFzQixFQUFFLENBQUM7UUFDcEMsaUJBQVksR0FBUSxFQUFFLENBQUM7UUFDdkIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFRLEVBQUUsQ0FBQztRQXNJdkIsNEJBQXVCOzs7O1FBQUcsVUFBQyxDQUFDOztn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QyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7Ozs7O0lBRU8saUVBQXlCOzs7OztJQUFqQyxVQUFrQyxLQUFpQjtRQUMvQyxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsVUFBZ0MsSUFBSyxPQUFBLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFsQyxDQUFrQyxFQUFDLENBQUM7SUFDM0gsQ0FBQzs7Ozs7SUFFTyxpREFBUzs7OztJQUFqQjtRQUFBLGlCQUVDO1FBREcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVM7Ozs7UUFBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFsQixDQUFrQixFQUFDLENBQUM7SUFDL0UsQ0FBQzs7Z0JBM05KLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQywyMkZBQXNEOztpQkFFekQ7Ozs7Z0JBWE8sc0JBQXNCO2dCQUN0QixxQkFBcUI7Z0JBRXJCLDJCQUEyQjtnQkFDM0Isa0JBQWtCOzs7dUNBV3JCLEtBQUs7O0lBb05WLG9DQUFDO0NBQUEsQUE1TkQsSUE0TkM7U0F2TlksNkJBQTZCOzs7Ozs7SUFDdEMsbURBQXdCOztJQUV4Qiw2REFDbUM7O0lBQ25DLCtDQUFpQzs7SUFDakMsOENBQStCOztJQUMvQixvREFBMkM7O0lBQzNDLHFEQUE4Qjs7SUFDOUIsbURBQXlCOztJQUN6QixxREFBMkI7O0lBQzNCLHFEQUE4Qjs7SUFzSTlCLGdFQVdDOztJQVVELHVFQU1DOzs7OztJQTlKRywrREFBc0Q7Ozs7O0lBQ3RELDhEQUFvRDs7Ozs7SUFDcEQsb0VBQWdFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAY2F1c2UtOTExL2NvcmUnO1xuaW1wb3J0IHtVc2VyTW9kZWx9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvdXNlci1tb2RlbCc7XG5pbXBvcnQge1VzZXJHcm91cE1vZGVsfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL3VzZXItZ3JvdXAtbW9kZWwnO1xuaW1wb3J0IHtHcm91cE1vZGVsfSBmcm9tICcuLi9zaGFyZWQvbW9kZWxzL2dyb3VwLW1vZGVsJztcbmltcG9ydCB7R3JvdXBQZXJtaXNzaW9uTW9kZWx9IGZyb20gJy4uL3NoYXJlZC9tb2RlbHMvZ3JvdXAtcGVybWlzc2lvbi1tb2RlbCc7XG5pbXBvcnQge01hbmFnZW1lbnRHcm91cFNlcnZpY2V9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9tYW5hZ2VtZW50LWdyb3VwLnNlcnZpY2UnO1xuaW1wb3J0IHtNYW5hZ2VtZW50VXNlclNlcnZpY2V9IGZyb20gJy4uL3NoYXJlZC9zZXJ2aWNlcy9tYW5hZ2VtZW50LXVzZXIuc2VydmljZSc7XG5pbXBvcnQge1Blcm1pc3Npb25Nb2RlbH0gZnJvbSAnLi4vc2hhcmVkL21vZGVscy9wZXJtaXNzaW9uLW1vZGVsJztcbmltcG9ydCB7TWFuYWdlbWVudFBlcm1pc3Npb25TZXJ2aWNlfSBmcm9tICcuLi9zaGFyZWQvc2VydmljZXMvbWFuYWdlbWVudC1wZXJtaXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXJ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NhdXNlLW1hbmFnZW1lbnQtZ3JvdXAnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYXVzZS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYXVzZS1tYW5hZ2VtZW50LWdyb3VwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ2F1c2VNYW5hZ2VtZW50R3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByaXZhdGUgZ3JvdXBVc2VyczogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaG92ZXJTdGF0ZVBlcm1pc3Npb24gPSB0cnVlO1xuICAgIHB1YmxpYyBncm91cHM6IEdyb3VwTW9kZWxbXSA9IFtdO1xuICAgIHB1YmxpYyB1c2VyczogVXNlck1vZGVsW10gPSBbXTtcbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25Nb2RlbFtdID0gW107XG4gICAgcHVibGljIHVzZXJGdWxsTmFtZTogYW55ID0ge307XG4gICAgcHVibGljIHNob3dDb2x1bW4gPSB0cnVlO1xuICAgIHB1YmxpYyBzaG93Q29sdW1uWFMgPSB0cnVlO1xuICAgIHB1YmxpYyB0cmFuc2xhdGlvbnM6IGFueSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbWFuYWdlbWVudEdyb3VwU2VydmljZTogTWFuYWdlbWVudEdyb3VwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtYW5hZ2VtZW50VXNlclNlcnZpY2U6IE1hbmFnZW1lbnRVc2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtYW5hZ2VtZW50UGVybWlzc2lvblNlcnZpY2U6IE1hbmFnZW1lbnRQZXJtaXNzaW9uU2VydmljZSxcbiAgICAgICAgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIsXG4gICAgKSB7XG4gICAgICAgIGJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFsnKG1heC13aWR0aDogMTAwMHB4KSddKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0NvbHVtbiA9ICFyZXN1bHQubWF0Y2hlcztcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKFsnKG1heC13aWR0aDogNjAwcHgpJ10pLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93Q29sdW1uWFMgPSAhcmVzdWx0Lm1hdGNoZXM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VtZW50VXNlclNlcnZpY2UuZ2V0QWxsPFVzZXJNb2RlbD4oKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVzZXJzID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMudXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodXNlci5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXNlci5maXJzdE5hbWUgIT09ICcnICYmIHVzZXIubGFzdE5hbWUgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJGdWxsTmFtZVt1c2VyLmlkXSAgPSBgJHt1c2VyLmZpcnN0TmFtZX0gJHt1c2VyLmxhc3ROYW1lfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubWFuYWdlbWVudFBlcm1pc3Npb25TZXJ2aWNlLmdldEFsbCgpLnN1YnNjcmliZShwZXJtaXNzaW9ucyA9PiB7XG4gICAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uSW5kZXggPSBwZXJtaXNzaW9ucy5maW5kSW5kZXgoYyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMudGFnID09PSAnQ2FuQWNjZXNzUGVybWlzc2lvbnMnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbkluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLnNwbGljZShwZXJtaXNzaW9uSW5kZXgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVybWlzc2lvbnMuc29ydCgoYTogUGVybWlzc2lvbk1vZGVsLCBiOiBQZXJtaXNzaW9uTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS5uYW1lIDwgYi5uYW1lKSB7IHJldHVybiAtMTsgfVxuICAgICAgICAgICAgICAgIGlmIChhLm5hbWUgPiBiLm5hbWUpIHsgcmV0dXJuIDE7IH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nZXRHcm91cHMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZnVsbE5hbWUoZGF0YSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke2RhdGEuZmlyc3ROYW1lfSAke2RhdGEubGFzdE5hbWV9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0R3JvdXBVc2VyKGZpZWxkLCBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVzZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5ncm91cFVzZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwVXNlcnMuZm9yRWFjaCggdXNlciA9PiB7XG4gICAgICAgICAgICAgICAgdXNlcnMucHVzaCh1c2VyLmlkVXNlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdXNlcnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRHcm91cFVzZXIoZmllbGQsIGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXBVc2VyOiBVc2VyR3JvdXBNb2RlbFtdID0gW107XG5cbiAgICAgICAgZS52YWx1ZS5mb3JFYWNoKGlkVXNlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cEluZGV4ID0gKGZpZWxkLmRhdGEudXNlcnMgfHwgW10pLmZpbmRJbmRleChnID0+IGcuaWRVc2VyID09PSBpZFVzZXIpO1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXBJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBncm91cFVzZXIucHVzaCh7IGlkVXNlciwgfSBhcyBVc2VyR3JvdXBNb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdyb3VwVXNlci5wdXNoKGZpZWxkLmRhdGEudXNlcnNbZ3JvdXBJbmRleF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmaWVsZC5zZXRWYWx1ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwVXNlcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0R3JvdXBQZXJtaXNzaW9uKGZpZWxkLCBlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwVXNlcjogVXNlckdyb3VwTW9kZWxbXSA9IFtdO1xuXG4gICAgICAgIGUudmFsdWUuZm9yRWFjaChpZFVzZXIgPT4ge1xuICAgICAgICAgICAgZ3JvdXBVc2VyLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkVXNlcixcbiAgICAgICAgICAgIH0gYXMgVXNlckdyb3VwTW9kZWwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmaWVsZC5zZXRWYWx1ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyb3VwVXNlcikpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBncm91cFBlcm1pc3Npb24gPSAoZmllbGQudmFsdWUgfHwgW10pLmZpbmQocCA9PiBwLmlkTW9kdWxlUGVybWlzc2lvbiA9PT0gcGVybWlzc2lvbi5pZCk7XG5cbiAgICAgICAgaWYgKGdyb3VwUGVybWlzc2lvbikge1xuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIGdyb3VwUGVybWlzc2lvbi5pc0FsbG93ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZS5jb21wb25lbnQub3B0aW9uKCd2YWx1ZScsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tCb3hUb2dnbGVkKGZpZWxkLCBwZXJtaXNzaW9uLCBlKTogdm9pZCB7XG4gICAgICAgIGlmIChlLmNvbXBvbmVudC5za2lwT25WYWx1ZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNraXBPblZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmNvbXBvbmVudC5zZXRVbmRlZmluZWROZXh0VGltZSkge1xuICAgICAgICAgICAgZS5jb21wb25lbnQuc2V0VW5kZWZpbmVkTmV4dFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNraXBPblZhbHVlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICBlLmNvbXBvbmVudC5vcHRpb24oJ3ZhbHVlJywgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHRoaXMuc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS52YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGUuY29tcG9uZW50LnNldFVuZGVmaW5lZE5leHRUaW1lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZCwgcGVybWlzc2lvbiwgZS52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93SW5zZXJ0ZWQoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVHcm91cChlLmRhdGEgYXMgR3JvdXBNb2RlbCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm93VXBkYXRlZChlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZUdyb3VwKGUuZGF0YSBhcyBHcm91cE1vZGVsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Sb3dSZW1vdmVkKGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSAoZS5kYXRhIGFzIEdyb3VwTW9kZWwpO1xuICAgICAgICB0aGlzLm1hbmFnZW1lbnRHcm91cFNlcnZpY2UuZGVsZXRlKGdyb3VwLmlkKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FsY3VsYXRlVXNlcnNDZWxsVmFsdWUgPSAoZSk6IHN0cmluZyA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJzID0gKGUudXNlcnMgPyBlLnVzZXJzIGFzIFVzZXJHcm91cE1vZGVsW10gOiBbXSk7XG4gICAgICAgIGxldCB1c2Vyc05hbWVzOiBhbnlbXSA9IFtdO1xuICAgICAgICB1c2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXNlckdyb3VwID0gdGhpcy51c2Vycy5maWx0ZXIodSA9PiB1LmlkID09PSB1c2VyLmlkVXNlcik7XG4gICAgICAgICAgICBpZiAodXNlckdyb3VwICYmIHVzZXJHcm91cFswXSkge1xuICAgICAgICAgICAgICAgIHVzZXJzTmFtZXMucHVzaCh1c2VyR3JvdXBbMF0uZmlyc3ROYW1lICsgJyAnICsgdXNlckdyb3VwWzBdLmxhc3ROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHVzZXJzTmFtZXMgPSB1c2Vyc05hbWVzLnNvcnQoKG9uZSwgdHdvKSA9PiAob25lIDwgdHdvID8gLTEgOiAxKSk7XG4gICAgICAgIHJldHVybiB1c2Vyc05hbWVzLmpvaW4oJywgJyk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRWRpdGluZ1N0YXJ0KGU6IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyb3VwVXNlcnMgPSBlLmRhdGEudXNlcnM7XG4gICAgfVxuXG4gICAgcHVibGljIG9uSW5pdE5ld1JvdygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ncm91cFVzZXJzID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdyb3VwTmFtZUFscmVhZHlVc2VkVmFsaWRhdGlvbiA9IChlKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hbmFnZW1lbnRHcm91cFNlcnZpY2UuaGFzRXhpc3RpbmdHcm91cE5hbWUoZS5kYXRhKS5waXBlKFxuICAgICAgICAgICAgbWFwKChleGlzdDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhZXhpc3Q7XG4gICAgICAgICAgICB9KVxuICAgICAgICApLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0UGVybWlzc2lvblN0YXR1cyhmaWVsZDogYW55LCBwZXJtaXNzaW9uLCB2YWx1ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBncm91cFBlcm1pc3Npb25zID0gZmllbGQudmFsdWUgfHwgW107XG4gICAgICAgIGNvbnN0IGdyb3VwSW5kZXggPSBncm91cFBlcm1pc3Npb25zLmZpbmRJbmRleChwID0+IHAuaWRNb2R1bGVQZXJtaXNzaW9uID09PSBwZXJtaXNzaW9uLmlkKTtcblxuICAgICAgICBpZiAoZ3JvdXBJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICBncm91cFBlcm1pc3Npb25zW2dyb3VwSW5kZXhdLmlzQWxsb3dlZCA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JvdXBQZXJtaXNzaW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZE1vZHVsZVBlcm1pc3Npb246IHBlcm1pc3Npb24uaWQsXG4gICAgICAgICAgICAgICAgaXNBbGxvd2VkOiB2YWx1ZSxcbiAgICAgICAgICAgIH0gYXMgR3JvdXBQZXJtaXNzaW9uTW9kZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGQuc2V0VmFsdWUoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShncm91cFBlcm1pc3Npb25zKSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUdyb3VwKGdyb3VwOiBHcm91cE1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlUGVybWlzc2lvblVuZGVmaW5lZChncm91cCk7XG4gICAgICAgIGlmIChncm91cC51c2Vycykge1xuICAgICAgICAgICAgZ3JvdXAudXNlcnMuZm9yRWFjaCgodXNlckdyb3VwOiBVc2VyR3JvdXBNb2RlbCkgPT4ge1xuICAgICAgICAgICAgICAgIHVzZXJHcm91cC5pZEdyb3VwID0gZ3JvdXAuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ3JvdXAucGVybWlzc2lvbnMpIHtcbiAgICAgICAgICAgIGdyb3VwLnBlcm1pc3Npb25zLmZvckVhY2goKGdyb3VwUGVybWlzc2lvbjogR3JvdXBQZXJtaXNzaW9uTW9kZWwpID0+IHtcbiAgICAgICAgICAgICAgICBncm91cFBlcm1pc3Npb24uaWRHcm91cCA9IGdyb3VwLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tYW5hZ2VtZW50R3JvdXBTZXJ2aWNlLnNhdmUoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEdyb3VwcygpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ncm91cFVzZXJzID0gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVQZXJtaXNzaW9uVW5kZWZpbmVkKGdyb3VwOiBHcm91cE1vZGVsKTogdm9pZCB7XG4gICAgICAgIGdyb3VwLnBlcm1pc3Npb25zID0gZ3JvdXAucGVybWlzc2lvbnMuZmlsdGVyKChwZXJtaXNzaW9uOiBHcm91cFBlcm1pc3Npb25Nb2RlbCkgPT4gcGVybWlzc2lvbi5pc0FsbG93ZWQgIT09IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcm91cHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWFuYWdlbWVudEdyb3VwU2VydmljZS5nZXRBbGwoKS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLmdyb3VwcyA9IGRhdGEpO1xuICAgIH1cbn1cbiJdfQ==