valtech-components 4.0.937 → 4.0.939
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/molecules/group-picker/group-picker.component.mjs +97 -0
- package/esm2022/lib/components/organisms/group-members/group-members.component.mjs +178 -0
- package/esm2022/lib/components/organisms/mini-games/mini-games.i18n.mjs +1 -381
- package/esm2022/lib/components/organisms/mini-games/types.mjs +1 -1
- package/esm2022/lib/services/groups/groups.service.mjs +92 -0
- package/esm2022/lib/services/groups/types.mjs +2 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +4 -3
- package/fesm2022/valtech-components.mjs +641 -7612
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/group-picker/group-picker.component.d.ts +28 -0
- package/lib/components/organisms/group-members/group-members.component.d.ts +43 -0
- package/lib/components/organisms/mini-games/types.d.ts +0 -182
- package/lib/services/groups/groups.service.d.ts +39 -0
- package/lib/services/groups/types.d.ts +69 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +4 -2
- package/src/lib/assets/games/README.md +8 -0
- package/esm2022/lib/components/organisms/mini-games/christianity-bot.mjs +0 -94
- package/esm2022/lib/components/organisms/mini-games/christianity-card.component.mjs +0 -503
- package/esm2022/lib/components/organisms/mini-games/christianity-catalog.mjs +0 -247
- package/esm2022/lib/components/organisms/mini-games/christianity-game.component.mjs +0 -4580
- package/esm2022/lib/components/organisms/mini-games/christianity-rules.mjs +0 -1383
- package/esm2022/lib/components/organisms/mini-games/christianity-tutorial.mjs +0 -152
- package/lib/components/organisms/mini-games/christianity-bot.d.ts +0 -15
- package/lib/components/organisms/mini-games/christianity-card.component.d.ts +0 -55
- package/lib/components/organisms/mini-games/christianity-catalog.d.ts +0 -18
- package/lib/components/organisms/mini-games/christianity-game.component.d.ts +0 -395
- package/lib/components/organisms/mini-games/christianity-rules.d.ts +0 -57
- package/lib/components/organisms/mini-games/christianity-tutorial.d.ts +0 -38
- package/src/lib/assets/games/christianity/card-symbol.svg +0 -51
- package/src/lib/assets/games/christianity/card-template-reference/front.html +0 -114
- package/src/lib/assets/games/christianity/card-template-reference/front.style.css +0 -352
- package/src/lib/assets/games/christianity/data/01-genesis.bible-reference-suggestions.csv +0 -191
- package/src/lib/assets/games/christianity/data/01-genesis.bible-verses.nbv-open.csv +0 -170
- package/src/lib/assets/games/christianity/data/01-genesis.cards.csv +0 -281
- package/src/lib/assets/games/christianity/data/01-genesis.cards.i18n.csv +0 -281
- package/src/lib/assets/games/christianity/data/01-genesis.cards.json +0 -16453
- package/src/lib/assets/games/christianity/data/01-genesis.unassigned-effects.csv +0 -49
- package/src/lib/assets/games/christianity/data/README.md +0 -40
- package/src/lib/assets/games/christianity/data/data-con-habilides.csv +0 -273
- package/src/lib/assets/games/christianity/data/habilidades-por-tipo.xlsx +0 -0
- package/src/lib/assets/games/christianity/data/listado-edicion.csv +0 -281
- package/src/lib/assets/games/christianity/editions/1/cards/.gitkeep +0 -1
- package/src/lib/assets/games/christianity/editions/1/cards/PLACEHOLDER.png +0 -0
- package/src/lib/assets/games/christianity/editions/README.md +0 -34
- package/src/lib/assets/games/christianity/icons/1-icon.png +0 -0
- package/src/lib/assets/games/christianity/icons/action.png +0 -0
- package/src/lib/assets/games/christianity/icons/character.png +0 -0
- package/src/lib/assets/games/christianity/icons/event.png +0 -0
- package/src/lib/assets/games/christianity/icons/leader.png +0 -0
- package/src/lib/assets/games/christianity/icons/offering.png +0 -0
- package/src/lib/assets/games/christianity/icons/place.png +0 -0
- package/src/lib/assets/games/christianity/icons/tool.png +0 -0
- package/src/lib/assets/games/christianity/icons/wisdom.png +0 -0
- package/src/lib/assets/games/christianity/sources/README.md +0 -16
- package/src/lib/assets/games/christianity/sources/spaonbv_vpl.txt +0 -29102
- package/src/lib/assets/games/christianity/sources/spaonbv_vpl.xml +0 -29104
- package/src/lib/assets/games/christianity/spaonbv.txt +0 -52
|
@@ -1,1383 +0,0 @@
|
|
|
1
|
-
export const CHRISTIANITY_BATTLE_SLOTS = 4;
|
|
2
|
-
// Máximo de cartas en mano: al robar por encima de este límite, la carta robada se descarta a Historia.
|
|
3
|
-
export const CHRISTIANITY_MAX_HAND_SIZE = 7;
|
|
4
|
-
export function readyOfferings(player) {
|
|
5
|
-
return player.offerings.reduce((total, offering) => total + (offering.ready ? offering.value : 0), player.temporaryOfferingReserve ?? 0);
|
|
6
|
-
}
|
|
7
|
-
export function totalOfferings(player) {
|
|
8
|
-
return player.offerings.reduce((total, offering) => total + offering.value, 0);
|
|
9
|
-
}
|
|
10
|
-
export function effectiveCost(player, card) {
|
|
11
|
-
const base = card.cost ?? 0;
|
|
12
|
-
if (base === 0)
|
|
13
|
-
return 0;
|
|
14
|
-
const delta = (player.costModifiers ?? [])
|
|
15
|
-
.filter(m => m.cardType === card.type)
|
|
16
|
-
.reduce((sum, m) => sum + m.delta, 0);
|
|
17
|
-
return Math.max(0, base + delta);
|
|
18
|
-
}
|
|
19
|
-
export function canPlayCard(game, seat, card) {
|
|
20
|
-
if (game.status !== 'in_progress' || game.turnOwner !== seat)
|
|
21
|
-
return false;
|
|
22
|
-
const player = game.players[seat];
|
|
23
|
-
if (card.type === 'offering') {
|
|
24
|
-
const extraCost = (player.costModifiers ?? [])
|
|
25
|
-
.filter(m => m.cardType === 'offering')
|
|
26
|
-
.reduce((s, m) => s + m.delta, 0);
|
|
27
|
-
if (extraCost > 0 && readyOfferings(player) < extraCost)
|
|
28
|
-
return false;
|
|
29
|
-
return !player.offeringPlayedThisTurn;
|
|
30
|
-
}
|
|
31
|
-
const cost = effectiveCost(player, card);
|
|
32
|
-
if (card.type === 'character') {
|
|
33
|
-
return readyOfferings(player) >= cost && player.battleZone.length < CHRISTIANITY_BATTLE_SLOTS;
|
|
34
|
-
}
|
|
35
|
-
if (card.type === 'tool') {
|
|
36
|
-
return readyOfferings(player) >= cost && player.battleZone.length > 0;
|
|
37
|
-
}
|
|
38
|
-
if (card.type === 'action' || card.type === 'wisdom' || card.type === 'event') {
|
|
39
|
-
const locked = (player.costModifiers ?? []).some(m => m.cardType === card.type && m.delta >= 99);
|
|
40
|
-
if (locked)
|
|
41
|
-
return false;
|
|
42
|
-
return readyOfferings(player) >= cost;
|
|
43
|
-
}
|
|
44
|
-
if (card.type === 'place')
|
|
45
|
-
return true;
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
export function playCardFromHand(game, seat, card, options = {}) {
|
|
49
|
-
if (!canPlayCard(game, seat, card)) {
|
|
50
|
-
return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
|
|
51
|
-
}
|
|
52
|
-
const next = structuredClone(game);
|
|
53
|
-
const player = next.players[seat];
|
|
54
|
-
const handIndex = player.hand?.indexOf(card.id) ?? -1;
|
|
55
|
-
if (handIndex < 0 || !player.hand) {
|
|
56
|
-
return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
|
|
57
|
-
}
|
|
58
|
-
const displayName = options.displayName ?? card.name;
|
|
59
|
-
let playedOfferingValue = 0;
|
|
60
|
-
let spentOfferings = 0;
|
|
61
|
-
player.hand.splice(handIndex, 1);
|
|
62
|
-
if (card.type === 'offering') {
|
|
63
|
-
playedOfferingValue = card.offeringValue ?? card.life ?? 1;
|
|
64
|
-
player.offerings.push({
|
|
65
|
-
instanceId: `${seat.toLowerCase()}_offering_${next.revision + 1}`,
|
|
66
|
-
cardId: card.id,
|
|
67
|
-
name: displayName,
|
|
68
|
-
owner: seat,
|
|
69
|
-
ready: true,
|
|
70
|
-
value: playedOfferingValue,
|
|
71
|
-
abilityName: card.abilityName,
|
|
72
|
-
abilityText: card.abilityText,
|
|
73
|
-
abilityCost: card.abilityCost,
|
|
74
|
-
});
|
|
75
|
-
player.offeringPlayedThisTurn = true;
|
|
76
|
-
}
|
|
77
|
-
else if (card.type === 'character') {
|
|
78
|
-
const occupiedSlots = new Set(player.battleZone.map((character, index) => Number.isInteger(character.slot) ? (character.slot ?? index) : index));
|
|
79
|
-
const targetSlot = options.slotIndex ?? [0, 1, 2, 3].find(index => !occupiedSlots.has(index));
|
|
80
|
-
if (targetSlot === undefined || occupiedSlots.has(targetSlot)) {
|
|
81
|
-
return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
|
|
82
|
-
}
|
|
83
|
-
spentOfferings = effectiveCost(player, card);
|
|
84
|
-
spendOfferings(player, spentOfferings);
|
|
85
|
-
const life = card.life ?? 1;
|
|
86
|
-
const newChar = {
|
|
87
|
-
instanceId: `${seat.toLowerCase()}_${next.revision + 1}_${player.battleZone.length}`,
|
|
88
|
-
cardId: card.id,
|
|
89
|
-
name: displayName,
|
|
90
|
-
owner: seat,
|
|
91
|
-
controller: seat,
|
|
92
|
-
slot: targetSlot,
|
|
93
|
-
attack: card.attack ?? 0,
|
|
94
|
-
currentHp: life,
|
|
95
|
-
maxHp: life,
|
|
96
|
-
canAttack: false,
|
|
97
|
-
};
|
|
98
|
-
const synthesized = synthesizeStructuredEffects(card);
|
|
99
|
-
bakeEffects(newChar, [...(card.effects ?? []), ...synthesized]);
|
|
100
|
-
player.battleZone.push(newChar);
|
|
101
|
-
fireEffects(next, newChar, 'on_enter', seat);
|
|
102
|
-
fireEffects(next, newChar, 'passive', seat);
|
|
103
|
-
applyPassiveCostModifiers(next.players[seat], newChar.instanceId, card, true);
|
|
104
|
-
resolveCharacterStrategyEnter(next, newChar, card, seat, options.lookup);
|
|
105
|
-
inlineCleanup(next, options.lookup);
|
|
106
|
-
player.battleZone.sort((left, right) => (left.slot ?? 0) - (right.slot ?? 0));
|
|
107
|
-
}
|
|
108
|
-
else if (card.type === 'tool') {
|
|
109
|
-
spentOfferings = effectiveCost(player, card);
|
|
110
|
-
if (spentOfferings > 0) {
|
|
111
|
-
spendOfferings(player, spentOfferings);
|
|
112
|
-
}
|
|
113
|
-
next.players[seat] = player;
|
|
114
|
-
const targetId = options.targetInstanceId;
|
|
115
|
-
const charIdx = next.players[seat].battleZone.findIndex(c => c.instanceId === targetId);
|
|
116
|
-
if (charIdx < 0) {
|
|
117
|
-
return { game, played: false, playedOfferingValue: 0, spentOfferings: 0, log: [] };
|
|
118
|
-
}
|
|
119
|
-
const ch = next.players[seat].battleZone[charIdx];
|
|
120
|
-
ch.equippedTools = [...(ch.equippedTools ?? []), card.id];
|
|
121
|
-
applyToolPassives(ch, card);
|
|
122
|
-
}
|
|
123
|
-
else if (card.type === 'action' || card.type === 'wisdom' || card.type === 'event') {
|
|
124
|
-
spentOfferings = effectiveCost(player, card);
|
|
125
|
-
if (spentOfferings > 0) {
|
|
126
|
-
spendOfferings(player, spentOfferings);
|
|
127
|
-
}
|
|
128
|
-
next.historyZone.push(card.id);
|
|
129
|
-
next.players[seat] = player;
|
|
130
|
-
resolveCardEffect(next, card, seat, options.lookup);
|
|
131
|
-
inlineCleanup(next, options.lookup);
|
|
132
|
-
}
|
|
133
|
-
else if (card.type === 'place') {
|
|
134
|
-
const previousPlace = next.placeZone[0];
|
|
135
|
-
if (previousPlace) {
|
|
136
|
-
next.historyZone.push(previousPlace);
|
|
137
|
-
}
|
|
138
|
-
next.placeZone = [card.id];
|
|
139
|
-
resolveCardEffect(next, card, seat, options.lookup);
|
|
140
|
-
}
|
|
141
|
-
next.revision++;
|
|
142
|
-
const log = [playCardLog(card, displayName)];
|
|
143
|
-
next.log = [...log, ...next.log].slice(0, 4);
|
|
144
|
-
return { game: next, played: true, playedOfferingValue, spentOfferings, log };
|
|
145
|
-
}
|
|
146
|
-
export function canUseOfferingAbility(game, seat, offeringInstanceId) {
|
|
147
|
-
if (game.status !== 'in_progress' || game.turnOwner !== seat)
|
|
148
|
-
return false;
|
|
149
|
-
const player = game.players[seat];
|
|
150
|
-
const offering = player.offerings.find(card => card.instanceId === offeringInstanceId);
|
|
151
|
-
if (!offering?.ready || !offering.abilityName || offering.abilityUsedThisTurn)
|
|
152
|
-
return false;
|
|
153
|
-
return readyOfferings(player) >= (offering.abilityCost ?? 0);
|
|
154
|
-
}
|
|
155
|
-
export function resolveOfferingAbility(game, seat, offeringInstanceId, messages) {
|
|
156
|
-
if (!canUseOfferingAbility(game, seat, offeringInstanceId)) {
|
|
157
|
-
return { game, resolved: false, leaderDamage: 0, reserveGain: 0, spentOfferings: 0, log: [] };
|
|
158
|
-
}
|
|
159
|
-
const next = structuredClone(game);
|
|
160
|
-
const player = next.players[seat];
|
|
161
|
-
const liveOffering = player.offerings.find(card => card.instanceId === offeringInstanceId);
|
|
162
|
-
if (!liveOffering)
|
|
163
|
-
return { game, resolved: false, leaderDamage: 0, reserveGain: 0, spentOfferings: 0, log: [] };
|
|
164
|
-
const spentOfferings = liveOffering.abilityCost ?? 0;
|
|
165
|
-
if (spentOfferings > 0) {
|
|
166
|
-
spendOfferings(player, spentOfferings);
|
|
167
|
-
}
|
|
168
|
-
const reserveGain = offeringAbilityReserveGain(liveOffering.abilityText, liveOffering.value);
|
|
169
|
-
player.temporaryOfferingReserve = (player.temporaryOfferingReserve ?? 0) + reserveGain;
|
|
170
|
-
player.offerings = player.offerings.map(card => card.instanceId === offeringInstanceId ? { ...card, abilityUsedThisTurn: true } : card);
|
|
171
|
-
player.leaderHp = Math.max(0, player.leaderHp - 1);
|
|
172
|
-
next.revision++;
|
|
173
|
-
const log = [`${liveOffering.name}: ${liveOffering.abilityName}.`];
|
|
174
|
-
if (messages) {
|
|
175
|
-
evaluateVictory(next, log, messages);
|
|
176
|
-
}
|
|
177
|
-
next.log = [...log, ...next.log].slice(0, 4);
|
|
178
|
-
return { game: next, resolved: true, leaderDamage: 1, reserveGain, spentOfferings, log };
|
|
179
|
-
}
|
|
180
|
-
function playCardLog(card, displayName) {
|
|
181
|
-
if (card.type === 'offering')
|
|
182
|
-
return `${displayName} queda lista como ofrenda.`;
|
|
183
|
-
if (card.type === 'place')
|
|
184
|
-
return `${displayName} queda como lugar activo.`;
|
|
185
|
-
if (card.type === 'action' || card.type === 'event')
|
|
186
|
-
return `${displayName} fue jugada.`;
|
|
187
|
-
if (card.type === 'wisdom')
|
|
188
|
-
return `${displayName} fue revelada.`;
|
|
189
|
-
if (card.type === 'tool')
|
|
190
|
-
return `${displayName} fue equipada.`;
|
|
191
|
-
return `${displayName} entra en batalla.`;
|
|
192
|
-
}
|
|
193
|
-
export function resolveAttackLeader(game, attackerSeat, attackerInstanceId, messages) {
|
|
194
|
-
const defenderSeat = opponentSeat(attackerSeat);
|
|
195
|
-
if (game.status !== 'in_progress' || game.players[defenderSeat].battleZone.length > 0) {
|
|
196
|
-
return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
|
|
197
|
-
}
|
|
198
|
-
const next = structuredClone(game);
|
|
199
|
-
const attacker = next.players[attackerSeat].battleZone.find(card => card.instanceId === attackerInstanceId);
|
|
200
|
-
if (!attacker || !attacker.canAttack)
|
|
201
|
-
return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
|
|
202
|
-
fireEffects(next, attacker, 'on_attack', attackerSeat, { targeting: 'leader' });
|
|
203
|
-
const damage = attacker.attack + (attacker.combatAttackBuff ?? 0);
|
|
204
|
-
next.players[defenderSeat].leaderHp = Math.max(0, next.players[defenderSeat].leaderHp - damage);
|
|
205
|
-
attacker.combatAttackBuff = 0;
|
|
206
|
-
attacker.canAttack = false;
|
|
207
|
-
const log = [
|
|
208
|
-
`${attacker.name} ${attackerSeat === 'P1' ? messages.attacksOpponentLeader : messages.attacksYourLeader}`,
|
|
209
|
-
];
|
|
210
|
-
evaluateVictory(next, log, messages);
|
|
211
|
-
next.revision++;
|
|
212
|
-
next.log = [...log, ...next.log].slice(0, 4);
|
|
213
|
-
return { game: next, attacked: true, attackerDamage: 0, targetDamage: damage, log };
|
|
214
|
-
}
|
|
215
|
-
export function resolveAttackCharacter(game, attackerSeat, attackerInstanceId, targetInstanceId, messages) {
|
|
216
|
-
const defenderSeat = opponentSeat(attackerSeat);
|
|
217
|
-
if (game.status !== 'in_progress')
|
|
218
|
-
return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
|
|
219
|
-
const next = structuredClone(game);
|
|
220
|
-
const attacker = next.players[attackerSeat].battleZone.find(card => card.instanceId === attackerInstanceId);
|
|
221
|
-
const target = next.players[defenderSeat].battleZone.find(card => card.instanceId === targetInstanceId);
|
|
222
|
-
if (!attacker || !target || !attacker.canAttack) {
|
|
223
|
-
return { game, attacked: false, attackerDamage: 0, targetDamage: 0, log: [] };
|
|
224
|
-
}
|
|
225
|
-
fireEffects(next, attacker, 'on_attack', attackerSeat, { targeting: 'character' }, target);
|
|
226
|
-
fireEffects(next, target, 'on_defend', defenderSeat, { targeting: 'character' }, attacker);
|
|
227
|
-
const attackerTotal = attacker.attack + (attacker.combatAttackBuff ?? 0);
|
|
228
|
-
const targetTotal = target.attack + (target.combatAttackBuff ?? 0);
|
|
229
|
-
target.currentHp -= attackerTotal;
|
|
230
|
-
attacker.currentHp -= targetTotal;
|
|
231
|
-
attacker.combatAttackBuff = 0;
|
|
232
|
-
target.combatAttackBuff = 0;
|
|
233
|
-
attacker.canAttack = false;
|
|
234
|
-
cleanupDestroyed(next.players[attackerSeat], next);
|
|
235
|
-
cleanupDestroyed(next.players[defenderSeat], next);
|
|
236
|
-
const log = [`${attacker.name} ${messages.combatsAgainst} ${target.name}.`];
|
|
237
|
-
evaluateVictory(next, log, messages);
|
|
238
|
-
next.revision++;
|
|
239
|
-
next.log = [...log, ...next.log].slice(0, 4);
|
|
240
|
-
return {
|
|
241
|
-
game: next,
|
|
242
|
-
attacked: true,
|
|
243
|
-
attackerDamage: targetTotal,
|
|
244
|
-
targetDamage: attackerTotal,
|
|
245
|
-
log,
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
export function advanceTurn(game, messages) {
|
|
249
|
-
game.players[game.turnOwner].temporaryOfferingReserve = 0;
|
|
250
|
-
game.turnOwner = opponentSeat(game.turnOwner);
|
|
251
|
-
game.turnCount++;
|
|
252
|
-
const current = game.players[game.turnOwner];
|
|
253
|
-
current.offeringPlayedThisTurn = false;
|
|
254
|
-
current.offerings = current.offerings.map(offering => ({
|
|
255
|
-
...offering,
|
|
256
|
-
ready: true,
|
|
257
|
-
abilityUsedThisTurn: false,
|
|
258
|
-
}));
|
|
259
|
-
current.battleZone = current.battleZone.map(card => ({ ...card, canAttack: true }));
|
|
260
|
-
const drawnCard = game.sharedDeck.shift();
|
|
261
|
-
const log = [];
|
|
262
|
-
let discardedForHandLimit = false;
|
|
263
|
-
if (drawnCard) {
|
|
264
|
-
if (current.hand) {
|
|
265
|
-
current.hand.push(drawnCard);
|
|
266
|
-
// Mano llena: la carta robada por encima del máximo se descarta a Historia.
|
|
267
|
-
while (current.hand.length > CHRISTIANITY_MAX_HAND_SIZE) {
|
|
268
|
-
const discarded = current.hand.pop();
|
|
269
|
-
if (discarded)
|
|
270
|
-
game.historyZone.push(discarded);
|
|
271
|
-
discardedForHandLimit = true;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
current.handCount = (current.handCount ?? 0) + 1;
|
|
276
|
-
if (current.handCount > CHRISTIANITY_MAX_HAND_SIZE) {
|
|
277
|
-
current.handCount = CHRISTIANITY_MAX_HAND_SIZE;
|
|
278
|
-
if (drawnCard)
|
|
279
|
-
game.historyZone.push(drawnCard);
|
|
280
|
-
discardedForHandLimit = true;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
evaluateVictory(game, log, messages);
|
|
286
|
-
}
|
|
287
|
-
return [
|
|
288
|
-
drawnCard ? `${current.displayName} ${messages.drawsCard}` : messages.deckIsEmpty,
|
|
289
|
-
...(discardedForHandLimit ? [`${current.displayName} ${messages.handFull}`] : []),
|
|
290
|
-
`${messages.turnOf} ${current.displayName}.`,
|
|
291
|
-
...log,
|
|
292
|
-
];
|
|
293
|
-
}
|
|
294
|
-
export function evaluateVictory(game, log, messages) {
|
|
295
|
-
if (game.players.P1.leaderHp > 0 && game.players.P2.leaderHp > 0 && game.sharedDeck.length > 0)
|
|
296
|
-
return;
|
|
297
|
-
game.status = 'finished';
|
|
298
|
-
const winner = game.players.P1.leaderHp <= 0
|
|
299
|
-
? 'P2'
|
|
300
|
-
: game.players.P2.leaderHp <= 0
|
|
301
|
-
? 'P1'
|
|
302
|
-
: game.players.P1.leaderHp >= game.players.P2.leaderHp
|
|
303
|
-
? 'P1'
|
|
304
|
-
: 'P2';
|
|
305
|
-
game.matchScore[winner] += 1;
|
|
306
|
-
log.push(winner === 'P1' ? messages.youWin : messages.opponentWins);
|
|
307
|
-
}
|
|
308
|
-
export function cleanupDestroyed(player, game, lookup) {
|
|
309
|
-
const destroyed = player.battleZone.filter(card => card.currentHp <= 0);
|
|
310
|
-
if (!destroyed.length)
|
|
311
|
-
return;
|
|
312
|
-
for (const ch of destroyed) {
|
|
313
|
-
fireEffects(game, ch, 'on_death', ch.owner);
|
|
314
|
-
applyPassiveCostModifiers(game.players[ch.owner], ch.instanceId, null, false);
|
|
315
|
-
if (lookup) {
|
|
316
|
-
const def = lookup(ch.cardId);
|
|
317
|
-
if (def)
|
|
318
|
-
resolveCharacterStrategyDeath(game, ch, def, ch.owner, lookup);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
game.historyZone.push(...destroyed.map(card => card.cardId));
|
|
322
|
-
player.battleZone = player.battleZone.filter(card => card.currentHp > 0);
|
|
323
|
-
}
|
|
324
|
-
export function spendOfferings(player, cost) {
|
|
325
|
-
let remaining = cost;
|
|
326
|
-
const temporaryReserve = player.temporaryOfferingReserve ?? 0;
|
|
327
|
-
if (temporaryReserve > 0) {
|
|
328
|
-
const spentTemporaryReserve = Math.min(temporaryReserve, remaining);
|
|
329
|
-
player.temporaryOfferingReserve = temporaryReserve - spentTemporaryReserve;
|
|
330
|
-
remaining -= spentTemporaryReserve;
|
|
331
|
-
}
|
|
332
|
-
player.offerings = player.offerings.map(offering => {
|
|
333
|
-
if (remaining <= 0 || !offering.ready)
|
|
334
|
-
return offering;
|
|
335
|
-
remaining -= offering.value;
|
|
336
|
-
return { ...offering, ready: false };
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
function offeringAbilityReserveGain(abilityText, fallbackValue) {
|
|
340
|
-
const match = abilityText?.match(/valor de (\d+) ofrendas?/i);
|
|
341
|
-
const parsed = match ? Number(match[1]) : Number.NaN;
|
|
342
|
-
return Number.isFinite(parsed) && parsed > 0 ? parsed : Math.max(1, fallbackValue);
|
|
343
|
-
}
|
|
344
|
-
export function opponentSeat(seat) {
|
|
345
|
-
return seat === 'P1' ? 'P2' : 'P1';
|
|
346
|
-
}
|
|
347
|
-
function checkCondition(condition, ctx) {
|
|
348
|
-
if (!condition)
|
|
349
|
-
return true;
|
|
350
|
-
return condition.targeting === ctx.targeting;
|
|
351
|
-
}
|
|
352
|
-
function applyMutationToCharacter(ch, effect) {
|
|
353
|
-
const mut = effect.mutation;
|
|
354
|
-
const duration = effect.duration ?? 'permanent';
|
|
355
|
-
switch (mut.type) {
|
|
356
|
-
case 'buff_attack':
|
|
357
|
-
if (duration === 'combat') {
|
|
358
|
-
ch.combatAttackBuff = (ch.combatAttackBuff ?? 0) + mut.amount;
|
|
359
|
-
}
|
|
360
|
-
else {
|
|
361
|
-
ch.attack += mut.amount;
|
|
362
|
-
}
|
|
363
|
-
break;
|
|
364
|
-
case 'buff_life':
|
|
365
|
-
ch.currentHp += mut.amount;
|
|
366
|
-
ch.maxHp += mut.amount;
|
|
367
|
-
break;
|
|
368
|
-
case 'deal_damage':
|
|
369
|
-
ch.currentHp = Math.max(0, ch.currentHp - mut.amount);
|
|
370
|
-
break;
|
|
371
|
-
case 'restore_hp':
|
|
372
|
-
ch.currentHp = Math.min(ch.maxHp, ch.currentHp + mut.amount);
|
|
373
|
-
break;
|
|
374
|
-
case 'destroy':
|
|
375
|
-
ch.currentHp = 0;
|
|
376
|
-
break;
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
function applyEffect(game, effect, source, combatOpponent, seat) {
|
|
380
|
-
const { mutation: mut, target } = effect;
|
|
381
|
-
const opp = opponentSeat(seat);
|
|
382
|
-
switch (target) {
|
|
383
|
-
case 'self':
|
|
384
|
-
applyMutationToCharacter(source, effect);
|
|
385
|
-
break;
|
|
386
|
-
case 'combat_opponent':
|
|
387
|
-
if (combatOpponent)
|
|
388
|
-
applyMutationToCharacter(combatOpponent, effect);
|
|
389
|
-
break;
|
|
390
|
-
case 'all_friendly':
|
|
391
|
-
for (const ch of game.players[seat].battleZone)
|
|
392
|
-
applyMutationToCharacter(ch, effect);
|
|
393
|
-
break;
|
|
394
|
-
case 'all_enemy':
|
|
395
|
-
for (const ch of game.players[opp].battleZone)
|
|
396
|
-
applyMutationToCharacter(ch, effect);
|
|
397
|
-
break;
|
|
398
|
-
case 'opponent_leader':
|
|
399
|
-
case 'own_leader': {
|
|
400
|
-
const ls = target === 'opponent_leader' ? opp : seat;
|
|
401
|
-
if (mut.type === 'deal_damage') {
|
|
402
|
-
game.players[ls].leaderHp = Math.max(0, game.players[ls].leaderHp - mut.amount);
|
|
403
|
-
}
|
|
404
|
-
else if (mut.type === 'restore_hp') {
|
|
405
|
-
game.players[ls].leaderHp = Math.min(game.players[ls].leaderMaxHp, game.players[ls].leaderHp + mut.amount);
|
|
406
|
-
}
|
|
407
|
-
break;
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
// game-level mutations that bypass the character switch
|
|
411
|
-
if (mut.type === 'draw_card') {
|
|
412
|
-
for (let i = 0; i < mut.amount; i++)
|
|
413
|
-
drawCardFor(game, seat);
|
|
414
|
-
}
|
|
415
|
-
else if (mut.type === 'discard_card') {
|
|
416
|
-
const tSeat = mut.who === 'opponent' ? opp : seat;
|
|
417
|
-
const hand = game.players[tSeat].hand ?? [];
|
|
418
|
-
let seed = game.revision * 31 + game.turnCount * 7;
|
|
419
|
-
for (let i = 0; i < Math.min(mut.amount, hand.length); i++) {
|
|
420
|
-
seed = (seed * 1664525 + 1013904223) & 0xffffffff;
|
|
421
|
-
const idx = Math.abs(seed) % hand.length;
|
|
422
|
-
game.historyZone.push(hand.splice(idx, 1)[0]);
|
|
423
|
-
}
|
|
424
|
-
game.players[tSeat].hand = hand;
|
|
425
|
-
}
|
|
426
|
-
else if (mut.type === 'gain_offerings') {
|
|
427
|
-
game.players[seat].temporaryOfferingReserve =
|
|
428
|
-
(game.players[seat].temporaryOfferingReserve ?? 0) + mut.amount;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
function fireEffects(game, source, trigger, seat, ctx = {}, combatOpponent = null) {
|
|
432
|
-
for (const effect of source.effects ?? []) {
|
|
433
|
-
if (effect.trigger !== trigger)
|
|
434
|
-
continue;
|
|
435
|
-
if (!checkCondition(effect.condition, ctx))
|
|
436
|
-
continue;
|
|
437
|
-
applyEffect(game, effect, source, combatOpponent, seat);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
function bakeEffects(instance, effects) {
|
|
441
|
-
instance.effects = [...(instance.effects ?? []), ...effects];
|
|
442
|
-
}
|
|
443
|
-
// --- Tool equip passives (H8) ---
|
|
444
|
-
function applyToolPassives(ch, card) {
|
|
445
|
-
const text = card.abilities?.[0]?.text ?? '';
|
|
446
|
-
const lower = text.toLowerCase();
|
|
447
|
-
const atkMatch = lower.match(/\+(\d+)\s+punto(?:s)? de ataque/);
|
|
448
|
-
if (atkMatch)
|
|
449
|
-
ch.attack += parseInt(atkMatch[1], 10);
|
|
450
|
-
const lifeMatch = lower.match(/\+(\d+)\s+punto(?:s)? de vida/);
|
|
451
|
-
if (lifeMatch) {
|
|
452
|
-
const n = parseInt(lifeMatch[1], 10);
|
|
453
|
-
ch.currentHp += n;
|
|
454
|
-
ch.maxHp += n;
|
|
455
|
-
}
|
|
456
|
-
if (lower.includes('puede atacar el turno en que entra')) {
|
|
457
|
-
ch.canAttack = true;
|
|
458
|
-
}
|
|
459
|
-
bakeEffects(ch, card.effects ?? []);
|
|
460
|
-
}
|
|
461
|
-
// --- Deterministic helpers ---
|
|
462
|
-
function lcgStep(seed) {
|
|
463
|
-
return ((seed * 1664525 + 1013904223) & 0x7fffffff) >>> 0;
|
|
464
|
-
}
|
|
465
|
-
function gameSeed(game) {
|
|
466
|
-
return lcgStep(game.revision * 31 + game.turnCount * 7);
|
|
467
|
-
}
|
|
468
|
-
function coinFlip(game) {
|
|
469
|
-
return gameSeed(game) % 2 === 0;
|
|
470
|
-
}
|
|
471
|
-
function pseudoRandIndex(len, seed) {
|
|
472
|
-
return Math.abs(seed) % len;
|
|
473
|
-
}
|
|
474
|
-
// --- Auto-targeting helpers ---
|
|
475
|
-
function pickMostDangerous(zone) {
|
|
476
|
-
if (!zone.length)
|
|
477
|
-
return null;
|
|
478
|
-
return zone.reduce((a, b) => (a.attack >= b.attack ? a : b));
|
|
479
|
-
}
|
|
480
|
-
function pickMostVulnerable(zone) {
|
|
481
|
-
if (!zone.length)
|
|
482
|
-
return null;
|
|
483
|
-
return zone.reduce((a, b) => (a.currentHp <= b.currentHp ? a : b));
|
|
484
|
-
}
|
|
485
|
-
function pickBestFriendly(zone, excluding) {
|
|
486
|
-
const candidates = excluding ? zone.filter(c => c.instanceId !== excluding) : zone;
|
|
487
|
-
if (!candidates.length)
|
|
488
|
-
return null;
|
|
489
|
-
return candidates.reduce((a, b) => (a.attack >= b.attack ? a : b));
|
|
490
|
-
}
|
|
491
|
-
function bounceCharacterToDeck(game, ch, fromSeat) {
|
|
492
|
-
game.players[fromSeat].battleZone = game.players[fromSeat].battleZone.filter(c => c.instanceId !== ch.instanceId);
|
|
493
|
-
game.sharedDeck.unshift(ch.cardId);
|
|
494
|
-
}
|
|
495
|
-
function stealCharacter(game, ch, fromSeat, toSeat) {
|
|
496
|
-
game.players[fromSeat].battleZone = game.players[fromSeat].battleZone.filter(c => c.instanceId !== ch.instanceId);
|
|
497
|
-
const newSlots = new Set(game.players[toSeat].battleZone.map(c => c.slot ?? 0));
|
|
498
|
-
const freeSlot = [0, 1, 2, 3].find(s => !newSlots.has(s)) ?? 3;
|
|
499
|
-
if (game.players[toSeat].battleZone.length < CHRISTIANITY_BATTLE_SLOTS) {
|
|
500
|
-
game.players[toSeat].battleZone.push({
|
|
501
|
-
...ch,
|
|
502
|
-
controller: toSeat,
|
|
503
|
-
slot: freeSlot,
|
|
504
|
-
canAttack: false,
|
|
505
|
-
});
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
function searchDeckForCard(game, seat, matchFn, lookup, putInPlay = false) {
|
|
509
|
-
if (!lookup)
|
|
510
|
-
return false;
|
|
511
|
-
const idx = game.sharedDeck.findIndex(id => {
|
|
512
|
-
const def = lookup(id);
|
|
513
|
-
return def ? matchFn(def) : false;
|
|
514
|
-
});
|
|
515
|
-
if (idx < 0)
|
|
516
|
-
return false;
|
|
517
|
-
const [cardId] = game.sharedDeck.splice(idx, 1);
|
|
518
|
-
shuffleDeckSegment(game, 0, game.sharedDeck.length, gameSeed(game));
|
|
519
|
-
if (putInPlay) {
|
|
520
|
-
const def = lookup(cardId);
|
|
521
|
-
if (def && game.players[seat].battleZone.length < CHRISTIANITY_BATTLE_SLOTS) {
|
|
522
|
-
const occupiedSlots = new Set(game.players[seat].battleZone.map((c, i) => c.slot ?? i));
|
|
523
|
-
const freeSlot = [0, 1, 2, 3].find(s => !occupiedSlots.has(s));
|
|
524
|
-
if (freeSlot !== undefined) {
|
|
525
|
-
game.players[seat].battleZone.push({
|
|
526
|
-
instanceId: `${seat.toLowerCase()}_search_${game.revision}`,
|
|
527
|
-
cardId,
|
|
528
|
-
name: def.name,
|
|
529
|
-
owner: seat,
|
|
530
|
-
controller: seat,
|
|
531
|
-
slot: freeSlot,
|
|
532
|
-
attack: def.attack ?? 0,
|
|
533
|
-
currentHp: def.life ?? 1,
|
|
534
|
-
maxHp: def.life ?? 1,
|
|
535
|
-
canAttack: false,
|
|
536
|
-
});
|
|
537
|
-
return true;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
game.players[seat].hand?.push(cardId);
|
|
541
|
-
}
|
|
542
|
-
else {
|
|
543
|
-
game.players[seat].hand?.push(cardId);
|
|
544
|
-
}
|
|
545
|
-
return true;
|
|
546
|
-
}
|
|
547
|
-
function shuffleDeckSegment(game, start, end, seed) {
|
|
548
|
-
const deck = game.sharedDeck;
|
|
549
|
-
for (let i = end - 1; i > start; i--) {
|
|
550
|
-
seed = lcgStep(seed);
|
|
551
|
-
const j = start + (seed % (i - start + 1));
|
|
552
|
-
[deck[i], deck[j]] = [deck[j], deck[i]];
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
// --- Passive cost modifier system ---
|
|
556
|
-
function parsePassiveCostModifiers(card) {
|
|
557
|
-
if (card.strategy !== 'accelerate' && card.strategy !== 'slowdown')
|
|
558
|
-
return null;
|
|
559
|
-
const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
|
|
560
|
-
const results = [];
|
|
561
|
-
const typeMap = [
|
|
562
|
-
['sabidurí', 'wisdom'],
|
|
563
|
-
['sabiduria', 'wisdom'],
|
|
564
|
-
['evento', 'event'],
|
|
565
|
-
['acción', 'action'],
|
|
566
|
-
['accion', 'action'],
|
|
567
|
-
['herramienta', 'tool'],
|
|
568
|
-
['personaje', 'character'],
|
|
569
|
-
['ofrenda', 'offering'],
|
|
570
|
-
['lugar', 'place'],
|
|
571
|
-
];
|
|
572
|
-
for (const [keyword, type] of typeMap) {
|
|
573
|
-
if (!text.includes(keyword))
|
|
574
|
-
continue;
|
|
575
|
-
// lock patterns
|
|
576
|
-
if (text.includes('no se pueden jugar')) {
|
|
577
|
-
results.push({ cardType: type, delta: 99 });
|
|
578
|
-
break;
|
|
579
|
-
}
|
|
580
|
-
const n = parseSpanishNumber(text) || 1;
|
|
581
|
-
if (card.strategy === 'accelerate') {
|
|
582
|
-
results.push({ cardType: type, delta: -n });
|
|
583
|
-
}
|
|
584
|
-
else {
|
|
585
|
-
results.push({ cardType: type, delta: n });
|
|
586
|
-
}
|
|
587
|
-
break;
|
|
588
|
-
}
|
|
589
|
-
return results.length ? results : null;
|
|
590
|
-
}
|
|
591
|
-
export function applyPassiveCostModifiers(player, sourceId, card, add) {
|
|
592
|
-
if (!add) {
|
|
593
|
-
player.costModifiers = (player.costModifiers ?? []).filter(m => m.sourceId !== sourceId);
|
|
594
|
-
return;
|
|
595
|
-
}
|
|
596
|
-
if (!card)
|
|
597
|
-
return;
|
|
598
|
-
const mods = parsePassiveCostModifiers(card);
|
|
599
|
-
if (!mods)
|
|
600
|
-
return;
|
|
601
|
-
player.costModifiers = [
|
|
602
|
-
...(player.costModifiers ?? []).filter(m => m.sourceId !== sourceId),
|
|
603
|
-
...mods.map(m => ({ ...m, sourceId })),
|
|
604
|
-
];
|
|
605
|
-
}
|
|
606
|
-
// --- Structured effect synthesis for characters ---
|
|
607
|
-
function synthesizeStructuredEffects(card) {
|
|
608
|
-
const effects = [];
|
|
609
|
-
if (!card.strategy)
|
|
610
|
-
return effects;
|
|
611
|
-
const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
|
|
612
|
-
if (card.strategy === 'buff') {
|
|
613
|
-
// on_attack buff to self (combat duration)
|
|
614
|
-
if (text.includes('al atacar') && text.includes('ataque')) {
|
|
615
|
-
const n = parseSpanishNumber(text) || 1;
|
|
616
|
-
effects.push({
|
|
617
|
-
trigger: 'on_attack',
|
|
618
|
-
strategy: 'buff',
|
|
619
|
-
target: 'self',
|
|
620
|
-
mutation: { type: 'buff_attack', amount: n },
|
|
621
|
-
duration: text.includes('final del turno') ? 'combat' : 'permanent',
|
|
622
|
-
});
|
|
623
|
-
}
|
|
624
|
-
// passive buff to all_friendly
|
|
625
|
-
if ((text.includes('mientras') || text.includes('todos los personajes en juego junto')) &&
|
|
626
|
-
text.includes('+') &&
|
|
627
|
-
text.includes('ataque')) {
|
|
628
|
-
const n = parseSpanishNumber(text) || 1;
|
|
629
|
-
effects.push({
|
|
630
|
-
trigger: 'passive',
|
|
631
|
-
strategy: 'buff',
|
|
632
|
-
target: 'all_friendly',
|
|
633
|
-
mutation: { type: 'buff_attack', amount: n },
|
|
634
|
-
duration: 'permanent',
|
|
635
|
-
});
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
if (card.strategy === 'destroy') {
|
|
639
|
-
// on_death damage to all_enemy
|
|
640
|
-
if (text.includes('al ser destruido') && text.includes('daño') && text.includes('oponente')) {
|
|
641
|
-
const n = parseSpanishNumber(text) || 1;
|
|
642
|
-
effects.push({
|
|
643
|
-
trigger: 'on_death',
|
|
644
|
-
strategy: 'destroy',
|
|
645
|
-
target: 'all_enemy',
|
|
646
|
-
mutation: { type: 'deal_damage', amount: n },
|
|
647
|
-
duration: 'permanent',
|
|
648
|
-
});
|
|
649
|
-
}
|
|
650
|
-
// on_death damage to opponent leader
|
|
651
|
-
if (text.includes('al ser destruido') && text.includes('daño') && text.includes('líder')) {
|
|
652
|
-
const n = parseSpanishNumber(text) || 1;
|
|
653
|
-
effects.push({
|
|
654
|
-
trigger: 'on_death',
|
|
655
|
-
strategy: 'destroy',
|
|
656
|
-
target: 'opponent_leader',
|
|
657
|
-
mutation: { type: 'deal_damage', amount: n },
|
|
658
|
-
duration: 'permanent',
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
return effects;
|
|
663
|
-
}
|
|
664
|
-
// --- Character strategy: on_enter & on_death ---
|
|
665
|
-
function resolveCharacterStrategyEnter(game, ch, card, seat, lookup) {
|
|
666
|
-
if (!card.strategy)
|
|
667
|
-
return;
|
|
668
|
-
const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
|
|
669
|
-
const opp = opponentSeat(seat);
|
|
670
|
-
const seed = gameSeed(game);
|
|
671
|
-
switch (card.strategy) {
|
|
672
|
-
case 'buff': {
|
|
673
|
-
if (!text.includes('al entrar en juego'))
|
|
674
|
-
return;
|
|
675
|
-
const n = parseSpanishNumber(text) || 1;
|
|
676
|
-
const isLife = text.includes('vida');
|
|
677
|
-
const isAtk = text.includes('ataque');
|
|
678
|
-
if (!isLife && !isAtk)
|
|
679
|
-
return;
|
|
680
|
-
if (text.includes('uno de tus personajes') || text.includes('1 de tus personajes')) {
|
|
681
|
-
const target = pickBestFriendly(game.players[seat].battleZone, ch.instanceId);
|
|
682
|
-
if (!target)
|
|
683
|
-
return;
|
|
684
|
-
if (isAtk)
|
|
685
|
-
target.attack += n;
|
|
686
|
-
if (isLife) {
|
|
687
|
-
target.currentHp += n;
|
|
688
|
-
target.maxHp += n;
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
else if (text.includes('todos tus personajes') ||
|
|
692
|
-
text.includes('tus personajes en juego')) {
|
|
693
|
-
for (const c of game.players[seat].battleZone) {
|
|
694
|
-
if (c.instanceId === ch.instanceId)
|
|
695
|
-
continue;
|
|
696
|
-
if (isAtk)
|
|
697
|
-
c.attack += n;
|
|
698
|
-
if (isLife) {
|
|
699
|
-
c.currentHp += n;
|
|
700
|
-
c.maxHp += n;
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
break;
|
|
705
|
-
}
|
|
706
|
-
case 'destroy': {
|
|
707
|
-
if (!text.includes('al entrar en juego') && !text.includes('cuando entra en juego'))
|
|
708
|
-
return;
|
|
709
|
-
// "destruye todos los personajes en juego"
|
|
710
|
-
if (text.includes('destruye todos los personajes en juego') ||
|
|
711
|
-
text.includes('baraja a todos personajes en juego')) {
|
|
712
|
-
for (const s of ['P1', 'P2']) {
|
|
713
|
-
game.players[s].battleZone.forEach(c => {
|
|
714
|
-
if (c.instanceId !== ch.instanceId)
|
|
715
|
-
c.currentHp = 0;
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
// "Destruye 4 de tus cartas de ofrenda"
|
|
719
|
-
const nOff = parseSpanishNumber(text.split('destruye').slice(-1)[0] ?? '');
|
|
720
|
-
if (nOff > 0) {
|
|
721
|
-
game.players[seat].offerings = game.players[seat].offerings.slice(nOff);
|
|
722
|
-
}
|
|
723
|
-
return;
|
|
724
|
-
}
|
|
725
|
-
// "baraja 1 personaje oponente" (bounce)
|
|
726
|
-
if (text.includes('baraja') && (text.includes('oponente') || text.includes('rival'))) {
|
|
727
|
-
const n = parseSpanishNumber(text) || 1;
|
|
728
|
-
const targets = [...game.players[opp].battleZone].sort((a, b) => (b.attack ?? 0) - (a.attack ?? 0));
|
|
729
|
-
for (let i = 0; i < Math.min(n, targets.length); i++) {
|
|
730
|
-
bounceCharacterToDeck(game, targets[i], opp);
|
|
731
|
-
}
|
|
732
|
-
return;
|
|
733
|
-
}
|
|
734
|
-
// "baraja 1 de tus personajes en juego" (self bounce)
|
|
735
|
-
if (text.includes('baraja') &&
|
|
736
|
-
(text.includes('tus personajes') || text.includes('uno de tus'))) {
|
|
737
|
-
const selfTargets = game.players[seat].battleZone.filter(c => c.instanceId !== ch.instanceId);
|
|
738
|
-
if (selfTargets.length) {
|
|
739
|
-
bounceCharacterToDeck(game, selfTargets[pseudoRandIndex(selfTargets.length, seed)], seat);
|
|
740
|
-
}
|
|
741
|
-
return;
|
|
742
|
-
}
|
|
743
|
-
// "destruye 1 personaje oponente"
|
|
744
|
-
if (text.includes('destruye') && text.includes('oponente')) {
|
|
745
|
-
const n = parseSpanishNumber(text) || 1;
|
|
746
|
-
// Conditional: "que tenga menos puntos de ataque que esta carta"
|
|
747
|
-
const targets = game.players[opp].battleZone.filter(c => {
|
|
748
|
-
if (text.includes('menos puntos de ataque que esta'))
|
|
749
|
-
return c.attack < ch.attack;
|
|
750
|
-
return true;
|
|
751
|
-
});
|
|
752
|
-
for (let i = 0; i < Math.min(n, targets.length); i++) {
|
|
753
|
-
const target = text.includes('elige') || n === 1
|
|
754
|
-
? (pickMostDangerous(targets) ?? targets[0])
|
|
755
|
-
: targets[i];
|
|
756
|
-
if (target)
|
|
757
|
-
target.currentHp = 0;
|
|
758
|
-
}
|
|
759
|
-
return;
|
|
760
|
-
}
|
|
761
|
-
// "inflige N puntos de daño a 1/2 personaje(s) oponente(s)"
|
|
762
|
-
if (text.includes('inflige') && text.includes('daño')) {
|
|
763
|
-
const dmg = parseSpanishNumber(text) || 1;
|
|
764
|
-
// How many targets?
|
|
765
|
-
const countMatch = text.match(/a\s+(\d+|un|dos|tres)\s+personaje/i);
|
|
766
|
-
const nTargets = countMatch ? parseSpanishNumber(countMatch[1]) || 1 : 1;
|
|
767
|
-
const sorted = [...game.players[opp].battleZone].sort((a, b) => a.currentHp - b.currentHp);
|
|
768
|
-
// Coin-flip conditional
|
|
769
|
-
if (text.includes('lanza') && text.includes('moneda')) {
|
|
770
|
-
if (!coinFlip(game)) {
|
|
771
|
-
// "si sale cruz" — usually nothing or own character bounced
|
|
772
|
-
if (text.includes('si sale cruz') && text.includes('tus personajes')) {
|
|
773
|
-
const selfT = game.players[seat].battleZone.filter(c => c.instanceId !== ch.instanceId);
|
|
774
|
-
if (selfT.length)
|
|
775
|
-
selfT[pseudoRandIndex(selfT.length, seed)].currentHp = 0;
|
|
776
|
-
}
|
|
777
|
-
return;
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
for (let i = 0; i < Math.min(nTargets, sorted.length); i++) {
|
|
781
|
-
sorted[i].currentHp = Math.max(0, sorted[i].currentHp - dmg);
|
|
782
|
-
}
|
|
783
|
-
return;
|
|
784
|
-
}
|
|
785
|
-
break;
|
|
786
|
-
}
|
|
787
|
-
case 'search': {
|
|
788
|
-
if (!text.includes('al entrar en juego') &&
|
|
789
|
-
!text.includes('cuando entra en juego') &&
|
|
790
|
-
!text.includes('busca'))
|
|
791
|
-
return;
|
|
792
|
-
if (!text.includes('busca'))
|
|
793
|
-
return;
|
|
794
|
-
const typeMap = [
|
|
795
|
-
['personaje', 'character'],
|
|
796
|
-
['herramienta', 'tool'],
|
|
797
|
-
['sabiduría', 'wisdom'],
|
|
798
|
-
['sabiduria', 'wisdom'],
|
|
799
|
-
['evento', 'event'],
|
|
800
|
-
['acción', 'action'],
|
|
801
|
-
['accion', 'action'],
|
|
802
|
-
['ofrenda', 'offering'],
|
|
803
|
-
['lugar', 'place'],
|
|
804
|
-
];
|
|
805
|
-
for (const [keyword, type] of typeMap) {
|
|
806
|
-
if (!text.includes(keyword))
|
|
807
|
-
continue;
|
|
808
|
-
const power = text.includes('poder destacado')
|
|
809
|
-
? 'featured'
|
|
810
|
-
: text.includes('poder normal')
|
|
811
|
-
? 'normal'
|
|
812
|
-
: undefined;
|
|
813
|
-
const putInPlay = text.includes('ponla en juego') || text.includes('juégala') || text.includes('juegala');
|
|
814
|
-
searchDeckForCard(game, seat, def => def.type === type && (!power || def.power === power), lookup, putInPlay);
|
|
815
|
-
break;
|
|
816
|
-
}
|
|
817
|
-
break;
|
|
818
|
-
}
|
|
819
|
-
case 'deckpeek': {
|
|
820
|
-
if (!text.includes('al entrar en juego') && !text.includes('cuando entra en juego'))
|
|
821
|
-
return;
|
|
822
|
-
const n = parseSpanishNumber(text) || 3;
|
|
823
|
-
deckpeekReorder(game, seat, n, lookup);
|
|
824
|
-
break;
|
|
825
|
-
}
|
|
826
|
-
case 'mindcontrol': {
|
|
827
|
-
if (!text.includes('al entrar en juego') && !text.includes('cuando entra en juego'))
|
|
828
|
-
return;
|
|
829
|
-
// "puedes elegir un personaje oponente ... con menos puntos de ataque que este"
|
|
830
|
-
if (text.includes('menos puntos de ataque que este') ||
|
|
831
|
-
text.includes('menos puntos de ataque que esta')) {
|
|
832
|
-
const target = game.players[opp].battleZone.find(c => c.attack < ch.attack);
|
|
833
|
-
if (target)
|
|
834
|
-
stealCharacter(game, target, opp, seat);
|
|
835
|
-
return;
|
|
836
|
-
}
|
|
837
|
-
// "puedes elegir un personaje oponente" generic steal
|
|
838
|
-
if (text.includes('personaje oponente') &&
|
|
839
|
-
(text.includes('pon') || text.includes('coloca'))) {
|
|
840
|
-
const target = pickMostVulnerable(game.players[opp].battleZone);
|
|
841
|
-
if (target)
|
|
842
|
-
stealCharacter(game, target, opp, seat);
|
|
843
|
-
}
|
|
844
|
-
break;
|
|
845
|
-
}
|
|
846
|
-
case 'reveal': {
|
|
847
|
-
if (text.includes('lanza') && text.includes('moneda')) {
|
|
848
|
-
if (coinFlip(game))
|
|
849
|
-
game.players[opp].handRevealed = true;
|
|
850
|
-
}
|
|
851
|
-
else if (text.includes('oponente') && text.includes('mano')) {
|
|
852
|
-
game.players[opp].handRevealed = true;
|
|
853
|
-
}
|
|
854
|
-
else if (text.includes('jugadores') && text.includes('mano')) {
|
|
855
|
-
game.players.P1.handRevealed = true;
|
|
856
|
-
game.players.P2.handRevealed = true;
|
|
857
|
-
}
|
|
858
|
-
break;
|
|
859
|
-
}
|
|
860
|
-
case 'accelerate': {
|
|
861
|
-
// Passive: canAttack on enter
|
|
862
|
-
if (text.includes('puede atacar cuando entra') || text.includes('puede atacar el turno')) {
|
|
863
|
-
ch.canAttack = true;
|
|
864
|
-
}
|
|
865
|
-
break;
|
|
866
|
-
}
|
|
867
|
-
default:
|
|
868
|
-
break;
|
|
869
|
-
}
|
|
870
|
-
}
|
|
871
|
-
function resolveCharacterStrategyDeath(game, ch, card, seat, _lookup) {
|
|
872
|
-
if (!card.strategy)
|
|
873
|
-
return;
|
|
874
|
-
const text = (card.abilities?.[0]?.text ?? '').toLowerCase();
|
|
875
|
-
const opp = opponentSeat(seat);
|
|
876
|
-
if (card.strategy === 'destroy' && text.includes('al ser destruido')) {
|
|
877
|
-
// "baraja a todos personajes en juego" on death
|
|
878
|
-
if (text.includes('baraja a todos personajes')) {
|
|
879
|
-
for (const s of ['P1', 'P2']) {
|
|
880
|
-
game.players[s].battleZone.forEach(c => (c.currentHp = 0));
|
|
881
|
-
}
|
|
882
|
-
return;
|
|
883
|
-
}
|
|
884
|
-
// "baraja N de tus personajes" on death
|
|
885
|
-
if (text.includes('baraja') && text.includes('tus personajes')) {
|
|
886
|
-
const n = parseSpanishNumber(text) || 1;
|
|
887
|
-
const selfT = [...game.players[seat].battleZone].slice(0, n);
|
|
888
|
-
for (const c of selfT)
|
|
889
|
-
bounceCharacterToDeck(game, c, seat);
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
if (card.strategy === 'mindcontrol' && text.includes('al ser destruido')) {
|
|
893
|
-
// "pon al personaje que destruya esta carta en tu zona"
|
|
894
|
-
// Can't reliably identify attacker at this point, skip
|
|
895
|
-
}
|
|
896
|
-
}
|
|
897
|
-
// --- Deckpeek / reorder ---
|
|
898
|
-
function deckpeekReorder(game, seat, n, lookup) {
|
|
899
|
-
const top = game.sharedDeck.slice(0, n);
|
|
900
|
-
if (!top.length)
|
|
901
|
-
return;
|
|
902
|
-
// Pull cards matching type to hand (for deckpeek+draw combos)
|
|
903
|
-
// For simplicity: sort top N by descending cost, keeping highest-value cards on top
|
|
904
|
-
if (lookup) {
|
|
905
|
-
top.sort((a, b) => {
|
|
906
|
-
const da = lookup(a);
|
|
907
|
-
const db = lookup(b);
|
|
908
|
-
return (db?.cost ?? 0) - (da?.cost ?? 0);
|
|
909
|
-
});
|
|
910
|
-
}
|
|
911
|
-
game.sharedDeck.splice(0, n, ...top);
|
|
912
|
-
// Check if the ability lets us draw a found card
|
|
913
|
-
const def = lookup?.(game.players[seat].battleZone.at(-1)?.cardId ?? '');
|
|
914
|
-
const text = (def?.abilities?.[0]?.text ?? '').toLowerCase();
|
|
915
|
-
if (text.includes('poner') && text.includes('mano') && top.length) {
|
|
916
|
-
const drawn = game.sharedDeck.shift();
|
|
917
|
-
if (drawn)
|
|
918
|
-
game.players[seat].hand?.push(drawn);
|
|
919
|
-
}
|
|
920
|
-
}
|
|
921
|
-
// --- Inline cleanup after card effects ---
|
|
922
|
-
function inlineCleanup(game, lookup) {
|
|
923
|
-
for (const s of ['P1', 'P2']) {
|
|
924
|
-
const destroyed = game.players[s].battleZone.filter(c => c.currentHp <= 0);
|
|
925
|
-
for (const ch of destroyed) {
|
|
926
|
-
fireEffects(game, ch, 'on_death', ch.owner);
|
|
927
|
-
applyPassiveCostModifiers(game.players[ch.owner], ch.instanceId, null, false);
|
|
928
|
-
if (lookup) {
|
|
929
|
-
const def = lookup(ch.cardId);
|
|
930
|
-
if (def)
|
|
931
|
-
resolveCharacterStrategyDeath(game, ch, def, ch.owner, lookup);
|
|
932
|
-
}
|
|
933
|
-
}
|
|
934
|
-
game.historyZone.push(...destroyed.map(c => c.cardId));
|
|
935
|
-
game.players[s].battleZone = game.players[s].battleZone.filter(c => c.currentHp > 0);
|
|
936
|
-
}
|
|
937
|
-
}
|
|
938
|
-
// --- Effect resolution (H7) ---
|
|
939
|
-
function resolveCardEffect(game, card, seat, lookup) {
|
|
940
|
-
const text = card.abilities?.[0]?.text ?? '';
|
|
941
|
-
switch (card.strategy) {
|
|
942
|
-
case 'directdamage':
|
|
943
|
-
effectDirectDamage(game, card, text, seat);
|
|
944
|
-
break;
|
|
945
|
-
case 'restore':
|
|
946
|
-
effectRestore(game, card, text, seat);
|
|
947
|
-
break;
|
|
948
|
-
case 'draw':
|
|
949
|
-
effectDraw(game, card, text, seat);
|
|
950
|
-
break;
|
|
951
|
-
case 'discard':
|
|
952
|
-
effectDiscard(game, card, text, seat);
|
|
953
|
-
break;
|
|
954
|
-
case 'buff':
|
|
955
|
-
effectBuff(game, card, text, seat);
|
|
956
|
-
break;
|
|
957
|
-
case 'destroy':
|
|
958
|
-
effectDestroyCard(game, card, text, seat);
|
|
959
|
-
break;
|
|
960
|
-
case 'search':
|
|
961
|
-
effectSearch(game, card, text, seat, lookup);
|
|
962
|
-
break;
|
|
963
|
-
case 'deckpeek':
|
|
964
|
-
effectDeckpeek(game, card, text, seat, lookup);
|
|
965
|
-
break;
|
|
966
|
-
case 'mindcontrol':
|
|
967
|
-
effectMindcontrol(game, card, text, seat);
|
|
968
|
-
break;
|
|
969
|
-
case 'reveal':
|
|
970
|
-
effectReveal(game, card, text, seat);
|
|
971
|
-
break;
|
|
972
|
-
case 'accelerate':
|
|
973
|
-
effectAccelerate(game, card, text, seat);
|
|
974
|
-
break;
|
|
975
|
-
case 'slowdown':
|
|
976
|
-
effectSlowdown(game, card, text, seat);
|
|
977
|
-
break;
|
|
978
|
-
}
|
|
979
|
-
}
|
|
980
|
-
function effectDirectDamage(game, card, text, seat) {
|
|
981
|
-
const opponent = opponentSeat(seat);
|
|
982
|
-
const lower = text.toLowerCase();
|
|
983
|
-
let dmg;
|
|
984
|
-
if (lower.includes('tantos')) {
|
|
985
|
-
dmg = game.players[seat].battleZone.length;
|
|
986
|
-
}
|
|
987
|
-
else {
|
|
988
|
-
dmg = parseSpanishNumber(text);
|
|
989
|
-
}
|
|
990
|
-
if (dmg <= 0)
|
|
991
|
-
return;
|
|
992
|
-
game.players[opponent].leaderHp = Math.max(0, game.players[opponent].leaderHp - dmg);
|
|
993
|
-
}
|
|
994
|
-
function effectRestore(game, card, text, seat) {
|
|
995
|
-
const lower = text.toLowerCase();
|
|
996
|
-
const n = Math.max(1, parseSpanishNumber(text) || 1);
|
|
997
|
-
if (lower.includes('los líderes') || lower.includes('los lideres')) {
|
|
998
|
-
for (const s of ['P1', 'P2']) {
|
|
999
|
-
const p = game.players[s];
|
|
1000
|
-
p.leaderHp = Math.min(p.leaderMaxHp, p.leaderHp + n);
|
|
1001
|
-
}
|
|
1002
|
-
return;
|
|
1003
|
-
}
|
|
1004
|
-
if (lower.includes('tus personajes') || lower.includes('personajes en juego')) {
|
|
1005
|
-
for (const ch of game.players[seat].battleZone) {
|
|
1006
|
-
ch.currentHp = Math.min(ch.maxHp, ch.currentHp + n);
|
|
1007
|
-
}
|
|
1008
|
-
return;
|
|
1009
|
-
}
|
|
1010
|
-
if (lower.includes('del líder') ||
|
|
1011
|
-
lower.includes('al líder') ||
|
|
1012
|
-
lower.includes('del lider') ||
|
|
1013
|
-
lower.includes('al lider')) {
|
|
1014
|
-
const p = game.players[seat];
|
|
1015
|
-
p.leaderHp = Math.min(p.leaderMaxHp, p.leaderHp + n);
|
|
1016
|
-
}
|
|
1017
|
-
}
|
|
1018
|
-
function effectDraw(game, card, text, seat) {
|
|
1019
|
-
const lower = text.toLowerCase();
|
|
1020
|
-
if (lower.includes('los jugadores')) {
|
|
1021
|
-
const n = Math.max(1, parseSpanishNumber(text) || 1);
|
|
1022
|
-
for (let i = 0; i < n; i++) {
|
|
1023
|
-
drawCardFor(game, 'P1');
|
|
1024
|
-
drawCardFor(game, 'P2');
|
|
1025
|
-
}
|
|
1026
|
-
return;
|
|
1027
|
-
}
|
|
1028
|
-
if (lower.includes('por cada personaje oponente')) {
|
|
1029
|
-
const n = game.players[opponentSeat(seat)].battleZone.length;
|
|
1030
|
-
for (let i = 0; i < n; i++)
|
|
1031
|
-
drawCardFor(game, seat);
|
|
1032
|
-
return;
|
|
1033
|
-
}
|
|
1034
|
-
const n = Math.max(1, parseSpanishNumber(text) || 1);
|
|
1035
|
-
for (let i = 0; i < n; i++)
|
|
1036
|
-
drawCardFor(game, seat);
|
|
1037
|
-
}
|
|
1038
|
-
function effectDiscard(game, card, text, seat) {
|
|
1039
|
-
const lower = text.toLowerCase();
|
|
1040
|
-
const opponent = opponentSeat(seat);
|
|
1041
|
-
if (lower.includes('ambos jugadores descartan su mano') ||
|
|
1042
|
-
lower.includes('los jugadores descartan su mano')) {
|
|
1043
|
-
for (const s of ['P1', 'P2']) {
|
|
1044
|
-
const p = game.players[s];
|
|
1045
|
-
game.historyZone.push(...(p.hand ?? []));
|
|
1046
|
-
p.hand = [];
|
|
1047
|
-
}
|
|
1048
|
-
return;
|
|
1049
|
-
}
|
|
1050
|
-
if ((lower.includes('oponente') && lower.includes('azar')) ||
|
|
1051
|
-
lower.includes('tu oponente descarta')) {
|
|
1052
|
-
const n = Math.max(1, parseSpanishNumber(text) || 1);
|
|
1053
|
-
const op = game.players[opponent];
|
|
1054
|
-
const hand = op.hand ?? [];
|
|
1055
|
-
let seed = game.revision * 31 + game.turnCount * 7;
|
|
1056
|
-
for (let i = 0; i < n && hand.length > 0; i++) {
|
|
1057
|
-
seed = (seed * 1664525 + 1013904223) & 0xffffffff;
|
|
1058
|
-
const idx = Math.abs(seed) % hand.length;
|
|
1059
|
-
game.historyZone.push(hand[idx]);
|
|
1060
|
-
hand.splice(idx, 1);
|
|
1061
|
-
}
|
|
1062
|
-
op.hand = hand;
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
function effectBuff(game, card, text, seat) {
|
|
1066
|
-
const lower = text.toLowerCase();
|
|
1067
|
-
const n = parseSpanishNumber(text) || 1;
|
|
1068
|
-
const isAtk = lower.includes('ataque');
|
|
1069
|
-
const isLife = lower.includes('vida');
|
|
1070
|
-
const isTurn = lower.includes('final del turno');
|
|
1071
|
-
const applyBuff = (ch) => {
|
|
1072
|
-
if (isAtk) {
|
|
1073
|
-
if (isTurn)
|
|
1074
|
-
ch.combatAttackBuff = (ch.combatAttackBuff ?? 0) + n;
|
|
1075
|
-
else
|
|
1076
|
-
ch.attack += n;
|
|
1077
|
-
}
|
|
1078
|
-
if (isLife) {
|
|
1079
|
-
ch.currentHp += n;
|
|
1080
|
-
ch.maxHp += n;
|
|
1081
|
-
}
|
|
1082
|
-
};
|
|
1083
|
-
if (lower.includes('tus personajes') || lower.includes('los personajes en juego junto')) {
|
|
1084
|
-
game.players[seat].battleZone.forEach(applyBuff);
|
|
1085
|
-
return;
|
|
1086
|
-
}
|
|
1087
|
-
if (lower.includes('un personaje en juego') ||
|
|
1088
|
-
lower.includes('uno de tus personajes') ||
|
|
1089
|
-
lower.includes('1 personaje')) {
|
|
1090
|
-
const target = lower.includes('oponente')
|
|
1091
|
-
? pickMostVulnerable(game.players[opponentSeat(seat)].battleZone)
|
|
1092
|
-
: pickBestFriendly(game.players[seat].battleZone);
|
|
1093
|
-
if (target)
|
|
1094
|
-
applyBuff(target);
|
|
1095
|
-
return;
|
|
1096
|
-
}
|
|
1097
|
-
// Fallback: buff all own
|
|
1098
|
-
game.players[seat].battleZone.forEach(applyBuff);
|
|
1099
|
-
}
|
|
1100
|
-
function effectDestroyCard(game, card, text, seat) {
|
|
1101
|
-
const lower = text.toLowerCase();
|
|
1102
|
-
const opp = opponentSeat(seat);
|
|
1103
|
-
// "Baraja a todos personajes en juego" / "destruye todos"
|
|
1104
|
-
if (lower.includes('todos los personajes en juego') ||
|
|
1105
|
-
(lower.includes('todos') && lower.includes('personajes'))) {
|
|
1106
|
-
for (const s of ['P1', 'P2']) {
|
|
1107
|
-
game.players[s].battleZone.forEach(c => (c.currentHp = 0));
|
|
1108
|
-
}
|
|
1109
|
-
return;
|
|
1110
|
-
}
|
|
1111
|
-
// "Los jugadores eligen uno de sus personajes" - everyone keeps one
|
|
1112
|
-
if (lower.includes('los jugadores eligen uno')) {
|
|
1113
|
-
for (const s of ['P1', 'P2']) {
|
|
1114
|
-
const zone = game.players[s].battleZone;
|
|
1115
|
-
if (zone.length <= 1)
|
|
1116
|
-
continue;
|
|
1117
|
-
const keeper = pickBestFriendly(zone);
|
|
1118
|
-
zone.forEach(c => {
|
|
1119
|
-
if (c.instanceId !== keeper?.instanceId)
|
|
1120
|
-
c.currentHp = 0;
|
|
1121
|
-
});
|
|
1122
|
-
}
|
|
1123
|
-
return;
|
|
1124
|
-
}
|
|
1125
|
-
// "Los jugadores emparejan de izquierda a derecha los personajes en juego. Se atacan entre sí."
|
|
1126
|
-
if (lower.includes('emparejan') ||
|
|
1127
|
-
lower.includes('atacan entre sí') ||
|
|
1128
|
-
lower.includes('atacan entre si')) {
|
|
1129
|
-
const p1 = game.players.P1.battleZone;
|
|
1130
|
-
const p2 = game.players.P2.battleZone;
|
|
1131
|
-
const pairs = Math.min(p1.length, p2.length);
|
|
1132
|
-
for (let i = 0; i < pairs; i++) {
|
|
1133
|
-
const a = p1[i];
|
|
1134
|
-
const b = p2[i];
|
|
1135
|
-
const aAtk = a.attack;
|
|
1136
|
-
a.currentHp = Math.max(0, a.currentHp - b.attack);
|
|
1137
|
-
b.currentHp = Math.max(0, b.currentHp - aAtk);
|
|
1138
|
-
}
|
|
1139
|
-
return;
|
|
1140
|
-
}
|
|
1141
|
-
// "Inflige N puntos de daño a un personaje oponente en juego"
|
|
1142
|
-
if (lower.includes('inflige') && lower.includes('daño') && lower.includes('oponente')) {
|
|
1143
|
-
const dmg = parseSpanishNumber(text) || 1;
|
|
1144
|
-
const target = pickMostVulnerable(game.players[opp].battleZone);
|
|
1145
|
-
if (target)
|
|
1146
|
-
target.currentHp = Math.max(0, target.currentHp - dmg);
|
|
1147
|
-
return;
|
|
1148
|
-
}
|
|
1149
|
-
// "Baraja un personaje oponente en juego" (bounce)
|
|
1150
|
-
if (lower.includes('baraja') && lower.includes('oponente')) {
|
|
1151
|
-
const target = pickMostDangerous(game.players[opp].battleZone);
|
|
1152
|
-
if (target)
|
|
1153
|
-
bounceCharacterToDeck(game, target, opp);
|
|
1154
|
-
return;
|
|
1155
|
-
}
|
|
1156
|
-
// "Destruye un personaje oponente en juego"
|
|
1157
|
-
if (lower.includes('destruye') && lower.includes('oponente')) {
|
|
1158
|
-
const target = pickMostDangerous(game.players[opp].battleZone);
|
|
1159
|
-
if (target)
|
|
1160
|
-
target.currentHp = 0;
|
|
1161
|
-
return;
|
|
1162
|
-
}
|
|
1163
|
-
// "Lanza 1 moneda. Si sale cara, destruye 1 personaje de tu oponente"
|
|
1164
|
-
if (lower.includes('lanza') && lower.includes('moneda')) {
|
|
1165
|
-
if (coinFlip(game)) {
|
|
1166
|
-
const target = pickMostDangerous(game.players[opp].battleZone);
|
|
1167
|
-
if (target)
|
|
1168
|
-
target.currentHp = 0;
|
|
1169
|
-
}
|
|
1170
|
-
else if (lower.includes('si sale cruz') && lower.includes('tu oponente')) {
|
|
1171
|
-
// opponent bounces/destroys one of their own
|
|
1172
|
-
}
|
|
1173
|
-
return;
|
|
1174
|
-
}
|
|
1175
|
-
// "Inflige 1 punto de daño a todos los personajes en juego" (e.g. plague events)
|
|
1176
|
-
if (lower.includes('inflige') && lower.includes('todos los personajes')) {
|
|
1177
|
-
const dmg = parseSpanishNumber(text) || 1;
|
|
1178
|
-
for (const s of ['P1', 'P2']) {
|
|
1179
|
-
game.players[s].battleZone.forEach(c => {
|
|
1180
|
-
c.currentHp = Math.max(0, c.currentHp - dmg);
|
|
1181
|
-
});
|
|
1182
|
-
}
|
|
1183
|
-
return;
|
|
1184
|
-
}
|
|
1185
|
-
// "Destruye N de tus cartas de ofrenda"
|
|
1186
|
-
if (lower.includes('tus cartas de ofrenda') && lower.includes('destruye')) {
|
|
1187
|
-
const n = parseSpanishNumber(text) || 1;
|
|
1188
|
-
game.players[seat].offerings = game.players[seat].offerings.slice(n);
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
|
-
function effectSearch(game, card, text, seat, lookup) {
|
|
1192
|
-
const lower = text.toLowerCase();
|
|
1193
|
-
const typeMap = [
|
|
1194
|
-
['personaje', 'character'],
|
|
1195
|
-
['herramienta', 'tool'],
|
|
1196
|
-
['sabiduría', 'wisdom'],
|
|
1197
|
-
['sabiduria', 'wisdom'],
|
|
1198
|
-
['evento', 'event'],
|
|
1199
|
-
['acción', 'action'],
|
|
1200
|
-
['accion', 'action'],
|
|
1201
|
-
['ofrenda', 'offering'],
|
|
1202
|
-
['lugar', 'place'],
|
|
1203
|
-
];
|
|
1204
|
-
const power = lower.includes('poder destacado')
|
|
1205
|
-
? 'featured'
|
|
1206
|
-
: lower.includes('poder normal')
|
|
1207
|
-
? 'normal'
|
|
1208
|
-
: undefined;
|
|
1209
|
-
const n = lower.includes('dos cartas') || lower.includes('2 cartas') ? 2 : 1;
|
|
1210
|
-
const putInPlay = lower.includes('ponla en juego') ||
|
|
1211
|
-
lower.includes('juégala') ||
|
|
1212
|
-
lower.includes('juegala') ||
|
|
1213
|
-
lower.includes('sin costo');
|
|
1214
|
-
// Discard cost
|
|
1215
|
-
if (lower.includes('descarta dos cartas') || lower.includes('descartas dos cartas')) {
|
|
1216
|
-
const hand = game.players[seat].hand ?? [];
|
|
1217
|
-
const seed = gameSeed(game);
|
|
1218
|
-
for (let i = 0; i < Math.min(2, hand.length); i++) {
|
|
1219
|
-
const idx = pseudoRandIndex(hand.length - i, seed + i);
|
|
1220
|
-
game.historyZone.push(hand.splice(idx, 1)[0]);
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
for (const [keyword, type] of typeMap) {
|
|
1224
|
-
if (!lower.includes(keyword))
|
|
1225
|
-
continue;
|
|
1226
|
-
for (let i = 0; i < n; i++) {
|
|
1227
|
-
searchDeckForCard(game, seat, def => def.type === type && (!power || def.power === power), lookup, putInPlay);
|
|
1228
|
-
}
|
|
1229
|
-
break;
|
|
1230
|
-
}
|
|
1231
|
-
}
|
|
1232
|
-
function effectDeckpeek(game, card, text, seat, lookup) {
|
|
1233
|
-
const n = parseSpanishNumber(text) || 3;
|
|
1234
|
-
const lower = text.toLowerCase();
|
|
1235
|
-
const top = game.sharedDeck.slice(0, n);
|
|
1236
|
-
if (!top.length)
|
|
1237
|
-
return;
|
|
1238
|
-
// "poner en juego todas las cartas de ofrenda de poder normal" from top N
|
|
1239
|
-
if (lower.includes('poner en juego') && lower.includes('ofrenda') && lookup) {
|
|
1240
|
-
for (const id of top) {
|
|
1241
|
-
const def = lookup(id);
|
|
1242
|
-
if (def?.type === 'offering') {
|
|
1243
|
-
game.players[seat].offerings.push({
|
|
1244
|
-
instanceId: `${seat.toLowerCase()}_dp_${game.revision}_${id}`,
|
|
1245
|
-
cardId: id,
|
|
1246
|
-
name: def.name,
|
|
1247
|
-
owner: seat,
|
|
1248
|
-
ready: true,
|
|
1249
|
-
value: def.offeringValue ?? 1,
|
|
1250
|
-
});
|
|
1251
|
-
game.sharedDeck.splice(game.sharedDeck.indexOf(id), 1);
|
|
1252
|
-
}
|
|
1253
|
-
}
|
|
1254
|
-
return;
|
|
1255
|
-
}
|
|
1256
|
-
// "mostrar una carta de X que encuentres y ponerla en tu mano"
|
|
1257
|
-
if (lower.includes('mostrar') && lower.includes('mano') && lookup) {
|
|
1258
|
-
const typeMap = [
|
|
1259
|
-
['herramienta', 'tool'],
|
|
1260
|
-
['ofrenda', 'offering'],
|
|
1261
|
-
['sabiduría', 'wisdom'],
|
|
1262
|
-
['sabiduria', 'wisdom'],
|
|
1263
|
-
['personaje', 'character'],
|
|
1264
|
-
];
|
|
1265
|
-
for (const [keyword, type] of typeMap) {
|
|
1266
|
-
if (!lower.includes(keyword))
|
|
1267
|
-
continue;
|
|
1268
|
-
const found = top.find(id => lookup(id)?.type === type);
|
|
1269
|
-
if (found) {
|
|
1270
|
-
game.sharedDeck.splice(game.sharedDeck.indexOf(found), 1);
|
|
1271
|
-
game.players[seat].hand?.push(found);
|
|
1272
|
-
}
|
|
1273
|
-
break;
|
|
1274
|
-
}
|
|
1275
|
-
}
|
|
1276
|
-
// "poner en tu mano" first card
|
|
1277
|
-
if (lower.includes('poner') && lower.includes('mano') && !lower.includes('mostrar')) {
|
|
1278
|
-
const drawn = game.sharedDeck.shift();
|
|
1279
|
-
if (drawn)
|
|
1280
|
-
game.players[seat].hand?.push(drawn);
|
|
1281
|
-
return;
|
|
1282
|
-
}
|
|
1283
|
-
// Reorder remaining top cards optimally (highest cost first)
|
|
1284
|
-
const remaining = game.sharedDeck.slice(0, n);
|
|
1285
|
-
if (lookup) {
|
|
1286
|
-
remaining.sort((a, b) => (lookup(b)?.cost ?? 0) - (lookup(a)?.cost ?? 0));
|
|
1287
|
-
game.sharedDeck.splice(0, n, ...remaining);
|
|
1288
|
-
}
|
|
1289
|
-
}
|
|
1290
|
-
function effectMindcontrol(game, card, text, seat) {
|
|
1291
|
-
const lower = text.toLowerCase();
|
|
1292
|
-
const opp = opponentSeat(seat);
|
|
1293
|
-
// "Los jugadores intercambian sus personajes en juego"
|
|
1294
|
-
if (lower.includes('intercambian sus personajes')) {
|
|
1295
|
-
const p1zone = [...game.players.P1.battleZone];
|
|
1296
|
-
const p2zone = [...game.players.P2.battleZone];
|
|
1297
|
-
game.players.P1.battleZone = p2zone.map(c => ({ ...c, controller: 'P1' }));
|
|
1298
|
-
game.players.P2.battleZone = p1zone.map(c => ({ ...c, controller: 'P2' }));
|
|
1299
|
-
return;
|
|
1300
|
-
}
|
|
1301
|
-
// "Los jugadores intercambian su mano"
|
|
1302
|
-
if (lower.includes('intercambian su mano')) {
|
|
1303
|
-
const h1 = game.players.P1.hand ?? [];
|
|
1304
|
-
const h2 = game.players.P2.hand ?? [];
|
|
1305
|
-
game.players.P1.hand = h2;
|
|
1306
|
-
game.players.P2.hand = h1;
|
|
1307
|
-
return;
|
|
1308
|
-
}
|
|
1309
|
-
// Generic "pon un personaje oponente" steal
|
|
1310
|
-
if (lower.includes('personaje oponente') && lower.includes('pon')) {
|
|
1311
|
-
const target = pickMostVulnerable(game.players[opp].battleZone);
|
|
1312
|
-
if (target)
|
|
1313
|
-
stealCharacter(game, target, opp, seat);
|
|
1314
|
-
}
|
|
1315
|
-
}
|
|
1316
|
-
function effectReveal(game, card, text, seat) {
|
|
1317
|
-
const lower = text.toLowerCase();
|
|
1318
|
-
const opp = opponentSeat(seat);
|
|
1319
|
-
if (lower.includes('tu oponente muestra su mano') || lower.includes('oponente muestra su mano')) {
|
|
1320
|
-
game.players[opp].handRevealed = true;
|
|
1321
|
-
}
|
|
1322
|
-
else if (lower.includes('jugadores juegan con su mano')) {
|
|
1323
|
-
game.players.P1.handRevealed = true;
|
|
1324
|
-
game.players.P2.handRevealed = true;
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
function effectAccelerate(game, card, text, seat) {
|
|
1328
|
-
// Action/event-level accelerate: give temporary offerings
|
|
1329
|
-
const lower = text.toLowerCase();
|
|
1330
|
-
const n = parseSpanishNumber(text) || 1;
|
|
1331
|
-
if (lower.includes('genera') && lower.includes('ofrenda')) {
|
|
1332
|
-
game.players[seat].temporaryOfferingReserve =
|
|
1333
|
-
(game.players[seat].temporaryOfferingReserve ?? 0) + n;
|
|
1334
|
-
}
|
|
1335
|
-
}
|
|
1336
|
-
function effectSlowdown(game, card, text, seat) {
|
|
1337
|
-
// Action-level slowdown: return a character to hand
|
|
1338
|
-
const lower = text.toLowerCase();
|
|
1339
|
-
const opp = opponentSeat(seat);
|
|
1340
|
-
if (lower.includes('devuelve') && lower.includes('personaje') && lower.includes('mano')) {
|
|
1341
|
-
const target = pickMostDangerous(game.players[opp].battleZone);
|
|
1342
|
-
if (target) {
|
|
1343
|
-
game.players[opp].battleZone = game.players[opp].battleZone.filter(c => c.instanceId !== target.instanceId);
|
|
1344
|
-
game.players[opp].hand?.push(target.cardId);
|
|
1345
|
-
}
|
|
1346
|
-
}
|
|
1347
|
-
}
|
|
1348
|
-
function drawCardFor(game, seat) {
|
|
1349
|
-
const card = game.sharedDeck.shift();
|
|
1350
|
-
if (!card)
|
|
1351
|
-
return;
|
|
1352
|
-
const p = game.players[seat];
|
|
1353
|
-
if (p.hand)
|
|
1354
|
-
p.hand.push(card);
|
|
1355
|
-
else
|
|
1356
|
-
p.handCount = (p.handCount ?? 0) + 1;
|
|
1357
|
-
}
|
|
1358
|
-
function parseSpanishNumber(text) {
|
|
1359
|
-
const words = {
|
|
1360
|
-
un: 1,
|
|
1361
|
-
una: 1,
|
|
1362
|
-
uno: 1,
|
|
1363
|
-
dos: 2,
|
|
1364
|
-
tres: 3,
|
|
1365
|
-
cuatro: 4,
|
|
1366
|
-
cinco: 5,
|
|
1367
|
-
seis: 6,
|
|
1368
|
-
siete: 7,
|
|
1369
|
-
ocho: 8,
|
|
1370
|
-
nueve: 9,
|
|
1371
|
-
diez: 10,
|
|
1372
|
-
};
|
|
1373
|
-
const digitMatch = text.match(/\b(\d+)\b/);
|
|
1374
|
-
if (digitMatch)
|
|
1375
|
-
return parseInt(digitMatch[1], 10);
|
|
1376
|
-
const lower = text.toLowerCase();
|
|
1377
|
-
for (const [word, n] of Object.entries(words)) {
|
|
1378
|
-
if (new RegExp(`\\b${word}\\b`).test(lower))
|
|
1379
|
-
return n;
|
|
1380
|
-
}
|
|
1381
|
-
return 0;
|
|
1382
|
-
}
|
|
1383
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hyaXN0aWFuaXR5LXJ1bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9taW5pLWdhbWVzL2NocmlzdGlhbml0eS1ydWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFM0Msd0dBQXdHO0FBQ3hHLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQXVDNUMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUErQjtJQUM1RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUM1QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNsRSxNQUFNLENBQUMsd0JBQXdCLElBQUksQ0FBQyxDQUNyQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBK0I7SUFDNUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixNQUErQixFQUMvQixJQUFnQztJQUVoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM1QixJQUFJLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDekIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztTQUN2QyxNQUFNLENB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QztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBWTtJQUN0QyxNQUFNLEtBQUssR0FBMkI7UUFDcEMsRUFBRSxFQUFFLENBQUM7UUFDTCxHQUFHLEVBQUUsQ0FBQztRQUNOLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLENBQUM7UUFDTixJQUFJLEVBQUUsQ0FBQztRQUNQLE1BQU0sRUFBRSxDQUFDO1FBQ1QsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLEVBQUUsQ0FBQztRQUNQLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxFQUFFLENBQUM7UUFDUCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksRUFBRSxFQUFFO0tBQ1QsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0MsSUFBSSxVQUFVO1FBQUUsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIENocmlzdGlhbml0eUNhcmRFZmZlY3QsXG4gIENocmlzdGlhbml0eUNhcmRUeXBlLFxuICBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgQ2hyaXN0aWFuaXR5RWZmZWN0VHJpZ2dlcixcbiAgQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgQ2hyaXN0aWFuaXR5U2VhdCxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBDSFJJU1RJQU5JVFlfQkFUVExFX1NMT1RTID0gNDtcblxuLy8gTcOheGltbyBkZSBjYXJ0YXMgZW4gbWFubzogYWwgcm9iYXIgcG9yIGVuY2ltYSBkZSBlc3RlIGzDrW1pdGUsIGxhIGNhcnRhIHJvYmFkYSBzZSBkZXNjYXJ0YSBhIEhpc3RvcmlhLlxuZXhwb3J0IGNvbnN0IENIUklTVElBTklUWV9NQVhfSEFORF9TSVpFID0gNztcblxuZXhwb3J0IGludGVyZmFjZSBDaHJpc3RpYW5pdHlSdWxlTWVzc2FnZXMge1xuICBhdHRhY2tzT3Bwb25lbnRMZWFkZXI6IHN0cmluZztcbiAgYXR0YWNrc1lvdXJMZWFkZXI6IHN0cmluZztcbiAgY29tYmF0c0FnYWluc3Q6IHN0cmluZztcbiAgZHJhd3NDYXJkOiBzdHJpbmc7XG4gIGRlY2tJc0VtcHR5OiBzdHJpbmc7XG4gIHR1cm5PZjogc3RyaW5nO1xuICB5b3VXaW46IHN0cmluZztcbiAgb3Bwb25lbnRXaW5zOiBzdHJpbmc7XG4gIGhhbmRGdWxsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hyaXN0aWFuaXR5UGxheUNhcmRSZXN1bHQge1xuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGU7XG4gIHBsYXllZDogYm9vbGVhbjtcbiAgcGxheWVkT2ZmZXJpbmdWYWx1ZTogbnVtYmVyO1xuICBzcGVudE9mZmVyaW5nczogbnVtYmVyO1xuICBsb2c6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENocmlzdGlhbml0eUF0dGFja1Jlc3VsdCB7XG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZTtcbiAgYXR0YWNrZWQ6IGJvb2xlYW47XG4gIGF0dGFja2VyRGFtYWdlOiBudW1iZXI7XG4gIHRhcmdldERhbWFnZTogbnVtYmVyO1xuICBsb2c6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENocmlzdGlhbml0eU9mZmVyaW5nQWJpbGl0eVJlc3VsdCB7XG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZTtcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XG4gIGxlYWRlckRhbWFnZTogbnVtYmVyO1xuICByZXNlcnZlR2FpbjogbnVtYmVyO1xuICBzcGVudE9mZmVyaW5nczogbnVtYmVyO1xuICBsb2c6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZHlPZmZlcmluZ3MocGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSk6IG51bWJlciB7XG4gIHJldHVybiBwbGF5ZXIub2ZmZXJpbmdzLnJlZHVjZShcbiAgICAodG90YWwsIG9mZmVyaW5nKSA9PiB0b3RhbCArIChvZmZlcmluZy5yZWFkeSA/IG9mZmVyaW5nLnZhbHVlIDogMCksXG4gICAgcGxheWVyLnRlbXBvcmFyeU9mZmVyaW5nUmVzZXJ2ZSA/PyAwXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b3RhbE9mZmVyaW5ncyhwbGF5ZXI6IENocmlzdGlhbml0eVBsYXllclN0YXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBsYXllci5vZmZlcmluZ3MucmVkdWNlKCh0b3RhbCwgb2ZmZXJpbmcpID0+IHRvdGFsICsgb2ZmZXJpbmcudmFsdWUsIDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWZmZWN0aXZlQ29zdChcbiAgcGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25cbik6IG51bWJlciB7XG4gIGNvbnN0IGJhc2UgPSBjYXJkLmNvc3QgPz8gMDtcbiAgaWYgKGJhc2UgPT09IDApIHJldHVybiAwO1xuICBjb25zdCBkZWx0YSA9IChwbGF5ZXIuY29zdE1vZGlmaWVycyA/PyBbXSlcbiAgICAuZmlsdGVyKG0gPT4gbS5jYXJkVHlwZSA9PT0gY2FyZC50eXBlKVxuICAgIC5yZWR1Y2UoKHN1bSwgbSkgPT4gc3VtICsgbS5kZWx0YSwgMCk7XG4gIHJldHVybiBNYXRoLm1heCgwLCBiYXNlICsgZGVsdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FuUGxheUNhcmQoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb25cbik6IGJvb2xlYW4ge1xuICBpZiAoZ2FtZS5zdGF0dXMgIT09ICdpbl9wcm9ncmVzcycgfHwgZ2FtZS50dXJuT3duZXIgIT09IHNlYXQpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcGxheWVyID0gZ2FtZS5wbGF5ZXJzW3NlYXRdO1xuICBpZiAoY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnKSB7XG4gICAgY29uc3QgZXh0cmFDb3N0ID0gKHBsYXllci5jb3N0TW9kaWZpZXJzID8/IFtdKVxuICAgICAgLmZpbHRlcihtID0+IG0uY2FyZFR5cGUgPT09ICdvZmZlcmluZycpXG4gICAgICAucmVkdWNlKChzLCBtKSA9PiBzICsgbS5kZWx0YSwgMCk7XG4gICAgaWYgKGV4dHJhQ29zdCA+IDAgJiYgcmVhZHlPZmZlcmluZ3MocGxheWVyKSA8IGV4dHJhQ29zdCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhcGxheWVyLm9mZmVyaW5nUGxheWVkVGhpc1R1cm47XG4gIH1cbiAgY29uc3QgY29zdCA9IGVmZmVjdGl2ZUNvc3QocGxheWVyLCBjYXJkKTtcbiAgaWYgKGNhcmQudHlwZSA9PT0gJ2NoYXJhY3RlcicpIHtcbiAgICByZXR1cm4gcmVhZHlPZmZlcmluZ3MocGxheWVyKSA+PSBjb3N0ICYmIHBsYXllci5iYXR0bGVab25lLmxlbmd0aCA8IENIUklTVElBTklUWV9CQVRUTEVfU0xPVFM7XG4gIH1cbiAgaWYgKGNhcmQudHlwZSA9PT0gJ3Rvb2wnKSB7XG4gICAgcmV0dXJuIHJlYWR5T2ZmZXJpbmdzKHBsYXllcikgPj0gY29zdCAmJiBwbGF5ZXIuYmF0dGxlWm9uZS5sZW5ndGggPiAwO1xuICB9XG4gIGlmIChjYXJkLnR5cGUgPT09ICdhY3Rpb24nIHx8IGNhcmQudHlwZSA9PT0gJ3dpc2RvbScgfHwgY2FyZC50eXBlID09PSAnZXZlbnQnKSB7XG4gICAgY29uc3QgbG9ja2VkID0gKHBsYXllci5jb3N0TW9kaWZpZXJzID8/IFtdKS5zb21lKFxuICAgICAgbSA9PiBtLmNhcmRUeXBlID09PSBjYXJkLnR5cGUgJiYgbS5kZWx0YSA+PSA5OVxuICAgICk7XG4gICAgaWYgKGxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiByZWFkeU9mZmVyaW5ncyhwbGF5ZXIpID49IGNvc3Q7XG4gIH1cbiAgaWYgKGNhcmQudHlwZSA9PT0gJ3BsYWNlJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHR5cGUgQ2FyZExvb2t1cCA9IChpZDogc3RyaW5nKSA9PiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbiB8IG51bGw7XG5cbmV4cG9ydCBmdW5jdGlvbiBwbGF5Q2FyZEZyb21IYW5kKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBvcHRpb25zOiB7XG4gICAgc2xvdEluZGV4PzogbnVtYmVyO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgIHRhcmdldEluc3RhbmNlSWQ/OiBzdHJpbmc7XG4gICAgbG9va3VwPzogQ2FyZExvb2t1cDtcbiAgfSA9IHt9XG4pOiBDaHJpc3RpYW5pdHlQbGF5Q2FyZFJlc3VsdCB7XG4gIGlmICghY2FuUGxheUNhcmQoZ2FtZSwgc2VhdCwgY2FyZCkpIHtcbiAgICByZXR1cm4geyBnYW1lLCBwbGF5ZWQ6IGZhbHNlLCBwbGF5ZWRPZmZlcmluZ1ZhbHVlOiAwLCBzcGVudE9mZmVyaW5nczogMCwgbG9nOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IHN0cnVjdHVyZWRDbG9uZShnYW1lKTtcbiAgY29uc3QgcGxheWVyID0gbmV4dC5wbGF5ZXJzW3NlYXRdO1xuICBjb25zdCBoYW5kSW5kZXggPSBwbGF5ZXIuaGFuZD8uaW5kZXhPZihjYXJkLmlkKSA/PyAtMTtcbiAgaWYgKGhhbmRJbmRleCA8IDAgfHwgIXBsYXllci5oYW5kKSB7XG4gICAgcmV0dXJuIHsgZ2FtZSwgcGxheWVkOiBmYWxzZSwgcGxheWVkT2ZmZXJpbmdWYWx1ZTogMCwgc3BlbnRPZmZlcmluZ3M6IDAsIGxvZzogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSA/PyBjYXJkLm5hbWU7XG4gIGxldCBwbGF5ZWRPZmZlcmluZ1ZhbHVlID0gMDtcbiAgbGV0IHNwZW50T2ZmZXJpbmdzID0gMDtcblxuICBwbGF5ZXIuaGFuZC5zcGxpY2UoaGFuZEluZGV4LCAxKTtcbiAgaWYgKGNhcmQudHlwZSA9PT0gJ29mZmVyaW5nJykge1xuICAgIHBsYXllZE9mZmVyaW5nVmFsdWUgPSBjYXJkLm9mZmVyaW5nVmFsdWUgPz8gY2FyZC5saWZlID8/IDE7XG4gICAgcGxheWVyLm9mZmVyaW5ncy5wdXNoKHtcbiAgICAgIGluc3RhbmNlSWQ6IGAke3NlYXQudG9Mb3dlckNhc2UoKX1fb2ZmZXJpbmdfJHtuZXh0LnJldmlzaW9uICsgMX1gLFxuICAgICAgY2FyZElkOiBjYXJkLmlkLFxuICAgICAgbmFtZTogZGlzcGxheU5hbWUsXG4gICAgICBvd25lcjogc2VhdCxcbiAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgdmFsdWU6IHBsYXllZE9mZmVyaW5nVmFsdWUsXG4gICAgICBhYmlsaXR5TmFtZTogY2FyZC5hYmlsaXR5TmFtZSxcbiAgICAgIGFiaWxpdHlUZXh0OiBjYXJkLmFiaWxpdHlUZXh0LFxuICAgICAgYWJpbGl0eUNvc3Q6IGNhcmQuYWJpbGl0eUNvc3QsXG4gICAgfSk7XG4gICAgcGxheWVyLm9mZmVyaW5nUGxheWVkVGhpc1R1cm4gPSB0cnVlO1xuICB9IGVsc2UgaWYgKGNhcmQudHlwZSA9PT0gJ2NoYXJhY3RlcicpIHtcbiAgICBjb25zdCBvY2N1cGllZFNsb3RzID0gbmV3IFNldChcbiAgICAgIHBsYXllci5iYXR0bGVab25lLm1hcCgoY2hhcmFjdGVyLCBpbmRleCkgPT5cbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihjaGFyYWN0ZXIuc2xvdCkgPyAoY2hhcmFjdGVyLnNsb3QgPz8gaW5kZXgpIDogaW5kZXhcbiAgICAgIClcbiAgICApO1xuICAgIGNvbnN0IHRhcmdldFNsb3QgPSBvcHRpb25zLnNsb3RJbmRleCA/PyBbMCwgMSwgMiwgM10uZmluZChpbmRleCA9PiAhb2NjdXBpZWRTbG90cy5oYXMoaW5kZXgpKTtcbiAgICBpZiAodGFyZ2V0U2xvdCA9PT0gdW5kZWZpbmVkIHx8IG9jY3VwaWVkU2xvdHMuaGFzKHRhcmdldFNsb3QpKSB7XG4gICAgICByZXR1cm4geyBnYW1lLCBwbGF5ZWQ6IGZhbHNlLCBwbGF5ZWRPZmZlcmluZ1ZhbHVlOiAwLCBzcGVudE9mZmVyaW5nczogMCwgbG9nOiBbXSB9O1xuICAgIH1cbiAgICBzcGVudE9mZmVyaW5ncyA9IGVmZmVjdGl2ZUNvc3QocGxheWVyLCBjYXJkKTtcbiAgICBzcGVuZE9mZmVyaW5ncyhwbGF5ZXIsIHNwZW50T2ZmZXJpbmdzKTtcbiAgICBjb25zdCBsaWZlID0gY2FyZC5saWZlID8/IDE7XG4gICAgY29uc3QgbmV3Q2hhcjogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UgPSB7XG4gICAgICBpbnN0YW5jZUlkOiBgJHtzZWF0LnRvTG93ZXJDYXNlKCl9XyR7bmV4dC5yZXZpc2lvbiArIDF9XyR7cGxheWVyLmJhdHRsZVpvbmUubGVuZ3RofWAsXG4gICAgICBjYXJkSWQ6IGNhcmQuaWQsXG4gICAgICBuYW1lOiBkaXNwbGF5TmFtZSxcbiAgICAgIG93bmVyOiBzZWF0LFxuICAgICAgY29udHJvbGxlcjogc2VhdCxcbiAgICAgIHNsb3Q6IHRhcmdldFNsb3QsXG4gICAgICBhdHRhY2s6IGNhcmQuYXR0YWNrID8/IDAsXG4gICAgICBjdXJyZW50SHA6IGxpZmUsXG4gICAgICBtYXhIcDogbGlmZSxcbiAgICAgIGNhbkF0dGFjazogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IHN5bnRoZXNpemVTdHJ1Y3R1cmVkRWZmZWN0cyhjYXJkKTtcbiAgICBiYWtlRWZmZWN0cyhuZXdDaGFyLCBbLi4uKGNhcmQuZWZmZWN0cyA/PyBbXSksIC4uLnN5bnRoZXNpemVkXSk7XG4gICAgcGxheWVyLmJhdHRsZVpvbmUucHVzaChuZXdDaGFyKTtcbiAgICBmaXJlRWZmZWN0cyhuZXh0LCBuZXdDaGFyLCAnb25fZW50ZXInLCBzZWF0KTtcbiAgICBmaXJlRWZmZWN0cyhuZXh0LCBuZXdDaGFyLCAncGFzc2l2ZScsIHNlYXQpO1xuICAgIGFwcGx5UGFzc2l2ZUNvc3RNb2RpZmllcnMobmV4dC5wbGF5ZXJzW3NlYXRdLCBuZXdDaGFyLmluc3RhbmNlSWQsIGNhcmQsIHRydWUpO1xuICAgIHJlc29sdmVDaGFyYWN0ZXJTdHJhdGVneUVudGVyKG5leHQsIG5ld0NoYXIsIGNhcmQsIHNlYXQsIG9wdGlvbnMubG9va3VwKTtcbiAgICBpbmxpbmVDbGVhbnVwKG5leHQsIG9wdGlvbnMubG9va3VwKTtcbiAgICBwbGF5ZXIuYmF0dGxlWm9uZS5zb3J0KChsZWZ0LCByaWdodCkgPT4gKGxlZnQuc2xvdCA/PyAwKSAtIChyaWdodC5zbG90ID8/IDApKTtcbiAgfSBlbHNlIGlmIChjYXJkLnR5cGUgPT09ICd0b29sJykge1xuICAgIHNwZW50T2ZmZXJpbmdzID0gZWZmZWN0aXZlQ29zdChwbGF5ZXIsIGNhcmQpO1xuICAgIGlmIChzcGVudE9mZmVyaW5ncyA+IDApIHtcbiAgICAgIHNwZW5kT2ZmZXJpbmdzKHBsYXllciwgc3BlbnRPZmZlcmluZ3MpO1xuICAgIH1cbiAgICBuZXh0LnBsYXllcnNbc2VhdF0gPSBwbGF5ZXI7XG4gICAgY29uc3QgdGFyZ2V0SWQgPSBvcHRpb25zLnRhcmdldEluc3RhbmNlSWQ7XG4gICAgY29uc3QgY2hhcklkeCA9IG5leHQucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmZpbmRJbmRleChjID0+IGMuaW5zdGFuY2VJZCA9PT0gdGFyZ2V0SWQpO1xuICAgIGlmIChjaGFySWR4IDwgMCkge1xuICAgICAgcmV0dXJuIHsgZ2FtZSwgcGxheWVkOiBmYWxzZSwgcGxheWVkT2ZmZXJpbmdWYWx1ZTogMCwgc3BlbnRPZmZlcmluZ3M6IDAsIGxvZzogW10gfTtcbiAgICB9XG4gICAgY29uc3QgY2ggPSBuZXh0LnBsYXllcnNbc2VhdF0uYmF0dGxlWm9uZVtjaGFySWR4XTtcbiAgICBjaC5lcXVpcHBlZFRvb2xzID0gWy4uLihjaC5lcXVpcHBlZFRvb2xzID8/IFtdKSwgY2FyZC5pZF07XG4gICAgYXBwbHlUb29sUGFzc2l2ZXMoY2gsIGNhcmQpO1xuICB9IGVsc2UgaWYgKGNhcmQudHlwZSA9PT0gJ2FjdGlvbicgfHwgY2FyZC50eXBlID09PSAnd2lzZG9tJyB8fCBjYXJkLnR5cGUgPT09ICdldmVudCcpIHtcbiAgICBzcGVudE9mZmVyaW5ncyA9IGVmZmVjdGl2ZUNvc3QocGxheWVyLCBjYXJkKTtcbiAgICBpZiAoc3BlbnRPZmZlcmluZ3MgPiAwKSB7XG4gICAgICBzcGVuZE9mZmVyaW5ncyhwbGF5ZXIsIHNwZW50T2ZmZXJpbmdzKTtcbiAgICB9XG4gICAgbmV4dC5oaXN0b3J5Wm9uZS5wdXNoKGNhcmQuaWQpO1xuICAgIG5leHQucGxheWVyc1tzZWF0XSA9IHBsYXllcjtcbiAgICByZXNvbHZlQ2FyZEVmZmVjdChuZXh0LCBjYXJkLCBzZWF0LCBvcHRpb25zLmxvb2t1cCk7XG4gICAgaW5saW5lQ2xlYW51cChuZXh0LCBvcHRpb25zLmxvb2t1cCk7XG4gIH0gZWxzZSBpZiAoY2FyZC50eXBlID09PSAncGxhY2UnKSB7XG4gICAgY29uc3QgcHJldmlvdXNQbGFjZSA9IG5leHQucGxhY2Vab25lWzBdO1xuICAgIGlmIChwcmV2aW91c1BsYWNlKSB7XG4gICAgICBuZXh0Lmhpc3Rvcnlab25lLnB1c2gocHJldmlvdXNQbGFjZSk7XG4gICAgfVxuICAgIG5leHQucGxhY2Vab25lID0gW2NhcmQuaWRdO1xuICAgIHJlc29sdmVDYXJkRWZmZWN0KG5leHQsIGNhcmQsIHNlYXQsIG9wdGlvbnMubG9va3VwKTtcbiAgfVxuXG4gIG5leHQucmV2aXNpb24rKztcbiAgY29uc3QgbG9nID0gW3BsYXlDYXJkTG9nKGNhcmQsIGRpc3BsYXlOYW1lKV07XG4gIG5leHQubG9nID0gWy4uLmxvZywgLi4ubmV4dC5sb2ddLnNsaWNlKDAsIDQpO1xuICByZXR1cm4geyBnYW1lOiBuZXh0LCBwbGF5ZWQ6IHRydWUsIHBsYXllZE9mZmVyaW5nVmFsdWUsIHNwZW50T2ZmZXJpbmdzLCBsb2cgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZU9mZmVyaW5nQWJpbGl0eShcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBvZmZlcmluZ0luc3RhbmNlSWQ6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGlmIChnYW1lLnN0YXR1cyAhPT0gJ2luX3Byb2dyZXNzJyB8fCBnYW1lLnR1cm5Pd25lciAhPT0gc2VhdCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwbGF5ZXIgPSBnYW1lLnBsYXllcnNbc2VhdF07XG4gIGNvbnN0IG9mZmVyaW5nID0gcGxheWVyLm9mZmVyaW5ncy5maW5kKGNhcmQgPT4gY2FyZC5pbnN0YW5jZUlkID09PSBvZmZlcmluZ0luc3RhbmNlSWQpO1xuICBpZiAoIW9mZmVyaW5nPy5yZWFkeSB8fCAhb2ZmZXJpbmcuYWJpbGl0eU5hbWUgfHwgb2ZmZXJpbmcuYWJpbGl0eVVzZWRUaGlzVHVybikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmVhZHlPZmZlcmluZ3MocGxheWVyKSA+PSAob2ZmZXJpbmcuYWJpbGl0eUNvc3QgPz8gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT2ZmZXJpbmdBYmlsaXR5KFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIG9mZmVyaW5nSW5zdGFuY2VJZDogc3RyaW5nLFxuICBtZXNzYWdlcz86IENocmlzdGlhbml0eVJ1bGVNZXNzYWdlc1xuKTogQ2hyaXN0aWFuaXR5T2ZmZXJpbmdBYmlsaXR5UmVzdWx0IHtcbiAgaWYgKCFjYW5Vc2VPZmZlcmluZ0FiaWxpdHkoZ2FtZSwgc2VhdCwgb2ZmZXJpbmdJbnN0YW5jZUlkKSkge1xuICAgIHJldHVybiB7IGdhbWUsIHJlc29sdmVkOiBmYWxzZSwgbGVhZGVyRGFtYWdlOiAwLCByZXNlcnZlR2FpbjogMCwgc3BlbnRPZmZlcmluZ3M6IDAsIGxvZzogW10gfTtcbiAgfVxuXG4gIGNvbnN0IG5leHQgPSBzdHJ1Y3R1cmVkQ2xvbmUoZ2FtZSk7XG4gIGNvbnN0IHBsYXllciA9IG5leHQucGxheWVyc1tzZWF0XTtcbiAgY29uc3QgbGl2ZU9mZmVyaW5nID0gcGxheWVyLm9mZmVyaW5ncy5maW5kKGNhcmQgPT4gY2FyZC5pbnN0YW5jZUlkID09PSBvZmZlcmluZ0luc3RhbmNlSWQpO1xuICBpZiAoIWxpdmVPZmZlcmluZylcbiAgICByZXR1cm4geyBnYW1lLCByZXNvbHZlZDogZmFsc2UsIGxlYWRlckRhbWFnZTogMCwgcmVzZXJ2ZUdhaW46IDAsIHNwZW50T2ZmZXJpbmdzOiAwLCBsb2c6IFtdIH07XG5cbiAgY29uc3Qgc3BlbnRPZmZlcmluZ3MgPSBsaXZlT2ZmZXJpbmcuYWJpbGl0eUNvc3QgPz8gMDtcbiAgaWYgKHNwZW50T2ZmZXJpbmdzID4gMCkge1xuICAgIHNwZW5kT2ZmZXJpbmdzKHBsYXllciwgc3BlbnRPZmZlcmluZ3MpO1xuICB9XG4gIGNvbnN0IHJlc2VydmVHYWluID0gb2ZmZXJpbmdBYmlsaXR5UmVzZXJ2ZUdhaW4obGl2ZU9mZmVyaW5nLmFiaWxpdHlUZXh0LCBsaXZlT2ZmZXJpbmcudmFsdWUpO1xuICBwbGF5ZXIudGVtcG9yYXJ5T2ZmZXJpbmdSZXNlcnZlID0gKHBsYXllci50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPz8gMCkgKyByZXNlcnZlR2FpbjtcbiAgcGxheWVyLm9mZmVyaW5ncyA9IHBsYXllci5vZmZlcmluZ3MubWFwKGNhcmQgPT5cbiAgICBjYXJkLmluc3RhbmNlSWQgPT09IG9mZmVyaW5nSW5zdGFuY2VJZCA/IHsgLi4uY2FyZCwgYWJpbGl0eVVzZWRUaGlzVHVybjogdHJ1ZSB9IDogY2FyZFxuICApO1xuICBwbGF5ZXIubGVhZGVySHAgPSBNYXRoLm1heCgwLCBwbGF5ZXIubGVhZGVySHAgLSAxKTtcbiAgbmV4dC5yZXZpc2lvbisrO1xuICBjb25zdCBsb2cgPSBbYCR7bGl2ZU9mZmVyaW5nLm5hbWV9OiAke2xpdmVPZmZlcmluZy5hYmlsaXR5TmFtZX0uYF07XG4gIGlmIChtZXNzYWdlcykge1xuICAgIGV2YWx1YXRlVmljdG9yeShuZXh0LCBsb2csIG1lc3NhZ2VzKTtcbiAgfVxuICBuZXh0LmxvZyA9IFsuLi5sb2csIC4uLm5leHQubG9nXS5zbGljZSgwLCA0KTtcbiAgcmV0dXJuIHsgZ2FtZTogbmV4dCwgcmVzb2x2ZWQ6IHRydWUsIGxlYWRlckRhbWFnZTogMSwgcmVzZXJ2ZUdhaW4sIHNwZW50T2ZmZXJpbmdzLCBsb2cgfTtcbn1cblxuZnVuY3Rpb24gcGxheUNhcmRMb2coY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sIGRpc3BsYXlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoY2FyZC50eXBlID09PSAnb2ZmZXJpbmcnKSByZXR1cm4gYCR7ZGlzcGxheU5hbWV9IHF1ZWRhIGxpc3RhIGNvbW8gb2ZyZW5kYS5gO1xuICBpZiAoY2FyZC50eXBlID09PSAncGxhY2UnKSByZXR1cm4gYCR7ZGlzcGxheU5hbWV9IHF1ZWRhIGNvbW8gbHVnYXIgYWN0aXZvLmA7XG4gIGlmIChjYXJkLnR5cGUgPT09ICdhY3Rpb24nIHx8IGNhcmQudHlwZSA9PT0gJ2V2ZW50JykgcmV0dXJuIGAke2Rpc3BsYXlOYW1lfSBmdWUganVnYWRhLmA7XG4gIGlmIChjYXJkLnR5cGUgPT09ICd3aXNkb20nKSByZXR1cm4gYCR7ZGlzcGxheU5hbWV9IGZ1ZSByZXZlbGFkYS5gO1xuICBpZiAoY2FyZC50eXBlID09PSAndG9vbCcpIHJldHVybiBgJHtkaXNwbGF5TmFtZX0gZnVlIGVxdWlwYWRhLmA7XG4gIHJldHVybiBgJHtkaXNwbGF5TmFtZX0gZW50cmEgZW4gYmF0YWxsYS5gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF0dGFja0xlYWRlcihcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBhdHRhY2tlclNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGF0dGFja2VySW5zdGFuY2VJZDogc3RyaW5nLFxuICBtZXNzYWdlczogQ2hyaXN0aWFuaXR5UnVsZU1lc3NhZ2VzXG4pOiBDaHJpc3RpYW5pdHlBdHRhY2tSZXN1bHQge1xuICBjb25zdCBkZWZlbmRlclNlYXQgPSBvcHBvbmVudFNlYXQoYXR0YWNrZXJTZWF0KTtcbiAgaWYgKGdhbWUuc3RhdHVzICE9PSAnaW5fcHJvZ3Jlc3MnIHx8IGdhbWUucGxheWVyc1tkZWZlbmRlclNlYXRdLmJhdHRsZVpvbmUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7IGdhbWUsIGF0dGFja2VkOiBmYWxzZSwgYXR0YWNrZXJEYW1hZ2U6IDAsIHRhcmdldERhbWFnZTogMCwgbG9nOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgbmV4dCA9IHN0cnVjdHVyZWRDbG9uZShnYW1lKTtcbiAgY29uc3QgYXR0YWNrZXIgPSBuZXh0LnBsYXllcnNbYXR0YWNrZXJTZWF0XS5iYXR0bGVab25lLmZpbmQoXG4gICAgY2FyZCA9PiBjYXJkLmluc3RhbmNlSWQgPT09IGF0dGFja2VySW5zdGFuY2VJZFxuICApO1xuICBpZiAoIWF0dGFja2VyIHx8ICFhdHRhY2tlci5jYW5BdHRhY2spXG4gICAgcmV0dXJuIHsgZ2FtZSwgYXR0YWNrZWQ6IGZhbHNlLCBhdHRhY2tlckRhbWFnZTogMCwgdGFyZ2V0RGFtYWdlOiAwLCBsb2c6IFtdIH07XG5cbiAgZmlyZUVmZmVjdHMobmV4dCwgYXR0YWNrZXIsICdvbl9hdHRhY2snLCBhdHRhY2tlclNlYXQsIHsgdGFyZ2V0aW5nOiAnbGVhZGVyJyB9KTtcbiAgY29uc3QgZGFtYWdlID0gYXR0YWNrZXIuYXR0YWNrICsgKGF0dGFja2VyLmNvbWJhdEF0dGFja0J1ZmYgPz8gMCk7XG4gIG5leHQucGxheWVyc1tkZWZlbmRlclNlYXRdLmxlYWRlckhwID0gTWF0aC5tYXgoMCwgbmV4dC5wbGF5ZXJzW2RlZmVuZGVyU2VhdF0ubGVhZGVySHAgLSBkYW1hZ2UpO1xuICBhdHRhY2tlci5jb21iYXRBdHRhY2tCdWZmID0gMDtcbiAgYXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gIGNvbnN0IGxvZyA9IFtcbiAgICBgJHthdHRhY2tlci5uYW1lfSAke2F0dGFja2VyU2VhdCA9PT0gJ1AxJyA/IG1lc3NhZ2VzLmF0dGFja3NPcHBvbmVudExlYWRlciA6IG1lc3NhZ2VzLmF0dGFja3NZb3VyTGVhZGVyfWAsXG4gIF07XG4gIGV2YWx1YXRlVmljdG9yeShuZXh0LCBsb2csIG1lc3NhZ2VzKTtcbiAgbmV4dC5yZXZpc2lvbisrO1xuICBuZXh0LmxvZyA9IFsuLi5sb2csIC4uLm5leHQubG9nXS5zbGljZSgwLCA0KTtcbiAgcmV0dXJuIHsgZ2FtZTogbmV4dCwgYXR0YWNrZWQ6IHRydWUsIGF0dGFja2VyRGFtYWdlOiAwLCB0YXJnZXREYW1hZ2U6IGRhbWFnZSwgbG9nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXR0YWNrQ2hhcmFjdGVyKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGF0dGFja2VyU2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgYXR0YWNrZXJJbnN0YW5jZUlkOiBzdHJpbmcsXG4gIHRhcmdldEluc3RhbmNlSWQ6IHN0cmluZyxcbiAgbWVzc2FnZXM6IENocmlzdGlhbml0eVJ1bGVNZXNzYWdlc1xuKTogQ2hyaXN0aWFuaXR5QXR0YWNrUmVzdWx0IHtcbiAgY29uc3QgZGVmZW5kZXJTZWF0ID0gb3Bwb25lbnRTZWF0KGF0dGFja2VyU2VhdCk7XG4gIGlmIChnYW1lLnN0YXR1cyAhPT0gJ2luX3Byb2dyZXNzJylcbiAgICByZXR1cm4geyBnYW1lLCBhdHRhY2tlZDogZmFsc2UsIGF0dGFja2VyRGFtYWdlOiAwLCB0YXJnZXREYW1hZ2U6IDAsIGxvZzogW10gfTtcblxuICBjb25zdCBuZXh0ID0gc3RydWN0dXJlZENsb25lKGdhbWUpO1xuICBjb25zdCBhdHRhY2tlciA9IG5leHQucGxheWVyc1thdHRhY2tlclNlYXRdLmJhdHRsZVpvbmUuZmluZChcbiAgICBjYXJkID0+IGNhcmQuaW5zdGFuY2VJZCA9PT0gYXR0YWNrZXJJbnN0YW5jZUlkXG4gICk7XG4gIGNvbnN0IHRhcmdldCA9IG5leHQucGxheWVyc1tkZWZlbmRlclNlYXRdLmJhdHRsZVpvbmUuZmluZChcbiAgICBjYXJkID0+IGNhcmQuaW5zdGFuY2VJZCA9PT0gdGFyZ2V0SW5zdGFuY2VJZFxuICApO1xuICBpZiAoIWF0dGFja2VyIHx8ICF0YXJnZXQgfHwgIWF0dGFja2VyLmNhbkF0dGFjaykge1xuICAgIHJldHVybiB7IGdhbWUsIGF0dGFja2VkOiBmYWxzZSwgYXR0YWNrZXJEYW1hZ2U6IDAsIHRhcmdldERhbWFnZTogMCwgbG9nOiBbXSB9O1xuICB9XG5cbiAgZmlyZUVmZmVjdHMobmV4dCwgYXR0YWNrZXIsICdvbl9hdHRhY2snLCBhdHRhY2tlclNlYXQsIHsgdGFyZ2V0aW5nOiAnY2hhcmFjdGVyJyB9LCB0YXJnZXQpO1xuICBmaXJlRWZmZWN0cyhuZXh0LCB0YXJnZXQsICdvbl9kZWZlbmQnLCBkZWZlbmRlclNlYXQsIHsgdGFyZ2V0aW5nOiAnY2hhcmFjdGVyJyB9LCBhdHRhY2tlcik7XG4gIGNvbnN0IGF0dGFja2VyVG90YWwgPSBhdHRhY2tlci5hdHRhY2sgKyAoYXR0YWNrZXIuY29tYmF0QXR0YWNrQnVmZiA/PyAwKTtcbiAgY29uc3QgdGFyZ2V0VG90YWwgPSB0YXJnZXQuYXR0YWNrICsgKHRhcmdldC5jb21iYXRBdHRhY2tCdWZmID8/IDApO1xuICB0YXJnZXQuY3VycmVudEhwIC09IGF0dGFja2VyVG90YWw7XG4gIGF0dGFja2VyLmN1cnJlbnRIcCAtPSB0YXJnZXRUb3RhbDtcbiAgYXR0YWNrZXIuY29tYmF0QXR0YWNrQnVmZiA9IDA7XG4gIHRhcmdldC5jb21iYXRBdHRhY2tCdWZmID0gMDtcbiAgYXR0YWNrZXIuY2FuQXR0YWNrID0gZmFsc2U7XG4gIGNsZWFudXBEZXN0cm95ZWQobmV4dC5wbGF5ZXJzW2F0dGFja2VyU2VhdF0sIG5leHQpO1xuICBjbGVhbnVwRGVzdHJveWVkKG5leHQucGxheWVyc1tkZWZlbmRlclNlYXRdLCBuZXh0KTtcbiAgY29uc3QgbG9nID0gW2Ake2F0dGFja2VyLm5hbWV9ICR7bWVzc2FnZXMuY29tYmF0c0FnYWluc3R9ICR7dGFyZ2V0Lm5hbWV9LmBdO1xuICBldmFsdWF0ZVZpY3RvcnkobmV4dCwgbG9nLCBtZXNzYWdlcyk7XG4gIG5leHQucmV2aXNpb24rKztcbiAgbmV4dC5sb2cgPSBbLi4ubG9nLCAuLi5uZXh0LmxvZ10uc2xpY2UoMCwgNCk7XG5cbiAgcmV0dXJuIHtcbiAgICBnYW1lOiBuZXh0LFxuICAgIGF0dGFja2VkOiB0cnVlLFxuICAgIGF0dGFja2VyRGFtYWdlOiB0YXJnZXRUb3RhbCxcbiAgICB0YXJnZXREYW1hZ2U6IGF0dGFja2VyVG90YWwsXG4gICAgbG9nLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWR2YW5jZVR1cm4oXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgbWVzc2FnZXM6IENocmlzdGlhbml0eVJ1bGVNZXNzYWdlc1xuKTogc3RyaW5nW10ge1xuICBnYW1lLnBsYXllcnNbZ2FtZS50dXJuT3duZXJdLnRlbXBvcmFyeU9mZmVyaW5nUmVzZXJ2ZSA9IDA7XG4gIGdhbWUudHVybk93bmVyID0gb3Bwb25lbnRTZWF0KGdhbWUudHVybk93bmVyKTtcbiAgZ2FtZS50dXJuQ291bnQrKztcbiAgY29uc3QgY3VycmVudCA9IGdhbWUucGxheWVyc1tnYW1lLnR1cm5Pd25lcl07XG4gIGN1cnJlbnQub2ZmZXJpbmdQbGF5ZWRUaGlzVHVybiA9IGZhbHNlO1xuICBjdXJyZW50Lm9mZmVyaW5ncyA9IGN1cnJlbnQub2ZmZXJpbmdzLm1hcChvZmZlcmluZyA9PiAoe1xuICAgIC4uLm9mZmVyaW5nLFxuICAgIHJlYWR5OiB0cnVlLFxuICAgIGFiaWxpdHlVc2VkVGhpc1R1cm46IGZhbHNlLFxuICB9KSk7XG4gIGN1cnJlbnQuYmF0dGxlWm9uZSA9IGN1cnJlbnQuYmF0dGxlWm9uZS5tYXAoY2FyZCA9PiAoeyAuLi5jYXJkLCBjYW5BdHRhY2s6IHRydWUgfSkpO1xuICBjb25zdCBkcmF3bkNhcmQgPSBnYW1lLnNoYXJlZERlY2suc2hpZnQoKTtcbiAgY29uc3QgbG9nOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGlzY2FyZGVkRm9ySGFuZExpbWl0ID0gZmFsc2U7XG4gIGlmIChkcmF3bkNhcmQpIHtcbiAgICBpZiAoY3VycmVudC5oYW5kKSB7XG4gICAgICBjdXJyZW50LmhhbmQucHVzaChkcmF3bkNhcmQpO1xuICAgICAgLy8gTWFubyBsbGVuYTogbGEgY2FydGEgcm9iYWRhIHBvciBlbmNpbWEgZGVsIG3DoXhpbW8gc2UgZGVzY2FydGEgYSBIaXN0b3JpYS5cbiAgICAgIHdoaWxlIChjdXJyZW50LmhhbmQubGVuZ3RoID4gQ0hSSVNUSUFOSVRZX01BWF9IQU5EX1NJWkUpIHtcbiAgICAgICAgY29uc3QgZGlzY2FyZGVkID0gY3VycmVudC5oYW5kLnBvcCgpO1xuICAgICAgICBpZiAoZGlzY2FyZGVkKSBnYW1lLmhpc3Rvcnlab25lLnB1c2goZGlzY2FyZGVkKTtcbiAgICAgICAgZGlzY2FyZGVkRm9ySGFuZExpbWl0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5oYW5kQ291bnQgPSAoY3VycmVudC5oYW5kQ291bnQgPz8gMCkgKyAxO1xuICAgICAgaWYgKGN1cnJlbnQuaGFuZENvdW50ID4gQ0hSSVNUSUFOSVRZX01BWF9IQU5EX1NJWkUpIHtcbiAgICAgICAgY3VycmVudC5oYW5kQ291bnQgPSBDSFJJU1RJQU5JVFlfTUFYX0hBTkRfU0laRTtcbiAgICAgICAgaWYgKGRyYXduQ2FyZCkgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKGRyYXduQ2FyZCk7XG4gICAgICAgIGRpc2NhcmRlZEZvckhhbmRMaW1pdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGV2YWx1YXRlVmljdG9yeShnYW1lLCBsb2csIG1lc3NhZ2VzKTtcbiAgfVxuICByZXR1cm4gW1xuICAgIGRyYXduQ2FyZCA/IGAke2N1cnJlbnQuZGlzcGxheU5hbWV9ICR7bWVzc2FnZXMuZHJhd3NDYXJkfWAgOiBtZXNzYWdlcy5kZWNrSXNFbXB0eSxcbiAgICAuLi4oZGlzY2FyZGVkRm9ySGFuZExpbWl0ID8gW2Ake2N1cnJlbnQuZGlzcGxheU5hbWV9ICR7bWVzc2FnZXMuaGFuZEZ1bGx9YF0gOiBbXSksXG4gICAgYCR7bWVzc2FnZXMudHVybk9mfSAke2N1cnJlbnQuZGlzcGxheU5hbWV9LmAsXG4gICAgLi4ubG9nLFxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVWaWN0b3J5KFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGxvZzogc3RyaW5nW10sXG4gIG1lc3NhZ2VzOiBDaHJpc3RpYW5pdHlSdWxlTWVzc2FnZXNcbik6IHZvaWQge1xuICBpZiAoZ2FtZS5wbGF5ZXJzLlAxLmxlYWRlckhwID4gMCAmJiBnYW1lLnBsYXllcnMuUDIubGVhZGVySHAgPiAwICYmIGdhbWUuc2hhcmVkRGVjay5sZW5ndGggPiAwKVxuICAgIHJldHVybjtcbiAgZ2FtZS5zdGF0dXMgPSAnZmluaXNoZWQnO1xuICBjb25zdCB3aW5uZXI6IENocmlzdGlhbml0eVNlYXQgPVxuICAgIGdhbWUucGxheWVycy5QMS5sZWFkZXJIcCA8PSAwXG4gICAgICA/ICdQMidcbiAgICAgIDogZ2FtZS5wbGF5ZXJzLlAyLmxlYWRlckhwIDw9IDBcbiAgICAgICAgPyAnUDEnXG4gICAgICAgIDogZ2FtZS5wbGF5ZXJzLlAxLmxlYWRlckhwID49IGdhbWUucGxheWVycy5QMi5sZWFkZXJIcFxuICAgICAgICAgID8gJ1AxJ1xuICAgICAgICAgIDogJ1AyJztcbiAgZ2FtZS5tYXRjaFNjb3JlW3dpbm5lcl0gKz0gMTtcbiAgbG9nLnB1c2god2lubmVyID09PSAnUDEnID8gbWVzc2FnZXMueW91V2luIDogbWVzc2FnZXMub3Bwb25lbnRXaW5zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFudXBEZXN0cm95ZWQoXG4gIHBsYXllcjogQ2hyaXN0aWFuaXR5UGxheWVyU3RhdGUsXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgbG9va3VwPzogQ2FyZExvb2t1cFxuKTogdm9pZCB7XG4gIGNvbnN0IGRlc3Ryb3llZCA9IHBsYXllci5iYXR0bGVab25lLmZpbHRlcihjYXJkID0+IGNhcmQuY3VycmVudEhwIDw9IDApO1xuICBpZiAoIWRlc3Ryb3llZC5sZW5ndGgpIHJldHVybjtcbiAgZm9yIChjb25zdCBjaCBvZiBkZXN0cm95ZWQpIHtcbiAgICBmaXJlRWZmZWN0cyhnYW1lLCBjaCwgJ29uX2RlYXRoJywgY2gub3duZXIpO1xuICAgIGFwcGx5UGFzc2l2ZUNvc3RNb2RpZmllcnMoZ2FtZS5wbGF5ZXJzW2NoLm93bmVyXSwgY2guaW5zdGFuY2VJZCwgbnVsbCwgZmFsc2UpO1xuICAgIGlmIChsb29rdXApIHtcbiAgICAgIGNvbnN0IGRlZiA9IGxvb2t1cChjaC5jYXJkSWQpO1xuICAgICAgaWYgKGRlZikgcmVzb2x2ZUNoYXJhY3RlclN0cmF0ZWd5RGVhdGgoZ2FtZSwgY2gsIGRlZiwgY2gub3duZXIgYXMgQ2hyaXN0aWFuaXR5U2VhdCwgbG9va3VwKTtcbiAgICB9XG4gIH1cbiAgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKC4uLmRlc3Ryb3llZC5tYXAoY2FyZCA9PiBjYXJkLmNhcmRJZCkpO1xuICBwbGF5ZXIuYmF0dGxlWm9uZSA9IHBsYXllci5iYXR0bGVab25lLmZpbHRlcihjYXJkID0+IGNhcmQuY3VycmVudEhwID4gMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGVuZE9mZmVyaW5ncyhwbGF5ZXI6IENocmlzdGlhbml0eVBsYXllclN0YXRlLCBjb3N0OiBudW1iZXIpOiB2b2lkIHtcbiAgbGV0IHJlbWFpbmluZyA9IGNvc3Q7XG4gIGNvbnN0IHRlbXBvcmFyeVJlc2VydmUgPSBwbGF5ZXIudGVtcG9yYXJ5T2ZmZXJpbmdSZXNlcnZlID8/IDA7XG4gIGlmICh0ZW1wb3JhcnlSZXNlcnZlID4gMCkge1xuICAgIGNvbnN0IHNwZW50VGVtcG9yYXJ5UmVzZXJ2ZSA9IE1hdGgubWluKHRlbXBvcmFyeVJlc2VydmUsIHJlbWFpbmluZyk7XG4gICAgcGxheWVyLnRlbXBvcmFyeU9mZmVyaW5nUmVzZXJ2ZSA9IHRlbXBvcmFyeVJlc2VydmUgLSBzcGVudFRlbXBvcmFyeVJlc2VydmU7XG4gICAgcmVtYWluaW5nIC09IHNwZW50VGVtcG9yYXJ5UmVzZXJ2ZTtcbiAgfVxuICBwbGF5ZXIub2ZmZXJpbmdzID0gcGxheWVyLm9mZmVyaW5ncy5tYXAob2ZmZXJpbmcgPT4ge1xuICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCAhb2ZmZXJpbmcucmVhZHkpIHJldHVybiBvZmZlcmluZztcbiAgICByZW1haW5pbmcgLT0gb2ZmZXJpbmcudmFsdWU7XG4gICAgcmV0dXJuIHsgLi4ub2ZmZXJpbmcsIHJlYWR5OiBmYWxzZSB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb2ZmZXJpbmdBYmlsaXR5UmVzZXJ2ZUdhaW4oXG4gIGFiaWxpdHlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrVmFsdWU6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgbWF0Y2ggPSBhYmlsaXR5VGV4dD8ubWF0Y2goL3ZhbG9yIGRlIChcXGQrKSBvZnJlbmRhcz8vaSk7XG4gIGNvbnN0IHBhcnNlZCA9IG1hdGNoID8gTnVtYmVyKG1hdGNoWzFdKSA6IE51bWJlci5OYU47XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSAmJiBwYXJzZWQgPiAwID8gcGFyc2VkIDogTWF0aC5tYXgoMSwgZmFsbGJhY2tWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcHBvbmVudFNlYXQoc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCk6IENocmlzdGlhbml0eVNlYXQge1xuICByZXR1cm4gc2VhdCA9PT0gJ1AxJyA/ICdQMicgOiAnUDEnO1xufVxuXG4vLyAtLS0gRWZmZWN0IGVuZ2luZSAoSDkpIC0tLVxuXG50eXBlIEVmZmVjdEN0eCA9IHsgdGFyZ2V0aW5nPzogJ2NoYXJhY3RlcicgfCAnbGVhZGVyJyB9O1xuXG5mdW5jdGlvbiBjaGVja0NvbmRpdGlvbihjb25kaXRpb246IENocmlzdGlhbml0eUNhcmRFZmZlY3RbJ2NvbmRpdGlvbiddLCBjdHg6IEVmZmVjdEN0eCk6IGJvb2xlYW4ge1xuICBpZiAoIWNvbmRpdGlvbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBjb25kaXRpb24udGFyZ2V0aW5nID09PSBjdHgudGFyZ2V0aW5nO1xufVxuXG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9DaGFyYWN0ZXIoXG4gIGNoOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgZWZmZWN0OiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0XG4pOiB2b2lkIHtcbiAgY29uc3QgbXV0ID0gZWZmZWN0Lm11dGF0aW9uO1xuICBjb25zdCBkdXJhdGlvbiA9IGVmZmVjdC5kdXJhdGlvbiA/PyAncGVybWFuZW50JztcbiAgc3dpdGNoIChtdXQudHlwZSkge1xuICAgIGNhc2UgJ2J1ZmZfYXR0YWNrJzpcbiAgICAgIGlmIChkdXJhdGlvbiA9PT0gJ2NvbWJhdCcpIHtcbiAgICAgICAgY2guY29tYmF0QXR0YWNrQnVmZiA9IChjaC5jb21iYXRBdHRhY2tCdWZmID8/IDApICsgbXV0LmFtb3VudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoLmF0dGFjayArPSBtdXQuYW1vdW50O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYnVmZl9saWZlJzpcbiAgICAgIGNoLmN1cnJlbnRIcCArPSBtdXQuYW1vdW50O1xuICAgICAgY2gubWF4SHAgKz0gbXV0LmFtb3VudDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RlYWxfZGFtYWdlJzpcbiAgICAgIGNoLmN1cnJlbnRIcCA9IE1hdGgubWF4KDAsIGNoLmN1cnJlbnRIcCAtIG11dC5hbW91bnQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmVzdG9yZV9ocCc6XG4gICAgICBjaC5jdXJyZW50SHAgPSBNYXRoLm1pbihjaC5tYXhIcCwgY2guY3VycmVudEhwICsgbXV0LmFtb3VudCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkZXN0cm95JzpcbiAgICAgIGNoLmN1cnJlbnRIcCA9IDA7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseUVmZmVjdChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBlZmZlY3Q6IENocmlzdGlhbml0eUNhcmRFZmZlY3QsXG4gIHNvdXJjZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIGNvbWJhdE9wcG9uZW50OiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSB8IG51bGwsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICBjb25zdCB7IG11dGF0aW9uOiBtdXQsIHRhcmdldCB9ID0gZWZmZWN0O1xuICBjb25zdCBvcHAgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG5cbiAgc3dpdGNoICh0YXJnZXQpIHtcbiAgICBjYXNlICdzZWxmJzpcbiAgICAgIGFwcGx5TXV0YXRpb25Ub0NoYXJhY3Rlcihzb3VyY2UsIGVmZmVjdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb21iYXRfb3Bwb25lbnQnOlxuICAgICAgaWYgKGNvbWJhdE9wcG9uZW50KSBhcHBseU11dGF0aW9uVG9DaGFyYWN0ZXIoY29tYmF0T3Bwb25lbnQsIGVmZmVjdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhbGxfZnJpZW5kbHknOlxuICAgICAgZm9yIChjb25zdCBjaCBvZiBnYW1lLnBsYXllcnNbc2VhdF0uYmF0dGxlWm9uZSkgYXBwbHlNdXRhdGlvblRvQ2hhcmFjdGVyKGNoLCBlZmZlY3QpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWxsX2VuZW15JzpcbiAgICAgIGZvciAoY29uc3QgY2ggb2YgZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSkgYXBwbHlNdXRhdGlvblRvQ2hhcmFjdGVyKGNoLCBlZmZlY3QpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb3Bwb25lbnRfbGVhZGVyJzpcbiAgICBjYXNlICdvd25fbGVhZGVyJzoge1xuICAgICAgY29uc3QgbHMgPSB0YXJnZXQgPT09ICdvcHBvbmVudF9sZWFkZXInID8gb3BwIDogc2VhdDtcbiAgICAgIGlmIChtdXQudHlwZSA9PT0gJ2RlYWxfZGFtYWdlJykge1xuICAgICAgICBnYW1lLnBsYXllcnNbbHNdLmxlYWRlckhwID0gTWF0aC5tYXgoMCwgZ2FtZS5wbGF5ZXJzW2xzXS5sZWFkZXJIcCAtIG11dC5hbW91bnQpO1xuICAgICAgfSBlbHNlIGlmIChtdXQudHlwZSA9PT0gJ3Jlc3RvcmVfaHAnKSB7XG4gICAgICAgIGdhbWUucGxheWVyc1tsc10ubGVhZGVySHAgPSBNYXRoLm1pbihcbiAgICAgICAgICBnYW1lLnBsYXllcnNbbHNdLmxlYWRlck1heEhwLFxuICAgICAgICAgIGdhbWUucGxheWVyc1tsc10ubGVhZGVySHAgKyBtdXQuYW1vdW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBnYW1lLWxldmVsIG11dGF0aW9ucyB0aGF0IGJ5cGFzcyB0aGUgY2hhcmFjdGVyIHN3aXRjaFxuICBpZiAobXV0LnR5cGUgPT09ICdkcmF3X2NhcmQnKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXQuYW1vdW50OyBpKyspIGRyYXdDYXJkRm9yKGdhbWUsIHNlYXQpO1xuICB9IGVsc2UgaWYgKG11dC50eXBlID09PSAnZGlzY2FyZF9jYXJkJykge1xuICAgIGNvbnN0IHRTZWF0ID0gbXV0LndobyA9PT0gJ29wcG9uZW50JyA/IG9wcCA6IHNlYXQ7XG4gICAgY29uc3QgaGFuZCA9IGdhbWUucGxheWVyc1t0U2VhdF0uaGFuZCA/PyBbXTtcbiAgICBsZXQgc2VlZCA9IGdhbWUucmV2aXNpb24gKiAzMSArIGdhbWUudHVybkNvdW50ICogNztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKG11dC5hbW91bnQsIGhhbmQubGVuZ3RoKTsgaSsrKSB7XG4gICAgICBzZWVkID0gKHNlZWQgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykgJiAweGZmZmZmZmZmO1xuICAgICAgY29uc3QgaWR4ID0gTWF0aC5hYnMoc2VlZCkgJSBoYW5kLmxlbmd0aDtcbiAgICAgIGdhbWUuaGlzdG9yeVpvbmUucHVzaChoYW5kLnNwbGljZShpZHgsIDEpWzBdKTtcbiAgICB9XG4gICAgZ2FtZS5wbGF5ZXJzW3RTZWF0XS5oYW5kID0gaGFuZDtcbiAgfSBlbHNlIGlmIChtdXQudHlwZSA9PT0gJ2dhaW5fb2ZmZXJpbmdzJykge1xuICAgIGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPVxuICAgICAgKGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPz8gMCkgKyBtdXQuYW1vdW50O1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpcmVFZmZlY3RzKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIHNvdXJjZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIHRyaWdnZXI6IENocmlzdGlhbml0eUVmZmVjdFRyaWdnZXIsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGN0eDogRWZmZWN0Q3R4ID0ge30sXG4gIGNvbWJhdE9wcG9uZW50OiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSB8IG51bGwgPSBudWxsXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlZmZlY3Qgb2Ygc291cmNlLmVmZmVjdHMgPz8gW10pIHtcbiAgICBpZiAoZWZmZWN0LnRyaWdnZXIgIT09IHRyaWdnZXIpIGNvbnRpbnVlO1xuICAgIGlmICghY2hlY2tDb25kaXRpb24oZWZmZWN0LmNvbmRpdGlvbiwgY3R4KSkgY29udGludWU7XG4gICAgYXBwbHlFZmZlY3QoZ2FtZSwgZWZmZWN0LCBzb3VyY2UsIGNvbWJhdE9wcG9uZW50LCBzZWF0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiYWtlRWZmZWN0cyhcbiAgaW5zdGFuY2U6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlLFxuICBlZmZlY3RzOiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0W11cbik6IHZvaWQge1xuICBpbnN0YW5jZS5lZmZlY3RzID0gWy4uLihpbnN0YW5jZS5lZmZlY3RzID8/IFtdKSwgLi4uZWZmZWN0c107XG59XG5cbi8vIC0tLSBUb29sIGVxdWlwIHBhc3NpdmVzIChIOCkgLS0tXG5cbmZ1bmN0aW9uIGFwcGx5VG9vbFBhc3NpdmVzKFxuICBjaDogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uXG4pOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJyc7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhdGtNYXRjaCA9IGxvd2VyLm1hdGNoKC9cXCsoXFxkKylcXHMrcHVudG8oPzpzKT8gZGUgYXRhcXVlLyk7XG4gIGlmIChhdGtNYXRjaCkgY2guYXR0YWNrICs9IHBhcnNlSW50KGF0a01hdGNoWzFdLCAxMCk7XG4gIGNvbnN0IGxpZmVNYXRjaCA9IGxvd2VyLm1hdGNoKC9cXCsoXFxkKylcXHMrcHVudG8oPzpzKT8gZGUgdmlkYS8pO1xuICBpZiAobGlmZU1hdGNoKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlSW50KGxpZmVNYXRjaFsxXSwgMTApO1xuICAgIGNoLmN1cnJlbnRIcCArPSBuO1xuICAgIGNoLm1heEhwICs9IG47XG4gIH1cbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwdWVkZSBhdGFjYXIgZWwgdHVybm8gZW4gcXVlIGVudHJhJykpIHtcbiAgICBjaC5jYW5BdHRhY2sgPSB0cnVlO1xuICB9XG4gIGJha2VFZmZlY3RzKGNoLCBjYXJkLmVmZmVjdHMgPz8gW10pO1xufVxuXG4vLyAtLS0gRGV0ZXJtaW5pc3RpYyBoZWxwZXJzIC0tLVxuXG5mdW5jdGlvbiBsY2dTdGVwKHNlZWQ6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoKHNlZWQgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykgJiAweDdmZmZmZmZmKSA+Pj4gMDtcbn1cblxuZnVuY3Rpb24gZ2FtZVNlZWQoZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGxjZ1N0ZXAoZ2FtZS5yZXZpc2lvbiAqIDMxICsgZ2FtZS50dXJuQ291bnQgKiA3KTtcbn1cblxuZnVuY3Rpb24gY29pbkZsaXAoZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBnYW1lU2VlZChnYW1lKSAlIDIgPT09IDA7XG59XG5cbmZ1bmN0aW9uIHBzZXVkb1JhbmRJbmRleChsZW46IG51bWJlciwgc2VlZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIE1hdGguYWJzKHNlZWQpICUgbGVuO1xufVxuXG4vLyAtLS0gQXV0by10YXJnZXRpbmcgaGVscGVycyAtLS1cblxuZnVuY3Rpb24gcGlja01vc3REYW5nZXJvdXMoXG4gIHpvbmU6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlW11cbik6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlIHwgbnVsbCB7XG4gIGlmICghem9uZS5sZW5ndGgpIHJldHVybiBudWxsO1xuICByZXR1cm4gem9uZS5yZWR1Y2UoKGEsIGIpID0+IChhLmF0dGFjayA+PSBiLmF0dGFjayA/IGEgOiBiKSk7XG59XG5cbmZ1bmN0aW9uIHBpY2tNb3N0VnVsbmVyYWJsZShcbiAgem9uZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2VbXVxuKTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UgfCBudWxsIHtcbiAgaWYgKCF6b25lLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB6b25lLnJlZHVjZSgoYSwgYikgPT4gKGEuY3VycmVudEhwIDw9IGIuY3VycmVudEhwID8gYSA6IGIpKTtcbn1cblxuZnVuY3Rpb24gcGlja0Jlc3RGcmllbmRseShcbiAgem9uZTogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2VbXSxcbiAgZXhjbHVkaW5nPzogc3RyaW5nXG4pOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSB8IG51bGwge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZXhjbHVkaW5nID8gem9uZS5maWx0ZXIoYyA9PiBjLmluc3RhbmNlSWQgIT09IGV4Y2x1ZGluZykgOiB6b25lO1xuICBpZiAoIWNhbmRpZGF0ZXMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNhbmRpZGF0ZXMucmVkdWNlKChhLCBiKSA9PiAoYS5hdHRhY2sgPj0gYi5hdHRhY2sgPyBhIDogYikpO1xufVxuXG5mdW5jdGlvbiBib3VuY2VDaGFyYWN0ZXJUb0RlY2soXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2g6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlLFxuICBmcm9tU2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGdhbWUucGxheWVyc1tmcm9tU2VhdF0uYmF0dGxlWm9uZSA9IGdhbWUucGxheWVyc1tmcm9tU2VhdF0uYmF0dGxlWm9uZS5maWx0ZXIoXG4gICAgYyA9PiBjLmluc3RhbmNlSWQgIT09IGNoLmluc3RhbmNlSWRcbiAgKTtcbiAgZ2FtZS5zaGFyZWREZWNrLnVuc2hpZnQoY2guY2FyZElkKTtcbn1cblxuZnVuY3Rpb24gc3RlYWxDaGFyYWN0ZXIoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2g6IENocmlzdGlhbml0eUNoYXJhY3Rlckluc3RhbmNlLFxuICBmcm9tU2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgdG9TZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgZ2FtZS5wbGF5ZXJzW2Zyb21TZWF0XS5iYXR0bGVab25lID0gZ2FtZS5wbGF5ZXJzW2Zyb21TZWF0XS5iYXR0bGVab25lLmZpbHRlcihcbiAgICBjID0+IGMuaW5zdGFuY2VJZCAhPT0gY2guaW5zdGFuY2VJZFxuICApO1xuICBjb25zdCBuZXdTbG90cyA9IG5ldyBTZXQoZ2FtZS5wbGF5ZXJzW3RvU2VhdF0uYmF0dGxlWm9uZS5tYXAoYyA9PiBjLnNsb3QgPz8gMCkpO1xuICBjb25zdCBmcmVlU2xvdCA9IFswLCAxLCAyLCAzXS5maW5kKHMgPT4gIW5ld1Nsb3RzLmhhcyhzKSkgPz8gMztcbiAgaWYgKGdhbWUucGxheWVyc1t0b1NlYXRdLmJhdHRsZVpvbmUubGVuZ3RoIDwgQ0hSSVNUSUFOSVRZX0JBVFRMRV9TTE9UUykge1xuICAgIGdhbWUucGxheWVyc1t0b1NlYXRdLmJhdHRsZVpvbmUucHVzaCh7XG4gICAgICAuLi5jaCxcbiAgICAgIGNvbnRyb2xsZXI6IHRvU2VhdCxcbiAgICAgIHNsb3Q6IGZyZWVTbG90LFxuICAgICAgY2FuQXR0YWNrOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZWFyY2hEZWNrRm9yQ2FyZChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBtYXRjaEZuOiAoZGVmOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbikgPT4gYm9vbGVhbixcbiAgbG9va3VwOiBDYXJkTG9va3VwIHwgdW5kZWZpbmVkLFxuICBwdXRJblBsYXkgPSBmYWxzZVxuKTogYm9vbGVhbiB7XG4gIGlmICghbG9va3VwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGlkeCA9IGdhbWUuc2hhcmVkRGVjay5maW5kSW5kZXgoaWQgPT4ge1xuICAgIGNvbnN0IGRlZiA9IGxvb2t1cChpZCk7XG4gICAgcmV0dXJuIGRlZiA/IG1hdGNoRm4oZGVmKSA6IGZhbHNlO1xuICB9KTtcbiAgaWYgKGlkeCA8IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW2NhcmRJZF0gPSBnYW1lLnNoYXJlZERlY2suc3BsaWNlKGlkeCwgMSk7XG4gIHNodWZmbGVEZWNrU2VnbWVudChnYW1lLCAwLCBnYW1lLnNoYXJlZERlY2subGVuZ3RoLCBnYW1lU2VlZChnYW1lKSk7XG4gIGlmIChwdXRJblBsYXkpIHtcbiAgICBjb25zdCBkZWYgPSBsb29rdXAoY2FyZElkKTtcbiAgICBpZiAoZGVmICYmIGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmxlbmd0aCA8IENIUklTVElBTklUWV9CQVRUTEVfU0xPVFMpIHtcbiAgICAgIGNvbnN0IG9jY3VwaWVkU2xvdHMgPSBuZXcgU2V0KGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLm1hcCgoYywgaSkgPT4gYy5zbG90ID8/IGkpKTtcbiAgICAgIGNvbnN0IGZyZWVTbG90ID0gWzAsIDEsIDIsIDNdLmZpbmQocyA9PiAhb2NjdXBpZWRTbG90cy5oYXMocykpO1xuICAgICAgaWYgKGZyZWVTbG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUucHVzaCh7XG4gICAgICAgICAgaW5zdGFuY2VJZDogYCR7c2VhdC50b0xvd2VyQ2FzZSgpfV9zZWFyY2hfJHtnYW1lLnJldmlzaW9ufWAsXG4gICAgICAgICAgY2FyZElkLFxuICAgICAgICAgIG5hbWU6IGRlZi5uYW1lLFxuICAgICAgICAgIG93bmVyOiBzZWF0LFxuICAgICAgICAgIGNvbnRyb2xsZXI6IHNlYXQsXG4gICAgICAgICAgc2xvdDogZnJlZVNsb3QsXG4gICAgICAgICAgYXR0YWNrOiBkZWYuYXR0YWNrID8/IDAsXG4gICAgICAgICAgY3VycmVudEhwOiBkZWYubGlmZSA/PyAxLFxuICAgICAgICAgIG1heEhwOiBkZWYubGlmZSA/PyAxLFxuICAgICAgICAgIGNhbkF0dGFjazogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmhhbmQ/LnB1c2goY2FyZElkKTtcbiAgfSBlbHNlIHtcbiAgICBnYW1lLnBsYXllcnNbc2VhdF0uaGFuZD8ucHVzaChjYXJkSWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaHVmZmxlRGVja1NlZ21lbnQoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgc3RhcnQ6IG51bWJlcixcbiAgZW5kOiBudW1iZXIsXG4gIHNlZWQ6IG51bWJlclxuKTogdm9pZCB7XG4gIGNvbnN0IGRlY2sgPSBnYW1lLnNoYXJlZERlY2s7XG4gIGZvciAobGV0IGkgPSBlbmQgLSAxOyBpID4gc3RhcnQ7IGktLSkge1xuICAgIHNlZWQgPSBsY2dTdGVwKHNlZWQpO1xuICAgIGNvbnN0IGogPSBzdGFydCArIChzZWVkICUgKGkgLSBzdGFydCArIDEpKTtcbiAgICBbZGVja1tpXSwgZGVja1tqXV0gPSBbZGVja1tqXSwgZGVja1tpXV07XG4gIH1cbn1cblxuLy8gLS0tIFBhc3NpdmUgY29zdCBtb2RpZmllciBzeXN0ZW0gLS0tXG5cbmZ1bmN0aW9uIHBhcnNlUGFzc2l2ZUNvc3RNb2RpZmllcnMoXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uXG4pOiBBcnJheTx7IGNhcmRUeXBlOiBDaHJpc3RpYW5pdHlDYXJkVHlwZTsgZGVsdGE6IG51bWJlciB9PiB8IG51bGwge1xuICBpZiAoY2FyZC5zdHJhdGVneSAhPT0gJ2FjY2VsZXJhdGUnICYmIGNhcmQuc3RyYXRlZ3kgIT09ICdzbG93ZG93bicpIHJldHVybiBudWxsO1xuICBjb25zdCB0ZXh0ID0gKGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHJlc3VsdHM6IEFycmF5PHsgY2FyZFR5cGU6IENocmlzdGlhbml0eUNhcmRUeXBlOyBkZWx0YTogbnVtYmVyIH0+ID0gW107XG4gIGNvbnN0IHR5cGVNYXA6IEFycmF5PFtzdHJpbmcsIENocmlzdGlhbml0eUNhcmRUeXBlXT4gPSBbXG4gICAgWydzYWJpZHVyw60nLCAnd2lzZG9tJ10sXG4gICAgWydzYWJpZHVyaWEnLCAnd2lzZG9tJ10sXG4gICAgWydldmVudG8nLCAnZXZlbnQnXSxcbiAgICBbJ2FjY2nDs24nLCAnYWN0aW9uJ10sXG4gICAgWydhY2Npb24nLCAnYWN0aW9uJ10sXG4gICAgWydoZXJyYW1pZW50YScsICd0b29sJ10sXG4gICAgWydwZXJzb25hamUnLCAnY2hhcmFjdGVyJ10sXG4gICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgWydsdWdhcicsICdwbGFjZSddLFxuICBdO1xuICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB0eXBlXSBvZiB0eXBlTWFwKSB7XG4gICAgaWYgKCF0ZXh0LmluY2x1ZGVzKGtleXdvcmQpKSBjb250aW51ZTtcbiAgICAvLyBsb2NrIHBhdHRlcm5zXG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ25vIHNlIHB1ZWRlbiBqdWdhcicpKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBjYXJkVHlwZTogdHlwZSwgZGVsdGE6IDk5IH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMTtcbiAgICBpZiAoY2FyZC5zdHJhdGVneSA9PT0gJ2FjY2VsZXJhdGUnKSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBjYXJkVHlwZTogdHlwZSwgZGVsdGE6IC1uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRzLnB1c2goeyBjYXJkVHlwZTogdHlwZSwgZGVsdGE6IG4gfSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiByZXN1bHRzLmxlbmd0aCA/IHJlc3VsdHMgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQYXNzaXZlQ29zdE1vZGlmaWVycyhcbiAgcGxheWVyOiBDaHJpc3RpYW5pdHlQbGF5ZXJTdGF0ZSxcbiAgc291cmNlSWQ6IHN0cmluZyxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24gfCBudWxsLFxuICBhZGQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAoIWFkZCkge1xuICAgIHBsYXllci5jb3N0TW9kaWZpZXJzID0gKHBsYXllci5jb3N0TW9kaWZpZXJzID8/IFtdKS5maWx0ZXIobSA9PiBtLnNvdXJjZUlkICE9PSBzb3VyY2VJZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghY2FyZCkgcmV0dXJuO1xuICBjb25zdCBtb2RzID0gcGFyc2VQYXNzaXZlQ29zdE1vZGlmaWVycyhjYXJkKTtcbiAgaWYgKCFtb2RzKSByZXR1cm47XG4gIHBsYXllci5jb3N0TW9kaWZpZXJzID0gW1xuICAgIC4uLihwbGF5ZXIuY29zdE1vZGlmaWVycyA/PyBbXSkuZmlsdGVyKG0gPT4gbS5zb3VyY2VJZCAhPT0gc291cmNlSWQpLFxuICAgIC4uLm1vZHMubWFwKG0gPT4gKHsgLi4ubSwgc291cmNlSWQgfSkpLFxuICBdO1xufVxuXG4vLyAtLS0gU3RydWN0dXJlZCBlZmZlY3Qgc3ludGhlc2lzIGZvciBjaGFyYWN0ZXJzIC0tLVxuXG5mdW5jdGlvbiBzeW50aGVzaXplU3RydWN0dXJlZEVmZmVjdHMoY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24pOiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0W10ge1xuICBjb25zdCBlZmZlY3RzOiBDaHJpc3RpYW5pdHlDYXJkRWZmZWN0W10gPSBbXTtcbiAgaWYgKCFjYXJkLnN0cmF0ZWd5KSByZXR1cm4gZWZmZWN0cztcbiAgY29uc3QgdGV4dCA9IChjYXJkLmFiaWxpdGllcz8uWzBdPy50ZXh0ID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmIChjYXJkLnN0cmF0ZWd5ID09PSAnYnVmZicpIHtcbiAgICAvLyBvbl9hdHRhY2sgYnVmZiB0byBzZWxmIChjb21iYXQgZHVyYXRpb24pXG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2FsIGF0YWNhcicpICYmIHRleHQuaW5jbHVkZXMoJ2F0YXF1ZScpKSB7XG4gICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICBlZmZlY3RzLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiAnb25fYXR0YWNrJyxcbiAgICAgICAgc3RyYXRlZ3k6ICdidWZmJyxcbiAgICAgICAgdGFyZ2V0OiAnc2VsZicsXG4gICAgICAgIG11dGF0aW9uOiB7IHR5cGU6ICdidWZmX2F0dGFjaycsIGFtb3VudDogbiB9LFxuICAgICAgICBkdXJhdGlvbjogdGV4dC5pbmNsdWRlcygnZmluYWwgZGVsIHR1cm5vJykgPyAnY29tYmF0JyA6ICdwZXJtYW5lbnQnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIHBhc3NpdmUgYnVmZiB0byBhbGxfZnJpZW5kbHlcbiAgICBpZiAoXG4gICAgICAodGV4dC5pbmNsdWRlcygnbWllbnRyYXMnKSB8fCB0ZXh0LmluY2x1ZGVzKCd0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnbyBqdW50bycpKSAmJlxuICAgICAgdGV4dC5pbmNsdWRlcygnKycpICYmXG4gICAgICB0ZXh0LmluY2x1ZGVzKCdhdGFxdWUnKVxuICAgICkge1xuICAgICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgICAgZWZmZWN0cy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogJ3Bhc3NpdmUnLFxuICAgICAgICBzdHJhdGVneTogJ2J1ZmYnLFxuICAgICAgICB0YXJnZXQ6ICdhbGxfZnJpZW5kbHknLFxuICAgICAgICBtdXRhdGlvbjogeyB0eXBlOiAnYnVmZl9hdHRhY2snLCBhbW91bnQ6IG4gfSxcbiAgICAgICAgZHVyYXRpb246ICdwZXJtYW5lbnQnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhcmQuc3RyYXRlZ3kgPT09ICdkZXN0cm95Jykge1xuICAgIC8vIG9uX2RlYXRoIGRhbWFnZSB0byBhbGxfZW5lbXlcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnYWwgc2VyIGRlc3RydWlkbycpICYmIHRleHQuaW5jbHVkZXMoJ2Rhw7FvJykgJiYgdGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSkge1xuICAgICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgICAgZWZmZWN0cy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogJ29uX2RlYXRoJyxcbiAgICAgICAgc3RyYXRlZ3k6ICdkZXN0cm95JyxcbiAgICAgICAgdGFyZ2V0OiAnYWxsX2VuZW15JyxcbiAgICAgICAgbXV0YXRpb246IHsgdHlwZTogJ2RlYWxfZGFtYWdlJywgYW1vdW50OiBuIH0sXG4gICAgICAgIGR1cmF0aW9uOiAncGVybWFuZW50JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBvbl9kZWF0aCBkYW1hZ2UgdG8gb3Bwb25lbnQgbGVhZGVyXG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ2FsIHNlciBkZXN0cnVpZG8nKSAmJiB0ZXh0LmluY2x1ZGVzKCdkYcOxbycpICYmIHRleHQuaW5jbHVkZXMoJ2zDrWRlcicpKSB7XG4gICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICBlZmZlY3RzLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiAnb25fZGVhdGgnLFxuICAgICAgICBzdHJhdGVneTogJ2Rlc3Ryb3knLFxuICAgICAgICB0YXJnZXQ6ICdvcHBvbmVudF9sZWFkZXInLFxuICAgICAgICBtdXRhdGlvbjogeyB0eXBlOiAnZGVhbF9kYW1hZ2UnLCBhbW91bnQ6IG4gfSxcbiAgICAgICAgZHVyYXRpb246ICdwZXJtYW5lbnQnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdHM7XG59XG5cbi8vIC0tLSBDaGFyYWN0ZXIgc3RyYXRlZ3k6IG9uX2VudGVyICYgb25fZGVhdGggLS0tXG5cbmZ1bmN0aW9uIHJlc29sdmVDaGFyYWN0ZXJTdHJhdGVneUVudGVyKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNoOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGxvb2t1cDogQ2FyZExvb2t1cCB8IHVuZGVmaW5lZFxuKTogdm9pZCB7XG4gIGlmICghY2FyZC5zdHJhdGVneSkgcmV0dXJuO1xuICBjb25zdCB0ZXh0ID0gKGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wcCA9IG9wcG9uZW50U2VhdChzZWF0KTtcbiAgY29uc3Qgc2VlZCA9IGdhbWVTZWVkKGdhbWUpO1xuXG4gIHN3aXRjaCAoY2FyZC5zdHJhdGVneSkge1xuICAgIGNhc2UgJ2J1ZmYnOiB7XG4gICAgICBpZiAoIXRleHQuaW5jbHVkZXMoJ2FsIGVudHJhciBlbiBqdWVnbycpKSByZXR1cm47XG4gICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICBjb25zdCBpc0xpZmUgPSB0ZXh0LmluY2x1ZGVzKCd2aWRhJyk7XG4gICAgICBjb25zdCBpc0F0ayA9IHRleHQuaW5jbHVkZXMoJ2F0YXF1ZScpO1xuICAgICAgaWYgKCFpc0xpZmUgJiYgIWlzQXRrKSByZXR1cm47XG4gICAgICBpZiAodGV4dC5pbmNsdWRlcygndW5vIGRlIHR1cyBwZXJzb25hamVzJykgfHwgdGV4dC5pbmNsdWRlcygnMSBkZSB0dXMgcGVyc29uYWplcycpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHBpY2tCZXN0RnJpZW5kbHkoZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUsIGNoLmluc3RhbmNlSWQpO1xuICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgICAgICBpZiAoaXNBdGspIHRhcmdldC5hdHRhY2sgKz0gbjtcbiAgICAgICAgaWYgKGlzTGlmZSkge1xuICAgICAgICAgIHRhcmdldC5jdXJyZW50SHAgKz0gbjtcbiAgICAgICAgICB0YXJnZXQubWF4SHAgKz0gbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdGV4dC5pbmNsdWRlcygndG9kb3MgdHVzIHBlcnNvbmFqZXMnKSB8fFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCd0dXMgcGVyc29uYWplcyBlbiBqdWVnbycpXG4gICAgICApIHtcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lKSB7XG4gICAgICAgICAgaWYgKGMuaW5zdGFuY2VJZCA9PT0gY2guaW5zdGFuY2VJZCkgY29udGludWU7XG4gICAgICAgICAgaWYgKGlzQXRrKSBjLmF0dGFjayArPSBuO1xuICAgICAgICAgIGlmIChpc0xpZmUpIHtcbiAgICAgICAgICAgIGMuY3VycmVudEhwICs9IG47XG4gICAgICAgICAgICBjLm1heEhwICs9IG47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjYXNlICdkZXN0cm95Jzoge1xuICAgICAgaWYgKCF0ZXh0LmluY2x1ZGVzKCdhbCBlbnRyYXIgZW4ganVlZ28nKSAmJiAhdGV4dC5pbmNsdWRlcygnY3VhbmRvIGVudHJhIGVuIGp1ZWdvJykpIHJldHVybjtcbiAgICAgIC8vIFwiZGVzdHJ1eWUgdG9kb3MgbG9zIHBlcnNvbmFqZXMgZW4ganVlZ29cIlxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCdkZXN0cnV5ZSB0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnbycpIHx8XG4gICAgICAgIHRleHQuaW5jbHVkZXMoJ2JhcmFqYSBhIHRvZG9zIHBlcnNvbmFqZXMgZW4ganVlZ28nKVxuICAgICAgKSB7XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgICAgICAgZ2FtZS5wbGF5ZXJzW3NdLmJhdHRsZVpvbmUuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgIGlmIChjLmluc3RhbmNlSWQgIT09IGNoLmluc3RhbmNlSWQpIGMuY3VycmVudEhwID0gMDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcIkRlc3RydXllIDQgZGUgdHVzIGNhcnRhcyBkZSBvZnJlbmRhXCJcbiAgICAgICAgY29uc3Qgbk9mZiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0LnNwbGl0KCdkZXN0cnV5ZScpLnNsaWNlKC0xKVswXSA/PyAnJyk7XG4gICAgICAgIGlmIChuT2ZmID4gMCkge1xuICAgICAgICAgIGdhbWUucGxheWVyc1tzZWF0XS5vZmZlcmluZ3MgPSBnYW1lLnBsYXllcnNbc2VhdF0ub2ZmZXJpbmdzLnNsaWNlKG5PZmYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFwiYmFyYWphIDEgcGVyc29uYWplIG9wb25lbnRlXCIgKGJvdW5jZSlcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdiYXJhamEnKSAmJiAodGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSB8fCB0ZXh0LmluY2x1ZGVzKCdyaXZhbCcpKSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBbLi4uZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZV0uc29ydChcbiAgICAgICAgICAoYSwgYikgPT4gKGIuYXR0YWNrID8/IDApIC0gKGEuYXR0YWNrID8/IDApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obiwgdGFyZ2V0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICBib3VuY2VDaGFyYWN0ZXJUb0RlY2soZ2FtZSwgdGFyZ2V0c1tpXSwgb3BwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBcImJhcmFqYSAxIGRlIHR1cyBwZXJzb25hamVzIGVuIGp1ZWdvXCIgKHNlbGYgYm91bmNlKVxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCdiYXJhamEnKSAmJlxuICAgICAgICAodGV4dC5pbmNsdWRlcygndHVzIHBlcnNvbmFqZXMnKSB8fCB0ZXh0LmluY2x1ZGVzKCd1bm8gZGUgdHVzJykpXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZlRhcmdldHMgPSBnYW1lLnBsYXllcnNbc2VhdF0uYmF0dGxlWm9uZS5maWx0ZXIoXG4gICAgICAgICAgYyA9PiBjLmluc3RhbmNlSWQgIT09IGNoLmluc3RhbmNlSWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHNlbGZUYXJnZXRzLmxlbmd0aCkge1xuICAgICAgICAgIGJvdW5jZUNoYXJhY3RlclRvRGVjayhnYW1lLCBzZWxmVGFyZ2V0c1twc2V1ZG9SYW5kSW5kZXgoc2VsZlRhcmdldHMubGVuZ3RoLCBzZWVkKV0sIHNlYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFwiZGVzdHJ1eWUgMSBwZXJzb25hamUgb3BvbmVudGVcIlxuICAgICAgaWYgKHRleHQuaW5jbHVkZXMoJ2Rlc3RydXllJykgJiYgdGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgICAgIC8vIENvbmRpdGlvbmFsOiBcInF1ZSB0ZW5nYSBtZW5vcyBwdW50b3MgZGUgYXRhcXVlIHF1ZSBlc3RhIGNhcnRhXCJcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUuZmlsdGVyKGMgPT4ge1xuICAgICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdtZW5vcyBwdW50b3MgZGUgYXRhcXVlIHF1ZSBlc3RhJykpIHJldHVybiBjLmF0dGFjayA8IGNoLmF0dGFjaztcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4obiwgdGFyZ2V0cy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgdGV4dC5pbmNsdWRlcygnZWxpZ2UnKSB8fCBuID09PSAxXG4gICAgICAgICAgICAgID8gKHBpY2tNb3N0RGFuZ2Vyb3VzKHRhcmdldHMpID8/IHRhcmdldHNbMF0pXG4gICAgICAgICAgICAgIDogdGFyZ2V0c1tpXTtcbiAgICAgICAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY3VycmVudEhwID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBcImluZmxpZ2UgTiBwdW50b3MgZGUgZGHDsW8gYSAxLzIgcGVyc29uYWplKHMpIG9wb25lbnRlKHMpXCJcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdpbmZsaWdlJykgJiYgdGV4dC5pbmNsdWRlcygnZGHDsW8nKSkge1xuICAgICAgICBjb25zdCBkbWcgPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMTtcbiAgICAgICAgLy8gSG93IG1hbnkgdGFyZ2V0cz9cbiAgICAgICAgY29uc3QgY291bnRNYXRjaCA9IHRleHQubWF0Y2goL2FcXHMrKFxcZCt8dW58ZG9zfHRyZXMpXFxzK3BlcnNvbmFqZS9pKTtcbiAgICAgICAgY29uc3QgblRhcmdldHMgPSBjb3VudE1hdGNoID8gcGFyc2VTcGFuaXNoTnVtYmVyKGNvdW50TWF0Y2hbMV0pIHx8IDEgOiAxO1xuICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4uZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZV0uc29ydCgoYSwgYikgPT4gYS5jdXJyZW50SHAgLSBiLmN1cnJlbnRIcCk7XG4gICAgICAgIC8vIENvaW4tZmxpcCBjb25kaXRpb25hbFxuICAgICAgICBpZiAodGV4dC5pbmNsdWRlcygnbGFuemEnKSAmJiB0ZXh0LmluY2x1ZGVzKCdtb25lZGEnKSkge1xuICAgICAgICAgIGlmICghY29pbkZsaXAoZ2FtZSkpIHtcbiAgICAgICAgICAgIC8vIFwic2kgc2FsZSBjcnV6XCIg4oCUIHVzdWFsbHkgbm90aGluZyBvciBvd24gY2hhcmFjdGVyIGJvdW5jZWRcbiAgICAgICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdzaSBzYWxlIGNydXonKSAmJiB0ZXh0LmluY2x1ZGVzKCd0dXMgcGVyc29uYWplcycpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHNlbGZUID0gZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGMgPT4gYy5pbnN0YW5jZUlkICE9PSBjaC5pbnN0YW5jZUlkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChzZWxmVC5sZW5ndGgpIHNlbGZUW3BzZXVkb1JhbmRJbmRleChzZWxmVC5sZW5ndGgsIHNlZWQpXS5jdXJyZW50SHAgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKG5UYXJnZXRzLCBzb3J0ZWQubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgc29ydGVkW2ldLmN1cnJlbnRIcCA9IE1hdGgubWF4KDAsIHNvcnRlZFtpXS5jdXJyZW50SHAgLSBkbWcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ3NlYXJjaCc6IHtcbiAgICAgIGlmIChcbiAgICAgICAgIXRleHQuaW5jbHVkZXMoJ2FsIGVudHJhciBlbiBqdWVnbycpICYmXG4gICAgICAgICF0ZXh0LmluY2x1ZGVzKCdjdWFuZG8gZW50cmEgZW4ganVlZ28nKSAmJlxuICAgICAgICAhdGV4dC5pbmNsdWRlcygnYnVzY2EnKVxuICAgICAgKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIXRleHQuaW5jbHVkZXMoJ2J1c2NhJykpIHJldHVybjtcbiAgICAgIGNvbnN0IHR5cGVNYXA6IEFycmF5PFtzdHJpbmcsIENocmlzdGlhbml0eUNhcmRUeXBlXT4gPSBbXG4gICAgICAgIFsncGVyc29uYWplJywgJ2NoYXJhY3RlciddLFxuICAgICAgICBbJ2hlcnJhbWllbnRhJywgJ3Rvb2wnXSxcbiAgICAgICAgWydzYWJpZHVyw61hJywgJ3dpc2RvbSddLFxuICAgICAgICBbJ3NhYmlkdXJpYScsICd3aXNkb20nXSxcbiAgICAgICAgWydldmVudG8nLCAnZXZlbnQnXSxcbiAgICAgICAgWydhY2Npw7NuJywgJ2FjdGlvbiddLFxuICAgICAgICBbJ2FjY2lvbicsICdhY3Rpb24nXSxcbiAgICAgICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgICAgIFsnbHVnYXInLCAncGxhY2UnXSxcbiAgICAgIF07XG4gICAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB0eXBlXSBvZiB0eXBlTWFwKSB7XG4gICAgICAgIGlmICghdGV4dC5pbmNsdWRlcyhrZXl3b3JkKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHBvd2VyID0gdGV4dC5pbmNsdWRlcygncG9kZXIgZGVzdGFjYWRvJylcbiAgICAgICAgICA/ICdmZWF0dXJlZCdcbiAgICAgICAgICA6IHRleHQuaW5jbHVkZXMoJ3BvZGVyIG5vcm1hbCcpXG4gICAgICAgICAgICA/ICdub3JtYWwnXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcHV0SW5QbGF5ID1cbiAgICAgICAgICB0ZXh0LmluY2x1ZGVzKCdwb25sYSBlbiBqdWVnbycpIHx8IHRleHQuaW5jbHVkZXMoJ2p1w6lnYWxhJykgfHwgdGV4dC5pbmNsdWRlcygnanVlZ2FsYScpO1xuICAgICAgICBzZWFyY2hEZWNrRm9yQ2FyZChcbiAgICAgICAgICBnYW1lLFxuICAgICAgICAgIHNlYXQsXG4gICAgICAgICAgZGVmID0+IGRlZi50eXBlID09PSB0eXBlICYmICghcG93ZXIgfHwgZGVmLnBvd2VyID09PSBwb3dlciksXG4gICAgICAgICAgbG9va3VwLFxuICAgICAgICAgIHB1dEluUGxheVxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2RlY2twZWVrJzoge1xuICAgICAgaWYgKCF0ZXh0LmluY2x1ZGVzKCdhbCBlbnRyYXIgZW4ganVlZ28nKSAmJiAhdGV4dC5pbmNsdWRlcygnY3VhbmRvIGVudHJhIGVuIGp1ZWdvJykpIHJldHVybjtcbiAgICAgIGNvbnN0IG4gPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMztcbiAgICAgIGRlY2twZWVrUmVvcmRlcihnYW1lLCBzZWF0LCBuLCBsb29rdXApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSAnbWluZGNvbnRyb2wnOiB7XG4gICAgICBpZiAoIXRleHQuaW5jbHVkZXMoJ2FsIGVudHJhciBlbiBqdWVnbycpICYmICF0ZXh0LmluY2x1ZGVzKCdjdWFuZG8gZW50cmEgZW4ganVlZ28nKSkgcmV0dXJuO1xuICAgICAgLy8gXCJwdWVkZXMgZWxlZ2lyIHVuIHBlcnNvbmFqZSBvcG9uZW50ZSAuLi4gY29uIG1lbm9zIHB1bnRvcyBkZSBhdGFxdWUgcXVlIGVzdGVcIlxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0LmluY2x1ZGVzKCdtZW5vcyBwdW50b3MgZGUgYXRhcXVlIHF1ZSBlc3RlJykgfHxcbiAgICAgICAgdGV4dC5pbmNsdWRlcygnbWVub3MgcHVudG9zIGRlIGF0YXF1ZSBxdWUgZXN0YScpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZS5maW5kKGMgPT4gYy5hdHRhY2sgPCBjaC5hdHRhY2spO1xuICAgICAgICBpZiAodGFyZ2V0KSBzdGVhbENoYXJhY3RlcihnYW1lLCB0YXJnZXQsIG9wcCwgc2VhdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFwicHVlZGVzIGVsZWdpciB1biBwZXJzb25hamUgb3BvbmVudGVcIiBnZW5lcmljIHN0ZWFsXG4gICAgICBpZiAoXG4gICAgICAgIHRleHQuaW5jbHVkZXMoJ3BlcnNvbmFqZSBvcG9uZW50ZScpICYmXG4gICAgICAgICh0ZXh0LmluY2x1ZGVzKCdwb24nKSB8fCB0ZXh0LmluY2x1ZGVzKCdjb2xvY2EnKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBwaWNrTW9zdFZ1bG5lcmFibGUoZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSk7XG4gICAgICAgIGlmICh0YXJnZXQpIHN0ZWFsQ2hhcmFjdGVyKGdhbWUsIHRhcmdldCwgb3BwLCBzZWF0KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ3JldmVhbCc6IHtcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdsYW56YScpICYmIHRleHQuaW5jbHVkZXMoJ21vbmVkYScpKSB7XG4gICAgICAgIGlmIChjb2luRmxpcChnYW1lKSkgZ2FtZS5wbGF5ZXJzW29wcF0uaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGV4dC5pbmNsdWRlcygnb3BvbmVudGUnKSAmJiB0ZXh0LmluY2x1ZGVzKCdtYW5vJykpIHtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW29wcF0uaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodGV4dC5pbmNsdWRlcygnanVnYWRvcmVzJykgJiYgdGV4dC5pbmNsdWRlcygnbWFubycpKSB7XG4gICAgICAgIGdhbWUucGxheWVycy5QMS5oYW5kUmV2ZWFsZWQgPSB0cnVlO1xuICAgICAgICBnYW1lLnBsYXllcnMuUDIuaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNhc2UgJ2FjY2VsZXJhdGUnOiB7XG4gICAgICAvLyBQYXNzaXZlOiBjYW5BdHRhY2sgb24gZW50ZXJcbiAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdwdWVkZSBhdGFjYXIgY3VhbmRvIGVudHJhJykgfHwgdGV4dC5pbmNsdWRlcygncHVlZGUgYXRhY2FyIGVsIHR1cm5vJykpIHtcbiAgICAgICAgY2guY2FuQXR0YWNrID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQ2hhcmFjdGVyU3RyYXRlZ3lEZWF0aChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjaDogQ2hyaXN0aWFuaXR5Q2hhcmFjdGVySW5zdGFuY2UsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBfbG9va3VwOiBDYXJkTG9va3VwIHwgdW5kZWZpbmVkXG4pOiB2b2lkIHtcbiAgaWYgKCFjYXJkLnN0cmF0ZWd5KSByZXR1cm47XG4gIGNvbnN0IHRleHQgPSAoY2FyZC5hYmlsaXRpZXM/LlswXT8udGV4dCA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgb3BwID0gb3Bwb25lbnRTZWF0KHNlYXQpO1xuXG4gIGlmIChjYXJkLnN0cmF0ZWd5ID09PSAnZGVzdHJveScgJiYgdGV4dC5pbmNsdWRlcygnYWwgc2VyIGRlc3RydWlkbycpKSB7XG4gICAgLy8gXCJiYXJhamEgYSB0b2RvcyBwZXJzb25hamVzIGVuIGp1ZWdvXCIgb24gZGVhdGhcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnYmFyYWphIGEgdG9kb3MgcGVyc29uYWplcycpKSB7XG4gICAgICBmb3IgKGNvbnN0IHMgb2YgWydQMScsICdQMiddIGFzIENocmlzdGlhbml0eVNlYXRbXSkge1xuICAgICAgICBnYW1lLnBsYXllcnNbc10uYmF0dGxlWm9uZS5mb3JFYWNoKGMgPT4gKGMuY3VycmVudEhwID0gMCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBcImJhcmFqYSBOIGRlIHR1cyBwZXJzb25hamVzXCIgb24gZGVhdGhcbiAgICBpZiAodGV4dC5pbmNsdWRlcygnYmFyYWphJykgJiYgdGV4dC5pbmNsdWRlcygndHVzIHBlcnNvbmFqZXMnKSkge1xuICAgICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgICAgY29uc3Qgc2VsZlQgPSBbLi4uZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmVdLnNsaWNlKDAsIG4pO1xuICAgICAgZm9yIChjb25zdCBjIG9mIHNlbGZUKSBib3VuY2VDaGFyYWN0ZXJUb0RlY2soZ2FtZSwgYywgc2VhdCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhcmQuc3RyYXRlZ3kgPT09ICdtaW5kY29udHJvbCcgJiYgdGV4dC5pbmNsdWRlcygnYWwgc2VyIGRlc3RydWlkbycpKSB7XG4gICAgLy8gXCJwb24gYWwgcGVyc29uYWplIHF1ZSBkZXN0cnV5YSBlc3RhIGNhcnRhIGVuIHR1IHpvbmFcIlxuICAgIC8vIENhbid0IHJlbGlhYmx5IGlkZW50aWZ5IGF0dGFja2VyIGF0IHRoaXMgcG9pbnQsIHNraXBcbiAgfVxufVxuXG4vLyAtLS0gRGVja3BlZWsgLyByZW9yZGVyIC0tLVxuXG5mdW5jdGlvbiBkZWNrcGVla1Jlb3JkZXIoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdCxcbiAgbjogbnVtYmVyLFxuICBsb29rdXA6IENhcmRMb29rdXAgfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBjb25zdCB0b3AgPSBnYW1lLnNoYXJlZERlY2suc2xpY2UoMCwgbik7XG4gIGlmICghdG9wLmxlbmd0aCkgcmV0dXJuO1xuICAvLyBQdWxsIGNhcmRzIG1hdGNoaW5nIHR5cGUgdG8gaGFuZCAoZm9yIGRlY2twZWVrK2RyYXcgY29tYm9zKVxuICAvLyBGb3Igc2ltcGxpY2l0eTogc29ydCB0b3AgTiBieSBkZXNjZW5kaW5nIGNvc3QsIGtlZXBpbmcgaGlnaGVzdC12YWx1ZSBjYXJkcyBvbiB0b3BcbiAgaWYgKGxvb2t1cCkge1xuICAgIHRvcC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBkYSA9IGxvb2t1cChhKTtcbiAgICAgIGNvbnN0IGRiID0gbG9va3VwKGIpO1xuICAgICAgcmV0dXJuIChkYj8uY29zdCA/PyAwKSAtIChkYT8uY29zdCA/PyAwKTtcbiAgICB9KTtcbiAgfVxuICBnYW1lLnNoYXJlZERlY2suc3BsaWNlKDAsIG4sIC4uLnRvcCk7XG4gIC8vIENoZWNrIGlmIHRoZSBhYmlsaXR5IGxldHMgdXMgZHJhdyBhIGZvdW5kIGNhcmRcbiAgY29uc3QgZGVmID0gbG9va3VwPy4oZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUuYXQoLTEpPy5jYXJkSWQgPz8gJycpO1xuICBjb25zdCB0ZXh0ID0gKGRlZj8uYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJycpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0ZXh0LmluY2x1ZGVzKCdwb25lcicpICYmIHRleHQuaW5jbHVkZXMoJ21hbm8nKSAmJiB0b3AubGVuZ3RoKSB7XG4gICAgY29uc3QgZHJhd24gPSBnYW1lLnNoYXJlZERlY2suc2hpZnQoKTtcbiAgICBpZiAoZHJhd24pIGdhbWUucGxheWVyc1tzZWF0XS5oYW5kPy5wdXNoKGRyYXduKTtcbiAgfVxufVxuXG4vLyAtLS0gSW5saW5lIGNsZWFudXAgYWZ0ZXIgY2FyZCBlZmZlY3RzIC0tLVxuXG5mdW5jdGlvbiBpbmxpbmVDbGVhbnVwKGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSwgbG9va3VwOiBDYXJkTG9va3VwIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgY29uc3QgZGVzdHJveWVkID0gZ2FtZS5wbGF5ZXJzW3NdLmJhdHRsZVpvbmUuZmlsdGVyKGMgPT4gYy5jdXJyZW50SHAgPD0gMCk7XG4gICAgZm9yIChjb25zdCBjaCBvZiBkZXN0cm95ZWQpIHtcbiAgICAgIGZpcmVFZmZlY3RzKGdhbWUsIGNoLCAnb25fZGVhdGgnLCBjaC5vd25lcik7XG4gICAgICBhcHBseVBhc3NpdmVDb3N0TW9kaWZpZXJzKGdhbWUucGxheWVyc1tjaC5vd25lcl0sIGNoLmluc3RhbmNlSWQsIG51bGwsIGZhbHNlKTtcbiAgICAgIGlmIChsb29rdXApIHtcbiAgICAgICAgY29uc3QgZGVmID0gbG9va3VwKGNoLmNhcmRJZCk7XG4gICAgICAgIGlmIChkZWYpIHJlc29sdmVDaGFyYWN0ZXJTdHJhdGVneURlYXRoKGdhbWUsIGNoLCBkZWYsIGNoLm93bmVyIGFzIENocmlzdGlhbml0eVNlYXQsIGxvb2t1cCk7XG4gICAgICB9XG4gICAgfVxuICAgIGdhbWUuaGlzdG9yeVpvbmUucHVzaCguLi5kZXN0cm95ZWQubWFwKGMgPT4gYy5jYXJkSWQpKTtcbiAgICBnYW1lLnBsYXllcnNbc10uYmF0dGxlWm9uZSA9IGdhbWUucGxheWVyc1tzXS5iYXR0bGVab25lLmZpbHRlcihjID0+IGMuY3VycmVudEhwID4gMCk7XG4gIH1cbn1cblxuLy8gLS0tIEVmZmVjdCByZXNvbHV0aW9uIChINykgLS0tXG5cbmZ1bmN0aW9uIHJlc29sdmVDYXJkRWZmZWN0KFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBsb29rdXA/OiBDYXJkTG9va3VwXG4pOiB2b2lkIHtcbiAgY29uc3QgdGV4dCA9IGNhcmQuYWJpbGl0aWVzPy5bMF0/LnRleHQgPz8gJyc7XG4gIHN3aXRjaCAoY2FyZC5zdHJhdGVneSkge1xuICAgIGNhc2UgJ2RpcmVjdGRhbWFnZSc6XG4gICAgICBlZmZlY3REaXJlY3REYW1hZ2UoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXN0b3JlJzpcbiAgICAgIGVmZmVjdFJlc3RvcmUoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkcmF3JzpcbiAgICAgIGVmZmVjdERyYXcoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkaXNjYXJkJzpcbiAgICAgIGVmZmVjdERpc2NhcmQoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdidWZmJzpcbiAgICAgIGVmZmVjdEJ1ZmYoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkZXN0cm95JzpcbiAgICAgIGVmZmVjdERlc3Ryb3lDYXJkKGdhbWUsIGNhcmQsIHRleHQsIHNlYXQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgIGVmZmVjdFNlYXJjaChnYW1lLCBjYXJkLCB0ZXh0LCBzZWF0LCBsb29rdXApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZGVja3BlZWsnOlxuICAgICAgZWZmZWN0RGVja3BlZWsoZ2FtZSwgY2FyZCwgdGV4dCwgc2VhdCwgbG9va3VwKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21pbmRjb250cm9sJzpcbiAgICAgIGVmZmVjdE1pbmRjb250cm9sKGdhbWUsIGNhcmQsIHRleHQsIHNlYXQpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmV2ZWFsJzpcbiAgICAgIGVmZmVjdFJldmVhbChnYW1lLCBjYXJkLCB0ZXh0LCBzZWF0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FjY2VsZXJhdGUnOlxuICAgICAgZWZmZWN0QWNjZWxlcmF0ZShnYW1lLCBjYXJkLCB0ZXh0LCBzZWF0KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Nsb3dkb3duJzpcbiAgICAgIGVmZmVjdFNsb3dkb3duKGdhbWUsIGNhcmQsIHRleHQsIHNlYXQpO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gZWZmZWN0RGlyZWN0RGFtYWdlKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICBjb25zdCBvcHBvbmVudCA9IG9wcG9uZW50U2VhdChzZWF0KTtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGxldCBkbWc6IG51bWJlcjtcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCd0YW50b3MnKSkge1xuICAgIGRtZyA9IGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICBkbWcgPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCk7XG4gIH1cbiAgaWYgKGRtZyA8PSAwKSByZXR1cm47XG4gIGdhbWUucGxheWVyc1tvcHBvbmVudF0ubGVhZGVySHAgPSBNYXRoLm1heCgwLCBnYW1lLnBsYXllcnNbb3Bwb25lbnRdLmxlYWRlckhwIC0gZG1nKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0UmVzdG9yZShcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG4gPSBNYXRoLm1heCgxLCBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMSk7XG4gIGlmIChsb3dlci5pbmNsdWRlcygnbG9zIGzDrWRlcmVzJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2xvcyBsaWRlcmVzJykpIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgWydQMScsICdQMiddIGFzIENocmlzdGlhbml0eVNlYXRbXSkge1xuICAgICAgY29uc3QgcCA9IGdhbWUucGxheWVyc1tzXTtcbiAgICAgIHAubGVhZGVySHAgPSBNYXRoLm1pbihwLmxlYWRlck1heEhwLCBwLmxlYWRlckhwICsgbik7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3R1cyBwZXJzb25hamVzJykgfHwgbG93ZXIuaW5jbHVkZXMoJ3BlcnNvbmFqZXMgZW4ganVlZ28nKSkge1xuICAgIGZvciAoY29uc3QgY2ggb2YgZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUpIHtcbiAgICAgIGNoLmN1cnJlbnRIcCA9IE1hdGgubWluKGNoLm1heEhwLCBjaC5jdXJyZW50SHAgKyBuKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChcbiAgICBsb3dlci5pbmNsdWRlcygnZGVsIGzDrWRlcicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2FsIGzDrWRlcicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2RlbCBsaWRlcicpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2FsIGxpZGVyJylcbiAgKSB7XG4gICAgY29uc3QgcCA9IGdhbWUucGxheWVyc1tzZWF0XTtcbiAgICBwLmxlYWRlckhwID0gTWF0aC5taW4ocC5sZWFkZXJNYXhIcCwgcC5sZWFkZXJIcCArIG4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdERyYXcoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHRleHQ6IHN0cmluZyxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2xvcyBqdWdhZG9yZXMnKSkge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIGRyYXdDYXJkRm9yKGdhbWUsICdQMScpO1xuICAgICAgZHJhd0NhcmRGb3IoZ2FtZSwgJ1AyJyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3BvciBjYWRhIHBlcnNvbmFqZSBvcG9uZW50ZScpKSB7XG4gICAgY29uc3QgbiA9IGdhbWUucGxheWVyc1tvcHBvbmVudFNlYXQoc2VhdCldLmJhdHRsZVpvbmUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBkcmF3Q2FyZEZvcihnYW1lLCBzZWF0KTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbiA9IE1hdGgubWF4KDEsIHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIGRyYXdDYXJkRm9yKGdhbWUsIHNlYXQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3REaXNjYXJkKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICBjb25zdCBsb3dlciA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3Qgb3Bwb25lbnQgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG4gIGlmIChcbiAgICBsb3dlci5pbmNsdWRlcygnYW1ib3MganVnYWRvcmVzIGRlc2NhcnRhbiBzdSBtYW5vJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnbG9zIGp1Z2Fkb3JlcyBkZXNjYXJ0YW4gc3UgbWFubycpXG4gICkge1xuICAgIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgICBjb25zdCBwID0gZ2FtZS5wbGF5ZXJzW3NdO1xuICAgICAgZ2FtZS5oaXN0b3J5Wm9uZS5wdXNoKC4uLihwLmhhbmQgPz8gW10pKTtcbiAgICAgIHAuaGFuZCA9IFtdO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKFxuICAgIChsb3dlci5pbmNsdWRlcygnb3BvbmVudGUnKSAmJiBsb3dlci5pbmNsdWRlcygnYXphcicpKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCd0dSBvcG9uZW50ZSBkZXNjYXJ0YScpXG4gICkge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1heCgxLCBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMSk7XG4gICAgY29uc3Qgb3AgPSBnYW1lLnBsYXllcnNbb3Bwb25lbnRdO1xuICAgIGNvbnN0IGhhbmQgPSBvcC5oYW5kID8/IFtdO1xuICAgIGxldCBzZWVkID0gZ2FtZS5yZXZpc2lvbiAqIDMxICsgZ2FtZS50dXJuQ291bnQgKiA3O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbiAmJiBoYW5kLmxlbmd0aCA+IDA7IGkrKykge1xuICAgICAgc2VlZCA9IChzZWVkICogMTY2NDUyNSArIDEwMTM5MDQyMjMpICYgMHhmZmZmZmZmZjtcbiAgICAgIGNvbnN0IGlkeCA9IE1hdGguYWJzKHNlZWQpICUgaGFuZC5sZW5ndGg7XG4gICAgICBnYW1lLmhpc3Rvcnlab25lLnB1c2goaGFuZFtpZHhdKTtcbiAgICAgIGhhbmQuc3BsaWNlKGlkeCwgMSk7XG4gICAgfVxuICAgIG9wLmhhbmQgPSBoYW5kO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdEJ1ZmYoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHRleHQ6IHN0cmluZyxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gIGNvbnN0IGlzQXRrID0gbG93ZXIuaW5jbHVkZXMoJ2F0YXF1ZScpO1xuICBjb25zdCBpc0xpZmUgPSBsb3dlci5pbmNsdWRlcygndmlkYScpO1xuICBjb25zdCBpc1R1cm4gPSBsb3dlci5pbmNsdWRlcygnZmluYWwgZGVsIHR1cm5vJyk7XG5cbiAgY29uc3QgYXBwbHlCdWZmID0gKGNoOiBDaHJpc3RpYW5pdHlDaGFyYWN0ZXJJbnN0YW5jZSkgPT4ge1xuICAgIGlmIChpc0F0aykge1xuICAgICAgaWYgKGlzVHVybikgY2guY29tYmF0QXR0YWNrQnVmZiA9IChjaC5jb21iYXRBdHRhY2tCdWZmID8/IDApICsgbjtcbiAgICAgIGVsc2UgY2guYXR0YWNrICs9IG47XG4gICAgfVxuICAgIGlmIChpc0xpZmUpIHtcbiAgICAgIGNoLmN1cnJlbnRIcCArPSBuO1xuICAgICAgY2gubWF4SHAgKz0gbjtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCd0dXMgcGVyc29uYWplcycpIHx8IGxvd2VyLmluY2x1ZGVzKCdsb3MgcGVyc29uYWplcyBlbiBqdWVnbyBqdW50bycpKSB7XG4gICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUuZm9yRWFjaChhcHBseUJ1ZmYpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VuIHBlcnNvbmFqZSBlbiBqdWVnbycpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ3VubyBkZSB0dXMgcGVyc29uYWplcycpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJzEgcGVyc29uYWplJylcbiAgKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gbG93ZXIuaW5jbHVkZXMoJ29wb25lbnRlJylcbiAgICAgID8gcGlja01vc3RWdWxuZXJhYmxlKGdhbWUucGxheWVyc1tvcHBvbmVudFNlYXQoc2VhdCldLmJhdHRsZVpvbmUpXG4gICAgICA6IHBpY2tCZXN0RnJpZW5kbHkoZ2FtZS5wbGF5ZXJzW3NlYXRdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIGFwcGx5QnVmZih0YXJnZXQpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBGYWxsYmFjazogYnVmZiBhbGwgb3duXG4gIGdhbWUucGxheWVyc1tzZWF0XS5iYXR0bGVab25lLmZvckVhY2goYXBwbHlCdWZmKTtcbn1cblxuZnVuY3Rpb24gZWZmZWN0RGVzdHJveUNhcmQoXG4gIGdhbWU6IENocmlzdGlhbml0eUdhbWVTdGF0ZSxcbiAgY2FyZDogQ2hyaXN0aWFuaXR5Q2FyZERlZmluaXRpb24sXG4gIHRleHQ6IHN0cmluZyxcbiAgc2VhdDogQ2hyaXN0aWFuaXR5U2VhdFxuKTogdm9pZCB7XG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHAgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG5cbiAgLy8gXCJCYXJhamEgYSB0b2RvcyBwZXJzb25hamVzIGVuIGp1ZWdvXCIgLyBcImRlc3RydXllIHRvZG9zXCJcbiAgaWYgKFxuICAgIGxvd2VyLmluY2x1ZGVzKCd0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnbycpIHx8XG4gICAgKGxvd2VyLmluY2x1ZGVzKCd0b2RvcycpICYmIGxvd2VyLmluY2x1ZGVzKCdwZXJzb25hamVzJykpXG4gICkge1xuICAgIGZvciAoY29uc3QgcyBvZiBbJ1AxJywgJ1AyJ10gYXMgQ2hyaXN0aWFuaXR5U2VhdFtdKSB7XG4gICAgICBnYW1lLnBsYXllcnNbc10uYmF0dGxlWm9uZS5mb3JFYWNoKGMgPT4gKGMuY3VycmVudEhwID0gMCkpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkxvcyBqdWdhZG9yZXMgZWxpZ2VuIHVubyBkZSBzdXMgcGVyc29uYWplc1wiIC0gZXZlcnlvbmUga2VlcHMgb25lXG4gIGlmIChsb3dlci5pbmNsdWRlcygnbG9zIGp1Z2Fkb3JlcyBlbGlnZW4gdW5vJykpIHtcbiAgICBmb3IgKGNvbnN0IHMgb2YgWydQMScsICdQMiddIGFzIENocmlzdGlhbml0eVNlYXRbXSkge1xuICAgICAgY29uc3Qgem9uZSA9IGdhbWUucGxheWVyc1tzXS5iYXR0bGVab25lO1xuICAgICAgaWYgKHpvbmUubGVuZ3RoIDw9IDEpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2VlcGVyID0gcGlja0Jlc3RGcmllbmRseSh6b25lKTtcbiAgICAgIHpvbmUuZm9yRWFjaChjID0+IHtcbiAgICAgICAgaWYgKGMuaW5zdGFuY2VJZCAhPT0ga2VlcGVyPy5pbnN0YW5jZUlkKSBjLmN1cnJlbnRIcCA9IDA7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gXCJMb3MganVnYWRvcmVzIGVtcGFyZWphbiBkZSBpenF1aWVyZGEgYSBkZXJlY2hhIGxvcyBwZXJzb25hamVzIGVuIGp1ZWdvLiBTZSBhdGFjYW4gZW50cmUgc8OtLlwiXG4gIGlmIChcbiAgICBsb3dlci5pbmNsdWRlcygnZW1wYXJlamFuJykgfHxcbiAgICBsb3dlci5pbmNsdWRlcygnYXRhY2FuIGVudHJlIHPDrScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2F0YWNhbiBlbnRyZSBzaScpXG4gICkge1xuICAgIGNvbnN0IHAxID0gZ2FtZS5wbGF5ZXJzLlAxLmJhdHRsZVpvbmU7XG4gICAgY29uc3QgcDIgPSBnYW1lLnBsYXllcnMuUDIuYmF0dGxlWm9uZTtcbiAgICBjb25zdCBwYWlycyA9IE1hdGgubWluKHAxLmxlbmd0aCwgcDIubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhaXJzOyBpKyspIHtcbiAgICAgIGNvbnN0IGEgPSBwMVtpXTtcbiAgICAgIGNvbnN0IGIgPSBwMltpXTtcbiAgICAgIGNvbnN0IGFBdGsgPSBhLmF0dGFjaztcbiAgICAgIGEuY3VycmVudEhwID0gTWF0aC5tYXgoMCwgYS5jdXJyZW50SHAgLSBiLmF0dGFjayk7XG4gICAgICBiLmN1cnJlbnRIcCA9IE1hdGgubWF4KDAsIGIuY3VycmVudEhwIC0gYUF0ayk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwiSW5mbGlnZSBOIHB1bnRvcyBkZSBkYcOxbyBhIHVuIHBlcnNvbmFqZSBvcG9uZW50ZSBlbiBqdWVnb1wiXG4gIGlmIChsb3dlci5pbmNsdWRlcygnaW5mbGlnZScpICYmIGxvd2VyLmluY2x1ZGVzKCdkYcOxbycpICYmIGxvd2VyLmluY2x1ZGVzKCdvcG9uZW50ZScpKSB7XG4gICAgY29uc3QgZG1nID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgY29uc3QgdGFyZ2V0ID0gcGlja01vc3RWdWxuZXJhYmxlKGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jdXJyZW50SHAgPSBNYXRoLm1heCgwLCB0YXJnZXQuY3VycmVudEhwIC0gZG1nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkJhcmFqYSB1biBwZXJzb25hamUgb3BvbmVudGUgZW4ganVlZ29cIiAoYm91bmNlKVxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2JhcmFqYScpICYmIGxvd2VyLmluY2x1ZGVzKCdvcG9uZW50ZScpKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gcGlja01vc3REYW5nZXJvdXMoZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSk7XG4gICAgaWYgKHRhcmdldCkgYm91bmNlQ2hhcmFjdGVyVG9EZWNrKGdhbWUsIHRhcmdldCwgb3BwKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkRlc3RydXllIHVuIHBlcnNvbmFqZSBvcG9uZW50ZSBlbiBqdWVnb1wiXG4gIGlmIChsb3dlci5pbmNsdWRlcygnZGVzdHJ1eWUnKSAmJiBsb3dlci5pbmNsdWRlcygnb3BvbmVudGUnKSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHBpY2tNb3N0RGFuZ2Vyb3VzKGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIHRhcmdldC5jdXJyZW50SHAgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwiTGFuemEgMSBtb25lZGEuIFNpIHNhbGUgY2FyYSwgZGVzdHJ1eWUgMSBwZXJzb25hamUgZGUgdHUgb3BvbmVudGVcIlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2xhbnphJykgJiYgbG93ZXIuaW5jbHVkZXMoJ21vbmVkYScpKSB7XG4gICAgaWYgKGNvaW5GbGlwKGdhbWUpKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBwaWNrTW9zdERhbmdlcm91cyhnYW1lLnBsYXllcnNbb3BwXS5iYXR0bGVab25lKTtcbiAgICAgIGlmICh0YXJnZXQpIHRhcmdldC5jdXJyZW50SHAgPSAwO1xuICAgIH0gZWxzZSBpZiAobG93ZXIuaW5jbHVkZXMoJ3NpIHNhbGUgY3J1eicpICYmIGxvd2VyLmluY2x1ZGVzKCd0dSBvcG9uZW50ZScpKSB7XG4gICAgICAvLyBvcHBvbmVudCBib3VuY2VzL2Rlc3Ryb3lzIG9uZSBvZiB0aGVpciBvd25cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gXCJJbmZsaWdlIDEgcHVudG8gZGUgZGHDsW8gYSB0b2RvcyBsb3MgcGVyc29uYWplcyBlbiBqdWVnb1wiIChlLmcuIHBsYWd1ZSBldmVudHMpXG4gIGlmIChsb3dlci5pbmNsdWRlcygnaW5mbGlnZScpICYmIGxvd2VyLmluY2x1ZGVzKCd0b2RvcyBsb3MgcGVyc29uYWplcycpKSB7XG4gICAgY29uc3QgZG1nID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gICAgZm9yIChjb25zdCBzIG9mIFsnUDEnLCAnUDInXSBhcyBDaHJpc3RpYW5pdHlTZWF0W10pIHtcbiAgICAgIGdhbWUucGxheWVyc1tzXS5iYXR0bGVab25lLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGMuY3VycmVudEhwID0gTWF0aC5tYXgoMCwgYy5jdXJyZW50SHAgLSBkbWcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwiRGVzdHJ1eWUgTiBkZSB0dXMgY2FydGFzIGRlIG9mcmVuZGFcIlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3R1cyBjYXJ0YXMgZGUgb2ZyZW5kYScpICYmIGxvd2VyLmluY2x1ZGVzKCdkZXN0cnV5ZScpKSB7XG4gICAgY29uc3QgbiA9IHBhcnNlU3BhbmlzaE51bWJlcih0ZXh0KSB8fCAxO1xuICAgIGdhbWUucGxheWVyc1tzZWF0XS5vZmZlcmluZ3MgPSBnYW1lLnBsYXllcnNbc2VhdF0ub2ZmZXJpbmdzLnNsaWNlKG4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdFNlYXJjaChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0LFxuICBsb29rdXA6IENhcmRMb29rdXAgfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBjb25zdCBsb3dlciA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgdHlwZU1hcDogQXJyYXk8W3N0cmluZywgQ2hyaXN0aWFuaXR5Q2FyZFR5cGVdPiA9IFtcbiAgICBbJ3BlcnNvbmFqZScsICdjaGFyYWN0ZXInXSxcbiAgICBbJ2hlcnJhbWllbnRhJywgJ3Rvb2wnXSxcbiAgICBbJ3NhYmlkdXLDrWEnLCAnd2lzZG9tJ10sXG4gICAgWydzYWJpZHVyaWEnLCAnd2lzZG9tJ10sXG4gICAgWydldmVudG8nLCAnZXZlbnQnXSxcbiAgICBbJ2FjY2nDs24nLCAnYWN0aW9uJ10sXG4gICAgWydhY2Npb24nLCAnYWN0aW9uJ10sXG4gICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgWydsdWdhcicsICdwbGFjZSddLFxuICBdO1xuICBjb25zdCBwb3dlciA9IGxvd2VyLmluY2x1ZGVzKCdwb2RlciBkZXN0YWNhZG8nKVxuICAgID8gJ2ZlYXR1cmVkJ1xuICAgIDogbG93ZXIuaW5jbHVkZXMoJ3BvZGVyIG5vcm1hbCcpXG4gICAgICA/ICdub3JtYWwnXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IGxvd2VyLmluY2x1ZGVzKCdkb3MgY2FydGFzJykgfHwgbG93ZXIuaW5jbHVkZXMoJzIgY2FydGFzJykgPyAyIDogMTtcbiAgY29uc3QgcHV0SW5QbGF5ID1cbiAgICBsb3dlci5pbmNsdWRlcygncG9ubGEgZW4ganVlZ28nKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCdqdcOpZ2FsYScpIHx8XG4gICAgbG93ZXIuaW5jbHVkZXMoJ2p1ZWdhbGEnKSB8fFxuICAgIGxvd2VyLmluY2x1ZGVzKCdzaW4gY29zdG8nKTtcblxuICAvLyBEaXNjYXJkIGNvc3RcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdkZXNjYXJ0YSBkb3MgY2FydGFzJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2Rlc2NhcnRhcyBkb3MgY2FydGFzJykpIHtcbiAgICBjb25zdCBoYW5kID0gZ2FtZS5wbGF5ZXJzW3NlYXRdLmhhbmQgPz8gW107XG4gICAgY29uc3Qgc2VlZCA9IGdhbWVTZWVkKGdhbWUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4oMiwgaGFuZC5sZW5ndGgpOyBpKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IHBzZXVkb1JhbmRJbmRleChoYW5kLmxlbmd0aCAtIGksIHNlZWQgKyBpKTtcbiAgICAgIGdhbWUuaGlzdG9yeVpvbmUucHVzaChoYW5kLnNwbGljZShpZHgsIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB0eXBlXSBvZiB0eXBlTWFwKSB7XG4gICAgaWYgKCFsb3dlci5pbmNsdWRlcyhrZXl3b3JkKSkgY29udGludWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHNlYXJjaERlY2tGb3JDYXJkKFxuICAgICAgICBnYW1lLFxuICAgICAgICBzZWF0LFxuICAgICAgICBkZWYgPT4gZGVmLnR5cGUgPT09IHR5cGUgJiYgKCFwb3dlciB8fCBkZWYucG93ZXIgPT09IHBvd2VyKSxcbiAgICAgICAgbG9va3VwLFxuICAgICAgICBwdXRJblBsYXlcbiAgICAgICk7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdERlY2twZWVrKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXQsXG4gIGxvb2t1cDogQ2FyZExvb2t1cCB8IHVuZGVmaW5lZFxuKTogdm9pZCB7XG4gIGNvbnN0IG4gPSBwYXJzZVNwYW5pc2hOdW1iZXIodGV4dCkgfHwgMztcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHRvcCA9IGdhbWUuc2hhcmVkRGVjay5zbGljZSgwLCBuKTtcbiAgaWYgKCF0b3AubGVuZ3RoKSByZXR1cm47XG5cbiAgLy8gXCJwb25lciBlbiBqdWVnbyB0b2RhcyBsYXMgY2FydGFzIGRlIG9mcmVuZGEgZGUgcG9kZXIgbm9ybWFsXCIgZnJvbSB0b3AgTlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3BvbmVyIGVuIGp1ZWdvJykgJiYgbG93ZXIuaW5jbHVkZXMoJ29mcmVuZGEnKSAmJiBsb29rdXApIHtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRvcCkge1xuICAgICAgY29uc3QgZGVmID0gbG9va3VwKGlkKTtcbiAgICAgIGlmIChkZWY/LnR5cGUgPT09ICdvZmZlcmluZycpIHtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLm9mZmVyaW5ncy5wdXNoKHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiBgJHtzZWF0LnRvTG93ZXJDYXNlKCl9X2RwXyR7Z2FtZS5yZXZpc2lvbn1fJHtpZH1gLFxuICAgICAgICAgIGNhcmRJZDogaWQsXG4gICAgICAgICAgbmFtZTogZGVmLm5hbWUsXG4gICAgICAgICAgb3duZXI6IHNlYXQsXG4gICAgICAgICAgcmVhZHk6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IGRlZi5vZmZlcmluZ1ZhbHVlID8/IDEsXG4gICAgICAgIH0pO1xuICAgICAgICBnYW1lLnNoYXJlZERlY2suc3BsaWNlKGdhbWUuc2hhcmVkRGVjay5pbmRleE9mKGlkKSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFwibW9zdHJhciB1bmEgY2FydGEgZGUgWCBxdWUgZW5jdWVudHJlcyB5IHBvbmVybGEgZW4gdHUgbWFub1wiXG4gIGlmIChsb3dlci5pbmNsdWRlcygnbW9zdHJhcicpICYmIGxvd2VyLmluY2x1ZGVzKCdtYW5vJykgJiYgbG9va3VwKSB7XG4gICAgY29uc3QgdHlwZU1hcDogQXJyYXk8W3N0cmluZywgQ2hyaXN0aWFuaXR5Q2FyZFR5cGVdPiA9IFtcbiAgICAgIFsnaGVycmFtaWVudGEnLCAndG9vbCddLFxuICAgICAgWydvZnJlbmRhJywgJ29mZmVyaW5nJ10sXG4gICAgICBbJ3NhYmlkdXLDrWEnLCAnd2lzZG9tJ10sXG4gICAgICBbJ3NhYmlkdXJpYScsICd3aXNkb20nXSxcbiAgICAgIFsncGVyc29uYWplJywgJ2NoYXJhY3RlciddLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBba2V5d29yZCwgdHlwZV0gb2YgdHlwZU1hcCkge1xuICAgICAgaWYgKCFsb3dlci5pbmNsdWRlcyhrZXl3b3JkKSkgY29udGludWU7XG4gICAgICBjb25zdCBmb3VuZCA9IHRvcC5maW5kKGlkID0+IGxvb2t1cChpZCk/LnR5cGUgPT09IHR5cGUpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGdhbWUuc2hhcmVkRGVjay5zcGxpY2UoZ2FtZS5zaGFyZWREZWNrLmluZGV4T2YoZm91bmQpLCAxKTtcbiAgICAgICAgZ2FtZS5wbGF5ZXJzW3NlYXRdLmhhbmQ/LnB1c2goZm91bmQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLy8gXCJwb25lciBlbiB0dSBtYW5vXCIgZmlyc3QgY2FyZFxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ3BvbmVyJykgJiYgbG93ZXIuaW5jbHVkZXMoJ21hbm8nKSAmJiAhbG93ZXIuaW5jbHVkZXMoJ21vc3RyYXInKSkge1xuICAgIGNvbnN0IGRyYXduID0gZ2FtZS5zaGFyZWREZWNrLnNoaWZ0KCk7XG4gICAgaWYgKGRyYXduKSBnYW1lLnBsYXllcnNbc2VhdF0uaGFuZD8ucHVzaChkcmF3bik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUmVvcmRlciByZW1haW5pbmcgdG9wIGNhcmRzIG9wdGltYWxseSAoaGlnaGVzdCBjb3N0IGZpcnN0KVxuICBjb25zdCByZW1haW5pbmcgPSBnYW1lLnNoYXJlZERlY2suc2xpY2UoMCwgbik7XG4gIGlmIChsb29rdXApIHtcbiAgICByZW1haW5pbmcuc29ydCgoYSwgYikgPT4gKGxvb2t1cChiKT8uY29zdCA/PyAwKSAtIChsb29rdXAoYSk/LmNvc3QgPz8gMCkpO1xuICAgIGdhbWUuc2hhcmVkRGVjay5zcGxpY2UoMCwgbiwgLi4ucmVtYWluaW5nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlZmZlY3RNaW5kY29udHJvbChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wcCA9IG9wcG9uZW50U2VhdChzZWF0KTtcblxuICAvLyBcIkxvcyBqdWdhZG9yZXMgaW50ZXJjYW1iaWFuIHN1cyBwZXJzb25hamVzIGVuIGp1ZWdvXCJcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdpbnRlcmNhbWJpYW4gc3VzIHBlcnNvbmFqZXMnKSkge1xuICAgIGNvbnN0IHAxem9uZSA9IFsuLi5nYW1lLnBsYXllcnMuUDEuYmF0dGxlWm9uZV07XG4gICAgY29uc3QgcDJ6b25lID0gWy4uLmdhbWUucGxheWVycy5QMi5iYXR0bGVab25lXTtcbiAgICBnYW1lLnBsYXllcnMuUDEuYmF0dGxlWm9uZSA9IHAyem9uZS5tYXAoYyA9PiAoeyAuLi5jLCBjb250cm9sbGVyOiAnUDEnIH0pKTtcbiAgICBnYW1lLnBsYXllcnMuUDIuYmF0dGxlWm9uZSA9IHAxem9uZS5tYXAoYyA9PiAoeyAuLi5jLCBjb250cm9sbGVyOiAnUDInIH0pKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBcIkxvcyBqdWdhZG9yZXMgaW50ZXJjYW1iaWFuIHN1IG1hbm9cIlxuICBpZiAobG93ZXIuaW5jbHVkZXMoJ2ludGVyY2FtYmlhbiBzdSBtYW5vJykpIHtcbiAgICBjb25zdCBoMSA9IGdhbWUucGxheWVycy5QMS5oYW5kID8/IFtdO1xuICAgIGNvbnN0IGgyID0gZ2FtZS5wbGF5ZXJzLlAyLmhhbmQgPz8gW107XG4gICAgZ2FtZS5wbGF5ZXJzLlAxLmhhbmQgPSBoMjtcbiAgICBnYW1lLnBsYXllcnMuUDIuaGFuZCA9IGgxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdlbmVyaWMgXCJwb24gdW4gcGVyc29uYWplIG9wb25lbnRlXCIgc3RlYWxcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwZXJzb25hamUgb3BvbmVudGUnKSAmJiBsb3dlci5pbmNsdWRlcygncG9uJykpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwaWNrTW9zdFZ1bG5lcmFibGUoZ2FtZS5wbGF5ZXJzW29wcF0uYmF0dGxlWm9uZSk7XG4gICAgaWYgKHRhcmdldCkgc3RlYWxDaGFyYWN0ZXIoZ2FtZSwgdGFyZ2V0LCBvcHAsIHNlYXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdFJldmVhbChcbiAgZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLFxuICBjYXJkOiBDaHJpc3RpYW5pdHlDYXJkRGVmaW5pdGlvbixcbiAgdGV4dDogc3RyaW5nLFxuICBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0XG4pOiB2b2lkIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IG9wcCA9IG9wcG9uZW50U2VhdChzZWF0KTtcbiAgaWYgKGxvd2VyLmluY2x1ZGVzKCd0dSBvcG9uZW50ZSBtdWVzdHJhIHN1IG1hbm8nKSB8fCBsb3dlci5pbmNsdWRlcygnb3BvbmVudGUgbXVlc3RyYSBzdSBtYW5vJykpIHtcbiAgICBnYW1lLnBsYXllcnNbb3BwXS5oYW5kUmV2ZWFsZWQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGxvd2VyLmluY2x1ZGVzKCdqdWdhZG9yZXMganVlZ2FuIGNvbiBzdSBtYW5vJykpIHtcbiAgICBnYW1lLnBsYXllcnMuUDEuaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgICBnYW1lLnBsYXllcnMuUDIuaGFuZFJldmVhbGVkID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlZmZlY3RBY2NlbGVyYXRlKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICAvLyBBY3Rpb24vZXZlbnQtbGV2ZWwgYWNjZWxlcmF0ZTogZ2l2ZSB0ZW1wb3Jhcnkgb2ZmZXJpbmdzXG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBuID0gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQpIHx8IDE7XG4gIGlmIChsb3dlci5pbmNsdWRlcygnZ2VuZXJhJykgJiYgbG93ZXIuaW5jbHVkZXMoJ29mcmVuZGEnKSkge1xuICAgIGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPVxuICAgICAgKGdhbWUucGxheWVyc1tzZWF0XS50ZW1wb3JhcnlPZmZlcmluZ1Jlc2VydmUgPz8gMCkgKyBuO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVmZmVjdFNsb3dkb3duKFxuICBnYW1lOiBDaHJpc3RpYW5pdHlHYW1lU3RhdGUsXG4gIGNhcmQ6IENocmlzdGlhbml0eUNhcmREZWZpbml0aW9uLFxuICB0ZXh0OiBzdHJpbmcsXG4gIHNlYXQ6IENocmlzdGlhbml0eVNlYXRcbik6IHZvaWQge1xuICAvLyBBY3Rpb24tbGV2ZWwgc2xvd2Rvd246IHJldHVybiBhIGNoYXJhY3RlciB0byBoYW5kXG4gIGNvbnN0IGxvd2VyID0gdGV4dC50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHAgPSBvcHBvbmVudFNlYXQoc2VhdCk7XG4gIGlmIChsb3dlci5pbmNsdWRlcygnZGV2dWVsdmUnKSAmJiBsb3dlci5pbmNsdWRlcygncGVyc29uYWplJykgJiYgbG93ZXIuaW5jbHVkZXMoJ21hbm8nKSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHBpY2tNb3N0RGFuZ2Vyb3VzKGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUpO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGdhbWUucGxheWVyc1tvcHBdLmJhdHRsZVpvbmUgPSBnYW1lLnBsYXllcnNbb3BwXS5iYXR0bGVab25lLmZpbHRlcihcbiAgICAgICAgYyA9PiBjLmluc3RhbmNlSWQgIT09IHRhcmdldC5pbnN0YW5jZUlkXG4gICAgICApO1xuICAgICAgZ2FtZS5wbGF5ZXJzW29wcF0uaGFuZD8ucHVzaCh0YXJnZXQuY2FyZElkKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZHJhd0NhcmRGb3IoZ2FtZTogQ2hyaXN0aWFuaXR5R2FtZVN0YXRlLCBzZWF0OiBDaHJpc3RpYW5pdHlTZWF0KTogdm9pZCB7XG4gIGNvbnN0IGNhcmQgPSBnYW1lLnNoYXJlZERlY2suc2hpZnQoKTtcbiAgaWYgKCFjYXJkKSByZXR1cm47XG4gIGNvbnN0IHAgPSBnYW1lLnBsYXllcnNbc2VhdF07XG4gIGlmIChwLmhhbmQpIHAuaGFuZC5wdXNoKGNhcmQpO1xuICBlbHNlIHAuaGFuZENvdW50ID0gKHAuaGFuZENvdW50ID8/IDApICsgMTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTcGFuaXNoTnVtYmVyKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IHdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICAgIHVuOiAxLFxuICAgIHVuYTogMSxcbiAgICB1bm86IDEsXG4gICAgZG9zOiAyLFxuICAgIHRyZXM6IDMsXG4gICAgY3VhdHJvOiA0LFxuICAgIGNpbmNvOiA1LFxuICAgIHNlaXM6IDYsXG4gICAgc2lldGU6IDcsXG4gICAgb2NobzogOCxcbiAgICBudWV2ZTogOSxcbiAgICBkaWV6OiAxMCxcbiAgfTtcbiAgY29uc3QgZGlnaXRNYXRjaCA9IHRleHQubWF0Y2goL1xcYihcXGQrKVxcYi8pO1xuICBpZiAoZGlnaXRNYXRjaCkgcmV0dXJuIHBhcnNlSW50KGRpZ2l0TWF0Y2hbMV0sIDEwKTtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7XG4gIGZvciAoY29uc3QgW3dvcmQsIG5dIG9mIE9iamVjdC5lbnRyaWVzKHdvcmRzKSkge1xuICAgIGlmIChuZXcgUmVnRXhwKGBcXFxcYiR7d29yZH1cXFxcYmApLnRlc3QobG93ZXIpKSByZXR1cm4gbjtcbiAgfVxuICByZXR1cm4gMDtcbn1cbiJdfQ==
|