UNPKG

@alfresco/adf-content-services

Version:
258 lines 35.3 kB
/*! * @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 { DataSorting } from '@alfresco/adf-core'; import { ShareDataRow } from './share-data-row.model'; export const ERR_ROW_NOT_FOUND = 'Row not found'; export const ERR_COL_NOT_FOUND = 'Column not found'; export class ShareDataTableAdapter { set sortingMode(value) { let newValue = (value || 'client').toLowerCase(); if (newValue !== 'client' && newValue !== 'server') { newValue = 'client'; } this._sortingMode = newValue; } get sortingMode() { return this._sortingMode; } constructor(thumbnailService, contentService, schema = [], sorting, sortingMode = 'client', allowDropFiles = false) { this.thumbnailService = thumbnailService; this.contentService = contentService; this.thumbnails = false; this.rows = []; this.columns = schema || []; this.sorting = sorting; this.sortingMode = sortingMode; this.allowDropFiles = allowDropFiles; } getColumnType(_row, col) { return col.type; } getRows() { return this.rows; } // TODO: disable this api setRows(rows) { this.rows = rows || []; this.sort(); } getColumns() { return this.columns; } setColumns(columns) { this.columns = columns || []; } getValue(row, col) { if (!row) { throw new Error(ERR_ROW_NOT_FOUND); } if (!col) { throw new Error(ERR_COL_NOT_FOUND); } const dataRow = row; const value = row.getValue(col.key); if (dataRow.cache[col.key]) { return dataRow.cache[col.key]; } if (col.key === '$thumbnail') { if (this.imageResolver) { const resolved = this.imageResolver(row, col); if (resolved) { return resolved; } } const node = row.node; if (node.entry.isFolder) { return this.getFolderIcon(node); } if (node.entry.isFile) { if (this.thumbnails) { return this.getDocumentThumbnailUrl(node); } } if (node.entry.content) { const mimeType = node.entry.content.mimeType; if (mimeType) { return this.thumbnailService.getMimeTypeIcon(mimeType); } } return this.thumbnailService.getDefaultMimeTypeIcon(); } if (col.type === 'image') { if (this.imageResolver) { const resolved = this.imageResolver(row, col); if (resolved) { return resolved; } } } return dataRow.cacheValue(col.key, value); } /** * Gets a thumbnail URL for the given document 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 */ getDocumentThumbnailUrl(node, attachment, ticket) { let resultUrl; if (node) { let nodeId; if (typeof node === 'string') { nodeId = node; } else if (node.entry) { nodeId = node.entry.id; } resultUrl = this.contentService.getDocumentThumbnailUrl(nodeId, attachment, ticket); } return resultUrl || this.thumbnailService.getMimeTypeIcon(node.entry.content.mimeType); } getSorting() { return this.sorting; } setSorting(sorting) { this.sorting = sorting; this.sortRows(this.rows, this.sorting); } sort(key, direction) { const sorting = this.sorting || new DataSorting(); if (key) { sorting.key = key; sorting.direction = direction || 'asc'; } this.setSorting(sorting); } setFilter(filter) { this.filter = filter; } setImageResolver(resolver) { this.imageResolver = resolver; } getFolderIcon(node) { if (this.isSmartFolder(node)) { return this.thumbnailService.getMimeTypeIcon('smartFolder'); } else if (this.isRuleFolder(node)) { return this.thumbnailService.getMimeTypeIcon('ruleFolder'); } else if (this.isALinkFolder(node)) { return this.thumbnailService.getMimeTypeIcon('linkFolder'); } else { return this.thumbnailService.getMimeTypeIcon('folder'); } } isSmartFolder(node) { const nodeAspects = this.getNodeAspectNames(node); return nodeAspects.indexOf('smf:customConfigSmartFolder') > -1 || nodeAspects.indexOf('smf:systemConfigSmartFolder') > -1; } isRuleFolder(node) { const nodeAspects = this.getNodeAspectNames(node); return nodeAspects.indexOf('rule:rules') > -1; } isALinkFolder(node) { const nodeType = node.entry ? node.entry.nodeType : node.nodeType; return nodeType === 'app:folderlink'; } getNodeAspectNames(node) { return node.entry?.aspectNames ? node.entry.aspectNames : node.aspectNames ? node.aspectNames : []; } sortRows(rows, sorting) { if (this.sortingMode === 'server') { return; } const options = {}; if (sorting?.key && rows?.length) { if (sorting.key.includes('sizeInBytes') || sorting.key === 'name') { options.numeric = true; } rows.sort((a, b) => { if (a.node.entry.isFolder !== b.node.entry.isFolder) { return a.node.entry.isFolder ? -1 : 1; } let left = a.getValue(sorting.key); if (left) { left = left instanceof Date ? left.valueOf().toString() : left.toString(); } else { left = ''; } let right = b.getValue(sorting.key); if (right) { right = right instanceof Date ? right.valueOf().toString() : right.toString(); } else { right = ''; } return sorting.direction === 'asc' ? left.localeCompare(right, undefined, options) : right.localeCompare(left, undefined, options); }); } } loadPage(nodePaging, merge = false, allowDropFiles) { let shareDataRows = []; if (allowDropFiles !== undefined) { this.allowDropFiles = allowDropFiles; } if (nodePaging?.list) { const nodeEntries = nodePaging.list.entries; if (nodeEntries?.length) { shareDataRows = nodeEntries.map((item) => new ShareDataRow(item, this.contentService, this.permissionsStyle, this.thumbnailService, this.allowDropFiles)); if (this.filter) { shareDataRows = shareDataRows.filter(this.filter); } if (this.sortingMode !== 'server') { // Sort by first sortable or just first column if (this.columns?.length) { const sorting = this.getSorting(); if (sorting) { this.sortRows(shareDataRows, sorting); } else { const sortable = this.columns.filter((c) => c.sortable); if (sortable.length > 0) { this.sort(sortable[0].key, 'asc'); } else { this.sort(this.columns[0].key, 'asc'); } } } } } } if (merge) { const listPrunedDuplicate = shareDataRows.filter((elementToFilter) => { const isPresent = this.rows.find((currentRow) => currentRow.obj.entry.id === elementToFilter.obj.entry.id); return !isPresent; }); this.rows = this.rows.concat(listPrunedDuplicate); } else { this.rows = shareDataRows; } } getSelectedRows() { return this.rows.filter((row) => row.isSelected); } getRowByNodeId(nodeId) { return this.rows.find((row) => row.node.entry.id === nodeId); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmUtZGF0YXRhYmxlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL2RvY3VtZW50LWxpc3QvZGF0YS9zaGFyZS1kYXRhdGFibGUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVCLFdBQVcsRUFBc0MsTUFBTSxvQkFBb0IsQ0FBQztBQUcxRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJdEQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQVcsZUFBZSxDQUFDO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFXLGtCQUFrQixDQUFDO0FBRTVELE1BQU0sT0FBTyxxQkFBcUI7SUFjOUIsSUFBSSxXQUFXLENBQUMsS0FBYTtRQUN6QixJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxJQUFJLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2pELFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVELFlBQ1ksZ0JBQWtDLEVBQ2xDLGNBQThCLEVBQ3RDLFNBQXVCLEVBQUUsRUFDekIsT0FBcUIsRUFDckIsY0FBc0IsUUFBUSxFQUM5QixpQkFBMEIsS0FBSztRQUx2QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQW5CMUMsZUFBVSxHQUFZLEtBQUssQ0FBQztRQXlCeEIsSUFBSSxD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QUFTLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBWSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQztJQUMxRSxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IERhdGFDb2x1bW4sIERhdGFSb3csIERhdGFTb3J0aW5nLCBEYXRhVGFibGVBZGFwdGVyLCBUaHVtYm5haWxTZXJ2aWNlIH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IE5vZGVQYWdpbmcsIE5vZGVFbnRyeSB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgUGVybWlzc2lvblN0eWxlTW9kZWwgfSBmcm9tICcuLy4uL21vZGVscy9wZXJtaXNzaW9ucy1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBTaGFyZURhdGFSb3cgfSBmcm9tICcuL3NoYXJlLWRhdGEtcm93Lm1vZGVsJztcbmltcG9ydCB7IFJvd0ZpbHRlciB9IGZyb20gJy4vcm93LWZpbHRlci5tb2RlbCc7XG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJ2aWNlcy9jb250ZW50LnNlcnZpY2UnO1xuXG5leHBvcnQgY29uc3QgRVJSX1JPV19OT1RfRk9VTkQ6IHN0cmluZyA9ICdSb3cgbm90IGZvdW5kJztcbmV4cG9ydCBjb25zdCBFUlJfQ09MX05PVF9GT1VORDogc3RyaW5nID0gJ0NvbHVtbiBub3QgZm91bmQnO1xuXG5leHBvcnQgY2xhc3MgU2hhcmVEYXRhVGFibGVBZGFwdGVyIGltcGxlbWVudHMgRGF0YVRhYmxlQWRhcHRlciB7XG4gICAgcHJpdmF0ZSBfc29ydGluZ01vZGU6IHN0cmluZztcbiAgICBwcml2YXRlIHNvcnRpbmc6IERhdGFTb3J0aW5nO1xuICAgIHByaXZhdGUgcm93czogRGF0YVJvd1tdO1xuICAgIHByaXZhdGUgY29sdW1uczogRGF0YUNvbHVtbltdO1xuXG4gICAgcHJpdmF0ZSBmaWx0ZXI6IFJvd0ZpbHRlcjtcbiAgICBwcml2YXRlIGltYWdlUmVzb2x2ZXI6IGFueTtcblxuICAgIHRodW1ibmFpbHM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwZXJtaXNzaW9uc1N0eWxlOiBQZXJtaXNzaW9uU3R5bGVNb2RlbFtdO1xuICAgIHNlbGVjdGVkUm93OiBEYXRhUm93O1xuICAgIGFsbG93RHJvcEZpbGVzOiBib29sZWFuO1xuXG4gICAgc2V0IHNvcnRpbmdNb2RlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlID0gKHZhbHVlIHx8ICdjbGllbnQnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobmV3VmFsdWUgIT09ICdjbGllbnQnICYmIG5ld1ZhbHVlICE9PSAnc2VydmVyJykge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSAnY2xpZW50JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3J0aW5nTW9kZSA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIGdldCBzb3J0aW5nTW9kZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydGluZ01vZGU7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgdGh1bWJuYWlsU2VydmljZTogVGh1bWJuYWlsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50U2VydmljZTogQ29udGVudFNlcnZpY2UsXG4gICAgICAgIHNjaGVtYTogRGF0YUNvbHVtbltdID0gW10sXG4gICAgICAgIHNvcnRpbmc/OiBEYXRhU29ydGluZyxcbiAgICAgICAgc29ydGluZ01vZGU6IHN0cmluZyA9ICdjbGllbnQnLFxuICAgICAgICBhbGxvd0Ryb3BGaWxlczogYm9vbGVhbiA9IGZhbHNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMucm93cyA9IFtdO1xuICAgICAgICB0aGlzLmNvbHVtbnMgPSBzY2hlbWEgfHwgW107XG4gICAgICAgIHRoaXMuc29ydGluZyA9IHNvcnRpbmc7XG4gICAgICAgIHRoaXMuc29ydGluZ01vZGUgPSBzb3J0aW5nTW9kZTtcbiAgICAgICAgdGhpcy5hbGxvd0Ryb3BGaWxlcyA9IGFsbG93RHJvcEZpbGVzO1xuICAgIH1cblxuICAgIGdldENvbHVtblR5cGUoX3JvdzogRGF0YVJvdywgY29sOiBEYXRhQ29sdW1uKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGNvbC50eXBlO1xuICAgIH1cblxuICAgIGdldFJvd3MoKTogQXJyYXk8RGF0YVJvdz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGRpc2FibGUgdGhpcyBhcGlcbiAgICBzZXRSb3dzKHJvd3M6IEFycmF5PERhdGFSb3c+KSB7XG4gICAgICAgIHRoaXMucm93cyA9IHJvd3MgfHwgW107XG4gICAgICAgIHRoaXMuc29ydCgpO1xuICAgIH1cblxuICAgIGdldENvbHVtbnMoKTogQXJyYXk8RGF0YUNvbHVtbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2x1bW5zO1xuICAgIH1cblxuICAgIHNldENvbHVtbnMoY29sdW1uczogQXJyYXk8RGF0YUNvbHVtbj4pIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTtcbiAgICB9XG5cbiAgICBnZXRWYWx1ZShyb3c6IERhdGFSb3csIGNvbDogRGF0YUNvbHVtbik6IGFueSB7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJSX1JPV19OT1RfRk9VTkQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29sKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJSX0NPTF9OT1RfRk9VTkQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGFSb3cgPSByb3cgYXMgU2hhcmVEYXRhUm93O1xuICAgICAgICBjb25zdCB2YWx1ZTogYW55ID0gcm93LmdldFZhbHVlKGNvbC5rZXkpO1xuICAgICAgICBpZiAoZGF0YVJvdy5jYWNoZVtjb2wua2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGFSb3cuY2FjaGVbY29sLmtleV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLmtleSA9PT0gJyR0aHVtYm5haWwnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZVJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLmltYWdlUmVzb2x2ZXIocm93LCBjb2wpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gcm93Lm5vZGU7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmVudHJ5LmlzRm9sZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9sZGVySWNvbihub2RlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUuZW50cnkuaXNGaWxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGh1bWJuYWlscykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREb2N1bWVudFRodW1ibmFpbFVybChub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLmVudHJ5LmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtaW1lVHlwZSA9IG5vZGUuZW50cnkuY29udGVudC5taW1lVHlwZTtcbiAgICAgICAgICAgICAgICBpZiAobWltZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24obWltZVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXREZWZhdWx0TWltZVR5cGVJY29uKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmltYWdlUmVzb2x2ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHRoaXMuaW1hZ2VSZXNvbHZlcihyb3csIGNvbCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YVJvdy5jYWNoZVZhbHVlKGNvbC5rZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgdGh1bWJuYWlsIFVSTCBmb3IgdGhlIGdpdmVuIGRvY3VtZW50IG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIG9yIE5vZGUgSUQgdG8gZ2V0IFVSTCBmb3IuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgVG9nZ2xlcyB3aGV0aGVyIHRvIHJldHJpZXZlIGNvbnRlbnQgYXMgYW4gYXR0YWNobWVudCBmb3IgZG93bmxvYWRcbiAgICAgKiBAcGFyYW0gdGlja2V0IEN1c3RvbSB0aWNrZXQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEByZXR1cm5zIFVSTCBzdHJpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldERvY3VtZW50VGh1bWJuYWlsVXJsKG5vZGU6IE5vZGVFbnRyeSwgYXR0YWNobWVudD86IGJvb2xlYW4sIHRpY2tldD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHRVcmw6IHN0cmluZztcblxuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkID0gbm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5lbnRyeSkge1xuICAgICAgICAgICAgICAgIG5vZGVJZCA9IG5vZGUuZW50cnkuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdFVybCA9IHRoaXMuY29udGVudFNlcnZpY2UuZ2V0RG9jdW1lbnRUaHVtYm5haWxVcmwobm9kZUlkLCBhdHRhY2htZW50LCB0aWNrZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFVybCB8fCB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKG5vZGUuZW50cnkuY29udGVudC5taW1lVHlwZSk7XG4gICAgfVxuXG4gICAgZ2V0U29ydGluZygpOiBEYXRhU29ydGluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRpbmc7XG4gICAgfVxuXG4gICAgc2V0U29ydGluZyhzb3J0aW5nOiBEYXRhU29ydGluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNvcnRpbmcgPSBzb3J0aW5nO1xuXG4gICAgICAgIHRoaXMuc29ydFJvd3ModGhpcy5yb3dzLCB0aGlzLnNvcnRpbmcpO1xuICAgIH1cblxuICAgIHNvcnQoa2V5Pzogc3RyaW5nLCBkaXJlY3Rpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc29ydGluZyA9IHRoaXMuc29ydGluZyB8fCBuZXcgRGF0YVNvcnRpbmcoKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgc29ydGluZy5rZXkgPSBrZXk7XG4gICAgICAgICAgICBzb3J0aW5nLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCAnYXNjJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvcnRpbmcoc29ydGluZyk7XG4gICAgfVxuXG4gICAgc2V0RmlsdGVyKGZpbHRlcjogUm93RmlsdGVyKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyO1xuICAgIH1cblxuICAgIHNldEltYWdlUmVzb2x2ZXIocmVzb2x2ZXI6IGFueSkge1xuICAgICAgICB0aGlzLmltYWdlUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvbGRlckljb24obm9kZTogYW55KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU21hcnRGb2xkZXIobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKCdzbWFydEZvbGRlcicpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNSdWxlRm9sZGVyKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxTZXJ2aWNlLmdldE1pbWVUeXBlSWNvbigncnVsZUZvbGRlcicpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNBTGlua0ZvbGRlcihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24oJ2xpbmtGb2xkZXInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKCdmb2xkZXInKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzU21hcnRGb2xkZXIobm9kZTogYW55KSB7XG4gICAgICAgIGNvbnN0IG5vZGVBc3BlY3RzID0gdGhpcy5nZXROb2RlQXNwZWN0TmFtZXMobm9kZSk7XG4gICAgICAgIHJldHVybiBub2RlQXNwZWN0cy5pbmRleE9mKCdzbWY6Y3VzdG9tQ29uZmlnU21hcnRGb2xkZXInKSA+IC0xIHx8IG5vZGVBc3BlY3RzLmluZGV4T2YoJ3NtZjpzeXN0ZW1Db25maWdTbWFydEZvbGRlcicpID4gLTE7XG4gICAgfVxuXG4gICAgaXNSdWxlRm9sZGVyKG5vZGU6IGFueSkge1xuICAgICAgICBjb25zdCBub2RlQXNwZWN0cyA9IHRoaXMuZ2V0Tm9kZUFzcGVjdE5hbWVzKG5vZGUpO1xuICAgICAgICByZXR1cm4gbm9kZUFzcGVjdHMuaW5kZXhPZigncnVsZTpydWxlcycpID4gLTE7XG4gICAgfVxuXG4gICAgaXNBTGlua0ZvbGRlcihub2RlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBub2RlLmVudHJ5ID8gbm9kZS5lbnRyeS5ub2RlVHlwZSA6IG5vZGUubm9kZVR5cGU7XG4gICAgICAgIHJldHVybiBub2RlVHlwZSA9PT0gJ2FwcDpmb2xkZXJsaW5rJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5vZGVBc3BlY3ROYW1lcyhub2RlOiBhbnkpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiBub2RlLmVudHJ5Py5hc3BlY3ROYW1lcyA/IG5vZGUuZW50cnkuYXNwZWN0TmFtZXMgOiBub2RlLmFzcGVjdE5hbWVzID8gbm9kZS5hc3BlY3ROYW1lcyA6IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgc29ydFJvd3Mocm93czogRGF0YVJvd1tdLCBzb3J0aW5nOiBEYXRhU29ydGluZykge1xuICAgICAgICBpZiAodGhpcy5zb3J0aW5nTW9kZSA9PT0gJ3NlcnZlcicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IEludGwuQ29sbGF0b3JPcHRpb25zID0ge307XG5cbiAgICAgICAgaWYgKHNvcnRpbmc/LmtleSAmJiByb3dzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzb3J0aW5nLmtleS5pbmNsdWRlcygnc2l6ZUluQnl0ZXMnKSB8fCBzb3J0aW5nLmtleSA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5udW1lcmljID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcm93cy5zb3J0KChhOiBTaGFyZURhdGFSb3csIGI6IFNoYXJlRGF0YVJvdykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhLm5vZGUuZW50cnkuaXNGb2xkZXIgIT09IGIubm9kZS5lbnRyeS5pc0ZvbGRlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5ub2RlLmVudHJ5LmlzRm9sZGVyID8gLTEgOiAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gYS5nZXRWYWx1ZShzb3J0aW5nLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgaW5zdGFuY2VvZiBEYXRlID8gbGVmdC52YWx1ZU9mKCkudG9TdHJpbmcoKSA6IGxlZnQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHJpZ2h0ID0gYi5nZXRWYWx1ZShzb3J0aW5nLmtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgaW5zdGFuY2VvZiBEYXRlID8gcmlnaHQudmFsdWVPZigpLnRvU3RyaW5nKCkgOiByaWdodC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvcnRpbmcuZGlyZWN0aW9uID09PSAnYXNjJyA/IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCwgdW5kZWZpbmVkLCBvcHRpb25zKSA6IHJpZ2h0LmxvY2FsZUNvbXBhcmUobGVmdCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRQYWdlKG5vZGVQYWdpbmc6IE5vZGVQYWdpbmcsIG1lcmdlOiBib29sZWFuID0gZmFsc2UsIGFsbG93RHJvcEZpbGVzPzogYm9vbGVhbikge1xuICAgICAgICBsZXQgc2hhcmVEYXRhUm93czogU2hhcmVEYXRhUm93W10gPSBbXTtcbiAgICAgICAgaWYgKGFsbG93RHJvcEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsb3dEcm9wRmlsZXMgPSBhbGxvd0Ryb3BGaWxlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZVBhZ2luZz8ubGlzdCkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZUVudHJpZXM6IE5vZGVFbnRyeVtdID0gbm9kZVBhZ2luZy5saXN0LmVudHJpZXM7XG4gICAgICAgICAgICBpZiAobm9kZUVudHJpZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNoYXJlRGF0YVJvd3MgPSBub2RlRW50cmllcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiBuZXcgU2hhcmVEYXRhUm93KGl0ZW0sIHRoaXMuY29udGVudFNlcnZpY2UsIHRoaXMucGVybWlzc2lvbnNTdHlsZSwgdGhpcy50aHVtYm5haWxTZXJ2aWNlLCB0aGlzLmFsbG93RHJvcEZpbGVzKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVEYXRhUm93cyA9IHNoYXJlRGF0YVJvd3MuZmlsdGVyKHRoaXMuZmlsdGVyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0aW5nTW9kZSAhPT0gJ3NlcnZlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU29ydCBieSBmaXJzdCBzb3J0YWJsZSBvciBqdXN0IGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRpbmcgPSB0aGlzLmdldFNvcnRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3J0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0Um93cyhzaGFyZURhdGFSb3dzLCBzb3J0aW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGFibGUgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLnNvcnRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ydGFibGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnQoc29ydGFibGVbMF0ua2V5LCAnYXNjJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0KHRoaXMuY29sdW1uc1swXS5rZXksICdhc2MnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RQcnVuZWREdXBsaWNhdGUgPSBzaGFyZURhdGFSb3dzLmZpbHRlcigoZWxlbWVudFRvRmlsdGVyOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXNlbnQgPSB0aGlzLnJvd3MuZmluZCgoY3VycmVudFJvdzogYW55KSA9PiBjdXJyZW50Um93Lm9iai5lbnRyeS5pZCA9PT0gZWxlbWVudFRvRmlsdGVyLm9iai5lbnRyeS5pZCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIWlzUHJlc2VudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJvd3MgPSB0aGlzLnJvd3MuY29uY2F0KGxpc3RQcnVuZWREdXBsaWNhdGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3dzID0gc2hhcmVEYXRhUm93cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNlbGVjdGVkUm93cygpOiBEYXRhUm93W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dzLmZpbHRlcigocm93OiBEYXRhUm93KSA9PiByb3cuaXNTZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgZ2V0Um93QnlOb2RlSWQobm9kZUlkOiBzdHJpbmcpOiBEYXRhUm93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93cy5maW5kKChyb3c6IERhdGFSb3cpID0+IHJvdy5ub2RlLmVudHJ5LmlkID09PSBub2RlSWQpO1xuICAgIH1cbn1cbiJdfQ==