UNPKG

@clr/angular

Version:

Angular components for Clarity

121 lines 18.8 kB
/* * Copyright (c) 2016-2025 Broadcom. All Rights Reserved. * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. * This software is released under MIT license. * The full license information can be found in LICENSE in the root directory of this project. */ import { Keys } from '../../../utils/enums/keys.enum'; import { DefaultKeyNavigationStrategy } from './key-navigation-strategies/default'; import { ExpandedColumnsRowKeyNavigationStrategy } from './key-navigation-strategies/expanded-columns-row'; import { ExpandedRowKeyNavigationStrategy } from './key-navigation-strategies/expanded-row'; export class KeyNavigationUtils { constructor(host, config) { this.host = host; this.config = config; } get grid() { return this.host?.querySelector(this.config.keyGrid); } get rows() { return this.host?.querySelectorAll(this.config.keyGridRows); } get cells() { return this.host?.querySelectorAll(this.config.keyGridCells); } get currentCellCoordinates() { const currentCell = this.cells ? Array.from(this.cells).find(i => i.getAttribute('tabindex') === '0') : null; const currentRow = currentCell ? currentCell.closest(this.config.keyGridRows) : null; const coordinates = { x: currentRow && currentCell ? Array.from(currentRow.querySelectorAll(this.config.keyGridCells)).indexOf(currentCell) : 0, y: currentRow && currentCell && this.rows ? Array.from(this.rows).indexOf(currentRow) : 0, }; return coordinates; } get averageRowHeight() { const heightSum = Array.from(this.rows.values()).reduce((sum, row) => { return sum + row.clientHeight; }, 0); return Math.round(heightSum / this.rows.length); } get itemsPerPage() { return Math.floor(this.host?.querySelector('.datagrid').clientHeight / this.averageRowHeight) - 1 || 0; } setAriaRowIndexTo(cellCoords) { let ariaRowIndex = this.rows[cellCoords.y].getAttribute('aria-rowindex'); if (!ariaRowIndex) { ariaRowIndex = this.rows[cellCoords.y - 1].getAttribute('aria-rowindex'); } cellCoords.ariaRowIndex = ariaRowIndex; } getNextItemCoordinate(e) { const currentCellCoords = this.currentCellCoordinates; const strategy = this.getNavStrategy(currentCellCoords); const inlineStart = this.host.dir === 'rtl' ? Keys.ArrowRight : Keys.ArrowLeft; const inlineEnd = this.host.dir === 'rtl' ? Keys.ArrowLeft : Keys.ArrowRight; switch (e.key) { case Keys.ArrowUp: return strategy.keyUp(currentCellCoords); case Keys.ArrowDown: return strategy.keyDown(currentCellCoords); case inlineStart: return strategy.keyLeft(currentCellCoords); case inlineEnd: return strategy.keyRight(currentCellCoords); case Keys.Home: return strategy.keyHome(currentCellCoords, e.ctrlKey); case Keys.End: return strategy.keyEnd(currentCellCoords, e.ctrlKey); case Keys.PageUp: return strategy.keyPageUp(currentCellCoords); case Keys.PageDown: return strategy.keyPageDown(currentCellCoords); default: return currentCellCoords; } } getCellsForRow(index) { return this.rows[index].querySelectorAll(this.config.keyGridCells); } isExpandedRow(index) { const selectedElement = this.rows[index].querySelector('.datagrid-row-detail'); return selectedElement ? selectedElement.style.display !== 'none' : false; } isDetailsRow(index) { return this.rows[index].classList.contains('datagrid-row-detail'); } isRowReplaced(index) { return !!this.rows[index].closest('clr-dg-row.datagrid-row-replaced'); } isSingleCellExpandedRow(index) { return this.rows[index]?.querySelectorAll(this.config.keyGridCells).length === 1; } actionCellCount(index) { return this.actionCellsAsArray(index).length; } actionCellsAsArray(index) { return Array.from(this.rows[index].querySelectorAll('.datagrid-row-sticky .datagrid-cell, .datagrid-row-sticky .datagrid-column')); } isActionCell(cellCoords) { return !!this.actionCellsAsArray(cellCoords.y)[cellCoords.x]; } createNextCellCoords(cellCoords) { return { x: cellCoords.x, y: cellCoords.y, }; } getNavStrategy(currentCellCoords) { switch (true) { case this.isSingleCellExpandedRow(currentCellCoords.y): return new ExpandedRowKeyNavigationStrategy(this); case this.isDetailsRow(currentCellCoords.y): case this.isExpandedRow(currentCellCoords.y): return new ExpandedColumnsRowKeyNavigationStrategy(this); default: return new DefaultKeyNavigationStrategy(this); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LW5hdmlnYXRpb24tdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy9kYXRhL2RhdGFncmlkL3V0aWxzL2tleS1uYXZpZ2F0aW9uLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3RELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTVGLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBbUIsSUFBaUIsRUFBUyxNQUErQjtRQUF6RCxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBeUI7SUFBRyxDQUFDO0lBRWhGLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUE0QixDQUFDO0lBQ3pGLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQTRCLENBQUM7SUFDMUYsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUss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UUFDdkQsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELE9BQU8sSUFBSSxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRCxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNEO2dCQUNFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNqRDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBCcm9hZGNvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoZSB0ZXJtIFwiQnJvYWRjb21cIiByZWZlcnMgdG8gQnJvYWRjb20gSW5jLiBhbmQvb3IgaXRzIHN1YnNpZGlhcmllcy5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHsgS2V5cyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2VudW1zL2tleXMuZW51bSc7XG5pbXBvcnQgeyBLZXlOYXZpZ2F0aW9uR3JpZFN0cmF0ZWd5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9rZXktbmF2LWdyaWQtc3RyYXRlZ3kuaW50ZXJmYWNlJztcbmltcG9ydCB7IENlbGxDb29yZGluYXRlcywgS2V5TmF2aWdhdGlvbkdyaWRDb25maWcgfSBmcm9tICcuL2tleS1uYXZpZ2F0aW9uLWdyaWQuY29udHJvbGxlcic7XG5pbXBvcnQgeyBEZWZhdWx0S2V5TmF2aWdhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi1zdHJhdGVnaWVzL2RlZmF1bHQnO1xuaW1wb3J0IHsgRXhwYW5kZWRDb2x1bW5zUm93S2V5TmF2aWdhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi1zdHJhdGVnaWVzL2V4cGFuZGVkLWNvbHVtbnMtcm93JztcbmltcG9ydCB7IEV4cGFuZGVkUm93S2V5TmF2aWdhdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9rZXktbmF2aWdhdGlvbi1zdHJhdGVnaWVzL2V4cGFuZGVkLXJvdyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlOYXZpZ2F0aW9uVXRpbHMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaG9zdDogSFRNTEVsZW1lbnQsIHB1YmxpYyBjb25maWc6IEtleU5hdmlnYXRpb25HcmlkQ29uZmlnKSB7fVxuXG4gIGdldCBncmlkKCkge1xuICAgIHJldHVybiB0aGlzLmhvc3Q/LnF1ZXJ5U2VsZWN0b3IodGhpcy5jb25maWcua2V5R3JpZCk7XG4gIH1cblxuICBnZXQgcm93cygpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuY29uZmlnLmtleUdyaWRSb3dzKSBhcyBOb2RlTGlzdE9mPEhUTUxFbGVtZW50PjtcbiAgfVxuXG4gIGdldCBjZWxscygpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuY29uZmlnLmtleUdyaWRDZWxscykgYXMgTm9kZUxpc3RPZjxIVE1MRWxlbWVudD47XG4gIH1cblxuICBnZXQgY3VycmVudENlbGxDb29yZGluYXRlcygpIHtcbiAgICBjb25zdCBjdXJyZW50Q2VsbCA9IHRoaXMuY2VsbHMgPyBBcnJheS5mcm9tKHRoaXMuY2VsbHMpLmZpbmQoaSA9PiBpLmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSA9PT0gJzAnKSA6IG51bGw7XG4gICAgY29uc3QgY3VycmVudFJvdzogSFRNTEVsZW1lbnQgPSBjdXJyZW50Q2VsbCA/IGN1cnJlbnRDZWxsLmNsb3Nlc3QodGhpcy5jb25maWcua2V5R3JpZFJvd3MpIDogbnVsbDtcblxuICAgIGNvbnN0IGNvb3JkaW5hdGVzOiBDZWxsQ29vcmRpbmF0ZXMgPSB7XG4gICAgICB4OlxuICAgICAgICBjdXJyZW50Um93ICYmIGN1cnJlbnRDZWxsXG4gICAgICAgICAgPyBBcnJheS5mcm9tKGN1cnJlbnRSb3cucXVlcnlTZWxlY3RvckFsbCh0aGlzLmNvbmZpZy5rZXlHcmlkQ2VsbHMpKS5pbmRleE9mKGN1cnJlbnRDZWxsKVxuICAgICAgICAgIDogMCxcbiAgICAgIHk6IGN1cnJlbnRSb3cgJiYgY3VycmVudENlbGwgJiYgdGhpcy5yb3dzID8gQXJyYXkuZnJvbSh0aGlzLnJvd3MpLmluZGV4T2YoY3VycmVudFJvdykgOiAwLFxuICAgIH07XG5cbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH1cblxuICBnZXQgYXZlcmFnZVJvd0hlaWdodCgpIHtcbiAgICBjb25zdCBoZWlnaHRTdW0gPSBBcnJheS5mcm9tKHRoaXMucm93cy52YWx1ZXMoKSkucmVkdWNlKChzdW0sIHJvdykgPT4ge1xuICAgICAgcmV0dXJuIHN1bSArIHJvdy5jbGllbnRIZWlnaHQ7XG4gICAgfSwgMCk7XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHRTdW0gLyB0aGlzLnJvd3MubGVuZ3RoKTtcbiAgfVxuXG4gIGdldCBpdGVtc1BlclBhZ2UoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5ob3N0Py5xdWVyeVNlbGVjdG9yKCcuZGF0YWdyaWQnKS5jbGllbnRIZWlnaHQgLyB0aGlzLmF2ZXJhZ2VSb3dIZWlnaHQpIC0gMSB8fCAwO1xuICB9XG5cbiAgc2V0QXJpYVJvd0luZGV4VG8oY2VsbENvb3JkczogQ2VsbENvb3JkaW5hdGVzKSB7XG4gICAgbGV0IGFyaWFSb3dJbmRleCA9IHRoaXMucm93c1tjZWxsQ29vcmRzLnldLmdldEF0dHJpYnV0ZSgnYXJpYS1yb3dpbmRleCcpO1xuXG4gICAgaWYgKCFhcmlhUm93SW5kZXgpIHtcbiAgICAgIGFyaWFSb3dJbmRleCA9IHRoaXMucm93c1tjZWxsQ29vcmRzLnkgLSAxXS5nZXRBdHRyaWJ1dGUoJ2FyaWEtcm93aW5kZXgnKTtcbiAgICB9XG5cbiAgICBjZWxsQ29vcmRzLmFyaWFSb3dJbmRleCA9IGFyaWFSb3dJbmRleDtcbiAgfVxuXG4gIGdldE5leHRJdGVtQ29vcmRpbmF0ZShlOiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgY3VycmVudENlbGxDb29yZHMgPSB0aGlzLmN1cnJlbnRDZWxsQ29vcmRpbmF0ZXM7XG4gICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLmdldE5hdlN0cmF0ZWd5KGN1cnJlbnRDZWxsQ29vcmRzKTtcblxuICAgIGNvbnN0IGlubGluZVN0YXJ0ID0gdGhpcy5ob3N0LmRpciA9PT0gJ3J0bCcgPyBLZXlzLkFycm93UmlnaHQgOiBLZXlzLkFycm93TGVmdDtcbiAgICBjb25zdCBpbmxpbmVFbmQgPSB0aGlzLmhvc3QuZGlyID09PSAncnRsJyA/IEtleXMuQXJyb3dMZWZ0IDogS2V5cy5BcnJvd1JpZ2h0O1xuXG4gICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgY2FzZSBLZXlzLkFycm93VXA6XG4gICAgICAgIHJldHVybiBzdHJhdGVneS5rZXlVcChjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgICBjYXNlIEtleXMuQXJyb3dEb3duOlxuICAgICAgICByZXR1cm4gc3RyYXRlZ3kua2V5RG93bihjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgICBjYXNlIGlubGluZVN0YXJ0OlxuICAgICAgICByZXR1cm4gc3RyYXRlZ3kua2V5TGVmdChjdXJyZW50Q2VsbENvb3Jkcyk7XG4gICAgICBjYXNlIGlubGluZUVuZDpcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmtleVJpZ2h0KGN1cnJlbnRDZWxsQ29vcmRzKTtcbiAgICAgIGNhc2UgS2V5cy5Ib21lOlxuICAgICAgICByZXR1cm4gc3RyYXRlZ3kua2V5SG9tZShjdXJyZW50Q2VsbENvb3JkcywgZS5jdHJsS2V5KTtcbiAgICAgIGNhc2UgS2V5cy5FbmQ6XG4gICAgICAgIHJldHVybiBzdHJhdGVneS5rZXlFbmQoY3VycmVudENlbGxDb29yZHMsIGUuY3RybEtleSk7XG4gICAgICBjYXNlIEtleXMuUGFnZVVwOlxuICAgICAgICByZXR1cm4gc3RyYXRlZ3kua2V5UGFnZVVwKGN1cnJlbnRDZWxsQ29vcmRzKTtcbiAgICAgIGNhc2UgS2V5cy5QYWdlRG93bjpcbiAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmtleVBhZ2VEb3duKGN1cnJlbnRDZWxsQ29vcmRzKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjdXJyZW50Q2VsbENvb3JkcztcbiAgICB9XG4gIH1cblxuICBnZXRDZWxsc0ZvclJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMucm93c1tpbmRleF0ucXVlcnlTZWxlY3RvckFsbCh0aGlzLmNvbmZpZy5rZXlHcmlkQ2VsbHMpO1xuICB9XG5cbiAgaXNFeHBhbmRlZFJvdyhpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMucm93c1tpbmRleF0ucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLXJvdy1kZXRhaWwnKTtcblxuICAgIHJldHVybiBzZWxlY3RlZEVsZW1lbnQgPyBzZWxlY3RlZEVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnIDogZmFsc2U7XG4gIH1cblxuICBpc0RldGFpbHNSb3coaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnJvd3NbaW5kZXhdLmNsYXNzTGlzdC5jb250YWlucygnZGF0YWdyaWQtcm93LWRldGFpbCcpO1xuICB9XG5cbiAgaXNSb3dSZXBsYWNlZChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuICEhdGhpcy5yb3dzW2luZGV4XS5jbG9zZXN0KCdjbHItZGctcm93LmRhdGFncmlkLXJvdy1yZXBsYWNlZCcpO1xuICB9XG5cbiAgaXNTaW5nbGVDZWxsRXhwYW5kZWRSb3coaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLnJvd3NbaW5kZXhdPy5xdWVyeVNlbGVjdG9yQWxsKHRoaXMuY29uZmlnLmtleUdyaWRDZWxscykubGVuZ3RoID09PSAxO1xuICB9XG5cbiAgYWN0aW9uQ2VsbENvdW50KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25DZWxsc0FzQXJyYXkoaW5kZXgpLmxlbmd0aDtcbiAgfVxuXG4gIGFjdGlvbkNlbGxzQXNBcnJheShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICB0aGlzLnJvd3NbaW5kZXhdLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kYXRhZ3JpZC1yb3ctc3RpY2t5IC5kYXRhZ3JpZC1jZWxsLCAuZGF0YWdyaWQtcm93LXN0aWNreSAuZGF0YWdyaWQtY29sdW1uJylcbiAgICApO1xuICB9XG5cbiAgaXNBY3Rpb25DZWxsKGNlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcykge1xuICAgIHJldHVybiAhIXRoaXMuYWN0aW9uQ2VsbHNBc0FycmF5KGNlbGxDb29yZHMueSlbY2VsbENvb3Jkcy54XTtcbiAgfVxuXG4gIGNyZWF0ZU5leHRDZWxsQ29vcmRzKGNlbGxDb29yZHM6IENlbGxDb29yZGluYXRlcyk6IENlbGxDb29yZGluYXRlcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNlbGxDb29yZHMueCxcbiAgICAgIHk6IGNlbGxDb29yZHMueSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROYXZTdHJhdGVneShjdXJyZW50Q2VsbENvb3JkczogQ2VsbENvb3JkaW5hdGVzKTogS2V5TmF2aWdhdGlvbkdyaWRTdHJhdGVneUludGVyZmFjZSB7XG4gICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICBjYXNlIHRoaXMuaXNTaW5nbGVDZWxsRXhwYW5kZWRSb3coY3VycmVudENlbGxDb29yZHMueSk6XG4gICAgICAgIHJldHVybiBuZXcgRXhwYW5kZWRSb3dLZXlOYXZpZ2F0aW9uU3RyYXRlZ3kodGhpcyk7XG4gICAgICBjYXNlIHRoaXMuaXNEZXRhaWxzUm93KGN1cnJlbnRDZWxsQ29vcmRzLnkpOlxuICAgICAgY2FzZSB0aGlzLmlzRXhwYW5kZWRSb3coY3VycmVudENlbGxDb29yZHMueSk6XG4gICAgICAgIHJldHVybiBuZXcgRXhwYW5kZWRDb2x1bW5zUm93S2V5TmF2aWdhdGlvblN0cmF0ZWd5KHRoaXMpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0S2V5TmF2aWdhdGlvblN0cmF0ZWd5KHRoaXMpO1xuICAgIH1cbiAgfVxufVxuIl19