UNPKG

@w11k/ngx-present

Version:

Angular based Presentation Tool

236 lines 19.9 kB
/** * @fileoverview added by tsickle * Generated from: lib/slide-by-slide/slide-by-slide.functions.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { max, min } from '../core/utils'; /** * @param {?} slides * @param {?} currentSlide * @param {?} move * @param {?} coordinatesToKeep * @param {?} coordinatesMaxDepth * @return {?} */ export function calculateCoordinates(slides, currentSlide, move, coordinatesToKeep, coordinatesMaxDepth) { if (move === 0) { return currentSlide; } if (coordinatesToKeep === undefined) { return slides[currentSlide.index + move]; } /** @type {?} */ const currentCoordinates = currentSlide.coordinates; /** @type {?} */ const coordinatesToKeepAbs = coordinatesToKeepAbsolute(currentCoordinates, coordinatesToKeep); /** @type {?} */ const newCoordinates = currentCoordinates.slice(0, coordinatesToKeepAbs); if (move > 0 && coordinatesToKeepAbs < currentCoordinates.length) { newCoordinates.push(currentCoordinates[coordinatesToKeepAbs] + move); } else if (move > 0) { newCoordinates.push(move); } else if (move < 0 && currentCoordinates[coordinatesToKeepAbs + 1] !== undefined && currentCoordinates[coordinatesToKeepAbs + 1] > 1) { newCoordinates.push(currentCoordinates[coordinatesToKeepAbs] + move + 1); } else if (move < 0 && coordinatesToKeepAbs < currentCoordinates.length) { newCoordinates.push(max(1, currentCoordinates[coordinatesToKeepAbs] + move)); } else if (move < 0) { newCoordinates.push(1); } if (move < 0) { while (newCoordinates.length <= coordinatesMaxDepth) { newCoordinates.push(1); } } /** @type {?} */ let arrayToSearchIn; if (move >= 0) { arrayToSearchIn = slides.slice(currentSlide.index + 1); } else { arrayToSearchIn = slides.slice(0, currentSlide.index).reverse(); } /** @type {?} */ const nextSlide = arrayToSearchIn.find((/** * @param {?} slide * @return {?} */ slide => { /** @type {?} */ const compared = compareCoordinates(slide.coordinates, newCoordinates); if (move < 0) { return compared <= 0; } else { return compared >= 0; } })); return nextSlide; } /** * @param {?} coordinates * @param {?} coordinatesToKeepRelative * @return {?} */ export function coordinatesToKeepAbsolute(coordinates, coordinatesToKeepRelative) { if (coordinatesToKeepRelative >= 0) { return min(coordinatesToKeepRelative, coordinates.length); } return max(coordinates.length + coordinatesToKeepRelative, 0); } /** @type {?} */ export const routerParamsCoordinatePrefix = 'coordinate-'; /** * @param {?} routeParams * @return {?} */ export function routeParamsToCoordinate(routeParams) { /** @type {?} */ const keys = Object.keys(routeParams); /** @type {?} */ const coordinates = keys .filter((/** * @param {?} key * @return {?} */ key => key.startsWith(routerParamsCoordinatePrefix))) .map((/** * @param {?} key * @return {?} */ key => { /** @type {?} */ const keyNumber = parseInt(key.substr(routerParamsCoordinatePrefix.length), 10); return { key, keyNumber }; })) .sort((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => compareNumber(a.keyNumber, b.keyNumber))) .map((/** * @param {?} key * @return {?} */ key => parseInt(routeParams[key.key], 10))); return coordinates; } /** * @param {?} a * @param {?} b * @return {?} */ function compareNumber(a, b) { if (a !== undefined && b === undefined) { return 1; } if (a === undefined && b !== undefined) { return -1; } if (a === undefined && b === undefined) { return 0; } if (a !== undefined && b !== undefined && a > b) { return 1; } if (a !== undefined && b !== undefined && a < b) { return -1; } return 0; } /** * @param {?} c1 * @param {?} c2 * @return {?} */ export function equalCoordinates(c1, c2) { return compareCoordinates(c1, c2) === 0; } /** * @param {?} c1 * @param {?} c2 * @return {?} */ export function compareCoordinates(c1, c2) { if (c1 === c2) { return 0; } if (c1 === null || c1 === undefined) { return -1; } if (c2 === null || c2 === undefined) { return 1; } /** @type {?} */ const maxLength = max(c1.length, c2.length); for (let i = 0; i < maxLength; i++) { /** @type {?} */ const c1i = c1[i]; /** @type {?} */ const c2i = c2[i]; /** @type {?} */ const iResult = compareNumber(c1i, c2i); if (iResult !== 0) { return iResult; } } return 0; } /** * @param {?} slides * @param {?} coordinates * @return {?} */ export function isValidCoordinate(slides, coordinates) { if (coordinates.length === 0) { return false; } /** @type {?} */ let current = slides; for (const coordinate of coordinates) { /** @type {?} */ const tooLow = coordinate < 1; /** @type {?} */ const tooHigh = Array.isArray(current) && coordinate - 1 >= current.length; if (tooLow || tooHigh) { return false; } /** @type {?} */ const next = current[coordinate - 1]; if (Array.isArray(next)) { current = next; } else { current = []; } } return true; } /** * @param {?} coordinates * @param {?} separator * @param {?=} length * @return {?} */ export function coordinatesToString(coordinates, separator, length) { return coordinates.slice(0, length).join(separator); } /** * @param {?} slides * @return {?} */ export function coordinateToSlideMap(slides) { /** @type {?} */ const map = {}; for (const slide of slides) { /** @type {?} */ const index = coordinatesToString(slide.coordinates, '.'); map[index] = slide; } return map; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHcxMWsvbmd4LXByZXNlbnQvIiwic291cmNlcyI6WyJsaWIvc2xpZGUtYnktc2xpZGUvc2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7OztBQUV6QyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZSxFQUNmLFlBQW1CLEVBQ25CLElBQVksRUFDWixpQkFBcUMsRUFDckMsbUJBQTJCO0lBQzlELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztLQUMxQzs7VUFFSyxrQkFBa0IsR0FBRyxZQUFZLENBQUMsV0FBVzs7VUFFN0Msb0JBQW9CLEdBQVcseUJBQXlCLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7O1VBRS9GLGNBQWMsR0FBZ0Isa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQztJQUVyRixJQUFJLElBQUksR0FBRyxDQUFDLElBQUksb0JBQW9CLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFO1FBQ2hFLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUN0RTtTQUFNLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtRQUNuQixjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzNCO1NBQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxL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RCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsV0FBd0IsRUFBRSxTQUFpQixFQUFFLE1BQWU7SUFDOUYsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEQsQ0FBQzs7Ozs7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZTs7VUFDNUMsR0FBRyxHQUE2QixFQUFFO0lBRXhDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFOztjQUNwQixLQUFLLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUM7UUFDekQsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztLQUNwQjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvb3JkaW5hdGVzLCBTbGlkZSwgU2xpZGVzIH0gZnJvbSAnLi4vY29yZS9wcmVzZW50YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb29yZGluYXRlcyhzbGlkZXM6IFNsaWRlW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiBTbGlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXNUb0tlZXA6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlc01heERlcHRoOiBudW1iZXIpOiBTbGlkZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChtb3ZlID09PSAwKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRTbGlkZTtcbiAgfVxuXG4gIGlmIChjb29yZGluYXRlc1RvS2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHNsaWRlc1tjdXJyZW50U2xpZGUuaW5kZXggKyBtb3ZlXTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlcyA9IGN1cnJlbnRTbGlkZS5jb29yZGluYXRlcztcblxuICBjb25zdCBjb29yZGluYXRlc1RvS2VlcEFiczogbnVtYmVyID0gY29vcmRpbmF0ZXNUb0tlZXBBYnNvbHV0ZShjdXJyZW50Q29vcmRpbmF0ZXMsIGNvb3JkaW5hdGVzVG9LZWVwKTtcblxuICBjb25zdCBuZXdDb29yZGluYXRlczogQ29vcmRpbmF0ZXMgPSBjdXJyZW50Q29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXNUb0tlZXBBYnMpO1xuXG4gIGlmIChtb3ZlID4gMCAmJiBjb29yZGluYXRlc1RvS2VlcEFicyA8IGN1cnJlbnRDb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlKTtcbiAgfSBlbHNlIGlmIChtb3ZlID4gMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2gobW92ZSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzICsgMV0gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29vcmRpbmF0ZXNbY29vcmRpbmF0ZXNUb0tlZXBBYnMgKyAxXSA+IDEpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlICsgMSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY29vcmRpbmF0ZXNUb0tlZXBBYnMgPCBjdXJyZW50Q29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgbmV3Q29vcmRpbmF0ZXMucHVzaChtYXgoMSwgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzXSArIG1vdmUpKTtcbiAgfSBlbHNlIGlmIChtb3ZlIDwgMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gIH1cblxuICBpZiAobW92ZSA8IDApIHtcbiAgICB3aGlsZSAobmV3Q29vcmRpbmF0ZXMubGVuZ3RoIDw9IGNvb3JkaW5hdGVzTWF4RGVwdGgpIHtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGFycmF5VG9TZWFyY2hJbjogU2xpZGVbXTtcbiAgaWYgKG1vdmUgPj0gMCkge1xuICAgIGFycmF5VG9TZWFyY2hJbiA9IHNsaWRlcy5zbGljZShjdXJyZW50U2xpZGUuaW5kZXggKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBhcnJheVRvU2VhcmNoSW4gPSBzbGlkZXMuc2xpY2UoMCwgY3VycmVudFNsaWRlLmluZGV4KS5yZXZlcnNlKCk7XG4gIH1cblxuICBjb25zdCBuZXh0U2xpZGUgPSBhcnJheVRvU2VhcmNoSW4uZmluZChzbGlkZSA9PiB7XG4gICAgY29uc3QgY29tcGFyZWQgPSBjb21wYXJlQ29vcmRpbmF0ZXMoc2xpZGUuY29vcmRpbmF0ZXMsIG5ld0Nvb3JkaW5hdGVzKTtcblxuICAgIGlmIChtb3ZlIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVkIDw9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb21wYXJlZCA+PSAwO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5leHRTbGlkZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVzVG9LZWVwQWJzb2x1dGUoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzLCBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY29vcmRpbmF0ZXNUb0tlZXBSZWxhdGl2ZSA+PSAwKSB7XG4gICAgcmV0dXJuIG1pbihjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCBjb29yZGluYXRlcy5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG1heChjb29yZGluYXRlcy5sZW5ndGggKyBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCAwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXggPSAnY29vcmRpbmF0ZS0nO1xuXG5leHBvcnQgZnVuY3Rpb24gcm91dGVQYXJhbXNUb0Nvb3JkaW5hdGUocm91dGVQYXJhbXM6IFBhcmFtcyk6IG51bWJlcltdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlUGFyYW1zKTtcblxuICBjb25zdCBjb29yZGluYXRlcyA9IGtleXNcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aChyb3V0ZXJQYXJhbXNDb29yZGluYXRlUHJlZml4KSlcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlOdW1iZXIgPSBwYXJzZUludChrZXkuc3Vic3RyKHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXgubGVuZ3RoKSwgMTApO1xuXG4gICAgICByZXR1cm4geyBrZXksIGtleU51bWJlciB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVOdW1iZXIoYS5rZXlOdW1iZXIsIGIua2V5TnVtYmVyKSlcbiAgICAubWFwKGtleSA9PiBwYXJzZUludChyb3V0ZVBhcmFtc1trZXkua2V5XSwgMTApKTtcblxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXIoYTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiOiBudW1iZXIgfCB1bmRlZmluZWQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhICE9PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkICYmIGEgPiBiKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYSAhPT0gdW5kZWZpbmVkICYmIGIgIT09IHVuZGVmaW5lZCAmJiBhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wYXJlQ29vcmRpbmF0ZXMoYzEsIGMyKSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogLTEgfCAwIHwgMSB7XG4gIGlmIChjMSA9PT0gYzIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChjMSA9PT0gbnVsbCB8fMKgYzEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG5cbiAgaWYgKGMyID09PSBudWxsIHx8wqBjMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBtYXhMZW5ndGggPSBtYXgoYzEubGVuZ3RoLCBjMi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjMWkgPSBjMVtpXTtcbiAgICBjb25zdCBjMmkgPSBjMltpXTtcblxuICAgIGNvbnN0IGlSZXN1bHQgPSBjb21wYXJlTnVtYmVyKGMxaSwgYzJpKTtcblxuICAgIGlmIChpUmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gaVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDb29yZGluYXRlKHNsaWRlczogU2xpZGVzLCBjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpOiBib29sZWFuIHtcbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBSZWN1cnNpdmVBcnJheTxTbGlkZT4gPSBzbGlkZXM7XG5cbiAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGNvb3JkaW5hdGVzKSB7XG4gICAgY29uc3QgdG9vTG93ID0gY29vcmRpbmF0ZSA8IDE7XG4gICAgY29uc3QgdG9vSGlnaCA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgJiYgY29vcmRpbmF0ZSAtIDEgPj0gY3VycmVudC5sZW5ndGg7XG5cbiAgICBpZiAodG9vTG93IHx8IHRvb0hpZ2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gY3VycmVudFtjb29yZGluYXRlIC0gMV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50ID0gW107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb29yZGluYXRlc1RvU3RyaW5nKGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcywgc2VwYXJhdG9yOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBjb29yZGluYXRlcy5zbGljZSgwLCBsZW5ndGgpLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVUb1NsaWRlTWFwKHNsaWRlczogU2xpZGVbXSk6IHsgW2tleTogc3RyaW5nXTogU2xpZGUgfSB7XG4gIGNvbnN0IG1hcDogeyBba2V5OiBzdHJpbmddOiBTbGlkZSB9ID0ge307XG5cbiAgZm9yIChjb25zdCBzbGlkZSBvZiBzbGlkZXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGNvb3JkaW5hdGVzVG9TdHJpbmcoc2xpZGUuY29vcmRpbmF0ZXMsICcuJyk7XG4gICAgbWFwW2luZGV4XSA9IHNsaWRlO1xuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn1cbiJdfQ==