UNPKG

@w11k/ngx-present

Version:

Angular based Presentation Tool

259 lines 21.1 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 { __values } from "tslib"; 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 {?} */ var currentCoordinates = currentSlide.coordinates; /** @type {?} */ var coordinatesToKeepAbs = coordinatesToKeepAbsolute(currentCoordinates, coordinatesToKeep); /** @type {?} */ var 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 {?} */ var arrayToSearchIn; if (move >= 0) { arrayToSearchIn = slides.slice(currentSlide.index + 1); } else { arrayToSearchIn = slides.slice(0, currentSlide.index).reverse(); } /** @type {?} */ var nextSlide = arrayToSearchIn.find((/** * @param {?} slide * @return {?} */ function (slide) { /** @type {?} */ var 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 var routerParamsCoordinatePrefix = 'coordinate-'; /** * @param {?} routeParams * @return {?} */ export function routeParamsToCoordinate(routeParams) { /** @type {?} */ var keys = Object.keys(routeParams); /** @type {?} */ var coordinates = keys .filter((/** * @param {?} key * @return {?} */ function (key) { return key.startsWith(routerParamsCoordinatePrefix); })) .map((/** * @param {?} key * @return {?} */ function (key) { /** @type {?} */ var keyNumber = parseInt(key.substr(routerParamsCoordinatePrefix.length), 10); return { key: key, keyNumber: keyNumber }; })) .sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return compareNumber(a.keyNumber, b.keyNumber); })) .map((/** * @param {?} key * @return {?} */ function (key) { return 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 {?} */ var maxLength = max(c1.length, c2.length); for (var i = 0; i < maxLength; i++) { /** @type {?} */ var c1i = c1[i]; /** @type {?} */ var c2i = c2[i]; /** @type {?} */ var iResult = compareNumber(c1i, c2i); if (iResult !== 0) { return iResult; } } return 0; } /** * @param {?} slides * @param {?} coordinates * @return {?} */ export function isValidCoordinate(slides, coordinates) { var e_1, _a; if (coordinates.length === 0) { return false; } /** @type {?} */ var current = slides; try { for (var coordinates_1 = __values(coordinates), coordinates_1_1 = coordinates_1.next(); !coordinates_1_1.done; coordinates_1_1 = coordinates_1.next()) { var coordinate = coordinates_1_1.value; /** @type {?} */ var tooLow = coordinate < 1; /** @type {?} */ var tooHigh = Array.isArray(current) && coordinate - 1 >= current.length; if (tooLow || tooHigh) { return false; } /** @type {?} */ var next = current[coordinate - 1]; if (Array.isArray(next)) { current = next; } else { current = []; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (coordinates_1_1 && !coordinates_1_1.done && (_a = coordinates_1.return)) _a.call(coordinates_1); } finally { if (e_1) throw e_1.error; } } 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) { var e_2, _a; /** @type {?} */ var map = {}; try { for (var slides_1 = __values(slides), slides_1_1 = slides_1.next(); !slides_1_1.done; slides_1_1 = slides_1.next()) { var slide = slides_1_1.value; /** @type {?} */ var index = coordinatesToString(slide.coordinates, '.'); map[index] = slide; } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (slides_1_1 && !slides_1_1.done && (_a = slides_1.return)) _a.call(slides_1); } finally { if (e_2) throw e_2.error; } } return map; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHcxMWsvbmd4LXByZXNlbnQvIiwic291cmNlcyI6WyJsaWIvc2xpZGUtYnktc2xpZGUvc2xpZGUtYnktc2xpZGUuZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUVBLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7QUFFekMsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQWUsRUFDZixZQUFtQixFQUNuQixJQUFZLEVBQ1osaUJBQXFDLEVBQ3JDLG1CQUEyQjtJQUM5RCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDZCxPQUFPLFlBQVksQ0FBQztLQUNyQjtJQUVELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDMUM7O1FBRUssa0JBQWtCLEdBQUcsWUFBWSxDQUFDLFdBQVc7O1FBRTdDLG9CQUFvQixHQUFXLHlCQUF5QixDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDOztRQUUvRixjQUFjLEdBQWdCLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLENBQUM7SUFFckYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtRQUNoRSxjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDdEU7U0FBTSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDbkIsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMzQjtTQUFNLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMs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QUN2QixPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2hCO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxFQUFFLENBQUM7YUFDZDtTQUNGOzs7Ozs7Ozs7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7Ozs7Ozs7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsV0FBd0IsRUFBRSxTQUFpQixFQUFFLE1BQWU7SUFDOUYsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDdEQsQ0FBQzs7Ozs7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZTs7O1FBQzVDLEdBQUcsR0FBNkIsRUFBRTs7UUFFeEMsS0FBb0IsSUFBQSxXQUFBLFNBQUEsTUFBTSxDQUFBLDhCQUFBLGtEQUFFO1lBQXZCLElBQU0sS0FBSyxtQkFBQTs7Z0JBQ1IsS0FBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO1lBQ3pELEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDcEI7Ozs7Ozs7OztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvb3JkaW5hdGVzLCBTbGlkZSwgU2xpZGVzIH0gZnJvbSAnLi4vY29yZS9wcmVzZW50YXRpb24udHlwZXMnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IG1heCwgbWluIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb29yZGluYXRlcyhzbGlkZXM6IFNsaWRlW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiBTbGlkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXNUb0tlZXA6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlc01heERlcHRoOiBudW1iZXIpOiBTbGlkZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChtb3ZlID09PSAwKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRTbGlkZTtcbiAgfVxuXG4gIGlmIChjb29yZGluYXRlc1RvS2VlcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHNsaWRlc1tjdXJyZW50U2xpZGUuaW5kZXggKyBtb3ZlXTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRDb29yZGluYXRlcyA9IGN1cnJlbnRTbGlkZS5jb29yZGluYXRlcztcblxuICBjb25zdCBjb29yZGluYXRlc1RvS2VlcEFiczogbnVtYmVyID0gY29vcmRpbmF0ZXNUb0tlZXBBYnNvbHV0ZShjdXJyZW50Q29vcmRpbmF0ZXMsIGNvb3JkaW5hdGVzVG9LZWVwKTtcblxuICBjb25zdCBuZXdDb29yZGluYXRlczogQ29vcmRpbmF0ZXMgPSBjdXJyZW50Q29vcmRpbmF0ZXMuc2xpY2UoMCwgY29vcmRpbmF0ZXNUb0tlZXBBYnMpO1xuXG4gIGlmIChtb3ZlID4gMCAmJiBjb29yZGluYXRlc1RvS2VlcEFicyA8IGN1cnJlbnRDb29yZGluYXRlcy5sZW5ndGgpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlKTtcbiAgfSBlbHNlIGlmIChtb3ZlID4gMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2gobW92ZSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzICsgMV0gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29vcmRpbmF0ZXNbY29vcmRpbmF0ZXNUb0tlZXBBYnMgKyAxXSA+IDEpIHtcbiAgICBuZXdDb29yZGluYXRlcy5wdXNoKGN1cnJlbnRDb29yZGluYXRlc1tjb29yZGluYXRlc1RvS2VlcEFic10gKyBtb3ZlICsgMSk7XG4gIH0gZWxzZSBpZiAobW92ZSA8IDAgJiYgY29vcmRpbmF0ZXNUb0tlZXBBYnMgPCBjdXJyZW50Q29vcmRpbmF0ZXMubGVuZ3RoKSB7XG4gICAgbmV3Q29vcmRpbmF0ZXMucHVzaChtYXgoMSwgY3VycmVudENvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzVG9LZWVwQWJzXSArIG1vdmUpKTtcbiAgfSBlbHNlIGlmIChtb3ZlIDwgMCkge1xuICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gIH1cblxuICBpZiAobW92ZSA8IDApIHtcbiAgICB3aGlsZSAobmV3Q29vcmRpbmF0ZXMubGVuZ3RoIDw9IGNvb3JkaW5hdGVzTWF4RGVwdGgpIHtcbiAgICAgIG5ld0Nvb3JkaW5hdGVzLnB1c2goMSk7XG4gICAgfVxuICB9XG5cbiAgbGV0IGFycmF5VG9TZWFyY2hJbjogU2xpZGVbXTtcbiAgaWYgKG1vdmUgPj0gMCkge1xuICAgIGFycmF5VG9TZWFyY2hJbiA9IHNsaWRlcy5zbGljZShjdXJyZW50U2xpZGUuaW5kZXggKyAxKTtcbiAgfSBlbHNlIHtcbiAgICBhcnJheVRvU2VhcmNoSW4gPSBzbGlkZXMuc2xpY2UoMCwgY3VycmVudFNsaWRlLmluZGV4KS5yZXZlcnNlKCk7XG4gIH1cblxuICBjb25zdCBuZXh0U2xpZGUgPSBhcnJheVRvU2VhcmNoSW4uZmluZChzbGlkZSA9PiB7XG4gICAgY29uc3QgY29tcGFyZWQgPSBjb21wYXJlQ29vcmRpbmF0ZXMoc2xpZGUuY29vcmRpbmF0ZXMsIG5ld0Nvb3JkaW5hdGVzKTtcblxuICAgIGlmIChtb3ZlIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVkIDw9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb21wYXJlZCA+PSAwO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG5leHRTbGlkZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVzVG9LZWVwQWJzb2x1dGUoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGVzLCBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoY29vcmRpbmF0ZXNUb0tlZXBSZWxhdGl2ZSA+PSAwKSB7XG4gICAgcmV0dXJuIG1pbihjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCBjb29yZGluYXRlcy5sZW5ndGgpO1xuICB9XG5cbiAgcmV0dXJuIG1heChjb29yZGluYXRlcy5sZW5ndGggKyBjb29yZGluYXRlc1RvS2VlcFJlbGF0aXZlLCAwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXggPSAnY29vcmRpbmF0ZS0nO1xuXG5leHBvcnQgZnVuY3Rpb24gcm91dGVQYXJhbXNUb0Nvb3JkaW5hdGUocm91dGVQYXJhbXM6IFBhcmFtcyk6IG51bWJlcltdIHtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJvdXRlUGFyYW1zKTtcblxuICBjb25zdCBjb29yZGluYXRlcyA9IGtleXNcbiAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aChyb3V0ZXJQYXJhbXNDb29yZGluYXRlUHJlZml4KSlcbiAgICAubWFwKGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlOdW1iZXIgPSBwYXJzZUludChrZXkuc3Vic3RyKHJvdXRlclBhcmFtc0Nvb3JkaW5hdGVQcmVmaXgubGVuZ3RoKSwgMTApO1xuXG4gICAgICByZXR1cm4geyBrZXksIGtleU51bWJlciB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGNvbXBhcmVOdW1iZXIoYS5rZXlOdW1iZXIsIGIua2V5TnVtYmVyKSlcbiAgICAubWFwKGtleSA9PiBwYXJzZUludChyb3V0ZVBhcmFtc1trZXkua2V5XSwgMTApKTtcblxuICByZXR1cm4gY29vcmRpbmF0ZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVOdW1iZXIoYTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiOiBudW1iZXIgfCB1bmRlZmluZWQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgIT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhICE9PSB1bmRlZmluZWQgJiYgYiAhPT0gdW5kZWZpbmVkICYmIGEgPiBiKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBpZiAoYSAhPT0gdW5kZWZpbmVkICYmIGIgIT09IHVuZGVmaW5lZCAmJiBhIDwgYikge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wYXJlQ29vcmRpbmF0ZXMoYzEsIGMyKSA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVDb29yZGluYXRlcyhjMTogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkLCBjMjogQ29vcmRpbmF0ZXMgfCBudWxsIHwgdW5kZWZpbmVkKTogLTEgfCAwIHwgMSB7XG4gIGlmIChjMSA9PT0gYzIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChjMSA9PT0gbnVsbCB8fMKgYzEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG5cbiAgaWYgKGMyID09PSBudWxsIHx8wqBjMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBjb25zdCBtYXhMZW5ndGggPSBtYXgoYzEubGVuZ3RoLCBjMi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4TGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjMWkgPSBjMVtpXTtcbiAgICBjb25zdCBjMmkgPSBjMltpXTtcblxuICAgIGNvbnN0IGlSZXN1bHQgPSBjb21wYXJlTnVtYmVyKGMxaSwgYzJpKTtcblxuICAgIGlmIChpUmVzdWx0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gaVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRDb29yZGluYXRlKHNsaWRlczogU2xpZGVzLCBjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpOiBib29sZWFuIHtcbiAgaWYgKGNvb3JkaW5hdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBSZWN1cnNpdmVBcnJheTxTbGlkZT4gPSBzbGlkZXM7XG5cbiAgZm9yIChjb25zdCBjb29yZGluYXRlIG9mIGNvb3JkaW5hdGVzKSB7XG4gICAgY29uc3QgdG9vTG93ID0gY29vcmRpbmF0ZSA8IDE7XG4gICAgY29uc3QgdG9vSGlnaCA9IEFycmF5LmlzQXJyYXkoY3VycmVudCkgJiYgY29vcmRpbmF0ZSAtIDEgPj0gY3VycmVudC5sZW5ndGg7XG5cbiAgICBpZiAodG9vTG93IHx8IHRvb0hpZ2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gY3VycmVudFtjb29yZGluYXRlIC0gMV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50ID0gW107XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb29yZGluYXRlc1RvU3RyaW5nKGNvb3JkaW5hdGVzOiBDb29yZGluYXRlcywgc2VwYXJhdG9yOiBzdHJpbmcsIGxlbmd0aD86IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBjb29yZGluYXRlcy5zbGljZSgwLCBsZW5ndGgpLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvb3JkaW5hdGVUb1NsaWRlTWFwKHNsaWRlczogU2xpZGVbXSk6IHsgW2tleTogc3RyaW5nXTogU2xpZGUgfSB7XG4gIGNvbnN0IG1hcDogeyBba2V5OiBzdHJpbmddOiBTbGlkZSB9ID0ge307XG5cbiAgZm9yIChjb25zdCBzbGlkZSBvZiBzbGlkZXMpIHtcbiAgICBjb25zdCBpbmRleCA9IGNvb3JkaW5hdGVzVG9TdHJpbmcoc2xpZGUuY29vcmRpbmF0ZXMsICcuJyk7XG4gICAgbWFwW2luZGV4XSA9IHNsaWRlO1xuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn1cbiJdfQ==