@alfresco/adf-content-services
Version:
Alfresco ADF content services
180 lines • 24 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Injectable } from '@angular/core';
import { ContentApi } from '@alfresco/js-api';
import { Subject } from 'rxjs';
import { AuthenticationService, ThumbnailService } from '@alfresco/adf-core';
import { PermissionsEnum } from '../models/permissions.enum';
import { AllowableOperationsEnum } from '../models/allowable-operations.enum';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import * as i0 from "@angular/core";
import * as i1 from "@alfresco/adf-core";
import * as i2 from "../../services/alfresco-api.service";
export class ContentService {
get contentApi() {
this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance());
return this._contentApi;
}
constructor(authService, apiService, thumbnailService) {
this.authService = authService;
this.apiService = apiService;
this.thumbnailService = thumbnailService;
this.folderCreated = new Subject();
this.folderCreate = new Subject();
this.folderEdit = new Subject();
}
/**
* Gets a content URL for the given node.
*
* @param node Node or Node ID to get URL for.
* @param attachment Toggles whether to retrieve content as an attachment for download
* @param ticket Custom ticket to use for authentication
* @returns URL string or `null`
*/
getContentUrl(node, attachment, ticket) {
if (node) {
let nodeId;
if (typeof node === 'string') {
nodeId = node;
}
else if (node.entry) {
nodeId = node.entry.id;
}
return this.contentApi.getContentUrl(nodeId, attachment, ticket);
}
return null;
}
getDocumentThumbnailUrl(nodeId, attachment, ticket) {
return this.contentApi.getDocumentThumbnailUrl(nodeId, attachment, ticket);
}
/**
* Checks if the user has permission on that node
*
* @param node Node to check permissions
* @param permission Required permission type
* @param userId Optional current user id will be taken by default
* @returns True if the user has the required permissions, false otherwise
*/
hasPermissions(node, permission, userId) {
let hasPermissions = false;
userId = userId ?? this.authService.getEcmUsername();
const permissions = [...(node.permissions?.locallySet || []), ...(node.permissions?.inherited || [])].filter((currentPermission) => currentPermission.authorityId === userId);
if (permissions.length) {
if (permission?.startsWith('!')) {
hasPermissions = !permissions.find((currentPermission) => currentPermission.name === permission.replace('!', ''));
}
else {
hasPermissions = !!permissions.find((currentPermission) => currentPermission.name === permission);
}
}
else {
if (permission === PermissionsEnum.CONSUMER) {
hasPermissions = true;
}
else if (permission === PermissionsEnum.NOT_CONSUMER) {
hasPermissions = false;
}
else if (permission?.startsWith('!')) {
hasPermissions = true;
}
}
return hasPermissions;
}
/**
* Checks if the user has permissions on that node
*
* @param node Node to check allowableOperations
* @param allowableOperation Create, delete, update, updatePermissions, !create, !delete, !update, !updatePermissions
* @returns True if the user has the required permissions, false otherwise
*/
hasAllowableOperations(node, allowableOperation) {
let hasAllowableOperations = false;
if (node?.allowableOperations) {
if (allowableOperation?.startsWith('!')) {
hasAllowableOperations = !node.allowableOperations.find((currentOperation) => currentOperation === allowableOperation.replace('!', ''));
}
else {
hasAllowableOperations = !!node.allowableOperations.find((currentOperation) => currentOperation === allowableOperation);
}
}
else {
if (allowableOperation?.startsWith('!')) {
hasAllowableOperations = true;
}
}
if (allowableOperation === AllowableOperationsEnum.COPY) {
hasAllowableOperations = true;
}
if (allowableOperation === AllowableOperationsEnum.LOCK) {
hasAllowableOperations = node.isFile;
if (node.isLocked && node.allowableOperations) {
hasAllowableOperations = !!~node.allowableOperations.indexOf('updatePermissions');
}
}
return hasAllowableOperations;
}
getNodeIcon(node) {
if (node?.isFolder) {
return this.getFolderIcon(node);
}
if (node?.isFile) {
return this.thumbnailService.getMimeTypeIcon(node?.content?.mimeType);
}
return this.thumbnailService.getDefaultMimeTypeIcon();
}
getFolderIcon(node) {
if (this.isSmartFolder(node)) {
return this.thumbnailService.getMimeTypeIcon('smartFolder');
}
else if (this.isRuleFolder(node)) {
return this.thumbnailService.getMimeTypeIcon('ruleFolder');
}
else if (this.isLinkFolder(node)) {
return this.thumbnailService.getMimeTypeIcon('linkFolder');
}
else {
return this.thumbnailService.getMimeTypeIcon('folder');
}
}
isSmartFolder(node) {
if (node) {
return this.hasAspect(node, 'smf:customConfigSmartFolder') || this.hasAspect(node, 'smf:systemConfigSmartFolder');
}
return false;
}
isRuleFolder(node) {
if (node) {
return this.hasAspect(node, 'rule:rules');
}
return false;
}
isLinkFolder(node) {
return node?.nodeType === 'app:folderlink';
}
hasAspect(node, aspectName) {
return node?.aspectNames?.includes(aspectName);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentService, deps: [{ token: i1.AuthenticationService }, { token: i2.AlfrescoApiService }, { token: i1.ThumbnailService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.AuthenticationService }, { type: i2.AlfrescoApiService }, { type: i1.ThumbnailService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9jb21tb24vc2VydmljZXMvY29udGVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQVl6RSxNQUFNLE9BQU8sY0FBYztJQU12QixJQUFJLFVBQVU7UUFDVixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBbUIsV0FBa0MsRUFBUyxVQUE4QixFQUFVLGdCQUFtQztRQUF0SCxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFBUyxlQUFVLEdBQVYsVUFBVSxDQUFvQjtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFWekksa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBc0IsQ0FBQztRQUNsRCxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7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QUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFVO1FBQ25CLE9BQU8sSUFBSSxFQUFFLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQztJQUMvQyxDQUFDO0lBRU8sU0FBUyxDQUFDLElBQVUsRUFBRSxVQUFrQjtRQUM1QyxPQUFPLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7OEdBNUpRLGNBQWM7a0hBQWQsY0FBYyxjQUZYLE1BQU07OzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZW50QXBpLCBOb2RlLCBOb2RlRW50cnkgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgVGh1bWJuYWlsU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc0VudW0gfSBmcm9tICcuLi9tb2RlbHMvcGVybWlzc2lvbnMuZW51bSc7XG5pbXBvcnQgeyBBbGxvd2FibGVPcGVyYXRpb25zRW51bSB9IGZyb20gJy4uL21vZGVscy9hbGxvd2FibGUtb3BlcmF0aW9ucy5lbnVtJztcbmltcG9ydCB7IEFsZnJlc2NvQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FsZnJlc2NvLWFwaS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBGb2xkZXJDcmVhdGVkRXZlbnQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICByZWxhdGl2ZVBhdGg/OiBzdHJpbmc7XG4gICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgbm9kZT86IE5vZGVFbnRyeTtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50U2VydmljZSB7XG4gICAgZm9sZGVyQ3JlYXRlZCA9IG5ldyBTdWJqZWN0PEZvbGRlckNyZWF0ZWRFdmVudD4oKTtcbiAgICBmb2xkZXJDcmVhdGUgPSBuZXcgU3ViamVjdDxOb2RlPigpO1xuICAgIGZvbGRlckVkaXQgPSBuZXcgU3ViamVjdDxOb2RlPigpO1xuXG4gICAgcHJpdmF0ZSBfY29udGVudEFwaTogQ29udGVudEFwaTtcbiAgICBnZXQgY29udGVudEFwaSgpOiBDb250ZW50QXBpIHtcbiAgICAgICAgdGhpcy5fY29udGVudEFwaSA9IHRoaXMuX2NvbnRlbnRBcGkgPz8gbmV3IENvbnRlbnRBcGkodGhpcy5hcGlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudEFwaTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgcHVibGljIGFwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSwgcHJpdmF0ZSB0aHVtYm5haWxTZXJ2aWNlPzogVGh1bWJuYWlsU2VydmljZSkge31cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjb250ZW50IFVSTCBmb3IgdGhlIGdpdmVuIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIG9yIE5vZGUgSUQgdG8gZ2V0IFVSTCBmb3IuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgVG9nZ2xlcyB3aGV0aGVyIHRvIHJldHJpZXZlIGNvbnRlbnQgYXMgYW4gYXR0YWNobWVudCBmb3IgZG93bmxvYWRcbiAgICAgKiBAcGFyYW0gdGlja2V0IEN1c3RvbSB0aWNrZXQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEByZXR1cm5zIFVSTCBzdHJpbmcgb3IgYG51bGxgXG4gICAgICovXG4gICAgZ2V0Q29udGVudFVybChub2RlOiBOb2RlRW50cnkgfCBzdHJpbmcsIGF0dGFjaG1lbnQ/OiBib29sZWFuLCB0aWNrZXQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkID0gbm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5lbnRyeSkge1xuICAgICAgICAgICAgICAgIG5vZGVJZCA9IG5vZGUuZW50cnkuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0Q29udGVudFVybChub2RlSWQsIGF0dGFjaG1lbnQsIHRpY2tldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXREb2N1bWVudFRodW1ibmFpbFVybChub2RlSWQ6IHN0cmluZywgYXR0YWNobWVudD86IGJvb2xlYW4sIHRpY2tldD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0RG9jdW1lbnRUaHVtYm5haWxVcmwobm9kZUlkLCBhdHRhY2htZW50LCB0aWNrZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiBvbiB0aGF0IG5vZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2sgcGVybWlzc2lvbnNcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbiBSZXF1aXJlZCBwZXJtaXNzaW9uIHR5cGVcbiAgICAgKiBAcGFyYW0gdXNlcklkIE9wdGlvbmFsIGN1cnJlbnQgdXNlciBpZCB3aWxsIGJlIHRha2VuIGJ5IGRlZmF1bHRcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB1c2VyIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGhhc1Blcm1pc3Npb25zKG5vZGU6IE5vZGUsIHBlcm1pc3Npb246IFBlcm1pc3Npb25zRW51bSB8IHN0cmluZywgdXNlcklkPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBoYXNQZXJtaXNzaW9ucyA9IGZhbHNlO1xuICAgICAgICB1c2VySWQgPSB1c2VySWQgPz8gdGhpcy5hdXRoU2VydmljZS5nZXRFY21Vc2VybmFtZSgpO1xuXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gWy4uLihub2RlLnBlcm1pc3Npb25zPy5sb2NhbGx5U2V0IHx8IFtdKSwgLi4uKG5vZGUucGVybWlzc2lvbnM/LmluaGVyaXRlZCB8fCBbXSldLmZpbHRlcihcbiAgICAgICAgICAgIChjdXJyZW50UGVybWlzc2lvbikgPT4gY3VycmVudFBlcm1pc3Npb24uYXV0aG9yaXR5SWQgPT09IHVzZXJJZFxuICAgICAgICApO1xuICAgICAgICBpZiAocGVybWlzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbj8uc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSAhcGVybWlzc2lvbnMuZmluZCgoY3VycmVudFBlcm1pc3Npb24pID0+IGN1cnJlbnRQZXJtaXNzaW9uLm5hbWUgPT09IHBlcm1pc3Npb24ucmVwbGFjZSgnIScsICcnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb25zID0gISFwZXJtaXNzaW9ucy5maW5kKChjdXJyZW50UGVybWlzc2lvbikgPT4gY3VycmVudFBlcm1pc3Npb24ubmFtZSA9PT0gcGVybWlzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUGVybWlzc2lvbnNFbnVtLkNPTlNVTUVSKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uID09PSBQZXJtaXNzaW9uc0VudW0uTk9UX0NPTlNVTUVSKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbj8uc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc1Blcm1pc3Npb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbnMgb24gdGhhdCBub2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGNoZWNrIGFsbG93YWJsZU9wZXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gYWxsb3dhYmxlT3BlcmF0aW9uIENyZWF0ZSwgZGVsZXRlLCB1cGRhdGUsIHVwZGF0ZVBlcm1pc3Npb25zLCAhY3JlYXRlLCAhZGVsZXRlLCAhdXBkYXRlLCAhdXBkYXRlUGVybWlzc2lvbnNcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB1c2VyIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZTogTm9kZSwgYWxsb3dhYmxlT3BlcmF0aW9uOiBBbGxvd2FibGVPcGVyYXRpb25zRW51bSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChub2RlPy5hbGxvd2FibGVPcGVyYXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dhYmxlT3BlcmF0aW9uPy5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgICAgICAgICBoYXNBbGxvd2FibGVPcGVyYXRpb25zID0gIW5vZGUuYWxsb3dhYmxlT3BlcmF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAoY3VycmVudE9wZXJhdGlvbikgPT4gY3VycmVudE9wZXJhdGlvbiA9PT0gYWxsb3dhYmxlT3BlcmF0aW9uLnJlcGxhY2UoJyEnLCAnJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYXNBbGxvd2FibGVPcGVyYXRpb25zID0gISFub2RlLmFsbG93YWJsZU9wZXJhdGlvbnMuZmluZCgoY3VycmVudE9wZXJhdGlvbikgPT4gY3VycmVudE9wZXJhdGlvbiA9PT0gYWxsb3dhYmxlT3BlcmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhbGxvd2FibGVPcGVyYXRpb24/LnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICAgICAgICAgIGhhc0FsbG93YWJsZU9wZXJhdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbG93YWJsZU9wZXJhdGlvbiA9PT0gQWxsb3dhYmxlT3BlcmF0aW9uc0VudW0uQ09QWSkge1xuICAgICAgICAgICAgaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsb3dhYmxlT3BlcmF0aW9uID09PSBBbGxvd2FibGVPcGVyYXRpb25zRW51bS5MT0NLKSB7XG4gICAgICAgICAgICBoYXNBbGxvd2FibGVPcGVyYXRpb25zID0gbm9kZS5pc0ZpbGU7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmlzTG9ja2VkICYmIG5vZGUuYWxsb3dhYmxlT3BlcmF0aW9ucykge1xuICAgICAgICAgICAgICAgIGhhc0FsbG93YWJsZU9wZXJhdGlvbnMgPSAhIX5ub2RlLmFsbG93YWJsZU9wZXJhdGlvbnMuaW5kZXhPZigndXBkYXRlUGVybWlzc2lvbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNBbGxvd2FibGVPcGVyYXRpb25zO1xuICAgIH1cblxuICAgIGdldE5vZGVJY29uKG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBpZiAobm9kZT8uaXNGb2xkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvbGRlckljb24obm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGU/LmlzRmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24obm9kZT8uY29udGVudD8ubWltZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0RGVmYXVsdE1pbWVUeXBlSWNvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9sZGVySWNvbihub2RlOiBOb2RlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTbWFydEZvbGRlcihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24oJ3NtYXJ0Rm9sZGVyJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1J1bGVGb2xkZXIobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKCdydWxlRm9sZGVyJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0xpbmtGb2xkZXIobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKCdsaW5rRm9sZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxTZXJ2aWNlLmdldE1pbWVUeXBlSWNvbignZm9sZGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1NtYXJ0Rm9sZGVyKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0FzcGVjdChub2RlLCAnc21mOmN1c3RvbUNvbmZpZ1NtYXJ0Rm9sZGVyJykgfHwgdGhpcy5oYXNBc3BlY3Qobm9kZSwgJ3NtZjpzeXN0ZW1Db25maWdTbWFydEZvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1J1bGVGb2xkZXIobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzQXNwZWN0KG5vZGUsICdydWxlOnJ1bGVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzTGlua0ZvbGRlcihub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBub2RlPy5ub2RlVHlwZSA9PT0gJ2FwcDpmb2xkZXJsaW5rJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0FzcGVjdChub2RlOiBOb2RlLCBhc3BlY3ROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG5vZGU/LmFzcGVjdE5hbWVzPy5pbmNsdWRlcyhhc3BlY3ROYW1lKTtcbiAgICB9XG59XG4iXX0=