UNPKG

@firestone-hs/replay-parser

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.

112 lines 17.9 kB
import { Injectable } from '@angular/core'; import { GameTag, Mulligan, Step } from '@firestone-hs/reference-data'; import { ActionTurn } from '../../models/game/action-turn'; import { Game } from '../../models/game/game'; import { GameEntity } from '../../models/game/game-entity'; import { MulliganTurn } from '../../models/game/mulligan-turn'; import { TagChangeHistoryItem } from '../../models/history/tag-change-history-item'; import { PlayerHistoryItem } from '../../models/models'; import * as i0 from "@angular/core"; export class TurnParserService { constructor() { } createTurns(game, history) { let turns = game.turns; let turnNumber = turns.size; // // console.log('last history item', history[history.length - 1]); for (const item of history) { if (turnNumber === 0 && this.isMulligan(item, game)) { // // console.log('adding mulligan turn', item); const mulliganTurn = this.parseMulliganTurn(item, turns); turns = turns.set(0, mulliganTurn); turnNumber++; } else if (turnNumber === 0 && this.isMulliganDone(item, game)) { // The proper mulligan input could not be parsed // console.warn('Could not detect mulligan input, creating mulligan turn'); const mulliganTurn = this.parseMulliganTurn(item, turns); turns = turns.set(0, mulliganTurn); turnNumber++; } else if (this.isStartOfTurn(item, game)) { // // console.log('adding new turn', turnNumber); // Used for instance in Bob's encounters if (!turns.has(0)) { // // console.log('creating fake mulligan turn', turns, turns.toJS()); const mulliganTurn = this.parseMulliganTurn(item, turns); turns = turns.set(0, mulliganTurn); turnNumber++; } const turn = this.parseTurn(turnNumber, item, turns); turns = turns.set(turnNumber, turn); turnNumber++; } } // // console.log('created turns', turns.toJS()); return Game.createGame(game, { turns }); } parseTurn(currentTurnNumber, item, turns) { const itemIndex = item.tag.index; // Turn 1 is mulligan in the log, while for us mulligan is turn 0 let turn = turns.get(currentTurnNumber, Object.assign(new ActionTurn(), { turn: `${currentTurnNumber}`, timestamp: item.timestamp, index: itemIndex, activePlayer: undefined, actions: [], })); turn = Object.assign(new ActionTurn(), turn, { index: Math.max(turn.index, itemIndex), }); return turn; } parseMulliganTurn(item, turns) { const itemIndex = item instanceof TagChangeHistoryItem ? item.tag.index : item.index; let mulliganTurn = turns.get(0, Object.assign(new MulliganTurn(), { turn: 'mulligan', timestamp: item.timestamp, index: itemIndex, actions: [], })); mulliganTurn = Object.assign(new MulliganTurn(), mulliganTurn, { index: Math.max(mulliganTurn.index, itemIndex), }); return mulliganTurn; } isMulligan(item, game) { return (item instanceof TagChangeHistoryItem && item.tag.tag === GameTag.MULLIGAN_STATE && item.tag.value === Mulligan.INPUT); } isMulliganDone(item, game) { return ((item instanceof PlayerHistoryItem && item.entityDefintion.tags.get(GameTag[GameTag.MULLIGAN_STATE]) === Mulligan.DONE) || (item instanceof TagChangeHistoryItem && item.tag.tag === GameTag.MULLIGAN_STATE && item.tag.value === Mulligan.DONE)); } isStartOfTurn(item, game) { if (!(item instanceof TagChangeHistoryItem)) { return false; } const startOfTurn = item.tag.tag === GameTag.STEP && item.tag.value === Step.MAIN_READY; if (startOfTurn) { // // console.log('start of turn, isGameEntity?', item.tag.entity, game.getLatestParsedState()?.toJS()) } return this.isGameEntity(item.tag.entity, game) && startOfTurn; } // private isPlayerEntity(entityId: number, game: Game) { // return game.entities.get(entityId) instanceof PlayerEntity; // } isGameEntity(entityId, game) { return game.getLatestParsedState().get(entityId) instanceof GameEntity; } } TurnParserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); TurnParserService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: TurnParserService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHVybi1wYXJzZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9nYW1lcGlwZWxpbmUvdHVybi1wYXJzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFLeEQsTUFBTSxPQUFPLGlCQUFpQjtJQUM3QixnQkFBZSxDQUFDO0lBRVQsV0FBVyxDQUFDLElBQVUsRUFBRSxPQUErQjtRQUM3RCxJQUFJLEtBQUssR0FBc0IsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMxQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzVCLG9FQUFvRTtRQUNwRSxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLFVBQVUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BELGdEQUFnRDtnQkFDaEQsTUFBTSxZQUFZLEdBQWlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUE0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SSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3hGLElBQUksV0FBVyxFQUFFO1lBQ2hCLHVHQUF1RztTQUN2RztRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUM7SUFDaEUsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCwrREFBK0Q7SUFDL0QsSUFBSTtJQUVJLFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQVU7UUFDaEQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksVUFBVSxDQUFDO0lBQ3hFLENBQUM7OzhHQXRHVyxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQUZqQixNQUFNOzJGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEdhbWVUYWcsIE11bGxpZ2FuLCBTdGVwIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvblR1cm4gfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9hY3Rpb24tdHVybic7XHJcbmltcG9ydCB7IEdhbWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS9nYW1lJztcclxuaW1wb3J0IHsgR2FtZUVudGl0eSB9IGZyb20gJy4uLy4uL21vZGVscy9nYW1lL2dhbWUtZW50aXR5JztcclxuaW1wb3J0IHsgTXVsbGlnYW5UdXJuIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvbXVsbGlnYW4tdHVybic7XHJcbmltcG9ydCB7IFR1cm4gfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2FtZS90dXJuJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvaGlzdG9yeS9oaXN0b3J5LWl0ZW0nO1xyXG5pbXBvcnQgeyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9oaXN0b3J5L3RhZy1jaGFuZ2UtaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgUGxheWVySGlzdG9yeUl0ZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvbW9kZWxzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUdXJuUGFyc2VyU2VydmljZSB7XHJcblx0Y29uc3RydWN0b3IoKSB7fVxyXG5cclxuXHRwdWJsaWMgY3JlYXRlVHVybnMoZ2FtZTogR2FtZSwgaGlzdG9yeTogcmVhZG9ubHkgSGlzdG9yeUl0ZW1bXSk6IEdhbWUge1xyXG5cdFx0bGV0IHR1cm5zOiBNYXA8bnVtYmVyLCBUdXJuPiA9IGdhbWUudHVybnM7XHJcblx0XHRsZXQgdHVybk51bWJlciA9IHR1cm5zLnNpemU7XHJcblx0XHQvLyAvLyBjb25zb2xlLmxvZygnbGFzdCBoaXN0b3J5IGl0ZW0nLCBoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV0pO1xyXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGhpc3RvcnkpIHtcclxuXHRcdFx0aWYgKHR1cm5OdW1iZXIgPT09IDAgJiYgdGhpcy5pc011bGxpZ2FuKGl0ZW0sIGdhbWUpKSB7XHJcblx0XHRcdFx0Ly8gLy8gY29uc29sZS5sb2coJ2FkZGluZyBtdWxsaWdhbiB0dXJuJywgaXRlbSk7XHJcblx0XHRcdFx0Y29uc3QgbXVsbGlnYW5UdXJuOiBNdWxsaWdhblR1cm4gPSB0aGlzLnBhcnNlTXVsbGlnYW5UdXJuKGl0ZW0gYXMgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0sIHR1cm5zKTtcclxuXHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCgwLCBtdWxsaWdhblR1cm4pO1xyXG5cdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0fSBlbHNlIGlmICh0dXJuTnVtYmVyID09PSAwICYmIHRoaXMuaXNNdWxsaWdhbkRvbmUoaXRlbSwgZ2FtZSkpIHtcclxuXHRcdFx0XHQvLyBUaGUgcHJvcGVyIG11bGxpZ2FuIGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWRcclxuXHRcdFx0XHQvLyBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBkZXRlY3QgbXVsbGlnYW4gaW5wdXQsIGNyZWF0aW5nIG11bGxpZ2FuIHR1cm4nKTtcclxuXHRcdFx0XHRjb25zdCBtdWxsaWdhblR1cm46IE11bGxpZ2FuVHVybiA9IHRoaXMucGFyc2VNdWxsaWdhblR1cm4oaXRlbSBhcyBQbGF5ZXJIaXN0b3J5SXRlbSwgdHVybnMpO1xyXG5cdFx0XHRcdHR1cm5zID0gdHVybnMuc2V0KDAsIG11bGxpZ2FuVHVybik7XHJcblx0XHRcdFx0dHVybk51bWJlcisrO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuaXNTdGFydE9mVHVybihpdGVtLCBnYW1lKSkge1xyXG5cdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdhZGRpbmcgbmV3IHR1cm4nLCB0dXJuTnVtYmVyKTtcclxuXHRcdFx0XHQvLyBVc2VkIGZvciBpbnN0YW5jZSBpbiBCb2IncyBlbmNvdW50ZXJzXHJcblx0XHRcdFx0aWYgKCF0dXJucy5oYXMoMCkpIHtcclxuXHRcdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdjcmVhdGluZyBmYWtlIG11bGxpZ2FuIHR1cm4nLCB0dXJucywgdHVybnMudG9KUygpKTtcclxuXHRcdFx0XHRcdGNvbnN0IG11bGxpZ2FuVHVybjogTXVsbGlnYW5UdXJuID0gdGhpcy5wYXJzZU11bGxpZ2FuVHVybihpdGVtIGFzIFRhZ0NoYW5nZUhpc3RvcnlJdGVtLCB0dXJucyk7XHJcblx0XHRcdFx0XHR0dXJucyA9IHR1cm5zLnNldCgwLCBtdWxsaWdhblR1cm4pO1xyXG5cdFx0XHRcdFx0dHVybk51bWJlcisrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb25zdCB0dXJuOiBBY3Rpb25UdXJuID0gdGhpcy5wYXJzZVR1cm4odHVybk51bWJlciwgaXRlbSBhcyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSwgdHVybnMpO1xyXG5cdFx0XHRcdHR1cm5zID0gdHVybnMuc2V0KHR1cm5OdW1iZXIsIHR1cm4pO1xyXG5cdFx0XHRcdHR1cm5OdW1iZXIrKztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Ly8gLy8gY29uc29sZS5sb2coJ2NyZWF0ZWQgdHVybnMnLCB0dXJucy50b0pTKCkpO1xyXG5cdFx0cmV0dXJuIEdhbWUuY3JlYXRlR2FtZShnYW1lLCB7IHR1cm5zIH0gYXMgR2FtZSk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIHBhcnNlVHVybihjdXJyZW50VHVybk51bWJlcjogbnVtYmVyLCBpdGVtOiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSwgdHVybnM6IE1hcDxudW1iZXIsIFR1cm4+KTogQWN0aW9uVHVybiB7XHJcblx0XHRjb25zdCBpdGVtSW5kZXggPSAoaXRlbSBhcyBUYWdDaGFuZ2VIaXN0b3J5SXRlbSkudGFnLmluZGV4O1xyXG5cdFx0Ly8gVHVybiAxIGlzIG11bGxpZ2FuIGluIHRoZSBsb2csIHdoaWxlIGZvciB1cyBtdWxsaWdhbiBpcyB0dXJuIDBcclxuXHRcdGxldCB0dXJuOiBBY3Rpb25UdXJuID0gdHVybnMuZ2V0KGN1cnJlbnRUdXJuTnVtYmVyLCBPYmplY3QuYXNzaWduKG5ldyBBY3Rpb25UdXJuKCksIHtcclxuXHRcdFx0dHVybjogYCR7Y3VycmVudFR1cm5OdW1iZXJ9YCxcclxuXHRcdFx0dGltZXN0YW1wOiBpdGVtLnRpbWVzdGFtcCxcclxuXHRcdFx0aW5kZXg6IGl0ZW1JbmRleCxcclxuXHRcdFx0YWN0aXZlUGxheWVyOiB1bmRlZmluZWQsXHJcblx0XHRcdGFjdGlvbnM6IFtdLFxyXG5cdFx0fSkgYXMgQWN0aW9uVHVybikgYXMgQWN0aW9uVHVybjtcclxuXHRcdHR1cm4gPSBPYmplY3QuYXNzaWduKG5ldyBBY3Rpb25UdXJuKCksIHR1cm4sIHtcclxuXHRcdFx0aW5kZXg6IE1hdGgubWF4KHR1cm4uaW5kZXgsIGl0ZW1JbmRleCksXHJcblx0XHR9KTtcclxuXHRcdHJldHVybiB0dXJuO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBwYXJzZU11bGxpZ2FuVHVybihpdGVtOiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSB8IFBsYXllckhpc3RvcnlJdGVtLCB0dXJuczogTWFwPG51bWJlciwgVHVybj4pOiBNdWxsaWdhblR1cm4ge1xyXG5cdFx0Y29uc3QgaXRlbUluZGV4ID0gaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtID8gaXRlbS50YWcuaW5kZXggOiBpdGVtLmluZGV4O1xyXG5cdFx0bGV0IG11bGxpZ2FuVHVybjogTXVsbGlnYW5UdXJuID0gdHVybnMuZ2V0KDAsIE9iamVjdC5hc3NpZ24obmV3IE11bGxpZ2FuVHVybigpLCB7XHJcblx0XHRcdHR1cm46ICdtdWxsaWdhbicsXHJcblx0XHRcdHRpbWVzdGFtcDogaXRlbS50aW1lc3RhbXAsXHJcblx0XHRcdGluZGV4OiBpdGVtSW5kZXgsXHJcblx0XHRcdGFjdGlvbnM6IFtdLFxyXG5cdFx0fSkgYXMgTXVsbGlnYW5UdXJuKSBhcyBNdWxsaWdhblR1cm47XHJcblx0XHRtdWxsaWdhblR1cm4gPSBPYmplY3QuYXNzaWduKG5ldyBNdWxsaWdhblR1cm4oKSwgbXVsbGlnYW5UdXJuLCB7XHJcblx0XHRcdGluZGV4OiBNYXRoLm1heChtdWxsaWdhblR1cm4uaW5kZXgsIGl0ZW1JbmRleCksXHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBtdWxsaWdhblR1cm47XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGlzTXVsbGlnYW4oaXRlbTogSGlzdG9yeUl0ZW0sIGdhbWU6IEdhbWUpIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdGl0ZW0gaW5zdGFuY2VvZiBUYWdDaGFuZ2VIaXN0b3J5SXRlbSAmJlxyXG5cdFx0XHRpdGVtLnRhZy50YWcgPT09IEdhbWVUYWcuTVVMTElHQU5fU1RBVEUgJiZcclxuXHRcdFx0aXRlbS50YWcudmFsdWUgPT09IE11bGxpZ2FuLklOUFVUXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc011bGxpZ2FuRG9uZShpdGVtOiBIaXN0b3J5SXRlbSwgZ2FtZTogR2FtZSkge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0KGl0ZW0gaW5zdGFuY2VvZiBQbGF5ZXJIaXN0b3J5SXRlbSAmJlxyXG5cdFx0XHRcdGl0ZW0uZW50aXR5RGVmaW50aW9uLnRhZ3MuZ2V0KEdhbWVUYWdbR2FtZVRhZy5NVUxMSUdBTl9TVEFURV0pID09PSBNdWxsaWdhbi5ET05FKSB8fFxyXG5cdFx0XHQoaXRlbSBpbnN0YW5jZW9mIFRhZ0NoYW5nZUhpc3RvcnlJdGVtICYmXHJcblx0XHRcdFx0aXRlbS50YWcudGFnID09PSBHYW1lVGFnLk1VTExJR0FOX1NUQVRFICYmXHJcblx0XHRcdFx0aXRlbS50YWcudmFsdWUgPT09IE11bGxpZ2FuLkRPTkUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpc1N0YXJ0T2ZUdXJuKGl0ZW06IEhpc3RvcnlJdGVtLCBnYW1lOiBHYW1lKSB7XHJcblx0XHRpZiAoIShpdGVtIGluc3RhbmNlb2YgVGFnQ2hhbmdlSGlzdG9yeUl0ZW0pKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHN0YXJ0T2ZUdXJuID0gaXRlbS50YWcudGFnID09PSBHYW1lVGFnLlNURVAgJiYgaXRlbS50YWcudmFsdWUgPT09IFN0ZXAuTUFJTl9SRUFEWTtcclxuXHRcdGlmIChzdGFydE9mVHVybikge1xyXG5cdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnc3RhcnQgb2YgdHVybiwgaXNHYW1lRW50aXR5PycsIGl0ZW0udGFnLmVudGl0eSwgZ2FtZS5nZXRMYXRlc3RQYXJzZWRTdGF0ZSgpPy50b0pTKCkpXHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5pc0dhbWVFbnRpdHkoaXRlbS50YWcuZW50aXR5LCBnYW1lKSAmJiBzdGFydE9mVHVybjtcclxuXHR9XHJcblxyXG5cdC8vIHByaXZhdGUgaXNQbGF5ZXJFbnRpdHkoZW50aXR5SWQ6IG51bWJlciwgZ2FtZTogR2FtZSkge1xyXG5cdC8vIFx0cmV0dXJuIGdhbWUuZW50aXRpZXMuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIFBsYXllckVudGl0eTtcclxuXHQvLyB9XHJcblxyXG5cdHByaXZhdGUgaXNHYW1lRW50aXR5KGVudGl0eUlkOiBudW1iZXIsIGdhbWU6IEdhbWUpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiBnYW1lLmdldExhdGVzdFBhcnNlZFN0YXRlKCkuZ2V0KGVudGl0eUlkKSBpbnN0YW5jZW9mIEdhbWVFbnRpdHk7XHJcblx0fVxyXG59XHJcbiJdfQ==