@oathompsonjones/mini-games 1.0.16 → 1.0.17

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.
@@ -30,7 +30,9 @@ export default abstract class Board<T extends LongInt | number> {
30
30
  /** The height of the game board. */
31
31
  protected readonly height: number;
32
32
  /** A stack of moves. */
33
- protected readonly moves: number[];
33
+ protected readonly moves: Array<Position & {
34
+ playerId: number;
35
+ }>;
34
36
  /**
35
37
  * Cached result of the last `winner` computation.
36
38
  * Set to `undefined` whenever the board changes so the getter recomputes.
@@ -40,6 +42,10 @@ export default abstract class Board<T extends LongInt | number> {
40
42
  private readonly numberOfPlayerBoards;
41
43
  /** Number of boards in total (most likely also 2). */
42
44
  private readonly numberOfBoards;
45
+ /** The zobrist hash table. */
46
+ private readonly zobrist;
47
+ /** The hash for the current board state. */
48
+ private _hash;
43
49
  /** The board states which represent a winning state. */
44
50
  protected abstract readonly winningStates: Array<BitBoard<T>>;
45
51
  /**
@@ -66,11 +72,10 @@ export default abstract class Board<T extends LongInt | number> {
66
72
  */
67
73
  get winner(): 0 | 1 | false | null;
68
74
  /**
69
- * Returns a compact string key uniquely identifying the current board state.
70
- * Used as a key in the alpha-beta transposition table.
75
+ * Gets a unique key representing the current board state.
71
76
  * @returns The unique board state key.
72
77
  */
73
- get hashKey(): string;
78
+ get hash(): number;
74
79
  /**
75
80
  * Calculates which cells are empty.
76
81
  * @returns The empty cells on the board.
@@ -23,6 +23,10 @@ export default class Board {
23
23
  numberOfPlayerBoards;
24
24
  /** Number of boards in total (most likely also 2). */
25
25
  numberOfBoards;
26
+ /** The zobrist hash table. */
27
+ zobrist = [];
28
+ /** The hash for the current board state. */
29
+ _hash = 0;
26
30
  /**
27
31
  * Creates an instance of Board.
28
32
  * @param width - The width of the game board.
@@ -39,6 +43,15 @@ export default class Board {
39
43
  this.bitBoard = (totalBits > 32
40
44
  ? new LongIntBitBoard(Math.ceil(totalBits / 32))
41
45
  : new IntBitBoard());
46
+ for (let x = 0; x < width; x++) {
47
+ this.zobrist[x] = [];
48
+ for (let y = 0; y < height; y++) {
49
+ this.zobrist[x][y] = [
50
+ Math.floor(Math.random() * 0xFFFFFFFF),
51
+ Math.floor(Math.random() * 0xFFFFFFFF),
52
+ ];
53
+ }
54
+ }
42
55
  }
43
56
  /**
44
57
  * Calculates whether or not the board is full.
@@ -93,13 +106,11 @@ export default class Board {
93
106
  return this._cachedWinner;
94
107
  }
95
108
  /**
96
- * Returns a compact string key uniquely identifying the current board state.
97
- * Used as a key in the alpha-beta transposition table.
109
+ * Gets a unique key representing the current board state.
98
110
  * @returns The unique board state key.
99
111
  */
100
- get hashKey() {
101
- const { data } = this.bitBoard;
102
- return data instanceof LongInt ? data.data.join(",") : String(data);
112
+ get hash() {
113
+ return this._hash;
103
114
  }
104
115
  /**
105
116
  * Calculates which cells are empty.
@@ -123,8 +134,9 @@ export default class Board {
123
134
  makeMove(move, playerId) {
124
135
  this._cachedWinner = undefined;
125
136
  const bit = this.getBitIndex(move, playerId);
126
- this.moves.push(bit);
137
+ this.moves.push({ ...move, playerId });
127
138
  this.bitBoard.setBit(bit);
139
+ this._hash ^= this.zobrist[move.x][move.y][playerId];
128
140
  }
129
141
  /**
130
142
  * Reverses the last move.
@@ -135,7 +147,9 @@ export default class Board {
135
147
  const lastMove = this.moves.pop();
136
148
  if (lastMove === undefined)
137
149
  throw new Error("No move to undo.");
138
- this.bitBoard.clearBit(lastMove);
150
+ const bit = this.getBitIndex(lastMove, lastMove.playerId);
151
+ this.bitBoard.clearBit(bit);
152
+ this._hash ^= this.zobrist[lastMove.x][lastMove.y][lastMove.playerId];
139
153
  }
140
154
  /**
141
155
  * Checks if a move is valid.
@@ -262,4 +276,4 @@ export default class Board {
262
276
  return position.x >= 0 && position.x < this.width && position.y >= 0 && position.y < this.height;
263
277
  }
264
278
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9ib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLGVBQWUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXNCN0Q7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsS0FBSztJQUMvQiw4Q0FBOEM7SUFDM0IsUUFBUSxDQUFjO0lBRXpDLG1DQUFtQztJQUNoQixLQUFLLENBQVM7SUFFakMsb0NBQW9DO0lBQ2pCLE1BQU0sQ0FBUztJQUVsQyx3QkFBd0I7SUFDTCxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBRXhDOzs7T0FHRztJQUNLLGFBQWEsR0FBcUMsU0FBUyxDQUFDO0lBRXBFLCtFQUErRTtJQUM5RCxvQkFBb0IsQ0FBUztJQUU5QyxzREFBc0Q7SUFDckMsY0FBYyxDQUFTO0lBS3hDOzs7Ozs7T0FNRztJQUNILFlBQXNCLEtBQWEsRUFBRSxNQUFjLEVBQUUsbUJBQTJCLENBQUMsRUFBRSxrQkFBMEIsQ0FBQztRQUMxRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsZUFBZSxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWpFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxTQUFTLEdBQUcsRUFBRTtZQUMzQixDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxT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QUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFFBQVEsQ0FBQyxJQUFjO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLFFBQWtCO1FBQ3RDLE9BQU8sUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvYml0Qm9hcmQuanNcIjtcbmltcG9ydCBJbnRCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvaW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUG9zaXRpb24gPSB7XG4gICAgeTogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbn07XG5cbi8qKiBEZWZpbmVzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gZHJhdyBhIGdyaWQuICovXG5leHBvcnQgY29uc3QgZW51bSBHcmlkTGluZXMge1xuICAgIEhvcml6b250YWwgPSBcIlxcdTI1MDBcIixcbiAgICBWZXJ0aWNhbCA9IFwiXFx1MjUwMlwiLFxuICAgIFRvcExlZnQgPSBcIlxcdTI1MENcIixcbiAgICBUb3BSaWdodCA9IFwiXFx1MjUxMFwiLFxuICAgIEJvdHRvbUxlZnQgPSBcIlxcdTI1MTRcIixcbiAgICBCb3R0b21SaWdodCA9IFwiXFx1MjUxOFwiLFxuICAgIFRMZWZ0ID0gXCJcXHUyNTFDXCIsXG4gICAgVFJpZ2h0ID0gXCJcXHUyNTI0XCIsXG4gICAgVFRvcCA9IFwiXFx1MjUyQ1wiLFxuICAgIFRCb3R0b20gPSBcIlxcdTI1MzRcIixcbiAgICBDcm9zcyA9IFwiXFx1MjUzQ1wiLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGJvYXJkLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgbnVtZXJpYyBkYXRhLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBCb2FyZDxUIGV4dGVuZHMgTG9uZ0ludCB8IG51bWJlcj4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgZGF0YSBzdG9yZWQgaW4gYSBCaXRCb2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYml0Qm9hcmQ6IEJpdEJvYXJkPFQ+O1xuXG4gICAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgZ2FtZSBib2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBnYW1lIGJvYXJkLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcblxuICAgIC8qKiBBIHN0YWNrIG9mIG1vdmVzLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtb3ZlczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENhY2hlZCByZXN1bHQgb2YgdGhlIGxhc3QgYHdpbm5lcmAgY29tcHV0YXRpb24uXG4gICAgICogU2V0IHRvIGB1bmRlZmluZWRgIHdoZW5ldmVyIHRoZSBib2FyZCBjaGFuZ2VzIHNvIHRoZSBnZXR0ZXIgcmVjb21wdXRlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jYWNoZWRXaW5uZXI6IDAgfCAxIHwgZmFsc2UgfCBudWxsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLyoqIEhvdyBtYW55IGJvYXJkcyB0aGVyZSBhcmUgcmVwcmVzZW50aW5nIHBsYXllciBwb3NpdGlvbnMgKG1vc3QgbGlrZWx5IDIpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbnVtYmVyT2ZQbGF5ZXJCb2FyZHM6IG51bWJlcjtcblxuICAgIC8qKiBOdW1iZXIgb2YgYm9hcmRzIGluIHRvdGFsIChtb3N0IGxpa2VseSBhbHNvIDIpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbnVtYmVyT2ZCb2FyZHM6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgYm9hcmQgc3RhdGVzIHdoaWNoIHJlcHJlc2VudCBhIHdpbm5pbmcgc3RhdGUuICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHdpbm5pbmdTdGF0ZXM6IEFycmF5PEJpdEJvYXJkPFQ+PjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJCb2FyZENvdW50IC0gSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuXG4gICAgICogQHBhcmFtIGV4dHJhQm9hcmRDb3VudCAtIE51bWJlciBvZiBleHRyYSBib2FyZHMgKG1vc3QgbGlrZWx5IDApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGxheWVyQm9hcmRDb3VudDogbnVtYmVyID0gMiwgZXh0cmFCb2FyZENvdW50OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMgPSBwbGF5ZXJCb2FyZENvdW50O1xuICAgICAgICB0aGlzLm51bWJlck9mQm9hcmRzID0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcyArIGV4dHJhQm9hcmRDb3VudDtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogdGhpcy5udW1iZXJPZkJvYXJkcztcblxuICAgICAgICB0aGlzLmJpdEJvYXJkID0gKHRvdGFsQml0cyA+IDMyXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRvdGFsQml0cyAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIEJpdEJvYXJkPFQ+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgd2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGZ1bGwuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGZ1bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0Z1bGwoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0Z1bGwgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLyAzMikpXG4gICAgICAgICAgICA6IG5ldyBJbnRCaXRCb2FyZCgpKSBhcyBCaXRCb2FyZDxUPjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKylcbiAgICAgICAgICAgIGlzRnVsbCA9IGlzRnVsbC5vcih0aGlzLmdldFBsYXllckJvYXJkKGkpKTtcbiAgICAgICAgY29uc3QgZnVsbFZhbHVlID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmRcbiAgICAgICAgICAgID8gbmV3IExvbmdJbnQoW1xuICAgICAgICAgICAgICAgIC4uLkFycmF5PG51bWJlcj4oTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAvIDMyKSAtIDEpLmZpbGwofjAgPj4+IDApLFxuICAgICAgICAgICAgICAgIDIgKiogKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAtIChNYXRoLmNlaWwodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0IC8gMzIpIC0gMSkgKiAzMikgLSAxLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIDogMiAqKiAodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0KSAtIDEpIGFzIFQ7XG5cbiAgICAgICAgcmV0dXJuIGlzRnVsbC5lcXVhbHMoZnVsbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgYm9hcmQgaXMgZW1wdHkuXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNFbXB0eSA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIEJpdEJvYXJkPFQ+O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZlBsYXllckJvYXJkczsgaSsrKVxuICAgICAgICAgICAgaXNFbXB0eSA9IGlzRW1wdHkub3IodGhpcy5nZXRQbGF5ZXJCb2FyZChpKSk7XG5cbiAgICAgICAgcmV0dXJuIGlzRW1wdHkuZXF1YWxzKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgd2hvIHRoZSB3aW5uZXIgaXMuXG4gICAgICogQHJldHVybnMgYGZhbHNlYCBpZiB0aGUgZ2FtZSBpcyBub3Qgb3ZlciwgdGhlIHBsYXllciBJRCBpZiB0aGVyZSBpcyBhIHdpbm5lciwgYW5kIGBudWxsYCBpZiB0aGVyZSBpcyBhIGRyYXcuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aW5uZXIoKTogMCB8IDEgfCBmYWxzZSB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkV2lubmVyICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkV2lubmVyO1xuXG4gICAgICAgIGNvbnN0IHBsYXllck9uZUJvYXJkID0gdGhpcy5nZXRQbGF5ZXJCb2FyZCgwKTtcbiAgICAgICAgY29uc3QgcGxheWVyVHdvQm9hcmQgPSB0aGlzLmdldFBsYXllckJvYXJkKDEpO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgdGhpcy53aW5uaW5nU3RhdGVzKSB7XG4gICAgICAgICAgICBpZiAocGxheWVyT25lQm9hcmQuYW5kKHN0YXRlKS5lcXVhbHMoc3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkV2lubmVyID0gMDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGxheWVyVHdvQm9hcmQuYW5kKHN0YXRlKS5lcXVhbHMoc3RhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkV2lubmVyID0gMTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2FjaGVkV2lubmVyID0gdGhpcy5pc0Z1bGwgPyBudWxsIDogZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFdpbm5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29tcGFjdCBzdHJpbmcga2V5IHVuaXF1ZWx5IGlkZW50aWZ5aW5nIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIFVzZWQgYXMgYSBrZXkgaW4gdGhlIGFscGhhLWJldGEgdHJhbnNwb3NpdGlvbiB0YWJsZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdW5pcXVlIGJvYXJkIHN0YXRlIGtleS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc2hLZXkoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSB0aGlzLmJpdEJvYXJkO1xuXG4gICAgICAgIHJldHVybiBkYXRhIGluc3RhbmNlb2YgTG9uZ0ludCA/IGRhdGEuZGF0YS5qb2luKFwiLFwiKSA6IFN0cmluZyhkYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoaWNoIGNlbGxzIGFyZSBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW1wdHkgY2VsbHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0pID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgYSBnaXZlbiBib2FyZCBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGhldXJpc3RpYygpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgd2hvJ3MgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRXaW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGJpdCA9IHRoaXMuZ2V0Qml0SW5kZXgobW92ZSwgcGxheWVySWQpO1xuXG4gICAgICAgIHRoaXMubW92ZXMucHVzaChiaXQpO1xuICAgICAgICB0aGlzLmJpdEJvYXJkLnNldEJpdChiaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBsYXN0IG1vdmUuXG4gICAgICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlcmUgaXMgbm8gbW92ZSB0byB1bmRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmRvTGFzdE1vdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbGFzdE1vdmUgPSB0aGlzLm1vdmVzLnBvcCgpO1xuXG4gICAgICAgIGlmIChsYXN0TW92ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbW92ZSB0byB1bmRvLlwiKTtcblxuICAgICAgICB0aGlzLmJpdEJvYXJkLmNsZWFyQml0KGxhc3RNb3ZlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtb3ZlIGlzIHZhbGlkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IGl0J3MgdmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIG1vdmVJc1ZhbGlkKG1vdmU6IFBvc2l0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWRQb3NpdGlvbihtb3ZlKSAmJiB0aGlzLmNlbGxPY2N1cGllcihtb3ZlKSA9PT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hpY2ggcGxheWVyIGlzIG9jY3VweWluZyBhIGdpdmVuIGNlbGwuXG4gICAgICogQHBhcmFtIGNlbGwgLSBUaGUgY2VsbCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgY2VsbCBpcyBlbXB0eSwgdGhlIG91dHB1dCBpcyBudWxsLCBvdGhlcndpc2UgdGhlIG91dHB1dCBpcyB0aGUgcGxheWVyJ3MgSUQuXG4gICAgICovXG4gICAgcHVibGljIGNlbGxPY2N1cGllcihjZWxsOiBQb3NpdGlvbik6IG51bWJlciB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYml0Qm9hcmQuZ2V0Qml0KHRoaXMuZ2V0Qml0SW5kZXgoY2VsbCwgaSkpID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIHdyYXAgLSBXaGV0aGVyIG9yIG5vdCB0byBwcm92aWRlIGEgYm9yZGVyIGZvciB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIGxhYmVsWCAtIFdoZXRoZXIgb3Igbm90IHRvIGxhYmVsIHguXG4gICAgICogQHBhcmFtIGxhYmVsWSAtIFdoZXRoZXIgb3Igbm90IHRvIGxhYmVsIHkuXG4gICAgICogQHBhcmFtIHN5bWJvbHMgLSBUaGUgc3ltYm9scyB0byB1c2UgYXMgYm9hcmQgcGllY2VzLlxuICAgICAqIEBwYXJhbSBjb2xvdXIgLSBXaGV0aGVyIG9yIG5vdCB0byBjb2xvdXIgdGhlIHBpZWNlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSAtIElmIHRoZSBzeW1ib2xzIGFyZSBub3QgdGhlIHNhbWUgbGVuZ3RoLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZyhcbiAgICAgICAgd3JhcDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGxhYmVsWDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGxhYmVsWTogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHN5bWJvbHM6IHN0cmluZ1tdID0gW1wiWFwiLCBcIk9cIl0sXG4gICAgICAgIGNvbG91cjogYm9vbGVhbiA9IHRydWUsXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHN5bWJvbHMubGVuZ3RoICE9PSB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVG9vIG1hbnkgc3ltYm9scy5cIik7XG5cbiAgICAgICAgY29uc3Qgc3ltYm9sTGVuZ3RoID0gc3ltYm9sc1swXSEubGVuZ3RoO1xuXG4gICAgICAgIGlmIChzeW1ib2xzLnNvbWUoKHMpID0+IHMubGVuZ3RoICE9PSBzeW1ib2xMZW5ndGgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3ltYm9scyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aC5cIik7XG5cbiAgICAgICAgY29uc3QgbWF0Y2hDZWxsU3BhY2UgPSBuZXcgUmVnRXhwKGAueyR7c3ltYm9sTGVuZ3RoICsgMn19YCwgXCJndVwiKTtcbiAgICAgICAgY29uc3QgYWxwaGFiZXQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIjtcbiAgICAgICAgY29uc3QgeExhYmVscyA9IGxhYmVsWFxuICAgICAgICAgICAgPyBgJHthbHBoYWJldC5zbGljZSgwLCB0aGlzLndpZHRoKVxuICAgICAgICAgICAgICAgIC5zcGxpdChcIlwiKVxuICAgICAgICAgICAgICAgIC5tYXAoKGxldHRlcikgPT4gYCAke2xldHRlci5wYWRTdGFydChzeW1ib2xMZW5ndGgpfSBgKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiXCIpXG4gICAgICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgICAgICAuam9pbihcIiBcIilcbiAgICAgICAgICAgICAgICAucGFkU3RhcnQoNCAqIHRoaXMud2lkdGggLSAxICsgTnVtYmVyKHdyYXApICsgTnVtYmVyKGxhYmVsWSkpXG4gICAgICAgICAgICB9XFxuYFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCB0b3BCb3JkZXIgPSB3cmFwXG4gICAgICAgICAgICA/IGAke2xhYmVsWSA/IFwiIFwiIDogXCJcIn0ke0dyaWRMaW5lcy5Ub3BMZWZ0fSR7R3JpZExpbmVzLkhvcml6b250YWxcbiAgICAgICAgICAgICAgICAucmVwZWF0KHRoaXMud2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgICAgICAuam9pbihHcmlkTGluZXMuVFRvcCl9JHtHcmlkTGluZXMuVG9wUmlnaHR9XFxuYFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCBib3R0b21Cb3JkZXIgPSB3cmFwXG4gICAgICAgICAgICA/IGAke2xhYmVsWSA/IFwiIFwiIDogXCJcIn0ke0dyaWRMaW5lcy5Cb3R0b21MZWZ0fSR7R3JpZExpbmVzLkhvcml6b250YWxcbiAgICAgICAgICAgICAgICAucmVwZWF0KHRoaXMud2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgICAgICAuam9pbihHcmlkTGluZXMuVEJvdHRvbSl9JHtHcmlkTGluZXMuQm90dG9tUmlnaHR9YFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCByb3dTZXBhcmF0b3IgPSBgJHtsYWJlbFkgPyBcIiBcIiA6IFwiXCJ9JHt3cmFwID8gR3JpZExpbmVzLlRMZWZ0IDogXCJcIn0ke0dyaWRMaW5lcy5Ib3Jpem9udGFsXG4gICAgICAgICAgICAucmVwZWF0KHRoaXMud2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAubWF0Y2gobWF0Y2hDZWxsU3BhY2UpIVxuICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLkNyb3NzKX0ke3dyYXAgPyBHcmlkTGluZXMuVFJpZ2h0IDogXCJcIn1cXG5gO1xuICAgICAgICBjb25zdCByb3dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgY29uc3QgeUxhYmVsID0gbGFiZWxZID8gYCR7eSArIDF9YCA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBsZWZ0Qm9yZGVyID0gd3JhcCA/IEdyaWRMaW5lcy5WZXJ0aWNhbCA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCByaWdodEJvcmRlciA9IHdyYXAgPyBHcmlkTGluZXMuVmVydGljYWwgOiBcIlwiO1xuICAgICAgICAgICAgbGV0IHJvdyA9IGAke3lMYWJlbH0ke2xlZnRCb3JkZXJ9YDtcblxuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0geyB4LCB5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYmFyID0geCA9PT0gdGhpcy53aWR0aCAtIDEgPyBcIlwiIDogR3JpZExpbmVzLlZlcnRpY2FsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxPY2N1cGllciA9IHRoaXMuY2VsbE9jY3VwaWVyKGNlbGwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNlbGxPY2N1cGllciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYCAke1wiIFwiLnJlcGVhdChzeW1ib2xMZW5ndGgpfSAke2Jhcn1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdyArPSBgICR7Y29sb3VyID8gYFxceDFiWyR7WzkxLCA5M11bY2VsbE9jY3VwaWVyXSF9bWAgOiBcIlwifWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3ltYm9sc1tjZWxsT2NjdXBpZXJdfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7Y29sb3VyID8gXCJcXHgxYlswbVwiIDogXCJcIn0gJHtiYXJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzLnB1c2goYCR7cm93fSR7cmlnaHRCb3JkZXJ9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7eExhYmVsc30ke3RvcEJvcmRlcn0ke3Jvd3Muam9pbihyb3dTZXBhcmF0b3IpfSR7Ym90dG9tQm9yZGVyfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpdCBpbmRleCBmcm9tIGl0cyBjb29yZGluYXRlcyBhbmQgcGxheWVyIElELlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIGNvb3JkaW5hdGVzLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgSUQgdG8gdXNlLlxuICAgICAqIEByZXR1cm5zIFRoZSBiaXQgaW5kZXggb2YgdGhlIG1vdmUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEJpdEluZGV4KG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbW92ZUluZGV4ID0gdGhpcy5nZXRJbmRleChtb3ZlKTtcbiAgICAgICAgY29uc3QgYml0Qm9hcmRNb3ZlSW5kZXggPSBtb3ZlSW5kZXggKyB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgKiBwbGF5ZXJJZDtcblxuICAgICAgICByZXR1cm4gYml0Qm9hcmRNb3ZlSW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBCaXRCb2FyZCBjb250YWluaW5nIG9ubHkgdGhlIHBsYXllcidzIGJpdHMuXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllcidzIElEIHRvIGdldCB0aGUgYm9hcmQgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIncyBiaXRzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQbGF5ZXJCb2FyZChwbGF5ZXJJZDogbnVtYmVyKTogQml0Qm9hcmQ8VD4ge1xuICAgICAgICBjb25zdCB0b3RhbEJpdHMgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZCA/IHRoaXMuYml0Qm9hcmQuZGF0YS53b3JkQ291bnQgOiAxKSAqIDMyO1xuICAgICAgICBjb25zdCBib2FyZFNpemUgPSB0aGlzLndpZHRoICogdGhpcy5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYml0Qm9hcmQubGVmdFNoaWZ0KHRvdGFsQml0cyAtIGJvYXJkU2l6ZSAqIChwbGF5ZXJJZCArIDEpKS5yaWdodFNoaWZ0KHRvdGFsQml0cyAtIGJvYXJkU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpdCBpbmRleCBmcm9tIGl0cyBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBjb29yZGluYXRlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0IGluZGV4LlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0SW5kZXgobW92ZTogUG9zaXRpb24pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aCAqIG1vdmUueSArIG1vdmUueDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtb3ZlIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gYm9hcmQuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgdGhhdCBjZWxsIGlzIGFscmVhZHkgb2NjdXBpZWQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIC0gVGhlIHBvc2l0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoYXQgY2VsbCBleGlzdHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWxpZFBvc2l0aW9uKHBvc2l0aW9uOiBQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcG9zaXRpb24ueCA+PSAwICYmIHBvc2l0aW9uLnggPCB0aGlzLndpZHRoICYmIHBvc2l0aW9uLnkgPj0gMCAmJiBwb3NpdGlvbi55IDwgdGhpcy5oZWlnaHQ7XG4gICAgfVxufVxuIl19
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9ib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLGVBQWUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXNCN0Q7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE9BQU8sT0FBZ0IsS0FBSztJQUMvQiw4Q0FBOEM7SUFDM0IsUUFBUSxDQUFjO0lBRXpDLG1DQUFtQztJQUNoQixLQUFLLENBQVM7SUFFakMsb0NBQW9DO0lBQ2pCLE1BQU0sQ0FBUztJQUVsQyx3QkFBd0I7SUFDTCxLQUFLLEdBQTRDLEVBQUUsQ0FBQztJQUV2RTs7O09BR0c7SUFDSyxhQUFhLEdBQXFDLFNBQVMsQ0FBQztJQUVwRSwrRUFBK0U7SUFDOUQsb0JBQW9CLENBQVM7SUFFOUMsc0RBQXNEO0lBQ3JDLGNBQWMsQ0FBUztJQUV4Qyw4QkFBOEI7SUFDYixPQUFPLEdBQWlCLEVBQUUsQ0FBQztJQUU1Qyw0Q0FBNEM7SUFDcEMsS0FBSyxHQUFXLENBQUMsQ0FBQztJQUsxQjs7Ozs7O09BTUc7SUFDSCxZQUFzQixLQUFhLEVBQUUsTUFBYyxFQUFFLG1CQUEyQixDQUFDLEVBQUUsa0JBQTBCLENBQUM7UUFDMUcsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGVBQWUsQ0FBQztRQUNsRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFB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QUN0QyxPQUFPLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckcsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQml0Qm9hcmQgZnJvbSBcIi4uL2JpdEJvYXJkL2JpdEJvYXJkLmpzXCI7XG5pbXBvcnQgSW50Qml0Qm9hcmQgZnJvbSBcIi4uL2JpdEJvYXJkL2ludEJpdEJvYXJkLmpzXCI7XG5pbXBvcnQgTG9uZ0ludCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IExvbmdJbnRCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFBvc2l0aW9uID0ge1xuICAgIHk6IG51bWJlcjtcbiAgICB4OiBudW1iZXI7XG59O1xuXG4vKiogRGVmaW5lcyB0aGUgY2hhcmFjdGVycyB1c2VkIHRvIGRyYXcgYSBncmlkLiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gR3JpZExpbmVzIHtcbiAgICBIb3Jpem9udGFsID0gXCJcXHUyNTAwXCIsXG4gICAgVmVydGljYWwgPSBcIlxcdTI1MDJcIixcbiAgICBUb3BMZWZ0ID0gXCJcXHUyNTBDXCIsXG4gICAgVG9wUmlnaHQgPSBcIlxcdTI1MTBcIixcbiAgICBCb3R0b21MZWZ0ID0gXCJcXHUyNTE0XCIsXG4gICAgQm90dG9tUmlnaHQgPSBcIlxcdTI1MThcIixcbiAgICBUTGVmdCA9IFwiXFx1MjUxQ1wiLFxuICAgIFRSaWdodCA9IFwiXFx1MjUyNFwiLFxuICAgIFRUb3AgPSBcIlxcdTI1MkNcIixcbiAgICBUQm90dG9tID0gXCJcXHUyNTM0XCIsXG4gICAgQ3Jvc3MgPSBcIlxcdTI1M0NcIixcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2FtZSBib2FyZC5cbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIG51bWVyaWMgZGF0YS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQm9hcmQ8VCBleHRlbmRzIExvbmdJbnQgfCBudW1iZXI+IHtcbiAgICAvKiogQ29udGFpbnMgdGhlIGRhdGEgc3RvcmVkIGluIGEgQml0Qm9hcmQuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpdEJvYXJkOiBCaXRCb2FyZDxUPjtcblxuICAgIC8qKiBUaGUgd2lkdGggb2YgdGhlIGdhbWUgYm9hcmQuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG5cbiAgICAvKiogVGhlIGhlaWdodCBvZiB0aGUgZ2FtZSBib2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKiogQSBzdGFjayBvZiBtb3Zlcy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW92ZXM6IEFycmF5PFBvc2l0aW9uICYgeyBwbGF5ZXJJZDogbnVtYmVyOyB9PiA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGVkIHJlc3VsdCBvZiB0aGUgbGFzdCBgd2lubmVyYCBjb21wdXRhdGlvbi5cbiAgICAgKiBTZXQgdG8gYHVuZGVmaW5lZGAgd2hlbmV2ZXIgdGhlIGJvYXJkIGNoYW5nZXMgc28gdGhlIGdldHRlciByZWNvbXB1dGVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhY2hlZFdpbm5lcjogMCB8IDEgfCBmYWxzZSB8IG51bGwgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvKiogSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBudW1iZXJPZlBsYXllckJvYXJkczogbnVtYmVyO1xuXG4gICAgLyoqIE51bWJlciBvZiBib2FyZHMgaW4gdG90YWwgKG1vc3QgbGlrZWx5IGFsc28gMikuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBudW1iZXJPZkJvYXJkczogbnVtYmVyO1xuXG4gICAgLyoqIFRoZSB6b2JyaXN0IGhhc2ggdGFibGUuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b2JyaXN0OiBudW1iZXJbXVtdW10gPSBbXTtcblxuICAgIC8qKiBUaGUgaGFzaCBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuICovXG4gICAgcHJpdmF0ZSBfaGFzaDogbnVtYmVyID0gMDtcblxuICAgIC8qKiBUaGUgYm9hcmQgc3RhdGVzIHdoaWNoIHJlcHJlc2VudCBhIHdpbm5pbmcgc3RhdGUuICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHdpbm5pbmdTdGF0ZXM6IEFycmF5PEJpdEJvYXJkPFQ+PjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgaGVpZ2h0IG9mIHRoZSBnYW1lIGJvYXJkLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJCb2FyZENvdW50IC0gSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuXG4gICAgICogQHBhcmFtIGV4dHJhQm9hcmRDb3VudCAtIE51bWJlciBvZiBleHRyYSBib2FyZHMgKG1vc3QgbGlrZWx5IDApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGxheWVyQm9hcmRDb3VudDogbnVtYmVyID0gMiwgZXh0cmFCb2FyZENvdW50OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMgPSBwbGF5ZXJCb2FyZENvdW50O1xuICAgICAgICB0aGlzLm51bWJlck9mQm9hcmRzID0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcyArIGV4dHJhQm9hcmRDb3VudDtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogdGhpcy5udW1iZXJPZkJvYXJkcztcblxuICAgICAgICB0aGlzLmJpdEJvYXJkID0gKHRvdGFsQml0cyA+IDMyXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRvdGFsQml0cyAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIEJpdEJvYXJkPFQ+O1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgICAgICAgdGhpcy56b2JyaXN0W3hdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy56b2JyaXN0W3hdIVt5XSA9IFtcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMHhGRkZGRkZGRiksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDB4RkZGRkZGRkYpLFxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBmdWxsLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBmdWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNGdWxsKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNGdWxsID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmRcbiAgICAgICAgICAgID8gbmV3IExvbmdJbnRCaXRCb2FyZChNYXRoLmNlaWwodGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0IC8gMzIpKVxuICAgICAgICAgICAgOiBuZXcgSW50Qml0Qm9hcmQoKSkgYXMgQml0Qm9hcmQ8VD47XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzOyBpKyspXG4gICAgICAgICAgICBpc0Z1bGwgPSBpc0Z1bGwub3IodGhpcy5nZXRQbGF5ZXJCb2FyZChpKSk7XG4gICAgICAgIGNvbnN0IGZ1bGxWYWx1ZSA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50KFtcbiAgICAgICAgICAgICAgICAuLi5BcnJheTxudW1iZXI+KE1hdGguY2VpbCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLyAzMikgLSAxKS5maWxsKH4wID4+PiAwKSxcbiAgICAgICAgICAgICAgICAyICoqICh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLSAoTWF0aC5jZWlsKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCAvIDMyKSAtIDEpICogMzIpIC0gMSxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICA6IDIgKiogKHRoaXMud2lkdGggKiB0aGlzLmhlaWdodCkgLSAxKSBhcyBUO1xuXG4gICAgICAgIHJldHVybiBpc0Z1bGwuZXF1YWxzKGZ1bGxWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgYm9hcmQgaXMgZW1wdHkuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGlzRW1wdHkgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0aGlzLndpZHRoICogdGhpcy5oZWlnaHQgLyAzMikpXG4gICAgICAgICAgICA6IG5ldyBJbnRCaXRCb2FyZCgpKSBhcyBCaXRCb2FyZDxUPjtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKylcbiAgICAgICAgICAgIGlzRW1wdHkgPSBpc0VtcHR5Lm9yKHRoaXMuZ2V0UGxheWVyQm9hcmQoaSkpO1xuXG4gICAgICAgIHJldHVybiBpc0VtcHR5LmVxdWFscygwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdobyB0aGUgd2lubmVyIGlzLlxuICAgICAqIEByZXR1cm5zIGBmYWxzZWAgaWYgdGhlIGdhbWUgaXMgbm90IG92ZXIsIHRoZSBwbGF5ZXIgSUQgaWYgdGhlcmUgaXMgYSB3aW5uZXIsIGFuZCBgbnVsbGAgaWYgdGhlcmUgaXMgYSBkcmF3LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lubmVyKCk6IDAgfCAxIHwgZmFsc2UgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhY2hlZFdpbm5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFdpbm5lcjtcblxuICAgICAgICBjb25zdCBwbGF5ZXJPbmVCb2FyZCA9IHRoaXMuZ2V0UGxheWVyQm9hcmQoMCk7XG4gICAgICAgIGNvbnN0IHBsYXllclR3b0JvYXJkID0gdGhpcy5nZXRQbGF5ZXJCb2FyZCgxKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRoaXMud2lubmluZ1N0YXRlcykge1xuICAgICAgICAgICAgaWYgKHBsYXllck9uZUJvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IDA7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBsYXllclR3b0JvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IDE7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IHRoaXMuaXNGdWxsID8gbnVsbCA6IGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRXaW5uZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHVuaXF1ZSBrZXkgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSB1bmlxdWUgYm9hcmQgc3RhdGUga2V5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzaCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoaWNoIGNlbGxzIGFyZSBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgZW1wdHkgY2VsbHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0pID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgYSBnaXZlbiBib2FyZCBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGhldXJpc3RpYygpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBtb3ZlIC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgd2hvJ3MgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWNoZWRXaW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGJpdCA9IHRoaXMuZ2V0Qml0SW5kZXgobW92ZSwgcGxheWVySWQpO1xuXG4gICAgICAgIHRoaXMubW92ZXMucHVzaCh7IC4uLm1vdmUsIHBsYXllcklkIH0pO1xuICAgICAgICB0aGlzLmJpdEJvYXJkLnNldEJpdChiaXQpO1xuICAgICAgICB0aGlzLl9oYXNoIF49IHRoaXMuem9icmlzdFttb3ZlLnhdIVttb3ZlLnldIVtwbGF5ZXJJZF0hO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBsYXN0IG1vdmUuXG4gICAgICogQHRocm93cyB7RXJyb3J9IC0gSWYgdGhlcmUgaXMgbm8gbW92ZSB0byB1bmRvLlxuICAgICAqL1xuICAgIHB1YmxpYyB1bmRvTGFzdE1vdmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFdpbm5lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbGFzdE1vdmUgPSB0aGlzLm1vdmVzLnBvcCgpO1xuXG4gICAgICAgIGlmIChsYXN0TW92ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbW92ZSB0byB1bmRvLlwiKTtcblxuICAgICAgICBjb25zdCBiaXQgPSB0aGlzLmdldEJpdEluZGV4KGxhc3RNb3ZlLCBsYXN0TW92ZS5wbGF5ZXJJZCk7XG5cbiAgICAgICAgdGhpcy5iaXRCb2FyZC5jbGVhckJpdChiaXQpO1xuICAgICAgICB0aGlzLl9oYXNoIF49IHRoaXMuem9icmlzdFtsYXN0TW92ZS54XSFbbGFzdE1vdmUueV0hW2xhc3RNb3ZlLnBsYXllcklkXSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbW92ZSBpcyB2YWxpZC5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgbW92ZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBpdCdzIHZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlSXNWYWxpZChtb3ZlOiBQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkUG9zaXRpb24obW92ZSkgJiYgdGhpcy5jZWxsT2NjdXBpZXIobW92ZSkgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoaWNoIHBsYXllciBpcyBvY2N1cHlpbmcgYSBnaXZlbiBjZWxsLlxuICAgICAqIEBwYXJhbSBjZWxsIC0gVGhlIGNlbGwgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgSWYgdGhlIGNlbGwgaXMgZW1wdHksIHRoZSBvdXRwdXQgaXMgbnVsbCwgb3RoZXJ3aXNlIHRoZSBvdXRwdXQgaXMgdGhlIHBsYXllcidzIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBjZWxsT2NjdXBpZXIoY2VsbDogUG9zaXRpb24pOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJpdEJvYXJkLmdldEJpdCh0aGlzLmdldEJpdEluZGV4KGNlbGwsIGkpKSA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSB3cmFwIC0gV2hldGhlciBvciBub3QgdG8gcHJvdmlkZSBhIGJvcmRlciBmb3IgdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBsYWJlbFggLSBXaGV0aGVyIG9yIG5vdCB0byBsYWJlbCB4LlxuICAgICAqIEBwYXJhbSBsYWJlbFkgLSBXaGV0aGVyIG9yIG5vdCB0byBsYWJlbCB5LlxuICAgICAqIEBwYXJhbSBzeW1ib2xzIC0gVGhlIHN5bWJvbHMgdG8gdXNlIGFzIGJvYXJkIHBpZWNlcy5cbiAgICAgKiBAcGFyYW0gY29sb3VyIC0gV2hldGhlciBvciBub3QgdG8gY29sb3VyIHRoZSBwaWVjZXMuXG4gICAgICogQHJldHVybnMgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBJZiB0aGUgc3ltYm9scyBhcmUgbm90IHRoZSBzYW1lIGxlbmd0aC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9TdHJpbmcoXG4gICAgICAgIHdyYXA6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBsYWJlbFg6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBsYWJlbFk6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBzeW1ib2xzOiBzdHJpbmdbXSA9IFtcIlhcIiwgXCJPXCJdLFxuICAgICAgICBjb2xvdXI6IGJvb2xlYW4gPSB0cnVlLFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmIChzeW1ib2xzLmxlbmd0aCAhPT0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRvbyBtYW55IHN5bWJvbHMuXCIpO1xuXG4gICAgICAgIGNvbnN0IHN5bWJvbExlbmd0aCA9IHN5bWJvbHNbMF0hLmxlbmd0aDtcblxuICAgICAgICBpZiAoc3ltYm9scy5zb21lKChzKSA9PiBzLmxlbmd0aCAhPT0gc3ltYm9sTGVuZ3RoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bWJvbHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGguXCIpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoQ2VsbFNwYWNlID0gbmV3IFJlZ0V4cChgLnske3N5bWJvbExlbmd0aCArIDJ9fWAsIFwiZ3VcIik7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0ID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG4gICAgICAgIGNvbnN0IHhMYWJlbHMgPSBsYWJlbFhcbiAgICAgICAgICAgID8gYCR7YWxwaGFiZXQuc2xpY2UoMCwgdGhpcy53aWR0aClcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgICAgICAubWFwKChsZXR0ZXIpID0+IGAgJHtsZXR0ZXIucGFkU3RhcnQoc3ltYm9sTGVuZ3RoKX0gYClcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDQgKiB0aGlzLndpZHRoIC0gMSArIE51bWJlcih3cmFwKSArIE51bWJlcihsYWJlbFkpKVxuICAgICAgICAgICAgfVxcbmBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3QgdG9wQm9yZGVyID0gd3JhcFxuICAgICAgICAgICAgPyBgJHtsYWJlbFkgPyBcIiBcIiA6IFwiXCJ9JHtHcmlkTGluZXMuVG9wTGVmdH0ke0dyaWRMaW5lcy5Ib3Jpem9udGFsXG4gICAgICAgICAgICAgICAgLnJlcGVhdCh0aGlzLndpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLlRUb3ApfSR7R3JpZExpbmVzLlRvcFJpZ2h0fVxcbmBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3QgYm90dG9tQm9yZGVyID0gd3JhcFxuICAgICAgICAgICAgPyBgJHtsYWJlbFkgPyBcIiBcIiA6IFwiXCJ9JHtHcmlkTGluZXMuQm90dG9tTGVmdH0ke0dyaWRMaW5lcy5Ib3Jpem9udGFsXG4gICAgICAgICAgICAgICAgLnJlcGVhdCh0aGlzLndpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLlRCb3R0b20pfSR7R3JpZExpbmVzLkJvdHRvbVJpZ2h0fWBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3Qgcm93U2VwYXJhdG9yID0gYCR7bGFiZWxZID8gXCIgXCIgOiBcIlwifSR7d3JhcCA/IEdyaWRMaW5lcy5UTGVmdCA6IFwiXCJ9JHtHcmlkTGluZXMuSG9yaXpvbnRhbFxuICAgICAgICAgICAgLnJlcGVhdCh0aGlzLndpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgLm1hdGNoKG1hdGNoQ2VsbFNwYWNlKSFcbiAgICAgICAgICAgIC5qb2luKEdyaWRMaW5lcy5Dcm9zcyl9JHt3cmFwID8gR3JpZExpbmVzLlRSaWdodCA6IFwiXCJ9XFxuYDtcbiAgICAgICAgY29uc3Qgcm93czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHlMYWJlbCA9IGxhYmVsWSA/IGAke3kgKyAxfWAgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgbGVmdEJvcmRlciA9IHdyYXAgPyBHcmlkTGluZXMuVmVydGljYWwgOiBcIlwiO1xuICAgICAgICAgICAgY29uc3QgcmlnaHRCb3JkZXIgPSB3cmFwID8gR3JpZExpbmVzLlZlcnRpY2FsIDogXCJcIjtcbiAgICAgICAgICAgIGxldCByb3cgPSBgJHt5TGFiZWx9JHtsZWZ0Qm9yZGVyfWA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHsgeCwgeSB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhciA9IHggPT09IHRoaXMud2lkdGggLSAxID8gXCJcIiA6IEdyaWRMaW5lcy5WZXJ0aWNhbDtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsT2NjdXBpZXIgPSB0aGlzLmNlbGxPY2N1cGllcihjZWxsKTtcblxuICAgICAgICAgICAgICAgIGlmIChjZWxsT2NjdXBpZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93ICs9IGAgJHtcIiBcIi5yZXBlYXQoc3ltYm9sTGVuZ3RoKX0gJHtiYXJ9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYCAke2NvbG91ciA/IGBcXHgxYlske1s5MSwgOTNdW2NlbGxPY2N1cGllcl0hfW1gIDogXCJcIn1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3N5bWJvbHNbY2VsbE9jY3VwaWVyXX1gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbG91ciA/IFwiXFx4MWJbMG1cIiA6IFwiXCJ9ICR7YmFyfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcm93cy5wdXNoKGAke3Jvd30ke3JpZ2h0Qm9yZGVyfVxcbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3hMYWJlbHN9JHt0b3BCb3JkZXJ9JHtyb3dzLmpvaW4ocm93U2VwYXJhdG9yKX0ke2JvdHRvbUJvcmRlcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaXQgaW5kZXggZnJvbSBpdHMgY29vcmRpbmF0ZXMgYW5kIHBsYXllciBJRC5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgLSBUaGUgcGxheWVyIElEIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0IGluZGV4IG9mIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRCaXRJbmRleChtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1vdmVJbmRleCA9IHRoaXMuZ2V0SW5kZXgobW92ZSk7XG4gICAgICAgIGNvbnN0IGJpdEJvYXJkTW92ZUluZGV4ID0gbW92ZUluZGV4ICsgdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0ICogcGxheWVySWQ7XG5cbiAgICAgICAgcmV0dXJuIGJpdEJvYXJkTW92ZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgQml0Qm9hcmQgY29udGFpbmluZyBvbmx5IHRoZSBwbGF5ZXIncyBiaXRzLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIncyBJRCB0byBnZXQgdGhlIGJvYXJkIGZvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGxheWVyJ3MgYml0cy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGxheWVyQm9hcmQocGxheWVySWQ6IG51bWJlcik6IEJpdEJvYXJkPFQ+IHtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmQgPyB0aGlzLmJpdEJvYXJkLmRhdGEud29yZENvdW50IDogMSkgKiAzMjtcbiAgICAgICAgY29uc3QgYm9hcmRTaXplID0gdGhpcy53aWR0aCAqIHRoaXMuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJpdEJvYXJkLmxlZnRTaGlmdCh0b3RhbEJpdHMgLSBib2FyZFNpemUgKiAocGxheWVySWQgKyAxKSkucmlnaHRTaGlmdCh0b3RhbEJpdHMgLSBib2FyZFNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaXQgaW5kZXggZnJvbSBpdHMgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIG1vdmUgLSBUaGUgY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybnMgVGhlIGJpdCBpbmRleC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEluZGV4KG1vdmU6IFBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggKiBtb3ZlLnkgKyBtb3ZlLng7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbW92ZSBpcyB2YWxpZCBmb3IgdGhlIGdpdmVuIGJvYXJkLlxuICAgICAqIERvZXMgbm90IGNoZWNrIGlmIHRoYXQgY2VsbCBpcyBhbHJlYWR5IG9jY3VwaWVkLlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGF0IGNlbGwgZXhpc3RzIG9uIHRoZSBib2FyZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVmFsaWRQb3NpdGlvbihwb3NpdGlvbjogUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uLnggPj0gMCAmJiBwb3NpdGlvbi54IDwgdGhpcy53aWR0aCAmJiBwb3NpdGlvbi55ID49IDAgJiYgcG9zaXRpb24ueSA8IHRoaXMuaGVpZ2h0O1xuICAgIH1cbn1cbiJdfQ==
@@ -37,8 +37,10 @@ export default abstract class Controller<T extends Board<LongInt | number>> exte
37
37
  }>;
38
38
  /** Contains the ID of the current player. */
39
39
  private currentPlayerId;
40
- /** Stores precomputed values to optimise minimax/alphabeta. */
41
- private readonly cache;
40
+ /** Contains the transposition table for the minimax algorithm. */
41
+ private readonly transposition;
42
+ /** Contains the best moves for the minimax algorithm. */
43
+ private readonly bestMoves;
42
44
  /**
43
45
  * Creates an instance of Controller.
44
46
  * @param playerTypes - The types of player for the game.
@@ -62,17 +64,23 @@ export default abstract class Controller<T extends Board<LongInt | number>> exte
62
64
  */
63
65
  play(): Promise<void>;
64
66
  /**
65
- * The minimax algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
67
+ * A wrapper for the minimax algorithm to find the optimal move for the current board state.
68
+ * @param maxDepth - The maximum depth to search.
69
+ * @returns The optimal move for the current board state.
70
+ */
71
+ protected search(maxDepth: number): {
72
+ move: Position;
73
+ score: number;
74
+ };
75
+ /**
76
+ * The minimax (negamax) algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
66
77
  * @param depth - The depth of the algorithm.
67
78
  * @param alpha - The bounds for the alpha-beta variation of the algorithm.
68
79
  * @param beta - The bounds for the alpha-beta variation of the algorithm.
69
- * @param maximisingPlayer - Whether or not the current player is the maximising player.
80
+ * @param playerId - The player to calculate the move for.
70
81
  * @returns The optimal move.
71
82
  */
72
- protected alphabeta(depth?: number, alpha?: number, beta?: number, maximisingPlayer?: boolean): {
73
- move: Position;
74
- score: number;
75
- };
83
+ private minimax;
76
84
  /** Changes which player's turn it is. */
77
85
  private nextTurn;
78
86
  /**
@@ -20,8 +20,10 @@ export default class Controller extends EventEmitter {
20
20
  players;
21
21
  /** Contains the ID of the current player. */
22
22
  currentPlayerId = 0;
23
- /** Stores precomputed values to optimise minimax/alphabeta. */
24
- cache = new Map();
23
+ /** Contains the transposition table for the minimax algorithm. */
24
+ transposition = new Map();
25
+ /** Contains the best moves for the minimax algorithm. */
26
+ bestMoves = new Map();
25
27
  /**
26
28
  * Creates an instance of Controller.
27
29
  * @param playerTypes - The types of player for the game.
@@ -63,53 +65,81 @@ export default class Controller extends EventEmitter {
63
65
  await this.makeMove();
64
66
  }
65
67
  /**
66
- * The minimax algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
68
+ * A wrapper for the minimax algorithm to find the optimal move for the current board state.
69
+ * @param maxDepth - The maximum depth to search.
70
+ * @returns The optimal move for the current board state.
71
+ */
72
+ search(maxDepth) {
73
+ let best = {
74
+ move: { x: NaN, y: NaN },
75
+ score: -Infinity,
76
+ };
77
+ for (let depth = 1; depth <= maxDepth; depth++)
78
+ best = this.minimax(depth, -Infinity, Infinity, this.currentPlayerId);
79
+ return best;
80
+ }
81
+ /**
82
+ * The minimax (negamax) algorithm with alpha-beta pruning (https://en.wikipedia.org/wiki/Minimax).
67
83
  * @param depth - The depth of the algorithm.
68
84
  * @param alpha - The bounds for the alpha-beta variation of the algorithm.
69
85
  * @param beta - The bounds for the alpha-beta variation of the algorithm.
70
- * @param maximisingPlayer - Whether or not the current player is the maximising player.
86
+ * @param playerId - The player to calculate the move for.
71
87
  * @returns The optimal move.
72
88
  */
73
- alphabeta(depth = Infinity, alpha = -Infinity, beta = Infinity, maximisingPlayer = true) {
74
- const playerIds = [(this.currentPlayerId + 1) % 2, this.currentPlayerId];
75
- if (depth === 0 || this.board.winner !== false) {
89
+ // eslint-disable-next-line max-statements
90
+ minimax(depth, alpha, beta, playerId) {
91
+ const { board } = this;
92
+ const { hash } = board;
93
+ const cached = this.transposition.get(hash);
94
+ if (cached && cached.depth >= depth) {
95
+ return {
96
+ move: this.bestMoves.get(hash) ?? { x: NaN, y: NaN },
97
+ score: cached.score,
98
+ };
99
+ }
100
+ if (depth === 0 || board.winner !== false) {
101
+ const score = board.heuristic * (this.currentPlayerId === 0 ? 1 : -1);
102
+ this.transposition.set(hash, { depth, score });
76
103
  return {
77
104
  move: { x: NaN, y: NaN },
78
- score: this.board.heuristic * (this.currentPlayerId === 0 ? 1 : -1),
105
+ score,
79
106
  };
80
107
  }
81
- if (this.cache.has(this.board.toString()))
82
- return this.cache.get(this.board.toString());
83
- let bestMove = {
84
- move: { x: NaN, y: NaN },
85
- score: maximisingPlayer ? -Infinity : Infinity,
86
- };
87
- const { emptyCells } = this.board;
88
- for (const move of emptyCells) {
89
- this.board.makeMove(move, playerIds[Number(maximisingPlayer)]);
90
- const { score } = this.alphabeta(depth - 1, alpha, beta, !maximisingPlayer);
91
- this.board.undoLastMove();
92
- if (maximisingPlayer) {
93
- const bestScore = Math.max(score, bestMove.score);
94
- if (bestScore !== bestMove.score)
95
- bestMove = { move, score };
96
- if (bestMove.score > beta)
97
- break;
98
- // eslint-disable-next-line no-param-reassign
99
- alpha = Math.max(alpha, bestScore);
108
+ const moves = [...board.emptyCells];
109
+ // Move ordering: try previously best move first
110
+ const bestStored = this.bestMoves.get(hash);
111
+ if (bestStored) {
112
+ const index = moves.findIndex((m) => m.x === bestStored.x && m.y === bestStored.y);
113
+ if (index > 0)
114
+ moves.unshift(moves.splice(index, 1)[0]);
115
+ }
116
+ let bestScore = -Infinity;
117
+ let bestMove = null;
118
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
119
+ for (let i = 0; i < moves.length; i++) {
120
+ const move = moves[i];
121
+ board.makeMove(move, playerId);
122
+ const { score } = this.minimax(depth - 1, -beta, -alpha, playerId ^ 1);
123
+ const value = -score;
124
+ board.undoLastMove();
125
+ if (value > bestScore) {
126
+ bestScore = value;
127
+ bestMove = move;
100
128
  }
101
- else {
102
- const bestScore = Math.min(score, bestMove.score);
103
- if (bestScore !== bestMove.score)
104
- bestMove = { move, score };
105
- if (bestMove.score < alpha)
106
- break;
129
+ if (value > alpha)
107
130
  // eslint-disable-next-line no-param-reassign
108
- beta = Math.min(beta, bestScore);
109
- }
131
+ alpha = value;
132
+ if (alpha >= beta)
133
+ break;
134
+ }
135
+ if (bestMove) {
136
+ this.transposition.set(hash, { depth, score: bestScore });
137
+ this.bestMoves.set(hash, bestMove);
110
138
  }
111
- this.cache.set(this.board.toString(), bestMove);
112
- return bestMove;
139
+ return {
140
+ move: bestMove ?? { x: NaN, y: NaN },
141
+ score: bestScore,
142
+ };
113
143
  }
114
144
  /** Changes which player's turn it is. */
115
145
  nextTurn() {
@@ -139,4 +169,4 @@ export default class Controller extends EventEmitter {
139
169
  this.nextTurn();
140
170
  }
141
171
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBb0MsV0FBK0I7SUFDbkYsS0FBSyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQThDLFNBQVEsWUFJbEY7SUFDRSwwQkFBMEI7SUFDVixLQUFLLENBQUk7SUFFekIsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBNkI7SUFFbkQsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEMsK0RBQStEO0lBQzlDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBOEMsQ0FBQztJQUUvRTs7Ozs7OztPQU9HO0lBRUgsWUFDSSxXQUF5QixFQUN6QixLQUFRLEVBQ1IsTUFBdUQsRUFDdkQsS0FBMEMsRUFDMUMsY0FBNEQ7UUFFNUQsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksS0FBSyxLQUFLLFNBQVM7WUFDbkIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBbUIsQ0FBQyxDQUFDO1FBRXhDLElBQUksY0FBYyxLQUFLLFNB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RUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFakMsT0FBTztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFOUIsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFekIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEIsQ0FBQztDQXFCSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJvYXJkIGZyb20gXCIuL2JvYXJkLmpzXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRlbWl0dGVyM1wiO1xuaW1wb3J0IHR5cGUgTG9uZ0ludCBmcm9tIFwiLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuL2JvYXJkLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFBsYXllclR5cGUgPSBcImVhc3lDUFVcIiB8IFwiaGFyZENQVVwiIHwgXCJodW1hblwiIHwgXCJpbXBvc3NpYmxlQ1BVXCIgfCBcIm1lZGl1bUNQVVwiO1xuXG5leHBvcnQgdHlwZSBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4gPSB7XG4gICAgb25FbmQ/OiAod2lubmVyOiBudW1iZXIgfCBudWxsKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgICBvbkludmFsaWRJbnB1dD86IChwb3NpdGlvbjogUG9zaXRpb24pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIHJlbmRlcmVyPzogKGNvbnRyb2xsZXI6IENvbnRyb2xsZXI8VD4pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xufTtcbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+ID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZ1bmN0aW9uLXR5cGVcbiAgICBuZXcocGxheWVyT25lVHlwZTogUGxheWVyVHlwZSwgcGxheWVyVHdvVHlwZTogUGxheWVyVHlwZSwgb3B0aW9ucz86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD4pOiBDb250cm9sbGVyPFQ+O1xufTtcbi8qKlxuICogRGVjb3JhdG9yIHRvIGNoZWNrIHRoYXQgdGhlIGNvbnN0cnVjdG9yIHR5cGUgZm9yIHRoZSBnaXZlbiBjbGFzcyBpcyBjb3JyZWN0LlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBib2FyZC5cbiAqIEBwYXJhbSBjb25zdHJ1Y3RvciAtIFRoZSBjbGFzcyB0byBjaGVjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdhbWU8VCBleHRlbmRzIEJvYXJkPExvbmdJbnQgfCBudW1iZXI+Pihjb25zdHJ1Y3RvcjogR2FtZUNvbnN0cnVjdG9yPFQ+KTogdm9pZCB7XG4gICAgdm9pZCBjb25zdHJ1Y3Rvcjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZ2FtZSBjb250cm9sbGVyLlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiBib2FyZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYWJzdHJhY3QgY2xhc3MgQ29udHJvbGxlcjxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+IGV4dGVuZHMgRXZlbnRFbWl0dGVyPHtcbiAgICBlbmQ6IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkVuZFwiXTtcbiAgICBpbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdO1xuICAgIGludmFsaWRJbnB1dDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uSW52YWxpZElucHV0XCJdO1xufT4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgYm9hcmQuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGJvYXJkOiBUO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB2aWV3IG9iamVjdC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVuZGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAgIC8qKiBDb250YWlucyB0aGUgcGxheWVyIG9iamVjdHMuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsYXllcnM6IEFycmF5PHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfT47XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIElEIG9mIHRoZSBjdXJyZW50IHBsYXllci4gKi9cbiAgICBwcml2YXRlIGN1cnJlbnRQbGF5ZXJJZDogbnVtYmVyID0gMDtcblxuICAgIC8qKiBTdG9yZXMgcHJlY29tcHV0ZWQgdmFsdWVzIHRvIG9wdGltaXNlIG1pbmltYXgvYWxwaGFiZXRhLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfT4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29udHJvbGxlci5cbiAgICAgKiBAcGFyYW0gcGxheWVyVHlwZXMgLSBUaGUgdHlwZXMgb2YgcGxheWVyIGZvciB0aGUgZ2FtZS5cbiAgICAgKiBAcGFyYW0gYm9hcmQgLSBUaGUgYm9hcmQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByZW5kZXIgLSBUaGUgcmVuZGVyIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSBvbkVuZCAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGdhbWUgZW5kcy5cbiAgICAgKiBAcGFyYW0gb25JbnZhbGlkSW5wdXQgLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBpbnB1dCBpcyBpbnZhbGlkLlxuICAgICAqL1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgICAgICBwbGF5ZXJUeXBlczogUGxheWVyVHlwZVtdLFxuICAgICAgICBib2FyZDogVCxcbiAgICAgICAgcmVuZGVyOiBSZXF1aXJlZDxHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+PltcInJlbmRlcmVyXCJdLFxuICAgICAgICBvbkVuZD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkVuZFwiXSxcbiAgICAgICAgb25JbnZhbGlkSW5wdXQ/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25JbnZhbGlkSW5wdXRcIl0sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYm9hcmQgPSBib2FyZDtcbiAgICAgICAgdGhpcy5wbGF5ZXJzID0gcGxheWVyVHlwZXMubWFwKChwbGF5ZXJUeXBlLCBpZCkgPT4gKHsgaWQsIHBsYXllclR5cGUgfSkpO1xuICAgICAgICB0aGlzLnJlbmRlciA9IHJlbmRlci5iaW5kKG51bGwsIHRoaXMpO1xuXG4gICAgICAgIGlmIChvbkVuZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImVuZFwiLCBvbkVuZCBhcyAoKSA9PiB2b2lkKTtcblxuICAgICAgICBpZiAob25JbnZhbGlkSW5wdXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRoaXMub24oXCJpbnZhbGlkSW5wdXRcIiwgb25JbnZhbGlkSW5wdXQgYXMgKCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBwbGF5ZXIgb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjdXJyZW50UGxheWVyKCk6IHsgaWQ6IG51bWJlcjsgcGxheWVyVHlwZTogUGxheWVyVHlwZTsgfSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXllcnNbdGhpcy5jdXJyZW50UGxheWVySWRdITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgbWFpbiBnYW1lIGZsb3cuXG4gICAgICogQHJldHVybnMgVGhlIHdpbm5lciBvciBudWxsIGluIHRoZSBldmVudCBvZiBhIHRpZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcGxheSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5vbihcImlucHV0XCIsIChhc3luYyAobW92ZTogUG9zaXRpb24pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUobW92ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiKVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZU1vdmUoKTtcbiAgICAgICAgfSkgYXMgKG1vdmU6IFBvc2l0aW9uKSA9PiB2b2lkKTtcblxuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50UGxheWVyLnBsYXllclR5cGUgIT09IFwiaHVtYW5cIiAmJiB0aGlzLmJvYXJkLndpbm5lciA9PT0gZmFsc2UpXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IGFsZ29yaXRobSB3aXRoIGFscGhhLWJldGEgcHJ1bmluZyAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWluaW1heCkuXG4gICAgICogQHBhcmFtIGRlcHRoIC0gVGhlIGRlcHRoIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGFscGhhIC0gVGhlIGJvdW5kcyBmb3IgdGhlIGFscGhhLWJldGEgdmFyaWF0aW9uIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIGJldGEgLSBUaGUgYm91bmRzIGZvciB0aGUgYWxwaGEtYmV0YSB2YXJpYXRpb24gb2YgdGhlIGFsZ29yaXRobS5cbiAgICAgKiBAcGFyYW0gbWF4aW1pc2luZ1BsYXllciAtIFdoZXRoZXIgb3Igbm90IHRoZSBjdXJyZW50IHBsYXllciBpcyB0aGUgbWF4aW1pc2luZyBwbGF5ZXIuXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWxwaGFiZXRhKFxuICAgICAgICBkZXB0aDogbnVtYmVyID0gSW5maW5pdHksXG4gICAgICAgIGFscGhhOiBudW1iZXIgPSAtSW5maW5pdHksXG4gICAgICAgIGJldGE6IG51bWJlciA9IEluZmluaXR5LFxuICAgICAgICBtYXhpbWlzaW5nUGxheWVyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9IHtcbiAgICAgICAgY29uc3QgcGxheWVySWRzID0gWyh0aGlzLmN1cnJlbnRQbGF5ZXJJZCArIDEpICUgMiwgdGhpcy5jdXJyZW50UGxheWVySWRdO1xuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCB0aGlzLmJvYXJkLndpbm5lciAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlOiB0aGlzLmJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FjaGUuaGFzKHRoaXMuYm9hcmQudG9TdHJpbmcoKSkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQodGhpcy5ib2FyZC50b1N0cmluZygpKSE7XG5cbiAgICAgICAgbGV0IGJlc3RNb3ZlID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IG1heGltaXNpbmdQbGF5ZXIgPyAtSW5maW5pdHkgOiBJbmZpbml0eSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGZvciAoY29uc3QgbW92ZSBvZiBlbXB0eUNlbGxzKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkc1tOdW1iZXIobWF4aW1pc2luZ1BsYXllcildISk7XG4gICAgICAgICAgICBjb25zdCB7IHNjb3JlIH0gPSB0aGlzLmFscGhhYmV0YShkZXB0aCAtIDEsIGFscGhhLCBiZXRhLCAhbWF4aW1pc2luZ1BsYXllcik7XG5cbiAgICAgICAgICAgIHRoaXMuYm9hcmQudW5kb0xhc3RNb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmIChtYXhpbWlzaW5nUGxheWVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5tYXgoc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA+IGJldGEpXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICAgICAgYWxwaGEgPSBNYXRoLm1heChhbHBoYSwgYmVzdFNjb3JlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmVzdFNjb3JlID0gTWF0aC5taW4oc2NvcmUsIGJlc3RNb3ZlLnNjb3JlKTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgIT09IGJlc3RNb3ZlLnNjb3JlKVxuICAgICAgICAgICAgICAgICAgICBiZXN0TW92ZSA9IHsgbW92ZSwgc2NvcmUgfTtcblxuICAgICAgICAgICAgICAgIGlmIChiZXN0TW92ZS5zY29yZSA8IGFscGhhKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGJldGEgPSBNYXRoLm1pbihiZXRhLCBiZXN0U2NvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQodGhpcy5ib2FyZC50b1N0cmluZygpLCBiZXN0TW92ZSk7XG5cbiAgICAgICAgcmV0dXJuIGJlc3RNb3ZlO1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBtb3ZlIHRvIG1ha2UuIElmIG9tbWl0dGVkLCB0aGUgbW92ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBDUFUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlTW92ZShpbnB1dD86IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKHRoaXMuZGV0ZXJtaW5lQ1BVTW92ZSh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSwgaW5wdXQpLCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgfHwgIXRoaXMuYm9hcmQubW92ZUlzVmFsaWQoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShpbnB1dCwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIiwgd2lubmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0VHVybigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIENQVSBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IC0gVGhlIGRpZmZpY3VsdHkgb2YgdGhlIEFJLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5tYXhEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yYW5kb21Nb3ZlIC0gQSByYW5kb20gbW92ZSB0byBtYWtlLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgdG8gbWFrZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmluZE9wdGltYWxNb3ZlKG9wdGlvbnM/OiB7XG4gICAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgICByYW5kb21Nb3ZlPzogUG9zaXRpb247XG4gICAgfSk6IFBvc2l0aW9uO1xufVxuIl19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL2NvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQWU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLElBQUksQ0FBb0MsV0FBK0I7SUFDbkYsS0FBSyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQThDLFNBQVEsWUFJbEY7SUFDRSwwQkFBMEI7SUFDVixLQUFLLENBQUk7SUFFekIsZ0NBQWdDO0lBQ2hCLE1BQU0sQ0FBNkI7SUFFbkQsbUNBQW1DO0lBQ2hCLE9BQU8sQ0FBaUQ7SUFFM0UsNkNBQTZDO0lBQ3JDLGVBQWUsR0FBVyxDQUFDLENBQUM7SUFFcEMsa0VBQWtFO0lBQ2pELGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBNkMsQ0FBQztJQUV0Rix5REFBeUQ7SUFDeEMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBRXpEOzs7Ozs7O09BT0c7SUFFSCxZQUNJLFdBQXlCLEVBQ3pCLEtBQVEsRUFDUixNQUF1RCxFQUN2RCxLQUEwQyxFQUMxQyxjQUE0RDtRQUU1RCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxLQUFLLEtBQUssU0FBUztZQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFtQixDQUFDLENBQUM7UUFFeEMsSUFBSSxjQUFjLEtBQUssU0FBUztZQUM1QixJQUFJLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxjQUE0QixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBRSxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNiLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQWMsRUFBaUIsRUFBRTtZQUN0RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxPQUFPO2dCQUN6QyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQTZCLENBQUMsQ0FBQztRQUVoQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLO1lBQzNFLDRDQUE0QztZQUM1QyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLE1BQU0sQ0FBQyxRQUFnQjtRQUM3QixJQUFJLElBQUksR0FBdUM7WUFDM0MsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQ3hCLEtBQUssRUFBRSxDQUFDLFFBQVE7U0FDbkIsQ0FBQztRQUVGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxRQUFRLEVBQUUsS0FBSyxFQUFFO1lBQzFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsMENBQTBDO0lBQ2xDLE9BQU8sQ0FBQyxLQUFhLEVBQUUsS0FBYSxFQUFFLElBQVksRUFBRSxRQUFnQjtRQUN4RSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNsQyxPQUFPO2dCQUNILElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtnQkFDcEQsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2FBQ3RCLENBQUM7UUFDTixDQUFDO1FBRUQsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFFL0MsT0FBTztnQkFDSCxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ3hCLEtBQUs7YUFDUixDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFcEMsZ0RBQWdEO1FBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbkYsSUFBSSxLQUFLLEdBQUcsQ0FBQztnQkFDVCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQzFCLElBQUksUUFBUSxHQUFvQixJQUFJLENBQUM7UUFFckMsNERBQTREO1FBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBRSxDQUFDO1lBRXZCLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRS9CLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUMxQixLQUFLLEdBQUcsQ0FBQyxFQUNULENBQUMsSUFBSSxFQUNMLENBQUMsS0FBSyxFQUNOLFFBQVEsR0FBRyxDQUFDLENBQ2YsQ0FBQztZQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBRXJCLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUVyQixJQUFJLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztnQkFDcEIsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDbEIsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNwQixDQUFDO1lBRUQsSUFBSSxLQUFLLEdBQUcsS0FBSztnQkFDYiw2Q0FBNkM7Z0JBQzdDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFFbEIsSUFBSSxLQUFLLElBQUksSUFBSTtnQkFDYixNQUFNO1FBQ2QsQ0FBQztRQUVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxPQUFPO1lBQ0gsSUFBSSxFQUFFLFFBQVEsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNwQyxLQUFLLEVBQUUsU0FBUztTQUNuQixDQUFDO0lBQ04sQ0FBQztJQUVELHlDQUF5QztJQUNqQyxRQUFRO1FBQ1osSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBZ0I7UUFDbkMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUcsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUVqQyxPQUFPO1lBQ1gsQ0FBQztZQUVELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU5QixJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV6QixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0NBcUJKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJldmVudGVtaXR0ZXIzXCI7XG5pbXBvcnQgdHlwZSBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4vYm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUGxheWVyVHlwZSA9IFwiZWFzeUNQVVwiIHwgXCJoYXJkQ1BVXCIgfCBcImh1bWFuXCIgfCBcImltcG9zc2libGVDUFVcIiB8IFwibWVkaXVtQ1BVXCI7XG5cbmV4cG9ydCB0eXBlIEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VCBleHRlbmRzIEJvYXJkPExvbmdJbnQgfCBudW1iZXI+PiA9IHtcbiAgICBvbkVuZD86ICh3aW5uZXI6IG51bWJlciB8IG51bGwpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uSW52YWxpZElucHV0PzogKHBvc2l0aW9uOiBQb3NpdGlvbikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gICAgcmVuZGVyZXI/OiAoY29udHJvbGxlcjogQ29udHJvbGxlcjxUPikgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG59O1xuZXhwb3J0IHR5cGUgR2FtZUNvbnN0cnVjdG9yPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4gPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZnVuY3Rpb24tdHlwZVxuICAgIG5ldyhwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLCBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLCBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPik6IENvbnRyb2xsZXI8VD47XG59O1xuLyoqXG4gKiBEZWNvcmF0b3IgdG8gY2hlY2sgdGhhdCB0aGUgY29uc3RydWN0b3IgdHlwZSBmb3IgdGhlIGdpdmVuIGNsYXNzIGlzIGNvcnJlY3QuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGJvYXJkLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gVGhlIGNsYXNzIHRvIGNoZWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gR2FtZTxUIGV4dGVuZHMgQm9hcmQ8TG9uZ0ludCB8IG51bWJlcj4+KGNvbnN0cnVjdG9yOiBHYW1lQ29uc3RydWN0b3I8VD4pOiB2b2lkIHtcbiAgICB2b2lkIGNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGNvbnRyb2xsZXIuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGJvYXJkLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyPFQgZXh0ZW5kcyBCb2FyZDxMb25nSW50IHwgbnVtYmVyPj4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8e1xuICAgIGVuZDogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uRW5kXCJdO1xuICAgIGlucHV0OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25JbnZhbGlkSW5wdXRcIl07XG4gICAgaW52YWxpZElucHV0OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPFQ+W1wib25JbnZhbGlkSW5wdXRcIl07XG59PiB7XG4gICAgLyoqIENvbnRhaW5zIHRoZSBib2FyZC4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYm9hcmQ6IFQ7XG5cbiAgICAvKiogQ29udGFpbnMgdGhlIHZpZXcgb2JqZWN0LiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZW5kZXI6ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSBwbGF5ZXIgb2JqZWN0cy4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxheWVyczogQXJyYXk8eyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9PjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGN1cnJlbnQgcGxheWVyLiAqL1xuICAgIHByaXZhdGUgY3VycmVudFBsYXllcklkOiBudW1iZXIgPSAwO1xuXG4gICAgLyoqIENvbnRhaW5zIHRoZSB0cmFuc3Bvc2l0aW9uIHRhYmxlIGZvciB0aGUgbWluaW1heCBhbGdvcml0aG0uICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc3Bvc2l0aW9uID0gbmV3IE1hcDxudW1iZXIsIHsgZGVwdGg6IG51bWJlcjsgc2NvcmU6IG51bWJlcjsgfT4oKTtcblxuICAgIC8qKiBDb250YWlucyB0aGUgYmVzdCBtb3ZlcyBmb3IgdGhlIG1pbmltYXggYWxnb3JpdGhtLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmVzdE1vdmVzID0gbmV3IE1hcDxudW1iZXIsIFBvc2l0aW9uPigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDb250cm9sbGVyLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUeXBlcyAtIFRoZSB0eXBlcyBvZiBwbGF5ZXIgZm9yIHRoZSBnYW1lLlxuICAgICAqIEBwYXJhbSBib2FyZCAtIFRoZSBib2FyZCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJlbmRlciAtIFRoZSByZW5kZXIgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIG9uRW5kIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZ2FtZSBlbmRzLlxuICAgICAqIEBwYXJhbSBvbkludmFsaWRJbnB1dCAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGlzIGludmFsaWQuXG4gICAgICovXG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllclR5cGVzOiBQbGF5ZXJUeXBlW10sXG4gICAgICAgIGJvYXJkOiBULFxuICAgICAgICByZW5kZXI6IFJlcXVpcmVkPEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD4+W1wicmVuZGVyZXJcIl0sXG4gICAgICAgIG9uRW5kPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxUPltcIm9uRW5kXCJdLFxuICAgICAgICBvbkludmFsaWRJbnB1dD86IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnM8VD5bXCJvbkludmFsaWRJbnB1dFwiXSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ib2FyZCA9IGJvYXJkO1xuICAgICAgICB0aGlzLnBsYXllcnMgPSBwbGF5ZXJUeXBlcy5tYXAoKHBsYXllclR5cGUsIGlkKSA9PiAoeyBpZCwgcGxheWVyVHlwZSB9KSk7XG4gICAgICAgIHRoaXMucmVuZGVyID0gcmVuZGVyLmJpbmQobnVsbCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKG9uRW5kICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aGlzLm9uKFwiZW5kXCIsIG9uRW5kIGFzICgpID0+IHZvaWQpO1xuXG4gICAgICAgIGlmIChvbkludmFsaWRJbnB1dCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vbihcImludmFsaWRJbnB1dFwiLCBvbkludmFsaWRJbnB1dCBhcyAoKSA9PiB2b2lkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHBsYXllciBvYmplY3QuXG4gICAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcGxheWVyIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRQbGF5ZXIoKTogeyBpZDogbnVtYmVyOyBwbGF5ZXJUeXBlOiBQbGF5ZXJUeXBlOyB9IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGxheWVyc1t0aGlzLmN1cnJlbnRQbGF5ZXJJZF0hO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBtYWluIGdhbWUgZmxvdy5cbiAgICAgKiBAcmV0dXJucyBUaGUgd2lubmVyIG9yIG51bGwgaW4gdGhlIGV2ZW50IG9mIGEgdGllLlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBwbGF5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlcigpO1xuICAgICAgICB0aGlzLm9uKFwiaW5wdXRcIiwgKGFzeW5jIChtb3ZlOiBQb3NpdGlvbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZShtb3ZlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlTW92ZSgpO1xuICAgICAgICB9KSBhcyAobW92ZTogUG9zaXRpb24pID0+IHZvaWQpO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSAhPT0gXCJodW1hblwiICYmIHRoaXMuYm9hcmQud2lubmVyID09PSBmYWxzZSlcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1ha2VNb3ZlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSB3cmFwcGVyIGZvciB0aGUgbWluaW1heCBhbGdvcml0aG0gdG8gZmluZCB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gbWF4RGVwdGggLSBUaGUgbWF4aW11bSBkZXB0aCB0byBzZWFyY2guXG4gICAgICogQHJldHVybnMgVGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgYm9hcmQgc3RhdGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlYXJjaChtYXhEZXB0aDogbnVtYmVyKTogeyBtb3ZlOiBQb3NpdGlvbjsgc2NvcmU6IG51bWJlcjsgfSB7XG4gICAgICAgIGxldCBiZXN0OiB7IG1vdmU6IFBvc2l0aW9uOyBzY29yZTogbnVtYmVyOyB9ID0ge1xuICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgc2NvcmU6IC1JbmZpbml0eSxcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBkZXB0aCA9IDE7IGRlcHRoIDw9IG1heERlcHRoOyBkZXB0aCsrKVxuICAgICAgICAgICAgYmVzdCA9IHRoaXMubWluaW1heChkZXB0aCwgLUluZmluaXR5LCBJbmZpbml0eSwgdGhpcy5jdXJyZW50UGxheWVySWQpO1xuXG4gICAgICAgIHJldHVybiBiZXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbWF4IChuZWdhbWF4KSBhbGdvcml0aG0gd2l0aCBhbHBoYS1iZXRhIHBydW5pbmcgKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01pbmltYXgpLlxuICAgICAqIEBwYXJhbSBkZXB0aCAtIFRoZSBkZXB0aCBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBhbHBoYSAtIFRoZSBib3VuZHMgZm9yIHRoZSBhbHBoYS1iZXRhIHZhcmlhdGlvbiBvZiB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBiZXRhIC0gVGhlIGJvdW5kcyBmb3IgdGhlIGFscGhhLWJldGEgdmFyaWF0aW9uIG9mIHRoZSBhbGdvcml0aG0uXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllciB0byBjYWxjdWxhdGUgdGhlIG1vdmUgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgcHJpdmF0ZSBtaW5pbWF4KGRlcHRoOiBudW1iZXIsIGFscGhhOiBudW1iZXIsIGJldGE6IG51bWJlciwgcGxheWVySWQ6IG51bWJlcik6IHsgbW92ZTogUG9zaXRpb247IHNjb3JlOiBudW1iZXI7IH0ge1xuICAgICAgICBjb25zdCB7IGJvYXJkIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IGhhc2ggfSA9IGJvYXJkO1xuXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMudHJhbnNwb3NpdGlvbi5nZXQoaGFzaCk7XG5cbiAgICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuZGVwdGggPj0gZGVwdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogdGhpcy5iZXN0TW92ZXMuZ2V0KGhhc2gpID8/IHsgeDogTmFOLCB5OiBOYU4gfSxcbiAgICAgICAgICAgICAgICBzY29yZTogY2FjaGVkLnNjb3JlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCB8fCBib2FyZC53aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zdCBzY29yZSA9IGJvYXJkLmhldXJpc3RpYyAqICh0aGlzLmN1cnJlbnRQbGF5ZXJJZCA9PT0gMCA/IDEgOiAtMSk7XG5cbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3NpdGlvbi5zZXQoaGFzaCwgeyBkZXB0aCwgc2NvcmUgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW92ZTogeyB4OiBOYU4sIHk6IE5hTiB9LFxuICAgICAgICAgICAgICAgIHNjb3JlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vdmVzID0gWy4uLmJvYXJkLmVtcHR5Q2VsbHNdO1xuXG4gICAgICAgIC8vIE1vdmUgb3JkZXJpbmc6IHRyeSBwcmV2aW91c2x5IGJlc3QgbW92ZSBmaXJzdFxuICAgICAgICBjb25zdCBiZXN0U3RvcmVkID0gdGhpcy5iZXN0TW92ZXMuZ2V0KGhhc2gpO1xuXG4gICAgICAgIGlmIChiZXN0U3RvcmVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IG1vdmVzLmZpbmRJbmRleCgobSkgPT4gbS54ID09PSBiZXN0U3RvcmVkLnggJiYgbS55ID09PSBiZXN0U3RvcmVkLnkpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggPiAwKVxuICAgICAgICAgICAgICAgIG1vdmVzLnVuc2hpZnQobW92ZXMuc3BsaWNlKGluZGV4LCAxKVswXSEpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJlc3RTY29yZSA9IC1JbmZpbml0eTtcbiAgICAgICAgbGV0IGJlc3RNb3ZlOiBQb3NpdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBtb3ZlID0gbW92ZXNbaV0hO1xuXG4gICAgICAgICAgICBib2FyZC5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgc2NvcmUgfSA9IHRoaXMubWluaW1heChcbiAgICAgICAgICAgICAgICBkZXB0aCAtIDEsXG4gICAgICAgICAgICAgICAgLWJldGEsXG4gICAgICAgICAgICAgICAgLWFscGhhLFxuICAgICAgICAgICAgICAgIHBsYXllcklkIF4gMSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gLXNjb3JlO1xuXG4gICAgICAgICAgICBib2FyZC51bmRvTGFzdE1vdmUoKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID4gYmVzdFNjb3JlKSB7XG4gICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgYmVzdE1vdmUgPSBtb3ZlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBhbHBoYSlcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBhbHBoYSA9IHZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoYWxwaGEgPj0gYmV0YSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiZXN0TW92ZSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc3Bvc2l0aW9uLnNldChoYXNoLCB7IGRlcHRoLCBzY29yZTogYmVzdFNjb3JlIH0pO1xuICAgICAgICAgICAgdGhpcy5iZXN0TW92ZXMuc2V0KGhhc2gsIGJlc3RNb3ZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb3ZlOiBiZXN0TW92ZSA/PyB7IHg6IE5hTiwgeTogTmFOIH0sXG4gICAgICAgICAgICBzY29yZTogYmVzdFNjb3JlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBDaGFuZ2VzIHdoaWNoIHBsYXllcidzIHR1cm4gaXQgaXMuICovXG4gICAgcHJpdmF0ZSBuZXh0VHVybigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGxheWVySWQgPSAodGhpcy5jdXJyZW50UGxheWVySWQgKyAxKSAlIHRoaXMucGxheWVycy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlLlxuICAgICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBtb3ZlIHRvIG1ha2UuIElmIG9tbWl0dGVkLCB0aGUgbW92ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBDUFUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBtYWtlTW92ZShpbnB1dD86IFBvc2l0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChpbnB1dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJvYXJkLm1ha2VNb3ZlKHRoaXMuZGV0ZXJtaW5lQ1BVTW92ZSh0aGlzLmN1cnJlbnRQbGF5ZXIucGxheWVyVHlwZSwgaW5wdXQpLCB0aGlzLmN1cnJlbnRQbGF5ZXIuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYXllci5wbGF5ZXJUeXBlICE9PSBcImh1bWFuXCIgfHwgIXRoaXMuYm9hcmQubW92ZUlzVmFsaWQoaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiaW52YWxpZElucHV0XCIsIGlucHV0KTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5ib2FyZC5tYWtlTW92ZShpbnB1dCwgdGhpcy5jdXJyZW50UGxheWVyLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgICAgIGNvbnN0IHsgd2lubmVyIH0gPSB0aGlzLmJvYXJkO1xuXG4gICAgICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIiwgd2lubmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uZXh0VHVybigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgdGhlIENQVSBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IC0gVGhlIGRpZmZpY3VsdHkgb2YgdGhlIEFJLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyBUaGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4sIGFsZ29yaXRobT86IEFsZ29yaXRobSk6IFBvc2l0aW9uO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5tYXhEZXB0aCAtIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHNlYXJjaC5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucy5yYW5kb21Nb3ZlIC0gQSByYW5kb20gbW92ZSB0byBtYWtlLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgdG8gbWFrZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZmluZE9wdGltYWxNb3ZlKG9wdGlvbnM/OiB7XG4gICAgICAgIG1heERlcHRoPzogbnVtYmVyO1xuICAgICAgICByYW5kb21Nb3ZlPzogUG9zaXRpb247XG4gICAgfSk6IFBvc2l0aW9uO1xufVxuIl19
@@ -20,6 +20,7 @@ export default class Board extends Base<LongInt> {
20
20
  constructor();
21
21
  /**
22
22
  * Calculates the heuristic score for the current board state.
23
+ * Favors blocking opponent's 3s over making own 3s.
23
24
  * @returns The heuristic score.
24
25
  */
25
26
  get heuristic(): number;
@@ -49,6 +49,7 @@ export default class Board extends Base {
49
49
  }
50
50
  /**
51
51
  * Calculates the heuristic score for the current board state.
52
+ * Favors blocking opponent's 3s over making own 3s.
52
53
  * @returns The heuristic score.
53
54
  */
54
55
  // eslint-disable-next-line max-statements
@@ -60,6 +61,9 @@ export default class Board extends Base {
60
61
  return -(10000 - this.moves.length);
61
62
  let p0Score = 0;
62
63
  let p1Score = 0;
64
+ // Scoring: defensive moves (blocking) weighted 1.5x higher than offensive moves
65
+ const offensiveScores = [0, 1, 10, 100];
66
+ const defensiveScores = [0, 1.5, 15, 150];
63
67
  // Horizontal →
64
68
  for (let y = 0; y < this.height; y++) {
65
69
  for (let x = 0; x < this.width - 3; x++) {
@@ -72,9 +76,9 @@ export default class Board extends Base {
72
76
  const p0Count = window.filter((occupier) => occupier === 0).length;
73
77
  const p1Count = window.filter((occupier) => occupier === 1).length;
74
78
  if (p0Count > 0 && p1Count === 0)
75
- p0Score += [0, 1, 10, 100][p0Count];
79
+ p0Score += defensiveScores[p0Count];
76
80
  else if (p1Count > 0 && p0Count === 0)
77
- p1Score += [0, 1, 10, 100][p1Count];
81
+ p1Score += offensiveScores[p1Count];
78
82
  }
79
83
  }
80
84
  // Vertical ↓
@@ -89,9 +93,9 @@ export default class Board extends Base {
89
93
  const p0Count = window.filter((occupier) => occupier === 0).length;
90
94
  const p1Count = window.filter((occupier) => occupier === 1).length;
91
95
  if (p0Count > 0 && p1Count === 0)
92
- p0Score += [0, 1, 10, 100][p0Count];
96
+ p0Score += defensiveScores[p0Count];
93
97
  else if (p1Count > 0 && p0Count === 0)
94
- p1Score += [0, 1, 10, 100][p1Count];
98
+ p1Score += offensiveScores[p1Count];
95
99
  }
96
100
  }
97
101
  // Diagonal ↘
@@ -106,9 +110,9 @@ export default class Board extends Base {
106
110
  const p0Count = window.filter((occupier) => occupier === 0).length;
107
111
  const p1Count = window.filter((occupier) => occupier === 1).length;
108
112
  if (p0Count > 0 && p1Count === 0)
109
- p0Score += [0, 1, 10, 100][p0Count];
113
+ p0Score += defensiveScores[p0Count];
110
114
  else if (p1Count > 0 && p0Count === 0)
111
- p1Score += [0, 1, 10, 100][p1Count];
115
+ p1Score += offensiveScores[p1Count];
112
116
  }
113
117
  }
114
118
  // Diagonal ↗
@@ -123,9 +127,9 @@ export default class Board extends Base {
123
127
  const p0Count = window.filter((occupier) => occupier === 0).length;
124
128
  const p1Count = window.filter((occupier) => occupier === 1).length;
125
129
  if (p0Count > 0 && p1Count === 0)
126
- p0Score += [0, 1, 10, 100][p0Count];
130
+ p0Score += defensiveScores[p0Count];
127
131
  else if (p1Count > 0 && p0Count === 0)
128
- p1Score += [0, 1, 10, 100][p1Count];
132
+ p1Score += offensiveScores[p1Count];
129
133
  }
130
134
  }
131
135
  return p1Score - p0Score;
@@ -160,9 +164,9 @@ export default class Board extends Base {
160
164
  */
161
165
  undoLastMove() {
162
166
  // X-coordinate is recoverable from the bit index: bit % width = x.
163
- const x = this.moves[this.moves.length - 1] % this.width;
167
+ const { x } = (this.moves[this.moves.length - 1]);
164
168
  super.undoLastMove();
165
169
  this.heights[x]++;
166
170
  }
167
171
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNjLE9BQU8sR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElB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LFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ2EsWUFBWTtRQUN4QixtRUFBbUU7UUFDbkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTFELEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBRSxFQUFFLENBQUM7SUFDdkIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UgZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi8uLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKiogUmVwcmVzZW50cyBhIENvbm5lY3QgNCBib2FyZC4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJvYXJkIGV4dGVuZHMgQmFzZTxMb25nSW50PiB7XG4gICAgcHJvdGVjdGVkIHdpbm5pbmdTdGF0ZXM6IExvbmdJbnRCaXRCb2FyZFtdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBUcmFja3MgdGhlIG5leHQgYXZhaWxhYmxlIHJvdyBpbmRleCBwZXIgY29sdW1uIChyb3cgNSA9IGJvdHRvbSwgcm93IDAgPSB0b3ApLlxuICAgICAqIEEgdmFsdWUgb2YgLTEgbWVhbnMgdGhlIGNvbHVtbiBpcyBmdWxsLlxuICAgICAqIE1haW50YWluZWQgaW5jcmVtZW50YWxseSBzbyBtYWtlTW92ZSBhbmQgZW1wdHlDZWxscyBhcmUgTygxKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodHM6IG51bWJlcltdID0gWzUsIDUsIDUsIDUsIDUsIDUsIDVdO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBGVUxMX0JPQVJEID0gbmV3IExvbmdJbnQoWzBiMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMV8xMTExMTExLCAwYjExMTExMTFfMTExXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IEhPUklaT05UQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAwMDAwXzAwMDExMTEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgVkVSVElDQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMTAwMF8wMDAwMTAwXzAwMDAwMTBfMDAwMDAwMSwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBOT05fTEVBRElOR19ESUFHT05BTCA9IG5ldyBMb25nSW50KFswYjAwMDBfMDAwMDAwMV8wMDAwMDEwXzAwMDAxMDBfMDAwMTAwMCwgMGIwMDAwMDAwXzAwMF0pO1xuXG4gICAgLyoqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig3LCA2KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5IT1JJWk9OVEFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuVkVSVElDQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgMzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy53aW5uaW5nU3RhdGVzLnB1c2gobmV3IExvbmdJbnRCaXRCb2FyZChMb25nSW50XG4gICAgICAgICAgICAgICAgICAgIC5sZWZ0U2hpZnQodGhpcy5MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTk9OX0xFQURJTkdfRElBR09OQUwsIGkgKyA3ICogailcbiAgICAgICAgICAgICAgICAgICAgLmFuZCh0aGlzLkZVTExfQk9BUkQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBoZXVyaXN0aWMgc2NvcmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBoZXVyaXN0aWMgc2NvcmUuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gICAgcHVibGljIGdldCBoZXVyaXN0aWMoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgeyB3aW5uZXIgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoO1xuXG4gICAgICAgIGlmICh3aW5uZXIgPT09IDEpXG4gICAgICAgICAgICByZXR1cm4gLSgxMDAwMCAtIHRoaXMubW92ZXMubGVuZ3RoKTtcblxuICAgICAgICBsZXQgcDBTY29yZSA9IDA7XG4gICAgICAgIGxldCBwMVNjb3JlID0gMDtcblxuICAgICAgICAvLyBIb3Jpem9udGFsIOKGklxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAyLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJ0aWNhbCDihpNcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQgLSAzOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMiB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5OiB5ICsgMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlhZ29uYWwg4oaYXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmhlaWdodCAtIDM7IHkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAxLCB5OiB5ICsgMSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMiwgeTogeSArIDIgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDMsIHk6IHkgKyAzIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwMENvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAwKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29uc3QgcDFDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMSkubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHAwQ291bnQgPiAwICYmIHAxQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAwU2NvcmUgKz0gWzAsIDEsIDEwLCAxMDBdW3AwQ291bnRdITtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwMUNvdW50ID4gMCAmJiBwMENvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMVNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMUNvdW50XSE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaWFnb25hbCDihpdcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLndpZHRoIC0gMzsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMzsgeSA8IHRoaXMuaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeTogeSAtIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDIsIHk6IHkgLSAyIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5OiB5IC0gMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IFswLCAxLCAxMCwgMTAwXVtwMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBbMCwgMSwgMTAsIDEwMF1bcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHAxU2NvcmUgLSBwMFNjb3JlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbHVtbiBtb3ZlcyBvcmRlcmVkIGNlbnRyZS1maXJzdCBzbyB0aGF0XG4gICAgICogYWxwaGEtYmV0YSBwcnVuaW5nIGVuY291bnRlcnMgdGhlIHN0cm9uZ2VzdCBtb3ZlcyBlYXJsaWVzdC5cbiAgICAgKiBVc2VzIHRoZSBpbmNyZW1lbnRhbCBoZWlnaHRzIGFycmF5IOKAlCBPKHdpZHRoKSwgbm8gYml0Ym9hcmQgcmVhZHMuXG4gICAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgZW1wdHkgY2VsbHMuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCB4IG9mIFszLCAyLCA0LCAxLCA1LCAwLCA2XSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVpZ2h0c1t4XSEgPj0gMClcbiAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5OiAwIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlIG9uIHRoZSBib2FyZC5cbiAgICAgKiBVc2VzIHRoZSBoZWlnaHRzIGFycmF5IGZvciBPKDEpIHJvdyByZXNvbHV0aW9uIGluc3RlYWQgb2Ygc2Nhbm5pbmcgdGhlIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0gbW92ZSAtIFRoZSBtb3ZlIHRvIG1ha2UuXG4gICAgICogQHBhcmFtIHBsYXllcklkIC0gVGhlIHBsYXllciBtYWtpbmcgdGhlIG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIG1ha2VNb3ZlKG1vdmU6IFBvc2l0aW9uLCBwbGF5ZXJJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIG1vdmUueSA9IHRoaXMuaGVpZ2h0c1ttb3ZlLnhdITtcbiAgICAgICAgdGhpcy5oZWlnaHRzW21vdmUueF0hLS07XG4gICAgICAgIHN1cGVyLm1ha2VNb3ZlKG1vdmUsIHBsYXllcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXZlcnNlcyB0aGUgbGFzdCBtb3ZlIGFuZCByZXN0b3JlcyB0aGUgY29sdW1uIGhlaWdodC5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdW5kb0xhc3RNb3ZlKCk6IHZvaWQge1xuICAgICAgICAvLyBYLWNvb3JkaW5hdGUgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgYml0IGluZGV4OiBiaXQgJSB3aWR0aCA9IHguXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm1vdmVzW3RoaXMubW92ZXMubGVuZ3RoIC0gMV0hICUgdGhpcy53aWR0aDtcblxuICAgICAgICBzdXBlci51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRzW3hdISsrO1xuICAgIH1cbn1cbiJdfQ==
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZ2FtZXMvY29ubmVjdDQvYm9hcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxJQUFJLE1BQU0scUJBQXFCLENBQUM7QUFDdkMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUM7QUFDaEQsT0FBTyxlQUFlLE1BQU0sbUNBQW1DLENBQUM7QUFHaEUsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sS0FBTSxTQUFRLElBQWE7SUFDbEMsYUFBYSxHQUFzQixFQUFFLENBQUM7SUFFaEQ7Ozs7T0FJRztJQUNjLE9BQU8sR0FBYSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBRWhGLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsc0NBQXNDLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUV4RixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0csb0NBQW9DO0lBQ3BDO1FBQ0ksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN6QixLQUFLLElB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QUcsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUVuRCxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5pbXBvcnQgTG9uZ0ludCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludC5qc1wiO1xuaW1wb3J0IExvbmdJbnRCaXRCb2FyZCBmcm9tIFwiLi4vLi4vYml0Qm9hcmQvbG9uZ0ludEJpdEJvYXJkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBvc2l0aW9uIH0gZnJvbSBcIi4uLy4uL2Jhc2UvYm9hcmQuanNcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBDb25uZWN0IDQgYm9hcmQuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCb2FyZCBleHRlbmRzIEJhc2U8TG9uZ0ludD4ge1xuICAgIHByb3RlY3RlZCB3aW5uaW5nU3RhdGVzOiBMb25nSW50Qml0Qm9hcmRbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogVHJhY2tzIHRoZSBuZXh0IGF2YWlsYWJsZSByb3cgaW5kZXggcGVyIGNvbHVtbiAocm93IDUgPSBib3R0b20sIHJvdyAwID0gdG9wKS5cbiAgICAgKiBBIHZhbHVlIG9mIC0xIG1lYW5zIHRoZSBjb2x1bW4gaXMgZnVsbC5cbiAgICAgKiBNYWludGFpbmVkIGluY3JlbWVudGFsbHkgc28gbWFrZU1vdmUgYW5kIGVtcHR5Q2VsbHMgYXJlIE8oMSkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHRzOiBudW1iZXJbXSA9IFs1LCA1LCA1LCA1LCA1LCA1LCA1XTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgRlVMTF9CT0FSRCA9IG5ldyBMb25nSW50KFswYjExMTFfMTExMTExMV8xMTExMTExXzExMTExMTFfMTExMTExMSwgMGIxMTExMTExXzExMV0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBIT1JJWk9OVEFMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAwXzAwMDAwMDBfMDAwMDAwMF8wMDAxMTExLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IFZFUlRJQ0FMID0gbmV3IExvbmdJbnQoWzBiMDAwMF8wMDAwMDAxXzAwMDAwMDFfMDAwMDAwMV8wMDAwMDAxLCAwYjAwMDAwMDBfMDAwXSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IExFQURJTkdfRElBR09OQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDEwMDBfMDAwMDEwMF8wMDAwMDEwXzAwMDAwMDEsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTk9OX0xFQURJTkdfRElBR09OQUwgPSBuZXcgTG9uZ0ludChbMGIwMDAwXzAwMDAwMDFfMDAwMDAxMF8wMDAwMTAwXzAwMDEwMDAsIDBiMDAwMDAwMF8wMDBdKTtcblxuICAgIC8qKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJvYXJkLiAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoNywgNik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDY7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuSE9SSVpPTlRBTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLlZFUlRJQ0FMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMud2lubmluZ1N0YXRlcy5wdXNoKG5ldyBMb25nSW50Qml0Qm9hcmQoTG9uZ0ludFxuICAgICAgICAgICAgICAgICAgICAubGVmdFNoaWZ0KHRoaXMuTEVBRElOR19ESUFHT05BTCwgaSArIDcgKiBqKVxuICAgICAgICAgICAgICAgICAgICAuYW5kKHRoaXMuRlVMTF9CT0FSRCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCAzOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpbm5pbmdTdGF0ZXMucHVzaChuZXcgTG9uZ0ludEJpdEJvYXJkKExvbmdJbnRcbiAgICAgICAgICAgICAgICAgICAgLmxlZnRTaGlmdCh0aGlzLk5PTl9MRUFESU5HX0RJQUdPTkFMLCBpICsgNyAqIGopXG4gICAgICAgICAgICAgICAgICAgIC5hbmQodGhpcy5GVUxMX0JPQVJEKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGV1cmlzdGljIHNjb3JlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBGYXZvcnMgYmxvY2tpbmcgb3Bwb25lbnQncyAzcyBvdmVyIG1ha2luZyBvd24gM3MuXG4gICAgICogQHJldHVybnMgVGhlIGhldXJpc3RpYyBzY29yZS5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbiAgICBwdWJsaWMgZ2V0IGhldXJpc3RpYygpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7IHdpbm5lciB9ID0gdGhpcztcblxuICAgICAgICBpZiAod2lubmVyID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIDEwMDAwIC0gdGhpcy5tb3Zlcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHdpbm5lciA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiAtKDEwMDAwIC0gdGhpcy5tb3Zlcy5sZW5ndGgpO1xuXG4gICAgICAgIGxldCBwMFNjb3JlID0gMDtcbiAgICAgICAgbGV0IHAxU2NvcmUgPSAwO1xuXG4gICAgICAgIC8vIFNjb3Jpbmc6IGRlZmVuc2l2ZSBtb3ZlcyAoYmxvY2tpbmcpIHdlaWdodGVkIDEuNXggaGlnaGVyIHRoYW4gb2ZmZW5zaXZlIG1vdmVzXG4gICAgICAgIGNvbnN0IG9mZmVuc2l2ZVNjb3JlcyA9IFswLCAxLCAxMCwgMTAwXTtcbiAgICAgICAgY29uc3QgZGVmZW5zaXZlU2NvcmVzID0gWzAsIDEuNSwgMTUsIDE1MF07XG5cbiAgICAgICAgLy8gSG9yaXpvbnRhbCDihpJcbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGggLSAzOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMiwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMywgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IGRlZmVuc2l2ZVNjb3Jlc1twMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBvZmZlbnNpdmVTY29yZXNbcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVydGljYWwg4oaTXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuaGVpZ2h0IC0gMzsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHgsIHkgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeTogeSArIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeTogeSArIDIgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeTogeSArIDMgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHAwQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBwMUNvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAxKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAocDBDb3VudCA+IDAgJiYgcDFDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDBTY29yZSArPSBkZWZlbnNpdmVTY29yZXNbcDBDb3VudF0hO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAxQ291bnQgPiAwICYmIHAwQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAxU2NvcmUgKz0gb2ZmZW5zaXZlU2NvcmVzW3AxQ291bnRdITtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpYWdvbmFsIOKGmFxuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMud2lkdGggLSAzOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5oZWlnaHQgLSAzOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSBbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeCwgeSB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMSwgeTogeSArIDEgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDIsIHk6IHkgKyAyIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAzLCB5OiB5ICsgMyB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcDBDb3VudCA9IHdpbmRvdy5maWx0ZXIoKG9jY3VwaWVyKSA9PiBvY2N1cGllciA9PT0gMCkubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHAxQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDEpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGlmIChwMENvdW50ID4gMCAmJiBwMUNvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBwMFNjb3JlICs9IGRlZmVuc2l2ZVNjb3Jlc1twMENvdW50XSE7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocDFDb3VudCA+IDAgJiYgcDBDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDFTY29yZSArPSBvZmZlbnNpdmVTY29yZXNbcDFDb3VudF0hO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlhZ29uYWwg4oaXXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy53aWR0aCAtIDM7IHgrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeSA9IDM7IHkgPCB0aGlzLmhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHgsIHkgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2VsbE9jY3VwaWVyKHsgeDogeCArIDEsIHk6IHkgLSAxIH0gYXMgUG9zaXRpb24pLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNlbGxPY2N1cGllcih7IHg6IHggKyAyLCB5OiB5IC0gMiB9IGFzIFBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZWxsT2NjdXBpZXIoeyB4OiB4ICsgMywgeTogeSAtIDMgfSBhcyBQb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHAwQ291bnQgPSB3aW5kb3cuZmlsdGVyKChvY2N1cGllcikgPT4gb2NjdXBpZXIgPT09IDApLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBwMUNvdW50ID0gd2luZG93LmZpbHRlcigob2NjdXBpZXIpID0+IG9jY3VwaWVyID09PSAxKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAocDBDb3VudCA+IDAgJiYgcDFDb3VudCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgcDBTY29yZSArPSBkZWZlbnNpdmVTY29yZXNbcDBDb3VudF0hO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAxQ291bnQgPiAwICYmIHAwQ291bnQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHAxU2NvcmUgKz0gb2ZmZW5zaXZlU2NvcmVzW3AxQ291bnRdITtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwMVNjb3JlIC0gcDBTY29yZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBsaXN0IG9mIGF2YWlsYWJsZSBjb2x1bW4gbW92ZXMgb3JkZXJlZCBjZW50cmUtZmlyc3Qgc28gdGhhdFxuICAgICAqIGFscGhhLWJldGEgcHJ1bmluZyBlbmNvdW50ZXJzIHRoZSBzdHJvbmdlc3QgbW92ZXMgZWFybGllc3QuXG4gICAgICogVXNlcyB0aGUgaW5jcmVtZW50YWwgaGVpZ2h0cyBhcnJheSDigJQgTyh3aWR0aCksIG5vIGJpdGJvYXJkIHJlYWRzLlxuICAgICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIGVtcHR5IGNlbGxzLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBbMywgMiwgNCwgMSwgNSwgMCwgNl0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlaWdodHNbeF0hID49IDApXG4gICAgICAgICAgICAgICAgZW1wdHlDZWxscy5wdXNoKHsgeCwgeTogMCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbXB0eUNlbGxzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgbW92ZSBvbiB0aGUgYm9hcmQuXG4gICAgICogVXNlcyB0aGUgaGVpZ2h0cyBhcnJheSBmb3IgTygxKSByb3cgcmVzb2x1dGlvbiBpbnN0ZWFkIG9mIHNjYW5uaW5nIHRoZSBjb2x1bW4uXG4gICAgICogQHBhcmFtIG1vdmUgLSBUaGUgbW92ZSB0byBtYWtlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCAtIFRoZSBwbGF5ZXIgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBtb3ZlLnkgPSB0aGlzLmhlaWdodHNbbW92ZS54XSE7XG4gICAgICAgIHRoaXMuaGVpZ2h0c1ttb3ZlLnhdIS0tO1xuICAgICAgICBzdXBlci5tYWtlTW92ZShtb3ZlLCBwbGF5ZXJJZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGxhc3QgbW92ZSBhbmQgcmVzdG9yZXMgdGhlIGNvbHVtbiBoZWlnaHQuXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIHVuZG9MYXN0TW92ZSgpOiB2b2lkIHtcbiAgICAgICAgLy8gWC1jb29yZGluYXRlIGlzIHJlY292ZXJhYmxlIGZyb20gdGhlIGJpdCBpbmRleDogYml0ICUgd2lkdGggPSB4LlxuICAgICAgICBjb25zdCB7IHggfSA9ICh0aGlzLm1vdmVzW3RoaXMubW92ZXMubGVuZ3RoIC0gMV0hKTtcblxuICAgICAgICBzdXBlci51bmRvTGFzdE1vdmUoKTtcbiAgICAgICAgdGhpcy5oZWlnaHRzW3hdISsrO1xuICAgIH1cbn1cbiJdfQ==
@@ -62,11 +62,11 @@ let Connect4 = class Connect4 extends Base {
62
62
  findOptimalMove({ maxDepth } = { maxDepth: Infinity }) {
63
63
  return this.board.isEmpty
64
64
  ? { x: 3, y: 5 }
65
- : this.alphabeta(maxDepth).move;
65
+ : this.search(maxDepth).move;
66
66
  }
67
67
  };
68
68
  Connect4 = __decorate([
69
69
  Game
70
70
  ], Connect4);
71
71
  export default Connect4;
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLFVBQXFDO1FBQ3pELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUU5RSxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ2pCLEtBQUssZUFBZTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsUUFBUSxLQUE0QixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDL0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDO0NBQ0osQ0FBQTtBQXpEb0IsUUFBUTtJQUQ1QixJQUFJO0dBQ2dCLFFBQVEsQ0F5RDVCO2VBekRvQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyZXIgZm9yIGNvbm5lY3QgNC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IENvbm5lY3Q0KTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKHRydWUsIHRydWUsIGZhbHNlLCBbXCLirKQgXCIsIFwi4qykIFwiXSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogUmVwcmVzZW50cyB0aGUgY29udHJvbGxlciBmb3IgY29ubmVjdCA0LiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbm5lY3Q0IGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29ubmVjdDQuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcblxuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgbWF4RGVwdGg6IDEwIH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNyB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNSB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgYWxnb3JpdGhtIGlzIGludmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRPcHRpbWFsTW92ZSh7IG1heERlcHRoIH06IHsgbWF4RGVwdGg6IG51bWJlcjsgfSA9IHsgbWF4RGVwdGg6IEluZmluaXR5IH0pOiBQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvYXJkLmlzRW1wdHlcbiAgICAgICAgICAgID8geyB4OiAzLCB5OiA1IH1cbiAgICAgICAgICAgIDogdGhpcy5hbHBoYWJldGEobWF4RGVwdGgpLm1vdmU7XG4gICAgfVxufVxuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy9jb25uZWN0NC9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBRy9COzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFDLFVBQW9CO0lBQ3ZDLCtCQUErQjtJQUMvQixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFFcEMsSUFBSSxNQUFNLEtBQUssS0FBSztRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRiw4QkFBOEI7QUFDbEMsQ0FBQztBQUVELCtDQUErQztBQUVoQyxJQUFNLFFBQVEsR0FBZCxNQUFNLFFBQVMsU0FBUSxJQUFXO0lBQzdDOzs7OztPQUtHO0lBQ0gsWUFDSSxhQUF5QixFQUN6QixhQUF5QixFQUN6QixPQUF1QztRQUV2QyxLQUFLLENBQ0QsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQzlCLElBQUksS0FBSyxFQUFFLEVBQ1gsT0FBTyxFQUFFLFFBQVEsSUFBSSxhQUFhLEVBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQ2QsT0FBTyxFQUFFLGNBQWMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLGdCQUFnQixDQUFDLFVBQXFDO1FBQ3pELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUUsQ0FBQztRQUU5RSxRQUFRLFVBQVUsRUFBRSxDQUFDO1lBQ2pCLEtBQUssZUFBZTtnQkFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEQsS0FBSyxTQUFTO2dCQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxLQUFLLFNBQVM7Z0JBQ1YsT0FBTyxVQUFVLENBQUM7WUFDdEI7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZSxDQUFDLEVBQUUsUUFBUSxLQUE0QixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUU7UUFDL0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyQyxDQUFDO0NBQ0osQ0FBQTtBQXpEb0IsUUFBUTtJQUQ1QixJQUFJO0dBQ2dCLFFBQVEsQ0F5RDVCO2VBekRvQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyZXIgZm9yIGNvbm5lY3QgNC5cbiAqIEBwYXJhbSBjb250cm9sbGVyIC0gVGhlIGNvbnRyb2xsZXIgdG8gcmVuZGVyLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0UmVuZGVyKGNvbnRyb2xsZXI6IENvbm5lY3Q0KTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKHRydWUsIHRydWUsIGZhbHNlLCBbXCLirKQgXCIsIFwi4qykIFwiXSkpO1xuICAgIGNvbnN0IHsgd2lubmVyIH0gPSBjb250cm9sbGVyLmJvYXJkO1xuXG4gICAgaWYgKHdpbm5lciAhPT0gZmFsc2UpXG4gICAgICAgIGNvbnNvbGUubG9nKHdpbm5lciA9PT0gbnVsbCA/IFwiSXQncyBhIHRpZSFcIiA6IGBQbGF5ZXIgJHt3aW5uZXIgKyAxfSB3aW5zIWApO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xufVxuXG4vKiogUmVwcmVzZW50cyB0aGUgY29udHJvbGxlciBmb3IgY29ubmVjdCA0LiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbm5lY3Q0IGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ29ubmVjdDQuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcblxuICAgICAgICBzd2l0Y2ggKGRpZmZpY3VsdHkpIHtcbiAgICAgICAgICAgIGNhc2UgXCJpbXBvc3NpYmxlQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9wdGltYWxNb3ZlKHsgbWF4RGVwdGg6IDEwIH0pO1xuICAgICAgICAgICAgY2FzZSBcImhhcmRDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNyB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJtZWRpdW1DUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyBtYXhEZXB0aDogNSB9KTtcbiAgICAgICAgICAgIGNhc2UgXCJlYXN5Q1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgZGlmZmljdWx0eS5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBib2FyZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgYWxnb3JpdGhtLlxuICAgICAqIEBwYXJhbSBvcHRpb25zLm1heERlcHRoIC0gVGhlIG1heGltdW0gZGVwdGggdG8gc2VhcmNoLlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IGJvYXJkIHN0YXRlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgYWxnb3JpdGhtIGlzIGludmFsaWQuXG4gICAgICovXG4gICAgcHVibGljIGZpbmRPcHRpbWFsTW92ZSh7IG1heERlcHRoIH06IHsgbWF4RGVwdGg6IG51bWJlcjsgfSA9IHsgbWF4RGVwdGg6IEluZmluaXR5IH0pOiBQb3NpdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvYXJkLmlzRW1wdHlcbiAgICAgICAgICAgID8geyB4OiAzLCB5OiA1IH1cbiAgICAgICAgICAgIDogdGhpcy5zZWFyY2gobWF4RGVwdGgpLm1vdmU7XG4gICAgfVxufVxuIl19
@@ -63,11 +63,11 @@ let TicTacToe = class TicTacToe extends Base {
63
63
  findOptimalMove({ randomMove } = { randomMove: { x: 2, y: 2 } }) {
64
64
  return this.board.isEmpty
65
65
  ? randomMove
66
- : this.alphabeta().move;
66
+ : this.search(9).move;
67
67
  }
68
68
  };
69
69
  TicTacToe = __decorate([
70
70
  Game
71
71
  ], TicTacToe);
72
72
  export default TicTacToe;
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQztRQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFekQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsRUFBRSxVQUFVLEtBRS9CLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0NBQ0osQ0FBQTtBQTVEb0IsU0FBUztJQUQ3QixJQUFJO0dBQ2dCLFNBQVMsQ0E0RDdCO2VBNURvQixTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJhc2UsIHsgR2FtZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2FtZUNvbnN0cnVjdG9yT3B0aW9ucywgUGxheWVyVHlwZSB9IGZyb20gXCIuLi8uLi9iYXNlL2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCBCb2FyZCBmcm9tIFwiLi9ib2FyZC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb3NpdGlvbiB9IGZyb20gXCIuLi8uLi9iYXNlL2JvYXJkLmpzXCI7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcmVuZGVyaW5nIGZ1bmN0aW9uIGZvciBUaWNUYWNUb2UuXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIFRoZSBjb250cm9sbGVyIHRvIHJlbmRlci5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFJlbmRlcihjb250cm9sbGVyOiBUaWNUYWNUb2UpOiB2b2lkIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgY29uc29sZS5jbGVhcigpO1xuICAgIGNvbnNvbGUubG9nKGNvbnRyb2xsZXIuYm9hcmQudG9TdHJpbmcoZmFsc2UpKTtcbiAgICBjb25zdCB7IHdpbm5lciB9ID0gY29udHJvbGxlci5ib2FyZDtcblxuICAgIGlmICh3aW5uZXIgIT09IGZhbHNlKVxuICAgICAgICBjb25zb2xlLmxvZyh3aW5uZXIgPT09IG51bGwgPyBcIkl0J3MgYSB0aWUhXCIgOiBgUGxheWVyICR7d2lubmVyICsgMX0gd2lucyFgKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbn1cblxuLyoqIEEgZ2FtZSBvZiBUaWNUYWNUb2UuICovXG5AR2FtZVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGljVGFjVG9lIGV4dGVuZHMgQmFzZTxCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGljVGFjVG9lIGdhbWUuXG4gICAgICogQHBhcmFtIHBsYXllck9uZVR5cGUgLSBUaGUgdHlwZSBvZiBwbGF5ZXIgb25lIChodW1hbiBvciBDUFUpLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJUd29UeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIHR3byAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHBsYXllck9uZVR5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIHBsYXllclR3b1R5cGU6IFBsYXllclR5cGUsXG4gICAgICAgIG9wdGlvbnM/OiBHYW1lQ29uc3RydWN0b3JPcHRpb25zPEJvYXJkPixcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICBbcGxheWVyT25lVHlwZSwgcGxheWVyVHdvVHlwZV0sXG4gICAgICAgICAgICBuZXcgQm9hcmQoKSxcbiAgICAgICAgICAgIG9wdGlvbnM/LnJlbmRlcmVyID8/IGRlZmF1bHRSZW5kZXIsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkVuZCxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm9uSW52YWxpZElucHV0LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgdGhlIENQVSdzIG1vdmUuXG4gICAgICogQHBhcmFtIGRpZmZpY3VsdHkgLSBUaGUgZGlmZmljdWx0eSBvZiB0aGUgQ1BVLlxuICAgICAqIEByZXR1cm5zIFRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBBbiBlcnJvciBpZiB0aGUgZGlmZmljdWx0eSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZXRlcm1pbmVDUFVNb3ZlKGRpZmZpY3VsdHk6IE9taXQ8UGxheWVyVHlwZSwgXCJodW1hblwiPik6IFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgeyBlbXB0eUNlbGxzIH0gPSB0aGlzLmJvYXJkO1xuICAgICAgICBjb25zdCByYW5kb21Nb3ZlID0gZW1wdHlDZWxsc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlbXB0eUNlbGxzLmxlbmd0aCldITtcbiAgICAgICAgY29uc3Qgb3B0aW1hbE1vdmUgPSB0aGlzLmZpbmRPcHRpbWFsTW92ZSh7IHJhbmRvbU1vdmUgfSk7XG5cbiAgICAgICAgc3dpdGNoIChkaWZmaWN1bHR5KSB7XG4gICAgICAgICAgICBjYXNlIFwiaW1wb3NzaWJsZUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpbWFsTW92ZTtcbiAgICAgICAgICAgIGNhc2UgXCJoYXJkQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPCAwLjggPyBvcHRpbWFsTW92ZSA6IHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBjYXNlIFwibWVkaXVtQ1BVXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgPCAwLjUgPyBvcHRpbWFsTW92ZSA6IHJhbmRvbU1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiZWFzeUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRpZmZpY3VsdHkuXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIG9wdGltYWwgbW92ZSBmb3IgdGhlIGN1cnJlbnQgcGxheWVyLlxuICAgICAqIEBwYXJhbSBhbGdvcml0aG0gLSBUaGUgYWxnb3JpdGhtIHRvIHVzZS5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtLnJhbmRvbU1vdmUgLSBUaGUgbW92ZSB0byByZXR1cm4gaWYgdGhlIGJvYXJkIGlzIGVtcHR5LlxuICAgICAqIEByZXR1cm5zIFRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGFsZ29yaXRobSBpcyBpbnZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kT3B0aW1hbE1vdmUoeyByYW5kb21Nb3ZlIH06IHtcbiAgICAgICAgcmFuZG9tTW92ZTogUG9zaXRpb247XG4gICAgfSA9IHsgcmFuZG9tTW92ZTogeyB4OiAyLCB5OiAyIH0gfSk6IFBvc2l0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9hcmQuaXNFbXB0eVxuICAgICAgICAgICAgPyByYW5kb21Nb3ZlXG4gICAgICAgICAgICA6IHRoaXMuYWxwaGFiZXRhKCkubW92ZTtcbiAgICB9XG59XG4iXX0=
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nYW1lcy90aWN0YWN0b2UvY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUcvQjs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFxQjtJQUN4QywrQkFBK0I7SUFDL0IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUVwQyxJQUFJLE1BQU0sS0FBSyxLQUFLO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxVQUFVLE1BQU0sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hGLDhCQUE4QjtBQUNsQyxDQUFDO0FBRUQsMkJBQTJCO0FBRVosSUFBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsSUFBVztJQUM5Qzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBeUIsRUFDekIsYUFBeUIsRUFDekIsT0FBdUM7UUFFdkMsS0FBSyxDQUNELENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxFQUM5QixJQUFJLEtBQUssRUFBRSxFQUNYLE9BQU8sRUFBRSxRQUFRLElBQUksYUFBYSxFQUNsQyxPQUFPLEVBQUUsS0FBSyxFQUNkLE9BQU8sRUFBRSxjQUFjLENBQzFCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0IsQ0FBQyxVQUFxQztRQUN6RCxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFFLENBQUM7UUFDOUUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFekQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNqQixLQUFLLGVBQWU7Z0JBQ2hCLE9BQU8sV0FBVyxDQUFDO1lBQ3ZCLEtBQUssU0FBUztnQkFDVixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssV0FBVztnQkFDWixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFELEtBQUssU0FBUztnQkFDVixPQUFPLFVBQVUsQ0FBQztZQUN0QjtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxlQUFlLENBQUMsRUFBRSxVQUFVLEtBQWdDLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDckIsQ0FBQyxDQUFDLFVBQVU7WUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztDQUNKLENBQUE7QUExRG9CLFNBQVM7SUFEN0IsSUFBSTtHQUNnQixTQUFTLENBMEQ3QjtlQTFEb0IsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlLCB7IEdhbWUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEdhbWVDb25zdHJ1Y3Rvck9wdGlvbnMsIFBsYXllclR5cGUgfSBmcm9tIFwiLi4vLi4vYmFzZS9jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgQm9hcmQgZnJvbSBcIi4vYm9hcmQuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9zaXRpb24gfSBmcm9tIFwiLi4vLi4vYmFzZS9ib2FyZC5qc1wiO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHJlbmRlcmluZyBmdW5jdGlvbiBmb3IgVGljVGFjVG9lLlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBUaGUgY29udHJvbGxlciB0byByZW5kZXIuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRSZW5kZXIoY29udHJvbGxlcjogVGljVGFjVG9lKTogdm9pZCB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgIGNvbnNvbGUuY2xlYXIoKTtcbiAgICBjb25zb2xlLmxvZyhjb250cm9sbGVyLmJvYXJkLnRvU3RyaW5nKGZhbHNlKSk7XG4gICAgY29uc3QgeyB3aW5uZXIgfSA9IGNvbnRyb2xsZXIuYm9hcmQ7XG5cbiAgICBpZiAod2lubmVyICE9PSBmYWxzZSlcbiAgICAgICAgY29uc29sZS5sb2cod2lubmVyID09PSBudWxsID8gXCJJdCdzIGEgdGllIVwiIDogYFBsYXllciAke3dpbm5lciArIDF9IHdpbnMhYCk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG59XG5cbi8qKiBBIGdhbWUgb2YgVGljVGFjVG9lLiAqL1xuQEdhbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpY1RhY1RvZSBleHRlbmRzIEJhc2U8Qm9hcmQ+IHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRpY1RhY1RvZSBnYW1lLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJPbmVUeXBlIC0gVGhlIHR5cGUgb2YgcGxheWVyIG9uZSAoaHVtYW4gb3IgQ1BVKS5cbiAgICAgKiBAcGFyYW0gcGxheWVyVHdvVHlwZSAtIFRoZSB0eXBlIG9mIHBsYXllciB0d28gKGh1bWFuIG9yIENQVSkuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGdhbWUuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwbGF5ZXJPbmVUeXBlOiBQbGF5ZXJUeXBlLFxuICAgICAgICBwbGF5ZXJUd29UeXBlOiBQbGF5ZXJUeXBlLFxuICAgICAgICBvcHRpb25zPzogR2FtZUNvbnN0cnVjdG9yT3B0aW9uczxCb2FyZD4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKFxuICAgICAgICAgICAgW3BsYXllck9uZVR5cGUsIHBsYXllclR3b1R5cGVdLFxuICAgICAgICAgICAgbmV3IEJvYXJkKCksXG4gICAgICAgICAgICBvcHRpb25zPy5yZW5kZXJlciA/PyBkZWZhdWx0UmVuZGVyLFxuICAgICAgICAgICAgb3B0aW9ucz8ub25FbmQsXG4gICAgICAgICAgICBvcHRpb25zPy5vbkludmFsaWRJbnB1dCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBDUFUncyBtb3ZlLlxuICAgICAqIEBwYXJhbSBkaWZmaWN1bHR5IC0gVGhlIGRpZmZpY3VsdHkgb2YgdGhlIENQVS5cbiAgICAgKiBAcmV0dXJucyBUaGUgQ1BVJ3MgbW92ZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaWYgdGhlIGRpZmZpY3VsdHkgaXMgaW52YWxpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGV0ZXJtaW5lQ1BVTW92ZShkaWZmaWN1bHR5OiBPbWl0PFBsYXllclR5cGUsIFwiaHVtYW5cIj4pOiBQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IHsgZW1wdHlDZWxscyB9ID0gdGhpcy5ib2FyZDtcbiAgICAgICAgY29uc3QgcmFuZG9tTW92ZSA9IGVtcHR5Q2VsbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZW1wdHlDZWxscy5sZW5ndGgpXSE7XG4gICAgICAgIGNvbnN0IG9wdGltYWxNb3ZlID0gdGhpcy5maW5kT3B0aW1hbE1vdmUoeyByYW5kb21Nb3ZlIH0pO1xuXG4gICAgICAgIHN3aXRjaCAoZGlmZmljdWx0eSkge1xuICAgICAgICAgICAgY2FzZSBcImltcG9zc2libGVDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW1hbE1vdmU7XG4gICAgICAgICAgICBjYXNlIFwiaGFyZENQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC44ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcIm1lZGl1bUNQVVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpIDwgMC41ID8gb3B0aW1hbE1vdmUgOiByYW5kb21Nb3ZlO1xuICAgICAgICAgICAgY2FzZSBcImVhc3lDUFVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tTW92ZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBkaWZmaWN1bHR5LlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBvcHRpbWFsIG1vdmUgZm9yIHRoZSBjdXJyZW50IHBsYXllci5cbiAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIC0gVGhlIGFsZ29yaXRobSB0byB1c2UuXG4gICAgICogQHBhcmFtIGFsZ29yaXRobS5yYW5kb21Nb3ZlIC0gVGhlIG1vdmUgdG8gcmV0dXJuIGlmIHRoZSBib2FyZCBpcyBlbXB0eS5cbiAgICAgKiBAcmV0dXJucyBUaGUgb3B0aW1hbCBtb3ZlIGZvciB0aGUgY3VycmVudCBwbGF5ZXIuXG4gICAgICogQHRocm93cyB7RXJyb3J9IEFuIGVycm9yIGlmIHRoZSBhbGdvcml0aG0gaXMgaW52YWxpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZE9wdGltYWxNb3ZlKHsgcmFuZG9tTW92ZSB9OiB7IHJhbmRvbU1vdmU6IFBvc2l0aW9uOyB9ID0geyByYW5kb21Nb3ZlOiB7IHg6IDIsIHk6IDIgfSB9KTogUG9zaXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5ib2FyZC5pc0VtcHR5XG4gICAgICAgICAgICA/IHJhbmRvbU1vdmVcbiAgICAgICAgICAgIDogdGhpcy5zZWFyY2goOSkubW92ZTtcbiAgICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oathompsonjones/mini-games",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "A selection of MiniGames. You will soon be able to play these games on [my website](https://oathompsonjones.co.uk/arcade).",
5
5
  "repository": {
6
6
  "url": "https://github.com/oathompsonjones/MiniGames.git"