UNPKG

bp-prism-game

Version:
188 lines 19.4 kB
import { WaterClass } from '../scenery/water/water.class'; import { AssetTypeEnum } from '../enum/asset-type.enum'; import { TreeClass } from '../scenery/tree/tree.class'; import { LavaClass } from '../scenery/lava/lava.class'; import { RockClass } from '../scenery/rock/rock.class'; import { GrassClass } from '../scenery/grass/grass.class'; import { SlimeClass } from '../scenery/slime/slime.class'; import { GameAssetEnum } from '../enum/game-assets.enum'; /** * The scenery service */ export class SceneryService { /** * The constructor */ constructor(gameService, ctx) { this.gameService = gameService; this.ctx = ctx; this.scenery = []; this.currentLevel = -1; } /** * Add all the scenery * * @param level The current level */ addScenery(level) { if (this.currentLevel !== level) { this.currentLevel = level; this.scenery.map((scenery) => { scenery.isDestroyed = true; }); const sceneryPositions = this.gameService.getSceneryPositions(); sceneryPositions.map((scenery) => { if (scenery.type === AssetTypeEnum.water) { this.addWater(scenery); } else if (scenery.type === AssetTypeEnum.slime) { this.addSlime(scenery); } else if (scenery.type === AssetTypeEnum.grass) { this.addGrass(scenery); } else if (scenery.type === AssetTypeEnum.rock) { this.addRock(scenery); } else if (scenery.type === AssetTypeEnum.lava) { this.addLava(scenery); } else { this.addTree(scenery); } }); } } /** * Find any unused scenery */ findUnusedScenery(type) { return this.scenery .filter((scenery) => { return scenery.getType() === type && scenery.isDestroyed; }) .shift(); } /** * Add the water scenery * * @param waterLocation The water location */ addWater(waterLocation) { let water = this.findUnusedScenery(GameAssetEnum.water); if (water) { water.isDestroyed = false; } else { water = new WaterClass(this.gameService, this.ctx, this.scenery.length, waterLocation.imageType); this.scenery.push(water); } water.move({ x: waterLocation.position.x, y: waterLocation.position.y }); } /** * Add the slime scenery * * @param slimeLocation The slime location */ addSlime(slimeLocation) { let slime = this.findUnusedScenery(GameAssetEnum.slime); if (slime) { slime.isDestroyed = false; } else { slime = new SlimeClass(this.gameService, this.ctx, this.scenery.length); this.scenery.push(slime); } slime.move({ x: slimeLocation.position.x, y: slimeLocation.position.y }); } /** * Add the grass scenery * * @param grassLocation The grass location */ addGrass(grassLocation) { let grass = this.findUnusedScenery(GameAssetEnum.grass); if (grass) { grass.isDestroyed = false; } else { grass = new GrassClass(this.gameService, this.ctx, this.scenery.length); this.scenery.push(grass); } grass.move({ x: grassLocation.position.x, y: grassLocation.position.y }); } /** * Add the rock scenery * * @param rockLocation The rock location */ addRock(rockLocation) { let rock = this.findUnusedScenery(GameAssetEnum.rock); if (rock) { rock.isDestroyed = false; } else { rock = new RockClass(this.gameService, this.ctx, this.scenery.length); this.scenery.push(rock); } rock.move({ x: rockLocation.position.x, y: rockLocation.position.y }); } /** * Add the lava scenery * * @param lavaLocation The lava location */ addLava(lavaLocation) { let lava = this.findUnusedScenery(GameAssetEnum.lava); if (lava) { lava.isDestroyed = false; } else { lava = new LavaClass(this.gameService, this.ctx, this.scenery.length); this.scenery.push(lava); } lava.move({ x: lavaLocation.position.x, y: lavaLocation.position.y }); } /** * Add the tree scenery * @param treeLocation The tree location */ addTree(treeLocation) { let tree = this.findUnusedScenery(GameAssetEnum.tree); if (tree) { tree.isDestroyed = false; } else { tree = new TreeClass(this.gameService, this.ctx, this.scenery.length); this.scenery.push(tree); } tree.move({ x: treeLocation.position.x, y: treeLocation.position.y }); } /** * Initialize the scenery */ animate() { this.scenery.map((scenary) => { scenary.animate(); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmVyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpc20vc3JjL2xpYi9zZXJ2aWNlL3NjZW5lcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFVekI7O09BRUc7SUFDSCxZQUFvQixXQUF3QixFQUFVLEdBQTZCO1FBQS9ELGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBMEI7UUFDakYsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFxQixFQUFFLEVBQUU7Z0JBQ3pDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDaEUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBMkIsRUFBRSxFQUFFO2dCQUNuRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLEtBQUssRUFBRTtvQkFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDeEI7cUJBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxLQUFLLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3hCO3FCQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsS0FBSyxFQUFFO29CQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QjtxQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLElBQUksRUFBRTtvQkFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxJQUFJLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3ZCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLElBQW1CO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE9BQU87YUFDaEIsTUFBTSxDQUFDLENBQUMsT0FBcUIsRUFBRSxFQUFFO1lBQ2hDLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzNELENBQUMsQ0FBQzthQUNELEtBQUssRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxRQUFRLENBQUMsYUFBaUM7UUFDaEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzNCO2FBQU07WUFDTCxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjtRQUVELEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDVCxDQUFDLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLENBQUMsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEIsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxRQUFRLENBQUMsYUFBaUM7UUFDaEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxJQUFJLEtBQUssRUFBRTtZQUNULEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzNCO2FBQU07WUFDTCxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7UUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ1QsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQixDQUFDLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xCLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssUUFBUSxDQUFDLGFBQWlDO1FBQ2hELElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUMzQjthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFCO1FBRUQsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNULENBQUMsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNsQixDQUFDLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLE9BQU8sQ0FBQyxZQUFnQztRQUM5QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUM7WUFDUixDQUFDLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFCLENBQUMsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakIsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxPQUFPLENBQUMsWUFBZ0M7UUFDOUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzFCO2FBQU07WUFDTCxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ1IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixDQUFDLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pCLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSyxPQUFPLENBQUMsWUFBZ0M7UUFDOUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQzFCO2FBQU07WUFDTCxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ1IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQixDQUFDLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pCLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQXFCLEVBQUUsRUFBRTtZQUN6QyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHYW1lU2VydmljZSB9IGZyb20gJy4vZ2FtZS5zZXJ2aWNlJztcbmltcG9ydCB7IElBc3NldCB9IGZyb20gJy4uL2ludGVyZmFjZS9hc3NldC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgV2F0ZXJDbGFzcyB9IGZyb20gJy4uL3NjZW5lcnkvd2F0ZXIvd2F0ZXIuY2xhc3MnO1xuaW1wb3J0IHsgQXNzZXRMb2NhdGlvbk1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYXNzZXQtbG9jYXRpb24ubW9kZWwnO1xuaW1wb3J0IHsgQXNzZXRUeXBlRW51bSB9IGZyb20gJy4uL2VudW0vYXNzZXQtdHlwZS5lbnVtJztcbmltcG9ydCB7IFRyZWVDbGFzcyB9IGZyb20gJy4uL3NjZW5lcnkvdHJlZS90cmVlLmNsYXNzJztcbmltcG9ydCB7IExhdmFDbGFzcyB9IGZyb20gJy4uL3NjZW5lcnkvbGF2YS9sYXZhLmNsYXNzJztcbmltcG9ydCB7IFNjZW5lcnlDbGFzcyB9IGZyb20gJy4uL3NjZW5lcnkvc2NlbmVyeS5jbGFzcyc7XG5pbXBvcnQgeyBSb2NrQ2xhc3MgfSBmcm9tICcuLi9zY2VuZXJ5L3JvY2svcm9jay5jbGFzcyc7XG5pbXBvcnQgeyBHcmFzc0NsYXNzIH0gZnJvbSAnLi4vc2NlbmVyeS9ncmFzcy9ncmFzcy5jbGFzcyc7XG5pbXBvcnQgeyBTbGltZUNsYXNzIH0gZnJvbSAnLi4vc2NlbmVyeS9zbGltZS9zbGltZS5jbGFzcyc7XG5pbXBvcnQgeyBHYW1lQXNzZXRFbnVtIH0gZnJvbSAnLi4vZW51bS9nYW1lLWFzc2V0cy5lbnVtJztcblxuLyoqXG4gKiBUaGUgc2NlbmVyeSBzZXJ2aWNlXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2VuZXJ5U2VydmljZSB7XG4gIC8qKlxuICAgKiBUaGUgc2NlbmVyeVxuICAgKi9cbiAgcHJpdmF0ZSBzY2VuZXJ5OiBTY2VuZXJ5Q2xhc3NbXTtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxldmVsXG4gICAqL1xuICBwcml2YXRlIGN1cnJlbnRMZXZlbDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ2FtZVNlcnZpY2U6IEdhbWVTZXJ2aWNlLCBwcml2YXRlIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSB7XG4gICAgdGhpcy5zY2VuZXJ5ID0gW107XG4gICAgdGhpcy5jdXJyZW50TGV2ZWwgPSAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWxsIHRoZSBzY2VuZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCBUaGUgY3VycmVudCBsZXZlbFxuICAgKi9cbiAgcHVibGljIGFkZFNjZW5lcnkobGV2ZWw6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmN1cnJlbnRMZXZlbCAhPT0gbGV2ZWwpIHtcbiAgICAgIHRoaXMuY3VycmVudExldmVsID0gbGV2ZWw7XG5cbiAgICAgIHRoaXMuc2NlbmVyeS5tYXAoKHNjZW5lcnk6IFNjZW5lcnlDbGFzcykgPT4ge1xuICAgICAgICBzY2VuZXJ5LmlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY2VuZXJ5UG9zaXRpb25zID0gdGhpcy5nYW1lU2VydmljZS5nZXRTY2VuZXJ5UG9zaXRpb25zKCk7XG4gICAgICBzY2VuZXJ5UG9zaXRpb25zLm1hcCgoc2NlbmVyeTogQXNzZXRMb2NhdGlvbk1vZGVsKSA9PiB7XG4gICAgICAgIGlmIChzY2VuZXJ5LnR5cGUgPT09IEFzc2V0VHlwZUVudW0ud2F0ZXIpIHtcbiAgICAgICAgICB0aGlzLmFkZFdhdGVyKHNjZW5lcnkpO1xuICAgICAgICB9IGVsc2UgaWYgKHNjZW5lcnkudHlwZSA9PT0gQXNzZXRUeXBlRW51bS5zbGltZSkge1xuICAgICAgICAgIHRoaXMuYWRkU2xpbWUoc2NlbmVyeSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NlbmVyeS50eXBlID09PSBBc3NldFR5cGVFbnVtLmdyYXNzKSB7XG4gICAgICAgICAgdGhpcy5hZGRHcmFzcyhzY2VuZXJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY2VuZXJ5LnR5cGUgPT09IEFzc2V0VHlwZUVudW0ucm9jaykge1xuICAgICAgICAgIHRoaXMuYWRkUm9jayhzY2VuZXJ5KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY2VuZXJ5LnR5cGUgPT09IEFzc2V0VHlwZUVudW0ubGF2YSkge1xuICAgICAgICAgIHRoaXMuYWRkTGF2YShzY2VuZXJ5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFkZFRyZWUoc2NlbmVyeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFueSB1bnVzZWQgc2NlbmVyeVxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kVW51c2VkU2NlbmVyeSh0eXBlOiBHYW1lQXNzZXRFbnVtKTogU2NlbmVyeUNsYXNzIHtcbiAgICByZXR1cm4gdGhpcy5zY2VuZXJ5XG4gICAgICAuZmlsdGVyKChzY2VuZXJ5OiBTY2VuZXJ5Q2xhc3MpID0+IHtcbiAgICAgICAgcmV0dXJuIHNjZW5lcnkuZ2V0VHlwZSgpID09PSB0eXBlICYmIHNjZW5lcnkuaXNEZXN0cm95ZWQ7XG4gICAgICB9KVxuICAgICAgLnNoaWZ0KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSB3YXRlciBzY2VuZXJ5XG4gICAqXG4gICAqIEBwYXJhbSB3YXRlckxvY2F0aW9uIFRoZSB3YXRlciBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRXYXRlcih3YXRlckxvY2F0aW9uOiBBc3NldExvY2F0aW9uTW9kZWwpOiB2b2lkIHtcbiAgICBsZXQgd2F0ZXIgPSB0aGlzLmZpbmRVbnVzZWRTY2VuZXJ5KEdhbWVBc3NldEVudW0ud2F0ZXIpO1xuXG4gICAgaWYgKHdhdGVyKSB7XG4gICAgICB3YXRlci5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXRlciA9IG5ldyBXYXRlckNsYXNzKHRoaXMuZ2FtZVNlcnZpY2UsIHRoaXMuY3R4LCB0aGlzLnNjZW5lcnkubGVuZ3RoLCB3YXRlckxvY2F0aW9uLmltYWdlVHlwZSk7XG4gICAgICB0aGlzLnNjZW5lcnkucHVzaCh3YXRlcik7XG4gICAgfVxuXG4gICAgd2F0ZXIubW92ZSh7XG4gICAgICB4OiB3YXRlckxvY2F0aW9uLnBvc2l0aW9uLngsXG4gICAgICB5OiB3YXRlckxvY2F0aW9uLnBvc2l0aW9uLnlcbiAgICB9IGFzIElBc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBzbGltZSBzY2VuZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBzbGltZUxvY2F0aW9uIFRoZSBzbGltZSBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRTbGltZShzbGltZUxvY2F0aW9uOiBBc3NldExvY2F0aW9uTW9kZWwpOiB2b2lkIHtcbiAgICBsZXQgc2xpbWUgPSB0aGlzLmZpbmRVbnVzZWRTY2VuZXJ5KEdhbWVBc3NldEVudW0uc2xpbWUpO1xuICAgIGlmIChzbGltZSkge1xuICAgICAgc2xpbWUuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2xpbWUgPSBuZXcgU2xpbWVDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgdGhpcy5zY2VuZXJ5Lmxlbmd0aCk7XG4gICAgICB0aGlzLnNjZW5lcnkucHVzaChzbGltZSk7XG4gICAgfVxuXG4gICAgc2xpbWUubW92ZSh7XG4gICAgICB4OiBzbGltZUxvY2F0aW9uLnBvc2l0aW9uLngsXG4gICAgICB5OiBzbGltZUxvY2F0aW9uLnBvc2l0aW9uLnlcbiAgICB9IGFzIElBc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBncmFzcyBzY2VuZXJ5XG4gICAqXG4gICAqIEBwYXJhbSBncmFzc0xvY2F0aW9uIFRoZSBncmFzcyBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRHcmFzcyhncmFzc0xvY2F0aW9uOiBBc3NldExvY2F0aW9uTW9kZWwpOiB2b2lkIHtcbiAgICBsZXQgZ3Jhc3MgPSB0aGlzLmZpbmRVbnVzZWRTY2VuZXJ5KEdhbWVBc3NldEVudW0uZ3Jhc3MpO1xuICAgIGlmIChncmFzcykge1xuICAgICAgZ3Jhc3MuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3Jhc3MgPSBuZXcgR3Jhc3NDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgdGhpcy5zY2VuZXJ5Lmxlbmd0aCk7XG4gICAgICB0aGlzLnNjZW5lcnkucHVzaChncmFzcyk7XG4gICAgfVxuXG4gICAgZ3Jhc3MubW92ZSh7XG4gICAgICB4OiBncmFzc0xvY2F0aW9uLnBvc2l0aW9uLngsXG4gICAgICB5OiBncmFzc0xvY2F0aW9uLnBvc2l0aW9uLnlcbiAgICB9IGFzIElBc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSByb2NrIHNjZW5lcnlcbiAgICpcbiAgICogQHBhcmFtIHJvY2tMb2NhdGlvbiBUaGUgcm9jayBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRSb2NrKHJvY2tMb2NhdGlvbjogQXNzZXRMb2NhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgbGV0IHJvY2sgPSB0aGlzLmZpbmRVbnVzZWRTY2VuZXJ5KEdhbWVBc3NldEVudW0ucm9jayk7XG4gICAgaWYgKHJvY2spIHtcbiAgICAgIHJvY2suaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9jayA9IG5ldyBSb2NrQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIHRoaXMuc2NlbmVyeS5sZW5ndGgpO1xuICAgICAgdGhpcy5zY2VuZXJ5LnB1c2gocm9jayk7XG4gICAgfVxuXG4gICAgcm9jay5tb3ZlKHtcbiAgICAgIHg6IHJvY2tMb2NhdGlvbi5wb3NpdGlvbi54LFxuICAgICAgeTogcm9ja0xvY2F0aW9uLnBvc2l0aW9uLnlcbiAgICB9IGFzIElBc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBsYXZhIHNjZW5lcnlcbiAgICpcbiAgICogQHBhcmFtIGxhdmFMb2NhdGlvbiBUaGUgbGF2YSBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRMYXZhKGxhdmFMb2NhdGlvbjogQXNzZXRMb2NhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgbGV0IGxhdmEgPSB0aGlzLmZpbmRVbnVzZWRTY2VuZXJ5KEdhbWVBc3NldEVudW0ubGF2YSk7XG4gICAgaWYgKGxhdmEpIHtcbiAgICAgIGxhdmEuaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGF2YSA9IG5ldyBMYXZhQ2xhc3ModGhpcy5nYW1lU2VydmljZSwgdGhpcy5jdHgsIHRoaXMuc2NlbmVyeS5sZW5ndGgpO1xuICAgICAgdGhpcy5zY2VuZXJ5LnB1c2gobGF2YSk7XG4gICAgfVxuXG4gICAgbGF2YS5tb3ZlKHtcbiAgICAgIHg6IGxhdmFMb2NhdGlvbi5wb3NpdGlvbi54LFxuICAgICAgeTogbGF2YUxvY2F0aW9uLnBvc2l0aW9uLnlcbiAgICB9IGFzIElBc3NldCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSB0cmVlIHNjZW5lcnlcbiAgICogQHBhcmFtIHRyZWVMb2NhdGlvbiBUaGUgdHJlZSBsb2NhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUcmVlKHRyZWVMb2NhdGlvbjogQXNzZXRMb2NhdGlvbk1vZGVsKTogdm9pZCB7XG4gICAgbGV0IHRyZWUgPSB0aGlzLmZpbmRVbnVzZWRTY2VuZXJ5KEdhbWVBc3NldEVudW0udHJlZSk7XG5cbiAgICBpZiAodHJlZSkge1xuICAgICAgdHJlZS5pc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlID0gbmV3IFRyZWVDbGFzcyh0aGlzLmdhbWVTZXJ2aWNlLCB0aGlzLmN0eCwgdGhpcy5zY2VuZXJ5Lmxlbmd0aCk7XG4gICAgICB0aGlzLnNjZW5lcnkucHVzaCh0cmVlKTtcbiAgICB9XG5cbiAgICB0cmVlLm1vdmUoe1xuICAgICAgeDogdHJlZUxvY2F0aW9uLnBvc2l0aW9uLngsXG4gICAgICB5OiB0cmVlTG9jYXRpb24ucG9zaXRpb24ueVxuICAgIH0gYXMgSUFzc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBzY2VuZXJ5XG4gICAqL1xuICBwdWJsaWMgYW5pbWF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNjZW5lcnkubWFwKChzY2VuYXJ5OiBTY2VuZXJ5Q2xhc3MpID0+IHtcbiAgICAgIHNjZW5hcnkuYW5pbWF0ZSgpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=