@linid-dm/directory-manager-client-core
Version:
Core package by providing a set of angular components for the Directory Manager app.
183 lines • 29.8 kB
JavaScript
/**
* Copyright (C) 2020-2024 Linagora
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any
* later version, provided you comply with the Additional Terms applicable for
* LinID Directory Manager software by LINAGORA pursuant to Section 7 of the GNU
* Affero General Public License, subsections (b), (c), and (e), pursuant to
* which these Appropriate Legal Notices must notably (i) retain the display of
* the "LinID™" trademark/logo at the top of the interface window, the display
* of the “You are using the Open Source and free version of LinID™, powered by
* Linagora © 2009–2013. Contribute to LinID R&D by subscribing to an Enterprise
* offer!” infobox and in the e-mails sent with the Program, notice appended to
* any type of outbound messages (e.g. e-mail and meeting requests) as well as
* in the LinID Directory Manager user interface, (ii) retain all hypertext
* links between LinID Directory Manager and https://linid.org/, as well as
* between LINAGORA and LINAGORA.com, and (iii) refrain from infringing LINAGORA
* intellectual property rights over its trademarks and commercial brands. Other
* Additional Terms apply, see <http://www.linagora.com/licenses/> for more
* details.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License and
* its applicable Additional Terms for LinID Directory Manager along with this
* program. If not, see <http://www.gnu.org/licenses/> for the GNU Affero
* General Public License version 3 and <http://www.linagora.com/licenses/> for
* the Additional Terms applicable to the LinID Directory Manager software.
*/
import { EResourceComponent, } from '../interfaces/configs.interface';
import { EUpdateOperations } from '../interfaces/ui.interface';
import { getElementLabel } from './data-detail.helper';
export function setActionsTitlesVariables(values, actions) {
const updatedActions = { ...actions };
for (const key in actions) {
if (Object.prototype.hasOwnProperty.call(actions, key) &&
actions[key].title != null) {
updatedActions[key] = setActionTitleVariables(values, actions[key], key);
}
}
return updatedActions;
}
export function setActionTitleVariables(values, action, actionId) {
const updatedAction = { ...action };
const containMatchingRegex = action.title.match(/\$[0-9]+/g);
if (!!containMatchingRegex && containMatchingRegex.length > 0) {
containMatchingRegex.forEach((_, index) => {
const titleCurrentVariableIndex = index + 1;
let newValue = '';
if (actionId === 'export') {
newValue =
values[index].charAt(0).toLocaleUpperCase() + values[index].slice(1);
}
else {
newValue = values[index];
}
updatedAction.title = updatedAction.title.replace('$' + titleCurrentVariableIndex, newValue);
});
}
return updatedAction;
}
export function getActionType(succeededElements, actions, operationsTypes) {
const reassignOperations = [
EUpdateOperations.REMOVE,
EUpdateOperations.ADD,
];
const isMultiple = succeededElements.length > 1;
let btnLabel;
if (reassignOperations.every((operationType) => operationsTypes.includes(operationType))) {
btnLabel = isMultiple ? actions.multipleReassign : actions.singleReassign;
}
else if (operationsTypes.length === 1) {
switch (operationsTypes[0]) {
case EUpdateOperations.REMOVE:
btnLabel = isMultiple
? actions.multipleUnassign ?? actions.multipleDelete
: actions.singleUnassign ?? actions.singleDelete;
break;
case EUpdateOperations.ADD:
btnLabel = actions.assign;
break;
case EUpdateOperations.EDIT:
btnLabel = isMultiple ? actions.multipleEdit : actions.singleEdit;
break;
default:
break;
}
}
return btnLabel;
}
export function getScimParentsAndChildren(attributes) {
return attributes.reduce((acc, attribute) => {
if (attribute.props.scimParentAttribute &&
attribute.props.scimParentAttribute !== null) {
const scimParentId = attribute.props.scimParentAttribute;
return {
...acc,
[scimParentId]: acc[scimParentId] &&
acc[scimParentId] !== null &&
acc[scimParentId].length > 0
? [...acc[scimParentId], attribute.modelRef]
: [attribute.modelRef],
};
}
return acc;
}, {});
}
export function getSucceededNotifications(succeededElements, action) {
let message = '';
let notificationVariableValue = null;
if (succeededElements.length === 1) {
notificationVariableValue = getElementLabel(succeededElements[0]);
message = action.successNotification.replace('$1', notificationVariableValue);
}
else if (succeededElements.length > 1 && succeededElements.length < 4) {
notificationVariableValue = succeededElements
.map((element) => getElementLabel(element))
.join(', ');
message = action.successNotificationMoreThan1.replace('$1', notificationVariableValue);
}
else if (succeededElements.length > 3) {
notificationVariableValue = succeededElements.length.toString();
message = action.successNotificationMoreThan3.replace('$1', notificationVariableValue);
}
return message;
}
export function getUserInterfaceRoutesRegexp(resourcesTypes, configs) {
return configs.allIds
.filter((id) => 'level' in configs.byId[id] && resourcesTypes.allIds.includes(id))
.reduce((acc, resourceTypeId) => {
let urlFirstPart = '^/home/';
let detailPathRegExp;
const resourceTypeConfig = configs.byId[resourceTypeId];
const resourceTypeProps = resourcesTypes.byId[resourceTypeId];
if (resourceTypeConfig.level === 0) {
const resourceTypeHasChildren = configs.allIds.some((id) => configs.byId[id].props?.parent === resourceTypeId);
const resourcePathRegExp = new RegExp(urlFirstPart.concat(`${resourceTypeProps.endpoint}$`));
if (resourceTypeConfig.component === EResourceComponent.ARRAY ||
resourceTypeConfig.component === EResourceComponent.LIST ||
(resourceTypeConfig.component === EResourceComponent.TREE &&
resourceTypeHasChildren)) {
detailPathRegExp = new RegExp(urlFirstPart.concat(`${resourceTypeProps.endpoint}/[^/]*$`));
}
else {
detailPathRegExp = new RegExp(urlFirstPart.concat(`${resourceTypeProps.endpoint}/.*$`));
}
acc = {
...acc,
[resourceTypeId]: {
resourcePathRegExp,
detailPathRegExp,
},
};
}
else {
const allParentsResourcesTypesIds = getResourcesTypesIdsByRelationship(resourceTypeId, configs).reverse();
detailPathRegExp = new RegExp(allParentsResourcesTypesIds.reduce((accBis, id) => accBis
.concat(`${resourcesTypes.byId[id].endpoint}/[^/]*`)
.concat(resourceTypeId === id ? '$' : '/'), urlFirstPart));
acc = {
...acc,
[resourceTypeId]: {
resourcePathRegExp: null,
detailPathRegExp,
},
};
}
return acc;
}, {});
}
function getResourcesTypesIdsByRelationship(resourceTypeId, configs) {
let resourcesTypesIds = [resourceTypeId];
const parentResourceTypeId = configs.byId[resourceTypeId].props?.parent;
if (!!parentResourceTypeId) {
resourcesTypesIds.push(...getResourcesTypesIdsByRelationship(parentResourceTypeId, configs));
}
return resourcesTypesIds;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlncy5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9saWJzL2NsaWVudC1jb3JlL3NyYy9saWIvc2hhcmVkL2hlbHBlcnMvY29uZmlncy5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixHQUtuQixNQUFNLGlDQUFpQyxDQUFDO0FBU3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUd2RCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLE1BQWdCLEVBQ2hCLE9BQTBCO0lBRTFCLE1BQU0sY0FBYyxHQUFzQixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDekQsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUMxQixJQUNFLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUMxQixDQUFDO1lBQ0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFnQixFQUNoQixNQUFpQixFQUNqQixRQUFnQjtJQUVoQixNQUFNLGFBQWEsR0FBYyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDL0MsTUFBTSxvQkFBb0IsR0FDeEIsTUFBTSxD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QUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFDOUMsWUFBWSxDQUNiLENBQ0YsQ0FBQztZQUNGLEdBQUcsR0FBRztnQkFDSixHQUFHLEdBQUc7Z0JBQ04sQ0FBQyxjQUFjLENBQUMsRUFBRTtvQkFDaEIsa0JBQWtCLEVBQUUsSUFBSTtvQkFDeEIsZ0JBQWdCO2lCQUNqQjthQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsRUFFQyxDQUNGLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBUyxrQ0FBa0MsQ0FDekMsY0FBc0IsRUFDdEIsT0FBeUI7SUFFekIsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ3hFLElBQUksQ0FBQyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDM0IsaUJBQWlCLENBQUMsSUFBSSxDQUNwQixHQUFHLGtDQUFrQyxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChDKSAyMDIwLTIwMjQgTGluYWdvcmFcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlclxuICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlXG4gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueVxuICogbGF0ZXIgdmVyc2lvbiwgcHJvdmlkZWQgeW91IGNvbXBseSB3aXRoIHRoZSBBZGRpdGlvbmFsIFRlcm1zIGFwcGxpY2FibGUgZm9yXG4gKiBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZSBieSBMSU5BR09SQSBwdXJzdWFudCB0byBTZWN0aW9uIDcgb2YgdGhlIEdOVVxuICogQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHN1YnNlY3Rpb25zIChiKSwgKGMpLCBhbmQgKGUpLCBwdXJzdWFudCB0b1xuICogd2hpY2ggdGhlc2UgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyBtdXN0IG5vdGFibHkgKGkpIHJldGFpbiB0aGUgZGlzcGxheSBvZlxuICogdGhlIFwiTGluSUTihKJcIiB0cmFkZW1hcmsvbG9nbyBhdCB0aGUgdG9wIG9mIHRoZSBpbnRlcmZhY2Ugd2luZG93LCB0aGUgZGlzcGxheVxuICogb2YgdGhlIOKAnFlvdSBhcmUgdXNpbmcgdGhlIE9wZW4gU291cmNlIGFuZCBmcmVlIHZlcnNpb24gb2YgTGluSUTihKIsIHBvd2VyZWQgYnlcbiAqIExpbmFnb3JhIMKpIDIwMDnigJMyMDEzLiBDb250cmlidXRlIHRvIExpbklEIFImRCBieSBzdWJzY3JpYmluZyB0byBhbiBFbnRlcnByaXNlXG4gKiBvZmZlciHigJ0gaW5mb2JveCBhbmQgaW4gdGhlIGUtbWFpbHMgc2VudCB3aXRoIHRoZSBQcm9ncmFtLCBub3RpY2UgYXBwZW5kZWQgdG9cbiAqIGFueSB0eXBlIG9mIG91dGJvdW5kIG1lc3NhZ2VzIChlLmcuIGUtbWFpbCBhbmQgbWVldGluZyByZXF1ZXN0cykgYXMgd2VsbCBhc1xuICogaW4gdGhlIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIHVzZXIgaW50ZXJmYWNlLCAoaWkpIHJldGFpbiBhbGwgaHlwZXJ0ZXh0XG4gKiBsaW5rcyBiZXR3ZWVuIExpbklEIERpcmVjdG9yeSBNYW5hZ2VyIGFuZCBodHRwczovL2xpbmlkLm9yZy8sIGFzIHdlbGwgYXNcbiAqIGJldHdlZW4gTElOQUdPUkEgYW5kIExJTkFHT1JBLmNvbSwgYW5kIChpaWkpIHJlZnJhaW4gZnJvbSBpbmZyaW5naW5nIExJTkFHT1JBXG4gKiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG92ZXIgaXRzIHRyYWRlbWFya3MgYW5kIGNvbW1lcmNpYWwgYnJhbmRzLiBPdGhlclxuICogQWRkaXRpb25hbCBUZXJtcyBhcHBseSwgc2VlIDxodHRwOi8vd3d3LmxpbmFnb3JhLmNvbS9saWNlbnNlcy8+IGZvciBtb3JlXG4gKiBkZXRhaWxzLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVFxuICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1NcbiAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmVcbiAqIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFuZFxuICogaXRzIGFwcGxpY2FibGUgQWRkaXRpb25hbCBUZXJtcyBmb3IgTGluSUQgRGlyZWN0b3J5IE1hbmFnZXIgYWxvbmcgd2l0aCB0aGlzXG4gKiBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4gZm9yIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMyBhbmQgPGh0dHA6Ly93d3cubGluYWdvcmEuY29tL2xpY2Vuc2VzLz4gZm9yXG4gKiB0aGUgQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIHRvIHRoZSBMaW5JRCBEaXJlY3RvcnkgTWFuYWdlciBzb2Z0d2FyZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFUmVzb3VyY2VDb21wb25lbnQsXG4gIElBdHRyaWJ1dGUsXG4gIElBdHRyaWJ1dGVBY3Rpb25zLFxuICBJQnRuTGFiZWwsXG4gIElDb25maWcsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgSURhdGFOb2RlLFxuICBJRGF0YVNvdXJjZVJvdyxcbiAgSUVudHJ5SWRzLFxuICBJVWlFbnRyeUlkcyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9kYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUmVzb3VyY2VUeXBlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXNvdXJjZXMtdHlwZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IElSZXNvdXJjZVR5cGVSb3V0ZXNSZWdFeHAgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JvdXRpbmcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEVVcGRhdGVPcGVyYXRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy91aS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudExhYmVsIH0gZnJvbSAnLi9kYXRhLWRldGFpbC5oZWxwZXInO1xuaW1wb3J0IHsgSnNUYWJsZSB9IGZyb20gJy4vanN0YWJsZS5oZWxwZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aW9uc1RpdGxlc1ZhcmlhYmxlcyhcbiAgdmFsdWVzOiBzdHJpbmdbXSxcbiAgYWN0aW9uczogSUF0dHJpYnV0ZUFjdGlvbnNcbik6IElBdHRyaWJ1dGVBY3Rpb25zIHtcbiAgY29uc3QgdXBkYXRlZEFjdGlvbnM6IElBdHRyaWJ1dGVBY3Rpb25zID0geyAuLi5hY3Rpb25zIH07XG4gIGZvciAoY29uc3Qga2V5IGluIGFjdGlvbnMpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWN0aW9ucywga2V5KSAmJlxuICAgICAgYWN0aW9uc1trZXldLnRpdGxlICE9IG51bGxcbiAgICApIHtcbiAgICAgIHVwZGF0ZWRBY3Rpb25zW2tleV0gPSBzZXRBY3Rpb25UaXRsZVZhcmlhYmxlcyh2YWx1ZXMsIGFjdGlvbnNba2V5XSwga2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVwZGF0ZWRBY3Rpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aW9uVGl0bGVWYXJpYWJsZXMoXG4gIHZhbHVlczogc3RyaW5nW10sXG4gIGFjdGlvbjogSUJ0bkxhYmVsLFxuICBhY3Rpb25JZDogc3RyaW5nXG4pOiBJQnRuTGFiZWwge1xuICBjb25zdCB1cGRhdGVkQWN0aW9uOiBJQnRuTGFiZWwgPSB7IC4uLmFjdGlvbiB9O1xuICBjb25zdCBjb250YWluTWF0Y2hpbmdSZWdleDogUmVnRXhwTWF0Y2hBcnJheSA9XG4gICAgYWN0aW9uLnRpdGxlLm1hdGNoKC9cXCRbMC05XSsvZyk7XG4gIGlmICghIWNvbnRhaW5NYXRjaGluZ1JlZ2V4ICYmIGNvbnRhaW5NYXRjaGluZ1JlZ2V4Lmxlbmd0aCA+IDApIHtcbiAgICBjb250YWluTWF0Y2hpbmdSZWdleC5mb3JFYWNoKChfOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlQ3VycmVudFZhcmlhYmxlSW5kZXg6IG51bWJlciA9IGluZGV4ICsgMTtcbiAgICAgIGxldCBuZXdWYWx1ZSA9ICcnO1xuICAgICAgaWYgKGFjdGlvbklkID09PSAnZXhwb3J0Jykge1xuICAgICAgICBuZXdWYWx1ZSA9XG4gICAgICAgICAgdmFsdWVzW2luZGV4XS5jaGFyQXQoMCkudG9Mb2NhbGVVcHBlckNhc2UoKSArIHZhbHVlc1tpbmRleF0uc2xpY2UoMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlc1tpbmRleF07XG4gICAgICB9XG4gICAgICB1cGRhdGVkQWN0aW9uLnRpdGxlID0gdXBkYXRlZEFjdGlvbi50aXRsZS5yZXBsYWNlKFxuICAgICAgICAnJCcgKyB0aXRsZUN1cnJlbnRWYXJpYWJsZUluZGV4LFxuICAgICAgICBuZXdWYWx1ZVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdXBkYXRlZEFjdGlvbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGlvblR5cGUoXG4gIHN1Y2NlZWRlZEVsZW1lbnRzOiAoSUVudHJ5SWRzIHwgSURhdGFTb3VyY2VSb3cgfCBJRGF0YU5vZGUpW10sXG4gIGFjdGlvbnM6IElBdHRyaWJ1dGVBY3Rpb25zLFxuICBvcGVyYXRpb25zVHlwZXM6IHN0cmluZ1tdXG4pOiBJQnRuTGFiZWwge1xuICBjb25zdCByZWFzc2lnbk9wZXJhdGlvbnM6IHN0cmluZ1tdID0gW1xuICAgIEVVcGRhdGVPcGVyYXRpb25zLlJFTU9WRSxcbiAgICBFVXBkYXRlT3BlcmF0aW9ucy5BREQsXG4gIF07XG4gIGNvbnN0IGlzTXVsdGlwbGU6IGJvb2xlYW4gPSBzdWNjZWVkZWRFbGVtZW50cy5sZW5ndGggPiAxO1xuICBsZXQgYnRuTGFiZWw6IElCdG5MYWJlbDtcbiAgaWYgKFxuICAgIHJlYXNzaWduT3BlcmF0aW9ucy5ldmVyeSgob3BlcmF0aW9uVHlwZTogc3RyaW5nKSA9PlxuICAgICAgb3BlcmF0aW9uc1R5cGVzLmluY2x1ZGVzKG9wZXJhdGlvblR5cGUpXG4gICAgKVxuICApIHtcbiAgICBidG5MYWJlbCA9IGlzTXVsdGlwbGUgPyBhY3Rpb25zLm11bHRpcGxlUmVhc3NpZ24gOiBhY3Rpb25zLnNpbmdsZVJlYXNzaWduO1xuICB9IGVsc2UgaWYgKG9wZXJhdGlvbnNUeXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbnNUeXBlc1swXSkge1xuICAgICAgY2FzZSBFVXBkYXRlT3BlcmF0aW9ucy5SRU1PVkU6XG4gICAgICAgIGJ0bkxhYmVsID0gaXNNdWx0aXBsZVxuICAgICAgICAgID8gYWN0aW9ucy5tdWx0aXBsZVVuYXNzaWduID8/IGFjdGlvbnMubXVsdGlwbGVEZWxldGVcbiAgICAgICAgICA6IGFjdGlvbnMuc2luZ2xlVW5hc3NpZ24gPz8gYWN0aW9ucy5zaW5nbGVEZWxldGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFVXBkYXRlT3BlcmF0aW9ucy5BREQ6XG4gICAgICAgIGJ0bkxhYmVsID0gYWN0aW9ucy5hc3NpZ247XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFVXBkYXRlT3BlcmF0aW9ucy5FRElUOlxuICAgICAgICBidG5MYWJlbCA9IGlzTXVsdGlwbGUgPyBhY3Rpb25zLm11bHRpcGxlRWRpdCA6IGFjdGlvbnMuc2luZ2xlRWRpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJ0bkxhYmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NpbVBhcmVudHNBbmRDaGlsZHJlbihhdHRyaWJ1dGVzOiBJQXR0cmlidXRlW10pOiB7XG4gIFtpZDogc3RyaW5nXTogc3RyaW5nW107XG59IHtcbiAgcmV0dXJuIGF0dHJpYnV0ZXMucmVkdWNlKFxuICAgIChhY2MsIGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBhdHRyaWJ1dGUucHJvcHMuc2NpbVBhcmVudEF0dHJpYnV0ZSAmJlxuICAgICAgICBhdHRyaWJ1dGUucHJvcHMuc2NpbVBhcmVudEF0dHJpYnV0ZSAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNjaW1QYXJlbnRJZDogc3RyaW5nID0gYXR0cmlidXRlLnByb3BzLnNjaW1QYXJlbnRBdHRyaWJ1dGU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtzY2ltUGFyZW50SWRdOlxuICAgICAgICAgICAgYWNjW3NjaW1QYXJlbnRJZF0gJiZcbiAgICAgICAgICAgIGFjY1tzY2ltUGFyZW50SWRdICE9PSBudWxsICYmXG4gICAgICAgICAgICBhY2Nbc2NpbVBhcmVudElkXS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gWy4uLmFjY1tzY2ltUGFyZW50SWRdLCBhdHRyaWJ1dGUubW9kZWxSZWZdXG4gICAgICAgICAgICAgIDogW2F0dHJpYnV0ZS5tb2RlbFJlZl0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAge30gYXMgeyBbaWQ6IHN0cmluZ106IHN0cmluZ1tdIH1cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN1Y2NlZWRlZE5vdGlmaWNhdGlvbnMoXG4gIHN1Y2NlZWRlZEVsZW1lbnRzOiAoSVVpRW50cnlJZHMgfCBJRGF0YVNvdXJjZVJvdyB8IElEYXRhTm9kZSlbXSxcbiAgYWN0aW9uOiBJQnRuTGFiZWxcbik6IHN0cmluZyB7XG4gIGxldCBtZXNzYWdlID0gJyc7XG4gIGxldCBub3RpZmljYXRpb25WYXJpYWJsZVZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICBpZiAoc3VjY2VlZGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgbm90aWZpY2F0aW9uVmFyaWFibGVWYWx1ZSA9IGdldEVsZW1lbnRMYWJlbChzdWNjZWVkZWRFbGVtZW50c1swXSk7XG4gICAgbWVzc2FnZSA9IGFjdGlvbi5zdWNjZXNzTm90aWZpY2F0aW9uLnJlcGxhY2UoXG4gICAgICAnJDEnLFxuICAgICAgbm90aWZpY2F0aW9uVmFyaWFibGVWYWx1ZVxuICAgICk7XG4gIH0gZWxzZSBpZiAoc3VjY2VlZGVkRWxlbWVudHMubGVuZ3RoID4gMSAmJiBzdWNjZWVkZWRFbGVtZW50cy5sZW5ndGggPCA0KSB7XG4gICAgbm90aWZpY2F0aW9uVmFyaWFibGVWYWx1ZSA9IHN1Y2NlZWRlZEVsZW1lbnRzXG4gICAgICAubWFwKChlbGVtZW50OiBJVWlFbnRyeUlkcyB8IElEYXRhU291cmNlUm93IHwgSURhdGFOb2RlKSA9PlxuICAgICAgICBnZXRFbGVtZW50TGFiZWwoZWxlbWVudClcbiAgICAgIClcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIG1lc3NhZ2UgPSBhY3Rpb24uc3VjY2Vzc05vdGlmaWNhdGlvbk1vcmVUaGFuMS5yZXBsYWNlKFxuICAgICAgJyQxJyxcbiAgICAgIG5vdGlmaWNhdGlvblZhcmlhYmxlVmFsdWVcbiAgICApO1xuICB9IGVsc2UgaWYgKHN1Y2NlZWRlZEVsZW1lbnRzLmxlbmd0aCA+IDMpIHtcbiAgICBub3RpZmljYXRpb25WYXJpYWJsZVZhbHVlID0gc3VjY2VlZGVkRWxlbWVudHMubGVuZ3RoLnRvU3RyaW5nKCk7XG4gICAgbWVzc2FnZSA9IGFjdGlvbi5zdWNjZXNzTm90aWZpY2F0aW9uTW9yZVRoYW4zLnJlcGxhY2UoXG4gICAgICAnJDEnLFxuICAgICAgbm90aWZpY2F0aW9uVmFyaWFibGVWYWx1ZVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VySW50ZXJmYWNlUm91dGVzUmVnZXhwKFxuICByZXNvdXJjZXNUeXBlczogSnNUYWJsZTxJUmVzb3VyY2VUeXBlPixcbiAgY29uZmlnczogSnNUYWJsZTxJQ29uZmlnPlxuKToge1xuICBbaWQ6IHN0cmluZ106IElSZXNvdXJjZVR5cGVSb3V0ZXNSZWdFeHA7XG59IHtcbiAgcmV0dXJuIGNvbmZpZ3MuYWxsSWRzXG4gICAgLmZpbHRlcihcbiAgICAgIChpZDogc3RyaW5nKSA9PlxuICAgICAgICAnbGV2ZWwnIGluIGNvbmZpZ3MuYnlJZFtpZF0gJiYgcmVzb3VyY2VzVHlwZXMuYWxsSWRzLmluY2x1ZGVzKGlkKVxuICAgIClcbiAgICAucmVkdWNlKFxuICAgICAgKGFjYywgcmVzb3VyY2VUeXBlSWQpID0+IHtcbiAgICAgICAgbGV0IHVybEZpcnN0UGFydCA9ICdeL2hvbWUvJztcbiAgICAgICAgbGV0IGRldGFpbFBhdGhSZWdFeHA6IFJlZ0V4cDtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlQ29uZmlnOiBJQ29uZmlnID0gY29uZmlncy5ieUlkW3Jlc291cmNlVHlwZUlkXTtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlUHJvcHM6IElSZXNvdXJjZVR5cGUgPVxuICAgICAgICAgIHJlc291cmNlc1R5cGVzLmJ5SWRbcmVzb3VyY2VUeXBlSWRdO1xuICAgICAgICBpZiAocmVzb3VyY2VUeXBlQ29uZmlnLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgcmVzb3VyY2VUeXBlSGFzQ2hpbGRyZW4gPSBjb25maWdzLmFsbElkcy5zb21lKFxuICAgICAgICAgICAgKGlkOiBzdHJpbmcpID0+IGNvbmZpZ3MuYnlJZFtpZF0ucHJvcHM/LnBhcmVudCA9PT0gcmVzb3VyY2VUeXBlSWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc291cmNlUGF0aFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICB1cmxGaXJzdFBhcnQuY29uY2F0KGAke3Jlc291cmNlVHlwZVByb3BzLmVuZHBvaW50fSRgKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzb3VyY2VUeXBlQ29uZmlnLmNvbXBvbmVudCA9PT0gRVJlc291cmNlQ29tcG9uZW50LkFSUkFZIHx8XG4gICAgICAgICAgICByZXNvdXJjZVR5cGVDb25maWcuY29tcG9uZW50ID09PSBFUmVzb3VyY2VDb21wb25lbnQuTElTVCB8fFxuICAgICAgICAgICAgKHJlc291cmNlVHlwZUNvbmZpZy5jb21wb25lbnQgPT09IEVSZXNvdXJjZUNvbXBvbmVudC5UUkVFICYmXG4gICAgICAgICAgICAgIHJlc291cmNlVHlwZUhhc0NoaWxkcmVuKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZGV0YWlsUGF0aFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgIHVybEZpcnN0UGFydC5jb25jYXQoYCR7cmVzb3VyY2VUeXBlUHJvcHMuZW5kcG9pbnR9L1teL10qJGApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWxQYXRoUmVnRXhwID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgdXJsRmlyc3RQYXJ0LmNvbmNhdChgJHtyZXNvdXJjZVR5cGVQcm9wcy5lbmRwb2ludH0vLiokYClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjYyA9IHtcbiAgICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICAgIFtyZXNvdXJjZVR5cGVJZF06IHtcbiAgICAgICAgICAgICAgcmVzb3VyY2VQYXRoUmVnRXhwLFxuICAgICAgICAgICAgICBkZXRhaWxQYXRoUmVnRXhwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGFsbFBhcmVudHNSZXNvdXJjZXNUeXBlc0lkcyA9XG4gICAgICAgICAgICBnZXRSZXNvdXJjZXNUeXBlc0lkc0J5UmVsYXRpb25zaGlwKFxuICAgICAgICAgICAgICByZXNvdXJjZVR5cGVJZCxcbiAgICAgICAgICAgICAgY29uZmlnc1xuICAgICAgICAgICAgKS5yZXZlcnNlKCk7XG4gICAgICAgICAgZGV0YWlsUGF0aFJlZ0V4cCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICBhbGxQYXJlbnRzUmVzb3VyY2VzVHlwZXNJZHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjQmlzLCBpZCkgPT5cbiAgICAgICAgICAgICAgICBhY2NCaXNcbiAgICAgICAgICAgICAgICAgIC5jb25jYXQoYCR7cmVzb3VyY2VzVHlwZXMuYnlJZFtpZF0uZW5kcG9pbnR9L1teL10qYClcbiAgICAgICAgICAgICAgICAgIC5jb25jYXQocmVzb3VyY2VUeXBlSWQgPT09IGlkID8gJyQnIDogJy8nKSxcbiAgICAgICAgICAgICAgdXJsRmlyc3RQYXJ0XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhY2MgPSB7XG4gICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICBbcmVzb3VyY2VUeXBlSWRdOiB7XG4gICAgICAgICAgICAgIHJlc291cmNlUGF0aFJlZ0V4cDogbnVsbCxcbiAgICAgICAgICAgICAgZGV0YWlsUGF0aFJlZ0V4cCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW3Jlc291cmNlVHlwZUlkOiBzdHJpbmddOiBJUmVzb3VyY2VUeXBlUm91dGVzUmVnRXhwO1xuICAgICAgfVxuICAgICk7XG59XG5cbmZ1bmN0aW9uIGdldFJlc291cmNlc1R5cGVzSWRzQnlSZWxhdGlvbnNoaXAoXG4gIHJlc291cmNlVHlwZUlkOiBzdHJpbmcsXG4gIGNvbmZpZ3M6IEpzVGFibGU8SUNvbmZpZz5cbik6IHN0cmluZ1tdIHtcbiAgbGV0IHJlc291cmNlc1R5cGVzSWRzID0gW3Jlc291cmNlVHlwZUlkXTtcbiAgY29uc3QgcGFyZW50UmVzb3VyY2VUeXBlSWQgPSBjb25maWdzLmJ5SWRbcmVzb3VyY2VUeXBlSWRdLnByb3BzPy5wYXJlbnQ7XG4gIGlmICghIXBhcmVudFJlc291cmNlVHlwZUlkKSB7XG4gICAgcmVzb3VyY2VzVHlwZXNJZHMucHVzaChcbiAgICAgIC4uLmdldFJlc291cmNlc1R5cGVzSWRzQnlSZWxhdGlvbnNoaXAocGFyZW50UmVzb3VyY2VUeXBlSWQsIGNvbmZpZ3MpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzb3VyY2VzVHlwZXNJZHM7XG59XG4iXX0=