@firestone-hs/replay-parser
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
117 lines • 18.3 kB
JavaScript
import { GameTag } from '@firestone-hs/reference-data';
import { PlayerEntity } from '../../models/game/player-entity';
import { deepEqual } from '../../utils';
export class ActionHelper {
static getOwner(entities, entityId) {
const ownerId = entityId;
let owner = entities.get(ownerId);
if (!(owner instanceof PlayerEntity)) {
const controllerId = entities.get(entityId).getTag(GameTag.CONTROLLER);
owner = entities
.filter((entity) => entity instanceof PlayerEntity)
.filter((entity) => entity.playerId === controllerId)
.first();
}
return owner;
}
static getCardId(entities, entityId, allEntitiesSoFar) {
const entity = entities.get(entityId);
if (entity && entity.cardID) {
return entity.cardID;
}
if (allEntitiesSoFar) {
const entitySoFar = allEntitiesSoFar.get(entityId);
if (entitySoFar && entitySoFar.cardID) {
return entitySoFar.cardID;
}
}
// Otherwise, this can happen when we're targeting a player entity, which doesn't have a card id
if (!(entity instanceof PlayerEntity)) {
// Since we don't always know the entity id, it is often correct to say we don't know
return null;
}
const heroEntityId = entity.getTag(GameTag.HERO_ENTITY);
return entities.get(heroEntityId).cardID;
}
static combineActions(actions, shouldMerge, combiner, shouldSwap) {
let previousResult = actions;
let result = ActionHelper.doCombine(previousResult, shouldMerge, combiner, shouldSwap);
while (!deepEqual(result, previousResult)) {
previousResult = result;
result = ActionHelper.doCombine(previousResult, shouldMerge, combiner);
}
return result;
}
static getTag(tags, name) {
if (!tags) {
return null;
}
const defender = tags?.find((tag) => tag.tag === name);
return defender ? defender.value : 0;
}
static mergeIntoFirstAction(first, second, newElements) {
const result = first.updateAction(newElements);
// const concat = [...(first.damages || []), ...(second.damages || [])] as ReadonlyArray<Damage>;
const finalDamages = first.damages.mergeWith((prev, next) => prev + next, second.damages);
return result.updateAction({
damages: finalDamages,
});
}
static doCombine(actions, shouldMerge, combiner, shouldSwap) {
const result = [];
let previousAction;
// // console.log('considering actions to merge', actions);
for (let i = 0; i < actions.length; i++) {
const currentAction = actions[i];
// // console.log(
// 'reduce 150',
// previousAction && previousAction.entities.get(150) && previousAction.entities.get(150).tags.toJS(),
// currentAction && currentAction.entities.get(150) && currentAction.entities.get(150).tags.toJS(),
// previousAction,
// currentAction,
// );
if (shouldMerge(previousAction, currentAction)) {
// // console.log('merging');
const index = result.indexOf(previousAction);
previousAction = combiner(previousAction, currentAction);
// // console.log(
// 'new previous action',
// previousAction.entities.get(150) && previousAction.entities.get(150).tags.toJS(),
// previousAction,
// );
result[index] = previousAction;
}
else if (shouldSwap && shouldSwap(previousAction, currentAction)) {
// // console.log('swapping', previousAction, currentAction);
const index = result.indexOf(previousAction);
const previousEntities = previousAction.entities;
const previousIndex = previousAction.index;
const previousTs = previousAction.timestamp;
const currentEntities = currentAction.entities;
const currentIndex = currentAction.index;
const currentTs = currentAction.timestamp;
result[index] = Object.assign(currentAction, {
entities: previousEntities,
index: previousIndex,
timestamp: previousTs,
});
result[index + 1] = Object.assign(previousAction, {
entities: currentEntities,
index: currentIndex,
timestamp: currentTs,
});
}
else {
// // console.log('doing nothing');
previousAction = currentAction;
result.push(currentAction);
}
}
// // console.log(
// 'finished',
// result[result.length - 1].entities.get(150) && result[result.length - 1].entities.get(150).tags.toJS(),
// );
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcGxheS1wYXJzZXIvc3JjL2xpYi9zZXJ2aWNlcy9hY3Rpb24vYWN0aW9uLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFJdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxPQUFPLFlBQVk7SUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUE2QixFQUFFLFFBQWdCO1FBQ3JFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxZQUFZLENBQUMsRUFBRTtZQUNyQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkUsS0FBSyxHQUFHLFFBQVE7aUJBQ2QsTUFBTSxDQUFDLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLFlBQVksWUFBWSxDQUFDO2lCQUMxRCxNQUFNLENBQUMsQ0FBQyxNQUFvQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFlBQVksQ0FBQztpQkFDbEUsS0FBSyxFQUFFLENBQUM7U0FDVjtRQUNELE9BQU8sS0FBcUIsQ0FBQztJQUM5QixDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVMsQ0FDdEIsUUFBNkIsRUFDN0IsUUFBZ0IsRUFDaEIsZ0JBQXFDO1FBRXJDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMs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LFFBQVEsRUFBRSxlQUFlO29CQUN6QixLQUFLLEVBQUUsWUFBWTtvQkFDbkIsU0FBUyxFQUFFLFNBQVM7aUJBQ1YsQ0FBQyxDQUFDO2FBQ2I7aUJBQU07Z0JBQ04sbUNBQW1DO2dCQUNuQyxjQUFjLEdBQUcsYUFBYSxDQUFDO2dCQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNCO1NBQ0Q7UUFDRCxrQkFBa0I7UUFDbEIsZUFBZTtRQUNmLDJHQUEyRztRQUMzRyxLQUFLO1FBQ0wsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHYW1lVGFnIH0gZnJvbSAnQGZpcmVzdG9uZS1ocy9yZWZlcmVuY2UtZGF0YSc7XHJcbmltcG9ydCB7IE1hcCB9IGZyb20gJ2ltbXV0YWJsZSc7XHJcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9hY3Rpb24vYWN0aW9uJztcclxuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvZW50aXR5JztcclxuaW1wb3J0IHsgUGxheWVyRW50aXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dhbWUvcGxheWVyLWVudGl0eSc7XHJcbmltcG9ydCB7IEVudGl0eVRhZyB9IGZyb20gJy4uLy4uL21vZGVscy9wYXJzZXIvZW50aXR5LXRhZyc7XHJcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBY3Rpb25IZWxwZXIge1xyXG5cdHB1YmxpYyBzdGF0aWMgZ2V0T3duZXIoZW50aXRpZXM6IE1hcDxudW1iZXIsIEVudGl0eT4sIGVudGl0eUlkOiBudW1iZXIpOiBQbGF5ZXJFbnRpdHkge1xyXG5cdFx0Y29uc3Qgb3duZXJJZCA9IGVudGl0eUlkO1xyXG5cdFx0bGV0IG93bmVyID0gZW50aXRpZXMuZ2V0KG93bmVySWQpO1xyXG5cdFx0aWYgKCEob3duZXIgaW5zdGFuY2VvZiBQbGF5ZXJFbnRpdHkpKSB7XHJcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXJJZCA9IGVudGl0aWVzLmdldChlbnRpdHlJZCkuZ2V0VGFnKEdhbWVUYWcuQ09OVFJPTExFUik7XHJcblx0XHRcdG93bmVyID0gZW50aXRpZXNcclxuXHRcdFx0XHQuZmlsdGVyKChlbnRpdHk6IEVudGl0eSkgPT4gZW50aXR5IGluc3RhbmNlb2YgUGxheWVyRW50aXR5KVxyXG5cdFx0XHRcdC5maWx0ZXIoKGVudGl0eTogUGxheWVyRW50aXR5KSA9PiBlbnRpdHkucGxheWVySWQgPT09IGNvbnRyb2xsZXJJZClcclxuXHRcdFx0XHQuZmlyc3QoKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBvd25lciBhcyBQbGF5ZXJFbnRpdHk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc3RhdGljIGdldENhcmRJZChcclxuXHRcdGVudGl0aWVzOiBNYXA8bnVtYmVyLCBFbnRpdHk+LFxyXG5cdFx0ZW50aXR5SWQ6IG51bWJlcixcclxuXHRcdGFsbEVudGl0aWVzU29GYXI6IE1hcDxudW1iZXIsIEVudGl0eT4sXHJcblx0KTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGVudGl0eSA9IGVudGl0aWVzLmdldChlbnRpdHlJZCk7XHJcblx0XHRpZiAoZW50aXR5ICYmIGVudGl0eS5jYXJkSUQpIHtcclxuXHRcdFx0cmV0dXJuIGVudGl0eS5jYXJkSUQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGFsbEVudGl0aWVzU29GYXIpIHtcclxuXHRcdFx0Y29uc3QgZW50aXR5U29GYXIgPSBhbGxFbnRpdGllc1NvRmFyLmdldChlbnRpdHlJZCk7XHJcblx0XHRcdGlmIChlbnRpdHlTb0ZhciAmJiBlbnRpdHlTb0Zhci5jYXJkSUQpIHtcclxuXHRcdFx0XHRyZXR1cm4gZW50aXR5U29GYXIuY2FyZElEO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT3RoZXJ3aXNlLCB0aGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSdyZSB0YXJnZXRpbmcgYSBwbGF5ZXIgZW50aXR5LCB3aGljaCBkb2Vzbid0IGhhdmUgYSBjYXJkIGlkXHJcblx0XHRpZiAoIShlbnRpdHkgaW5zdGFuY2VvZiBQbGF5ZXJFbnRpdHkpKSB7XHJcblx0XHRcdC8vIFNpbmNlIHdlIGRvbid0IGFsd2F5cyBrbm93IHRoZSBlbnRpdHkgaWQsIGl0IGlzIG9mdGVuIGNvcnJlY3QgdG8gc2F5IHdlIGRvbid0IGtub3dcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRjb25zdCBoZXJvRW50aXR5SWQgPSBlbnRpdHkuZ2V0VGFnKEdhbWVUYWcuSEVST19FTlRJVFkpO1xyXG5cdFx0cmV0dXJuIGVudGl0aWVzLmdldChoZXJvRW50aXR5SWQpLmNhcmRJRDtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBzdGF0aWMgY29tYmluZUFjdGlvbnM8VCBleHRlbmRzIEFjdGlvbj4oXHJcblx0XHRhY3Rpb25zOiByZWFkb25seSBBY3Rpb25bXSxcclxuXHRcdHNob3VsZE1lcmdlOiAoYTogQWN0aW9uLCBiOiBBY3Rpb24pID0+IGJvb2xlYW4sXHJcblx0XHRjb21iaW5lcjogKGE6IFQsIGI6IFQpID0+IFQsXHJcblx0XHRzaG91bGRTd2FwPzogKGE6IEFjdGlvbiwgYjogQWN0aW9uKSA9PiBib29sZWFuLFxyXG5cdCk6IHJlYWRvbmx5IEFjdGlvbltdIHtcclxuXHRcdGxldCBwcmV2aW91c1Jlc3VsdCA9IGFjdGlvbnM7XHJcblx0XHRsZXQgcmVzdWx0OiByZWFkb25seSBBY3Rpb25bXSA9IEFjdGlvbkhlbHBlci5kb0NvbWJpbmUocHJldmlvdXNSZXN1bHQsIHNob3VsZE1lcmdlLCBjb21iaW5lciwgc2hvdWxkU3dhcCk7XHJcblx0XHR3aGlsZSAoIWRlZXBFcXVhbChyZXN1bHQsIHByZXZpb3VzUmVzdWx0KSkge1xyXG5cdFx0XHRwcmV2aW91c1Jlc3VsdCA9IHJlc3VsdDtcclxuXHRcdFx0cmVzdWx0ID0gQWN0aW9uSGVscGVyLmRvQ29tYmluZShwcmV2aW91c1Jlc3VsdCwgc2hvdWxkTWVyZ2UsIGNvbWJpbmVyKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc3RhdGljIGdldFRhZyh0YWdzOiByZWFkb25seSBFbnRpdHlUYWdbXSwgbmFtZTogR2FtZVRhZyk6IG51bWJlciB7XHJcblx0XHRpZiAoIXRhZ3MpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRjb25zdCBkZWZlbmRlciA9IHRhZ3M/LmZpbmQoKHRhZykgPT4gdGFnLnRhZyA9PT0gbmFtZSk7XHJcblx0XHRyZXR1cm4gZGVmZW5kZXIgPyBkZWZlbmRlci52YWx1ZSA6IDA7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgc3RhdGljIG1lcmdlSW50b0ZpcnN0QWN0aW9uPFQgZXh0ZW5kcyBBY3Rpb24+KGZpcnN0OiBULCBzZWNvbmQ6IEFjdGlvbiwgbmV3RWxlbWVudHM6IFQpOiBUIHtcclxuXHRcdGNvbnN0IHJlc3VsdCA9IGZpcnN0LnVwZGF0ZUFjdGlvbihuZXdFbGVtZW50cyk7XHJcblx0XHQvLyBjb25zdCBjb25jYXQgPSBbLi4uKGZpcnN0LmRhbWFnZXMgfHwgW10pLCAuLi4oc2Vjb25kLmRhbWFnZXMgfHwgW10pXSBhcyBSZWFkb25seUFycmF5PERhbWFnZT47XHJcblx0XHRjb25zdCBmaW5hbERhbWFnZXMgPSBmaXJzdC5kYW1hZ2VzLm1lcmdlV2l0aCgocHJldiwgbmV4dCkgPT4gcHJldiArIG5leHQsIHNlY29uZC5kYW1hZ2VzKTtcclxuXHRcdHJldHVybiByZXN1bHQudXBkYXRlQWN0aW9uKHtcclxuXHRcdFx0ZGFtYWdlczogZmluYWxEYW1hZ2VzLFxyXG5cdFx0fSBhcyBUKSBhcyBUO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBzdGF0aWMgZG9Db21iaW5lPFQgZXh0ZW5kcyBBY3Rpb24+KFxyXG5cdFx0YWN0aW9uczogcmVhZG9ubHkgQWN0aW9uW10sXHJcblx0XHRzaG91bGRNZXJnZTogKGE6IEFjdGlvbiwgYjogQWN0aW9uKSA9PiBib29sZWFuLFxyXG5cdFx0Y29tYmluZXI6IChhOiBULCBiOiBUKSA9PiBULFxyXG5cdFx0c2hvdWxkU3dhcD86IChhOiBBY3Rpb24sIGI6IEFjdGlvbikgPT4gYm9vbGVhbixcclxuXHQpOiByZWFkb25seSBBY3Rpb25bXSB7XHJcblx0XHRjb25zdCByZXN1bHQ6IEFjdGlvbltdID0gW107XHJcblx0XHRsZXQgcHJldmlvdXNBY3Rpb246IEFjdGlvbjtcclxuXHRcdC8vIC8vIGNvbnNvbGUubG9nKCdjb25zaWRlcmluZyBhY3Rpb25zIHRvIG1lcmdlJywgYWN0aW9ucyk7XHJcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0Y29uc3QgY3VycmVudEFjdGlvbiA9IGFjdGlvbnNbaV07XHJcblx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKFxyXG5cdFx0XHQvLyBcdCdyZWR1Y2UgMTUwJyxcclxuXHRcdFx0Ly8gXHRwcmV2aW91c0FjdGlvbiAmJiBwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKSAmJiBwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKS50YWdzLnRvSlMoKSxcclxuXHRcdFx0Ly8gXHRjdXJyZW50QWN0aW9uICYmIGN1cnJlbnRBY3Rpb24uZW50aXRpZXMuZ2V0KDE1MCkgJiYgY3VycmVudEFjdGlvbi5lbnRpdGllcy5nZXQoMTUwKS50YWdzLnRvSlMoKSxcclxuXHRcdFx0Ly8gXHRwcmV2aW91c0FjdGlvbixcclxuXHRcdFx0Ly8gXHRjdXJyZW50QWN0aW9uLFxyXG5cdFx0XHQvLyApO1xyXG5cdFx0XHRpZiAoc2hvdWxkTWVyZ2UocHJldmlvdXNBY3Rpb24sIGN1cnJlbnRBY3Rpb24pKSB7XHJcblx0XHRcdFx0Ly8gLy8gY29uc29sZS5sb2coJ21lcmdpbmcnKTtcclxuXHRcdFx0XHRjb25zdCBpbmRleCA9IHJlc3VsdC5pbmRleE9mKHByZXZpb3VzQWN0aW9uKTtcclxuXHRcdFx0XHRwcmV2aW91c0FjdGlvbiA9IGNvbWJpbmVyKHByZXZpb3VzQWN0aW9uIGFzIFQsIGN1cnJlbnRBY3Rpb24gYXMgVCk7XHJcblx0XHRcdFx0Ly8gLy8gY29uc29sZS5sb2coXHJcblx0XHRcdFx0Ly8gXHQnbmV3IHByZXZpb3VzIGFjdGlvbicsXHJcblx0XHRcdFx0Ly8gXHRwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKSAmJiBwcmV2aW91c0FjdGlvbi5lbnRpdGllcy5nZXQoMTUwKS50YWdzLnRvSlMoKSxcclxuXHRcdFx0XHQvLyBcdHByZXZpb3VzQWN0aW9uLFxyXG5cdFx0XHRcdC8vICk7XHJcblx0XHRcdFx0cmVzdWx0W2luZGV4XSA9IHByZXZpb3VzQWN0aW9uO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHNob3VsZFN3YXAgJiYgc2hvdWxkU3dhcChwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbikpIHtcclxuXHRcdFx0XHQvLyAvLyBjb25zb2xlLmxvZygnc3dhcHBpbmcnLCBwcmV2aW91c0FjdGlvbiwgY3VycmVudEFjdGlvbik7XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSByZXN1bHQuaW5kZXhPZihwcmV2aW91c0FjdGlvbik7XHJcblx0XHRcdFx0Y29uc3QgcHJldmlvdXNFbnRpdGllcyA9IHByZXZpb3VzQWN0aW9uLmVudGl0aWVzO1xyXG5cdFx0XHRcdGNvbnN0IHByZXZpb3VzSW5kZXggPSBwcmV2aW91c0FjdGlvbi5pbmRleDtcclxuXHRcdFx0XHRjb25zdCBwcmV2aW91c1RzID0gcHJldmlvdXNBY3Rpb24udGltZXN0YW1wO1xyXG5cdFx0XHRcdGNvbnN0IGN1cnJlbnRFbnRpdGllcyA9IGN1cnJlbnRBY3Rpb24uZW50aXRpZXM7XHJcblx0XHRcdFx0Y29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEFjdGlvbi5pbmRleDtcclxuXHRcdFx0XHRjb25zdCBjdXJyZW50VHMgPSBjdXJyZW50QWN0aW9uLnRpbWVzdGFtcDtcclxuXHRcdFx0XHRyZXN1bHRbaW5kZXhdID0gT2JqZWN0LmFzc2lnbihjdXJyZW50QWN0aW9uLCB7XHJcblx0XHRcdFx0XHRlbnRpdGllczogcHJldmlvdXNFbnRpdGllcyxcclxuXHRcdFx0XHRcdGluZGV4OiBwcmV2aW91c0luZGV4LFxyXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBwcmV2aW91c1RzLFxyXG5cdFx0XHRcdH0gYXMgQWN0aW9uKTtcclxuXHRcdFx0XHRyZXN1bHRbaW5kZXggKyAxXSA9IE9iamVjdC5hc3NpZ24ocHJldmlvdXNBY3Rpb24sIHtcclxuXHRcdFx0XHRcdGVudGl0aWVzOiBjdXJyZW50RW50aXRpZXMsXHJcblx0XHRcdFx0XHRpbmRleDogY3VycmVudEluZGV4LFxyXG5cdFx0XHRcdFx0dGltZXN0YW1wOiBjdXJyZW50VHMsXHJcblx0XHRcdFx0fSBhcyBBY3Rpb24pO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIC8vIGNvbnNvbGUubG9nKCdkb2luZyBub3RoaW5nJyk7XHJcblx0XHRcdFx0cHJldmlvdXNBY3Rpb24gPSBjdXJyZW50QWN0aW9uO1xyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGN1cnJlbnRBY3Rpb24pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvLyAvLyBjb25zb2xlLmxvZyhcclxuXHRcdC8vIFx0J2ZpbmlzaGVkJyxcclxuXHRcdC8vIFx0cmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXS5lbnRpdGllcy5nZXQoMTUwKSAmJiByZXN1bHRbcmVzdWx0Lmxlbmd0aCAtIDFdLmVudGl0aWVzLmdldCgxNTApLnRhZ3MudG9KUygpLFxyXG5cdFx0Ly8gKTtcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG59XHJcbiJdfQ==