@oathompsonjones/mini-games 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/lint-and-test.yml +52 -0
- package/.github/workflows/publish.yml +36 -0
- package/build/base/board.d.ts +17 -58
- package/build/base/board.js +23 -75
- package/build/base/controller.d.ts +16 -34
- package/build/base/controller.js +27 -39
- package/build/bitBoard/bitBoard.d.ts +8 -33
- package/build/bitBoard/bitBoard.js +7 -12
- package/build/bitBoard/intBitBoard.d.ts +65 -4
- package/build/bitBoard/intBitBoard.js +66 -5
- package/build/bitBoard/longInt.d.ts +2 -32
- package/build/bitBoard/longInt.js +17 -25
- package/build/bitBoard/longIntBitBoard.d.ts +65 -7
- package/build/bitBoard/longIntBitBoard.js +72 -4
- package/build/console.d.ts +1 -4
- package/build/console.js +4 -7
- package/build/games/connect4/board.d.ts +9 -0
- package/build/games/connect4/board.js +10 -1
- package/build/games/connect4/controller.d.ts +18 -0
- package/build/games/connect4/controller.js +23 -1
- package/build/games/tictactoe/board.d.ts +3 -0
- package/build/games/tictactoe/board.js +4 -1
- package/build/games/tictactoe/controller.d.ts +20 -0
- package/build/games/tictactoe/controller.js +25 -1
- package/build/index.js +1 -1
- package/eslint.config.js +3 -0
- package/package.json +6 -8
- package/patches/{eventemitter3+^5.0.1.patch → eventemitter3@5.0.1.patch} +28 -9
- package/.eslintrc +0 -6
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: lint-and-test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["*"]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: ["*"]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
lint:
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
os:
|
|
15
|
+
- ubuntu-latest
|
|
16
|
+
node: [14.x, 18.x, 20.x]
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v3
|
|
19
|
+
- uses: pnpm/action-setup@v2
|
|
20
|
+
with:
|
|
21
|
+
version: 8
|
|
22
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
23
|
+
uses: actions/setup-node@v3
|
|
24
|
+
with:
|
|
25
|
+
node-version: ${{ matrix.node-version }}
|
|
26
|
+
cache: "pnpm"
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: pnpm install
|
|
29
|
+
- name: Run Linter
|
|
30
|
+
run: pnpm lint
|
|
31
|
+
test:
|
|
32
|
+
runs-on: ${{ matrix.os }}
|
|
33
|
+
strategy:
|
|
34
|
+
matrix:
|
|
35
|
+
os:
|
|
36
|
+
- ubuntu-latest
|
|
37
|
+
node: [14.x, 18.x, 20.x]
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v3
|
|
40
|
+
- uses: pnpm/action-setup@v2
|
|
41
|
+
with:
|
|
42
|
+
version: 8
|
|
43
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
44
|
+
uses: actions/setup-node@v3
|
|
45
|
+
with:
|
|
46
|
+
node-version: ${{ matrix.node-version }}
|
|
47
|
+
cache: "pnpm"
|
|
48
|
+
- name: Install dependencies
|
|
49
|
+
run: pnpm install
|
|
50
|
+
- name: Run tests
|
|
51
|
+
run: pnpm test
|
|
52
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
name: publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["lint-and-test"]
|
|
6
|
+
branches: [main, master]
|
|
7
|
+
types:
|
|
8
|
+
- completed
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
runs-on: ${{ matrix.os }}
|
|
13
|
+
strategy:
|
|
14
|
+
matrix:
|
|
15
|
+
os:
|
|
16
|
+
- ubuntu-latest
|
|
17
|
+
node: [14.x]
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v3
|
|
20
|
+
- uses: pnpm/action-setup@v2
|
|
21
|
+
with:
|
|
22
|
+
version: 8
|
|
23
|
+
- name: Use Node.js ${{ matrix.node-version }}
|
|
24
|
+
uses: actions/setup-node@v3
|
|
25
|
+
with:
|
|
26
|
+
node-version: ${{ matrix.node-version }}
|
|
27
|
+
registry-url: 'https://registry.npmjs.org'
|
|
28
|
+
cache: "pnpm"
|
|
29
|
+
- name: Install dependencies
|
|
30
|
+
run: pnpm install
|
|
31
|
+
- name: Build code
|
|
32
|
+
run: pnpm build
|
|
33
|
+
- name: Publish code
|
|
34
|
+
run: pnpm publish
|
|
35
|
+
env:
|
|
36
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_REGISTRY_KEY }}
|
package/build/base/board.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import type BitBoard from "../bitBoard/bitBoard.js";
|
|
2
|
-
export
|
|
2
|
+
export type Position = {
|
|
3
3
|
y: number;
|
|
4
4
|
x: number;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Defines the characters used to draw a grid.
|
|
8
|
-
*/
|
|
5
|
+
};
|
|
6
|
+
/** Defines the characters used to draw a grid. */
|
|
9
7
|
export declare const enum GridLines {
|
|
10
8
|
Horizontal = "\u2500",
|
|
11
9
|
Vertical = "\u2502",
|
|
@@ -19,59 +17,35 @@ export declare const enum GridLines {
|
|
|
19
17
|
TBottom = "\u2534",
|
|
20
18
|
Cross = "\u253C"
|
|
21
19
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Represents a game board.
|
|
24
|
-
*/
|
|
20
|
+
/** Represents a game board. */
|
|
25
21
|
export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
26
|
-
/**
|
|
27
|
-
* Contains the ID of the game.
|
|
28
|
-
*/
|
|
22
|
+
/** Contains the ID of the game. */
|
|
29
23
|
gameID: string;
|
|
30
|
-
/**
|
|
31
|
-
* Contains the data stored in a BitBoard.
|
|
32
|
-
*/
|
|
24
|
+
/** Contains the data stored in a BitBoard. */
|
|
33
25
|
protected readonly bitBoard: T;
|
|
34
|
-
/**
|
|
35
|
-
* The width of the board.
|
|
36
|
-
|
|
37
|
-
*/
|
|
26
|
+
/** The width of the board. */
|
|
38
27
|
protected readonly boardWidth: number;
|
|
39
|
-
/**
|
|
40
|
-
* The height of the board.
|
|
41
|
-
*/
|
|
28
|
+
/** The height of the board. */
|
|
42
29
|
protected readonly boardHeight: number;
|
|
43
|
-
/**
|
|
44
|
-
* A stack of moves.
|
|
45
|
-
*/
|
|
30
|
+
/** A stack of moves. */
|
|
46
31
|
protected readonly moves: number[];
|
|
47
|
-
/**
|
|
48
|
-
* How many boards there are representing player positions (most likely 2).
|
|
49
|
-
*/
|
|
32
|
+
/** How many boards there are representing player positions (most likely 2). */
|
|
50
33
|
private readonly numberOfPlayerBoards;
|
|
51
|
-
/**
|
|
52
|
-
* Number of boards in total (most likely also 2).
|
|
53
|
-
*/
|
|
34
|
+
/** Number of boards in total (most likely also 2). */
|
|
54
35
|
private readonly numberOfBoards;
|
|
55
|
-
/**
|
|
56
|
-
* The board states which represent a winning state.
|
|
57
|
-
*/
|
|
36
|
+
/** The board states which represent a winning state. */
|
|
58
37
|
protected abstract readonly winningStates: T[];
|
|
59
38
|
/**
|
|
60
39
|
* Creates an instance of Board.
|
|
61
|
-
*
|
|
62
40
|
* @param width The width of the board.
|
|
63
41
|
* @param height The height of the board.
|
|
64
42
|
* @param playerBoardCount How many boards there are representing player positions (most likely 2).
|
|
65
43
|
* @param extraBoardCount Number of extra boards (most likely 0).
|
|
66
44
|
*/
|
|
67
45
|
protected constructor(width: number, height: number, playerBoardCount?: number, extraBoardCount?: number);
|
|
68
|
-
/**
|
|
69
|
-
* Calculates whether or not the board is full.
|
|
70
|
-
*/
|
|
46
|
+
/** Calculates whether or not the board is full. */
|
|
71
47
|
get isFull(): boolean;
|
|
72
|
-
/**
|
|
73
|
-
* Calculates whether or not the board is empty.
|
|
74
|
-
*/
|
|
48
|
+
/** Calculates whether or not the board is empty. */
|
|
75
49
|
get isEmpty(): boolean;
|
|
76
50
|
/**
|
|
77
51
|
* Calculates who the winner is.
|
|
@@ -80,13 +54,9 @@ export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
|
80
54
|
* If there is a draw, the output is null.
|
|
81
55
|
*/
|
|
82
56
|
get winner(): 0 | 1 | false | null;
|
|
83
|
-
/**
|
|
84
|
-
* Calculates which cells are empty.
|
|
85
|
-
*/
|
|
57
|
+
/** Calculates which cells are empty. */
|
|
86
58
|
get emptyCells(): Position[];
|
|
87
|
-
/**
|
|
88
|
-
* Calculates the heuristic score for a given board state.
|
|
89
|
-
*/
|
|
59
|
+
/** Calculates the heuristic score for a given board state. */
|
|
90
60
|
abstract get heuristic(): number;
|
|
91
61
|
/**
|
|
92
62
|
* Sets the game ID.
|
|
@@ -95,32 +65,26 @@ export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
|
95
65
|
setGameID(id: string): void;
|
|
96
66
|
/**
|
|
97
67
|
* Makes a move on the board.
|
|
98
|
-
*
|
|
99
68
|
* @param move The position of the move.
|
|
100
69
|
* @param playerId The player who's making the move.
|
|
101
70
|
*/
|
|
102
71
|
makeMove(move: Position, playerId: number): void;
|
|
103
|
-
/**
|
|
104
|
-
* Reverses the last move.
|
|
105
|
-
*/
|
|
72
|
+
/** Reverses the last move. */
|
|
106
73
|
undoLastMove(): void;
|
|
107
74
|
/**
|
|
108
75
|
* Checks if a move is valid.
|
|
109
|
-
*
|
|
110
76
|
* @param move The move.
|
|
111
77
|
* @returns Whether or not it's valid.
|
|
112
78
|
*/
|
|
113
79
|
moveIsValid(move: Position): boolean;
|
|
114
80
|
/**
|
|
115
81
|
* Checks which player is occupying a given cell.
|
|
116
|
-
*
|
|
117
82
|
* @param cell The cell to check.
|
|
118
83
|
* @returns If the cell is empty, the output is null, otherwise the output is the player's ID.
|
|
119
84
|
*/
|
|
120
85
|
cellOccupier(cell: Position): number | null;
|
|
121
86
|
/**
|
|
122
87
|
* Creates a string representation of the board.
|
|
123
|
-
*
|
|
124
88
|
* @param wrap Whether or not to provide a border for the board.
|
|
125
89
|
* @param labelX Whether or not to label x.
|
|
126
90
|
* @param labelY Whether or not to label y.
|
|
@@ -131,7 +95,6 @@ export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
|
131
95
|
toString(wrap?: boolean, labelX?: boolean, labelY?: boolean, symbols?: string[], colour?: boolean): string;
|
|
132
96
|
/**
|
|
133
97
|
* Determines if a given player has a line of pieces on the board.
|
|
134
|
-
*
|
|
135
98
|
* @param playerId The ID of the player.
|
|
136
99
|
* @param length The number of pieces needed.
|
|
137
100
|
* @param maxGaps The number of gaps allowed for a line to be valid. Defaults to 0.
|
|
@@ -140,7 +103,6 @@ export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
|
140
103
|
hasLine(playerId: number, length: number, maxGaps?: number): number;
|
|
141
104
|
/**
|
|
142
105
|
* Gets a bit index from its coordinates and player ID.
|
|
143
|
-
*
|
|
144
106
|
* @param move The coordinates.
|
|
145
107
|
* @param playerId The player ID.
|
|
146
108
|
* @returns The bit index.
|
|
@@ -148,14 +110,12 @@ export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
|
148
110
|
protected getBitIndex(move: Position, playerId: number): number;
|
|
149
111
|
/**
|
|
150
112
|
* A BitBoard containing only the player's bits.
|
|
151
|
-
*
|
|
152
113
|
* @param playerId The player's ID.
|
|
153
114
|
* @returns The player's bits.
|
|
154
115
|
*/
|
|
155
116
|
protected getPlayerBoard(playerId: number): T;
|
|
156
117
|
/**
|
|
157
118
|
* Gets a bit index from its coordinates.
|
|
158
|
-
*
|
|
159
119
|
* @param move The coordinates.
|
|
160
120
|
* @returns The bit index.
|
|
161
121
|
*/
|
|
@@ -163,7 +123,6 @@ export default abstract class Board<T extends BitBoard = BitBoard> {
|
|
|
163
123
|
/**
|
|
164
124
|
* Checks if a move is valid for the given board.
|
|
165
125
|
* Does not check if that cell is already occupied.
|
|
166
|
-
*
|
|
167
126
|
* @param position The position to check.
|
|
168
127
|
* @returns Whether or not that cell exists on the board.
|
|
169
128
|
*/
|
package/build/base/board.js
CHANGED
|
@@ -1,59 +1,24 @@
|
|
|
1
1
|
import IntBitBoard from "../bitBoard/intBitBoard.js";
|
|
2
2
|
import LongInt from "../bitBoard/longInt.js";
|
|
3
3
|
import LongIntBitBoard from "../bitBoard/longIntBitBoard.js";
|
|
4
|
-
/**
|
|
5
|
-
* Defines the characters used to draw a grid.
|
|
6
|
-
*/
|
|
7
|
-
export var GridLines;
|
|
8
|
-
(function (GridLines) {
|
|
9
|
-
GridLines["Horizontal"] = "\u2500";
|
|
10
|
-
GridLines["Vertical"] = "\u2502";
|
|
11
|
-
GridLines["TopLeft"] = "\u250C";
|
|
12
|
-
GridLines["TopRight"] = "\u2510";
|
|
13
|
-
GridLines["BottomLeft"] = "\u2514";
|
|
14
|
-
GridLines["BottomRight"] = "\u2518";
|
|
15
|
-
GridLines["TLeft"] = "\u251C";
|
|
16
|
-
GridLines["TRight"] = "\u2524";
|
|
17
|
-
GridLines["TTop"] = "\u252C";
|
|
18
|
-
GridLines["TBottom"] = "\u2534";
|
|
19
|
-
GridLines["Cross"] = "\u253C";
|
|
20
|
-
})(GridLines || (GridLines = {}));
|
|
21
|
-
/**
|
|
22
|
-
* Represents a game board.
|
|
23
|
-
*/
|
|
4
|
+
/** Represents a game board. */
|
|
24
5
|
export default class Board {
|
|
25
|
-
/**
|
|
26
|
-
* Contains the ID of the game.
|
|
27
|
-
*/
|
|
6
|
+
/** Contains the ID of the game. */
|
|
28
7
|
gameID = "";
|
|
29
|
-
/**
|
|
30
|
-
* Contains the data stored in a BitBoard.
|
|
31
|
-
*/
|
|
8
|
+
/** Contains the data stored in a BitBoard. */
|
|
32
9
|
bitBoard;
|
|
33
|
-
/**
|
|
34
|
-
* The width of the board.
|
|
35
|
-
|
|
36
|
-
*/
|
|
10
|
+
/** The width of the board. */
|
|
37
11
|
boardWidth;
|
|
38
|
-
/**
|
|
39
|
-
* The height of the board.
|
|
40
|
-
*/
|
|
12
|
+
/** The height of the board. */
|
|
41
13
|
boardHeight;
|
|
42
|
-
/**
|
|
43
|
-
* A stack of moves.
|
|
44
|
-
*/
|
|
14
|
+
/** A stack of moves. */
|
|
45
15
|
moves = [];
|
|
46
|
-
/**
|
|
47
|
-
* How many boards there are representing player positions (most likely 2).
|
|
48
|
-
*/
|
|
16
|
+
/** How many boards there are representing player positions (most likely 2). */
|
|
49
17
|
numberOfPlayerBoards;
|
|
50
|
-
/**
|
|
51
|
-
* Number of boards in total (most likely also 2).
|
|
52
|
-
*/
|
|
18
|
+
/** Number of boards in total (most likely also 2). */
|
|
53
19
|
numberOfBoards;
|
|
54
20
|
/**
|
|
55
21
|
* Creates an instance of Board.
|
|
56
|
-
*
|
|
57
22
|
* @param width The width of the board.
|
|
58
23
|
* @param height The height of the board.
|
|
59
24
|
* @param playerBoardCount How many boards there are representing player positions (most likely 2).
|
|
@@ -67,9 +32,7 @@ export default class Board {
|
|
|
67
32
|
const totalBits = this.boardWidth * this.boardHeight * this.numberOfBoards;
|
|
68
33
|
this.bitBoard = (totalBits > 32 ? new LongIntBitBoard(Math.ceil(totalBits / 32)) : new IntBitBoard());
|
|
69
34
|
}
|
|
70
|
-
/**
|
|
71
|
-
* Calculates whether or not the board is full.
|
|
72
|
-
*/
|
|
35
|
+
/** Calculates whether or not the board is full. */
|
|
73
36
|
get isFull() {
|
|
74
37
|
let isFull = (this.bitBoard instanceof LongIntBitBoard
|
|
75
38
|
? new LongIntBitBoard(Math.ceil(this.boardWidth * this.boardHeight / 32))
|
|
@@ -79,14 +42,12 @@ export default class Board {
|
|
|
79
42
|
const fullValue = this.bitBoard instanceof LongIntBitBoard
|
|
80
43
|
? new LongInt([
|
|
81
44
|
...Array(Math.ceil(this.boardWidth * this.boardHeight / 32) - 1).fill(~0 >>> 0),
|
|
82
|
-
2 ** (this.boardWidth * this.boardHeight - (Math.ceil(this.boardWidth * this.boardHeight / 32) - 1) * 32) - 1
|
|
45
|
+
2 ** (this.boardWidth * this.boardHeight - (Math.ceil(this.boardWidth * this.boardHeight / 32) - 1) * 32) - 1,
|
|
83
46
|
])
|
|
84
47
|
: 2 ** (this.boardWidth * this.boardHeight) - 1;
|
|
85
48
|
return isFull.equals(fullValue);
|
|
86
49
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Calculates whether or not the board is empty.
|
|
89
|
-
*/
|
|
50
|
+
/** Calculates whether or not the board is empty. */
|
|
90
51
|
get isEmpty() {
|
|
91
52
|
let isEmpty = (this.bitBoard instanceof LongIntBitBoard
|
|
92
53
|
? new LongIntBitBoard(Math.ceil(this.boardWidth * this.boardHeight / 32))
|
|
@@ -114,9 +75,7 @@ export default class Board {
|
|
|
114
75
|
return null;
|
|
115
76
|
return false;
|
|
116
77
|
}
|
|
117
|
-
/**
|
|
118
|
-
* Calculates which cells are empty.
|
|
119
|
-
*/
|
|
78
|
+
/** Calculates which cells are empty. */
|
|
120
79
|
get emptyCells() {
|
|
121
80
|
const emptyCells = [];
|
|
122
81
|
for (let y = 0; y < this.boardHeight; y++) {
|
|
@@ -136,7 +95,6 @@ export default class Board {
|
|
|
136
95
|
}
|
|
137
96
|
/**
|
|
138
97
|
* Makes a move on the board.
|
|
139
|
-
*
|
|
140
98
|
* @param move The position of the move.
|
|
141
99
|
* @param playerId The player who's making the move.
|
|
142
100
|
*/
|
|
@@ -145,9 +103,7 @@ export default class Board {
|
|
|
145
103
|
this.moves.push(bit);
|
|
146
104
|
this.bitBoard.setBit(bit);
|
|
147
105
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Reverses the last move.
|
|
150
|
-
*/
|
|
106
|
+
/** Reverses the last move. */
|
|
151
107
|
undoLastMove() {
|
|
152
108
|
const lastMove = this.moves.pop();
|
|
153
109
|
if (lastMove === undefined)
|
|
@@ -156,7 +112,6 @@ export default class Board {
|
|
|
156
112
|
}
|
|
157
113
|
/**
|
|
158
114
|
* Checks if a move is valid.
|
|
159
|
-
*
|
|
160
115
|
* @param move The move.
|
|
161
116
|
* @returns Whether or not it's valid.
|
|
162
117
|
*/
|
|
@@ -165,7 +120,6 @@ export default class Board {
|
|
|
165
120
|
}
|
|
166
121
|
/**
|
|
167
122
|
* Checks which player is occupying a given cell.
|
|
168
|
-
*
|
|
169
123
|
* @param cell The cell to check.
|
|
170
124
|
* @returns If the cell is empty, the output is null, otherwise the output is the player's ID.
|
|
171
125
|
*/
|
|
@@ -178,7 +132,6 @@ export default class Board {
|
|
|
178
132
|
}
|
|
179
133
|
/**
|
|
180
134
|
* Creates a string representation of the board.
|
|
181
|
-
*
|
|
182
135
|
* @param wrap Whether or not to provide a border for the board.
|
|
183
136
|
* @param labelX Whether or not to label x.
|
|
184
137
|
* @param labelY Whether or not to label y.
|
|
@@ -204,30 +157,30 @@ export default class Board {
|
|
|
204
157
|
.padStart(4 * this.boardWidth - 1 + Number(wrap) + Number(labelY))}\n`
|
|
205
158
|
: "";
|
|
206
159
|
const topBorder = wrap
|
|
207
|
-
? `${labelY ? " " : ""}${GridLines.TopLeft}${GridLines.Horizontal
|
|
160
|
+
? `${labelY ? " " : ""}${"\u250C" /* GridLines.TopLeft */}${"\u2500" /* GridLines.Horizontal */
|
|
208
161
|
.repeat(this.boardWidth * (symbolLength + 2))
|
|
209
162
|
.match(matchCellSpace)
|
|
210
|
-
.join(GridLines.TTop)}${GridLines.TopRight}\n`
|
|
163
|
+
.join("\u252C" /* GridLines.TTop */)}${"\u2510" /* GridLines.TopRight */}\n`
|
|
211
164
|
: "";
|
|
212
165
|
const bottomBorder = wrap
|
|
213
|
-
? `${labelY ? " " : ""}${GridLines.BottomLeft}${GridLines.Horizontal
|
|
166
|
+
? `${labelY ? " " : ""}${"\u2514" /* GridLines.BottomLeft */}${"\u2500" /* GridLines.Horizontal */
|
|
214
167
|
.repeat(this.boardWidth * (symbolLength + 2))
|
|
215
168
|
.match(matchCellSpace)
|
|
216
|
-
.join(GridLines.TBottom)}${GridLines.BottomRight}`
|
|
169
|
+
.join("\u2534" /* GridLines.TBottom */)}${"\u2518" /* GridLines.BottomRight */}`
|
|
217
170
|
: "";
|
|
218
|
-
const rowSeparator = `${labelY ? " " : ""}${wrap ? GridLines.TLeft : ""}${GridLines.Horizontal
|
|
171
|
+
const rowSeparator = `${labelY ? " " : ""}${wrap ? "\u251C" /* GridLines.TLeft */ : ""}${"\u2500" /* GridLines.Horizontal */
|
|
219
172
|
.repeat(this.boardWidth * (symbolLength + 2))
|
|
220
173
|
.match(matchCellSpace)
|
|
221
|
-
.join(GridLines.Cross)}${wrap ? GridLines.TRight : ""}\n`;
|
|
174
|
+
.join("\u253C" /* GridLines.Cross */)}${wrap ? "\u2524" /* GridLines.TRight */ : ""}\n`;
|
|
222
175
|
const rows = [];
|
|
223
176
|
for (let y = 0; y < this.boardHeight; y++) {
|
|
224
177
|
const yLabel = labelY ? `${y + 1}` : "";
|
|
225
|
-
const leftBorder = wrap ? GridLines.Vertical : "";
|
|
226
|
-
const rightBorder = wrap ? GridLines.Vertical : "";
|
|
178
|
+
const leftBorder = wrap ? "\u2502" /* GridLines.Vertical */ : "";
|
|
179
|
+
const rightBorder = wrap ? "\u2502" /* GridLines.Vertical */ : "";
|
|
227
180
|
let row = `${yLabel}${leftBorder}`;
|
|
228
181
|
for (let x = 0; x < this.boardWidth; x++) {
|
|
229
182
|
const cell = { x, y };
|
|
230
|
-
const bar = x === this.boardWidth - 1 ? "" : GridLines.Vertical
|
|
183
|
+
const bar = x === this.boardWidth - 1 ? "" : "\u2502" /* GridLines.Vertical */;
|
|
231
184
|
const cellOccupier = this.cellOccupier(cell);
|
|
232
185
|
if (cellOccupier === null) {
|
|
233
186
|
row += ` ${" ".repeat(symbolLength)} ${bar}`;
|
|
@@ -244,7 +197,6 @@ export default class Board {
|
|
|
244
197
|
}
|
|
245
198
|
/**
|
|
246
199
|
* Determines if a given player has a line of pieces on the board.
|
|
247
|
-
*
|
|
248
200
|
* @param playerId The ID of the player.
|
|
249
201
|
* @param length The number of pieces needed.
|
|
250
202
|
* @param maxGaps The number of gaps allowed for a line to be valid. Defaults to 0.
|
|
@@ -286,7 +238,6 @@ export default class Board {
|
|
|
286
238
|
}
|
|
287
239
|
/**
|
|
288
240
|
* Gets a bit index from its coordinates and player ID.
|
|
289
|
-
*
|
|
290
241
|
* @param move The coordinates.
|
|
291
242
|
* @param playerId The player ID.
|
|
292
243
|
* @returns The bit index.
|
|
@@ -298,7 +249,6 @@ export default class Board {
|
|
|
298
249
|
}
|
|
299
250
|
/**
|
|
300
251
|
* A BitBoard containing only the player's bits.
|
|
301
|
-
*
|
|
302
252
|
* @param playerId The player's ID.
|
|
303
253
|
* @returns The player's bits.
|
|
304
254
|
*/
|
|
@@ -309,7 +259,6 @@ export default class Board {
|
|
|
309
259
|
}
|
|
310
260
|
/**
|
|
311
261
|
* Gets a bit index from its coordinates.
|
|
312
|
-
*
|
|
313
262
|
* @param move The coordinates.
|
|
314
263
|
* @returns The bit index.
|
|
315
264
|
*/
|
|
@@ -319,7 +268,6 @@ export default class Board {
|
|
|
319
268
|
/**
|
|
320
269
|
* Checks if a move is valid for the given board.
|
|
321
270
|
* Does not check if that cell is already occupied.
|
|
322
|
-
*
|
|
323
271
|
* @param position The position to check.
|
|
324
272
|
* @returns Whether or not that cell exists on the board.
|
|
325
273
|
*/
|
|
@@ -327,4 +275,4 @@ export default class Board {
|
|
|
327
275
|
return position.x >= 0 && position.x < this.boardWidth && position.y >= 0 && position.y < this.boardHeight;
|
|
328
276
|
}
|
|
329
277
|
}
|
|
330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9ib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLGVBQWUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU83RDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFrQixTQVlqQjtBQVpELFdBQWtCLFNBQVM7SUFDdkIsa0NBQXFCLENBQUE7SUFDckIsZ0NBQW1CLENBQUE7SUFDbkIsK0JBQWtCLENBQUE7SUFDbEIsZ0NBQW1CLENBQUE7SUFDbkIsa0NBQXFCLENBQUE7SUFDckIsbUNBQXNCLENBQUE7SUFDdEIsNkJBQWdCLENBQUE7SUFDaEIsOEJBQWlCLENBQUE7SUFDakIsNEJBQWUsQ0FBQTtJQUNmLCtCQUFrQixDQUFBO0lBQ2xCLDZCQUFnQixDQUFBO0FBQ3BCLENBQUMsRUFaaUIsU0FBUyxLQUFULFNBQVMsUUFZMUI7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQWdCLEtBQUs7SUFDL0I7O09BRUc7SUFDSSxNQUFNLEdBQVcsRUFBRSxDQUFDO0lBRTNCOztPQUVHO0lBQ2dCLFFBQVEsQ0FBSTtJQUUvQjs7O09BR0c7SUFDZ0IsVUFBVSxDQUFTO0lBRXRDOztPQUVHO0lBQ2dCLFdBQVcsQ0FBUztJQUV2Qzs7T0FFRztJQUNnQixLQUFLLEdBQWEsRUFBRSxDQUFDO0lBRXhDOztPQUVHO0lBQ2Msb0JBQW9CLENBQVM7SUFFOUM7O09BRUc7SUFDYyxjQUFjLENBQVM7SUFPeEM7Ozs7Ozs7T0FPRztJQUNILFlBQXNCLEtBQWEsRUFBRSxNQUFjLEVBQUUsbUJBQTJCLENBQUMsRUFBRSxrQkFBMEIsQ0FBQztRQUMxRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FB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QUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxVQUFVO2lCQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDNUMsS0FBSyxDQUFDLGNBQWMsQ0FBRTtpQkFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxJQUFJO1lBQ2xELENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxNQUFNLFlBQVksR0FBRyxJQUFJO1lBQ3JCLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsVUFBVTtpQkFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUJBQzVDLEtBQUssQ0FBQyxjQUFjLENBQUU7aUJBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUN0RCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1QsTUFBTSxZQUFZLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxVQUFVO2FBQ3pGLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQzVDLEtBQUssQ0FBQyxjQUFjLENBQUU7YUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FB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QyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxRQUFRLENBQUMsSUFBYztRQUMzQixPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxlQUFlLENBQUMsUUFBa0I7UUFDdEMsT0FBTyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQy9HLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJpdEJvYXJkIGZyb20gXCIuLi9iaXRCb2FyZC9iaXRCb2FyZC5qc1wiO1xuaW1wb3J0IEludEJpdEJvYXJkIGZyb20gXCIuLi9iaXRCb2FyZC9pbnRCaXRCb2FyZC5qc1wiO1xuaW1wb3J0IExvbmdJbnQgZnJvbSBcIi4uL2JpdEJvYXJkL2xvbmdJbnQuanNcIjtcbmltcG9ydCBMb25nSW50Qml0Qm9hcmQgZnJvbSBcIi4uL2JpdEJvYXJkL2xvbmdJbnRCaXRCb2FyZC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBvc2l0aW9uIHtcbiAgICB5OiBudW1iZXI7XG4gICAgeDogbnVtYmVyO1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIGNoYXJhY3RlcnMgdXNlZCB0byBkcmF3IGEgZ3JpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gR3JpZExpbmVzIHtcbiAgICBIb3Jpem9udGFsID0gXCJcXHUyNTAwXCIsXG4gICAgVmVydGljYWwgPSBcIlxcdTI1MDJcIixcbiAgICBUb3BMZWZ0ID0gXCJcXHUyNTBDXCIsXG4gICAgVG9wUmlnaHQgPSBcIlxcdTI1MTBcIixcbiAgICBCb3R0b21MZWZ0ID0gXCJcXHUyNTE0XCIsXG4gICAgQm90dG9tUmlnaHQgPSBcIlxcdTI1MThcIixcbiAgICBUTGVmdCA9IFwiXFx1MjUxQ1wiLFxuICAgIFRSaWdodCA9IFwiXFx1MjUyNFwiLFxuICAgIFRUb3AgPSBcIlxcdTI1MkNcIixcbiAgICBUQm90dG9tID0gXCJcXHUyNTM0XCIsXG4gICAgQ3Jvc3MgPSBcIlxcdTI1M0NcIlxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBnYW1lIGJvYXJkLlxuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBCb2FyZDxUIGV4dGVuZHMgQml0Qm9hcmQgPSBCaXRCb2FyZD4ge1xuICAgIC8qKlxuICAgICAqIENvbnRhaW5zIHRoZSBJRCBvZiB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2FtZUlEOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgdGhlIGRhdGEgc3RvcmVkIGluIGEgQml0Qm9hcmQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpdEJvYXJkOiBUO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHdpZHRoIG9mIHRoZSBib2FyZC5cblxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBib2FyZFdpZHRoOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBib2FyZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9hcmRIZWlnaHQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIEEgc3RhY2sgb2YgbW92ZXMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vdmVzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgYm9hcmRzIHRoZXJlIGFyZSByZXByZXNlbnRpbmcgcGxheWVyIHBvc2l0aW9ucyAobW9zdCBsaWtlbHkgMikuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBudW1iZXJPZlBsYXllckJvYXJkczogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGJvYXJkcyBpbiB0b3RhbCAobW9zdCBsaWtlbHkgYWxzbyAyKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG51bWJlck9mQm9hcmRzOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYm9hcmQgc3RhdGVzIHdoaWNoIHJlcHJlc2VudCBhIHdpbm5pbmcgc3RhdGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHdpbm5pbmdTdGF0ZXM6IFRbXTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2lkdGggVGhlIHdpZHRoIG9mIHRoZSBib2FyZC5cbiAgICAgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJCb2FyZENvdW50IEhvdyBtYW55IGJvYXJkcyB0aGVyZSBhcmUgcmVwcmVzZW50aW5nIHBsYXllciBwb3NpdGlvbnMgKG1vc3QgbGlrZWx5IDIpLlxuICAgICAqIEBwYXJhbSBleHRyYUJvYXJkQ291bnQgTnVtYmVyIG9mIGV4dHJhIGJvYXJkcyAobW9zdCBsaWtlbHkgMCkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBwbGF5ZXJCb2FyZENvdW50OiBudW1iZXIgPSAyLCBleHRyYUJvYXJkQ291bnQ6IG51bWJlciA9IDApIHtcbiAgICAgICAgdGhpcy5ib2FyZFdpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuYm9hcmRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMgPSBwbGF5ZXJCb2FyZENvdW50O1xuICAgICAgICB0aGlzLm51bWJlck9mQm9hcmRzID0gdGhpcy5udW1iZXJPZlBsYXllckJvYXJkcyArIGV4dHJhQm9hcmRDb3VudDtcbiAgICAgICAgY29uc3QgdG90YWxCaXRzID0gdGhpcy5ib2FyZFdpZHRoICogdGhpcy5ib2FyZEhlaWdodCAqIHRoaXMubnVtYmVyT2ZCb2FyZHM7XG4gICAgICAgIHRoaXMuYml0Qm9hcmQgPSAodG90YWxCaXRzID4gMzIgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0b3RhbEJpdHMgLyAzMikpIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgYm9hcmQgaXMgZnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRnVsbCgpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGlzRnVsbCA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgLyAzMikpXG4gICAgICAgICAgICA6IG5ldyBJbnRCaXRCb2FyZCgpKSBhcyBUO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKylcbiAgICAgICAgICAgIGlzRnVsbCA9IGlzRnVsbC5vcih0aGlzLmdldFBsYXllckJvYXJkKGkpKTtcbiAgICAgICAgY29uc3QgZnVsbFZhbHVlID0gdGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludChbXG4gICAgICAgICAgICAgICAgLi4uQXJyYXk8bnVtYmVyPihNYXRoLmNlaWwodGhpcy5ib2FyZFdpZHRoICogdGhpcy5ib2FyZEhlaWdodCAvIDMyKSAtIDEpLmZpbGwofjAgPj4+IDApLFxuICAgICAgICAgICAgICAgIDIgKiogKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgLSAoTWF0aC5jZWlsKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgLyAzMikgLSAxKSAqIDMyKSAtIDFcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICA6IDIgKiogKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQpIC0gMTtcbiAgICAgICAgcmV0dXJuIGlzRnVsbC5lcXVhbHMoZnVsbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBib2FyZCBpcyBlbXB0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0VtcHR5ID0gKHRoaXMuYml0Qm9hcmQgaW5zdGFuY2VvZiBMb25nSW50Qml0Qm9hcmRcbiAgICAgICAgICAgID8gbmV3IExvbmdJbnRCaXRCb2FyZChNYXRoLmNlaWwodGhpcy5ib2FyZFdpZHRoICogdGhpcy5ib2FyZEhlaWdodCAvIDMyKSlcbiAgICAgICAgICAgIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIFQ7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZlBsYXllckJvYXJkczsgaSsrKVxuICAgICAgICAgICAgaXNFbXB0eSA9IGlzRW1wdHkub3IodGhpcy5nZXRQbGF5ZXJCb2FyZChpKSk7XG4gICAgICAgIHJldHVybiBpc0VtcHR5LmVxdWFscygwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHdobyB0aGUgd2lubmVyIGlzLlxuICAgICAqIElmIHRoZSBnYW1lIGlzIG5vdCBvdmVyLCB0aGUgb3V0cHV0IGlzIGZhbHNlLlxuICAgICAqIElmIHRoZXJlIGlzIGEgd2lubmVyLCB0aGUgb3V0cHV0IGlzIHRoZWlyIElELlxuICAgICAqIElmIHRoZXJlIGlzIGEgZHJhdywgdGhlIG91dHB1dCBpcyBudWxsLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgd2lubmVyKCk6IDAgfCAxIHwgZmFsc2UgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGxheWVyT25lQm9hcmQgPSB0aGlzLmdldFBsYXllckJvYXJkKDApO1xuICAgICAgICBjb25zdCBwbGF5ZXJUd29Cb2FyZCA9IHRoaXMuZ2V0UGxheWVyQm9hcmQoMSk7XG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgdGhpcy53aW5uaW5nU3RhdGVzKSB7XG4gICAgICAgICAgICBpZiAocGxheWVyT25lQm9hcmQuYW5kKHN0YXRlKS5lcXVhbHMoc3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgaWYgKHBsYXllclR3b0JvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0Z1bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgd2hpY2ggY2VsbHMgYXJlIGVtcHR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZW1wdHlDZWxscygpOiBQb3NpdGlvbltdIHtcbiAgICAgICAgY29uc3QgZW1wdHlDZWxsczogUG9zaXRpb25bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuYm9hcmRIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB0aGlzLmJvYXJkV2lkdGg7IHgrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNlbGxPY2N1cGllcih7IHgsIHkgfSkgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGVtcHR5Q2VsbHMucHVzaCh7IHgsIHkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgaGV1cmlzdGljIHNjb3JlIGZvciBhIGdpdmVuIGJvYXJkIHN0YXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgaGV1cmlzdGljKCk6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGdhbWUgSUQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgZ2FtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0R2FtZUlEKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5nYW1lSUQgPSBpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIG1vdmUgb24gdGhlIGJvYXJkLlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vdmUgVGhlIHBvc2l0aW9uIG9mIHRoZSBtb3ZlLlxuICAgICAqIEBwYXJhbSBwbGF5ZXJJZCBUaGUgcGxheWVyIHdobydzIG1ha2luZyB0aGUgbW92ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgbWFrZU1vdmUobW92ZTogUG9zaXRpb24sIHBsYXllcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYml0ID0gdGhpcy5nZXRCaXRJbmRleChtb3ZlLCBwbGF5ZXJJZCk7XG4gICAgICAgIHRoaXMubW92ZXMucHVzaChiaXQpO1xuICAgICAgICB0aGlzLmJpdEJvYXJkLnNldEJpdChiaXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIHRoZSBsYXN0IG1vdmUuXG4gICAgICovXG4gICAgcHVibGljIHVuZG9MYXN0TW92ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGFzdE1vdmUgPSB0aGlzLm1vdmVzLnBvcCgpO1xuICAgICAgICBpZiAobGFzdE1vdmUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIG1vdmUgdG8gdW5kby5cIik7XG4gICAgICAgIHRoaXMuYml0Qm9hcmQuY2xlYXJCaXQobGFzdE1vdmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1vdmUgaXMgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW92ZSBUaGUgbW92ZS5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBpdCdzIHZhbGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBtb3ZlSXNWYWxpZChtb3ZlOiBQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkUG9zaXRpb24obW92ZSkgJiYgdGhpcy5jZWxsT2NjdXBpZXIobW92ZSkgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoaWNoIHBsYXllciBpcyBvY2N1cHlpbmcgYSBnaXZlbiBjZWxsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgSWYgdGhlIGNlbGwgaXMgZW1wdHksIHRoZSBvdXRwdXQgaXMgbnVsbCwgb3RoZXJ3aXNlIHRoZSBvdXRwdXQgaXMgdGhlIHBsYXllcidzIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBjZWxsT2NjdXBpZXIoY2VsbDogUG9zaXRpb24pOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJpdEJvYXJkLmdldEJpdCh0aGlzLmdldEJpdEluZGV4KGNlbGwsIGkpKSA9PT0gMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBib2FyZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB3cmFwIFdoZXRoZXIgb3Igbm90IHRvIHByb3ZpZGUgYSBib3JkZXIgZm9yIHRoZSBib2FyZC5cbiAgICAgKiBAcGFyYW0gbGFiZWxYIFdoZXRoZXIgb3Igbm90IHRvIGxhYmVsIHguXG4gICAgICogQHBhcmFtIGxhYmVsWSBXaGV0aGVyIG9yIG5vdCB0byBsYWJlbCB5LlxuICAgICAqIEBwYXJhbSBzeW1ib2xzIFRoZSBzeW1ib2xzIHRvIHVzZSBhcyBib2FyZCBwaWVjZXMuXG4gICAgICogQHBhcmFtIGNvbG91ciBXaGV0aGVyIG9yIG5vdCB0byBjb2xvdXIgdGhlIHBpZWNlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1N0cmluZyhcbiAgICAgICAgd3JhcDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGxhYmVsWDogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGxhYmVsWTogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIHN5bWJvbHM6IHN0cmluZ1tdID0gW1wiWFwiLCBcIk9cIl0sXG4gICAgICAgIGNvbG91cjogYm9vbGVhbiA9IHRydWVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoc3ltYm9scy5sZW5ndGggIT09IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb28gbWFueSBzeW1ib2xzLlwiKTtcbiAgICAgICAgY29uc3Qgc3ltYm9sTGVuZ3RoID0gc3ltYm9sc1swXSEubGVuZ3RoO1xuICAgICAgICBpZiAoc3ltYm9scy5zb21lKChzKSA9PiBzLmxlbmd0aCAhPT0gc3ltYm9sTGVuZ3RoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5bWJvbHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGguXCIpO1xuICAgICAgICBjb25zdCBtYXRjaENlbGxTcGFjZSA9IG5ldyBSZWdFeHAoYC57JHtzeW1ib2xMZW5ndGggKyAyfX1gLCBcImd1XCIpO1xuICAgICAgICBjb25zdCBhbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuICAgICAgICBjb25zdCB4TGFiZWxzID0gbGFiZWxYXG4gICAgICAgICAgICA/IGAke2FscGhhYmV0LnNsaWNlKDAsIHRoaXMuYm9hcmRXaWR0aClcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgICAgICAubWFwKChsZXR0ZXIpID0+IGAgJHtsZXR0ZXIucGFkU3RhcnQoc3ltYm9sTGVuZ3RoKX0gYClcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDQgKiB0aGlzLmJvYXJkV2lkdGggLSAxICsgTnVtYmVyKHdyYXApICsgTnVtYmVyKGxhYmVsWSkpXG4gICAgICAgICAgICB9XFxuYFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCB0b3BCb3JkZXIgPSB3cmFwXG4gICAgICAgICAgICA/IGAke2xhYmVsWSA/IFwiIFwiIDogXCJcIn0ke0dyaWRMaW5lcy5Ub3BMZWZ0fSR7R3JpZExpbmVzLkhvcml6b250YWxcbiAgICAgICAgICAgICAgICAucmVwZWF0KHRoaXMuYm9hcmRXaWR0aCAqIChzeW1ib2xMZW5ndGggKyAyKSlcbiAgICAgICAgICAgICAgICAubWF0Y2gobWF0Y2hDZWxsU3BhY2UpIVxuICAgICAgICAgICAgICAgIC5qb2luKEdyaWRMaW5lcy5UVG9wKX0ke0dyaWRMaW5lcy5Ub3BSaWdodH1cXG5gXG4gICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIGNvbnN0IGJvdHRvbUJvcmRlciA9IHdyYXBcbiAgICAgICAgICAgID8gYCR7bGFiZWxZID8gXCIgXCIgOiBcIlwifSR7R3JpZExpbmVzLkJvdHRvbUxlZnR9JHtHcmlkTGluZXMuSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgIC5yZXBlYXQodGhpcy5ib2FyZFdpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLlRCb3R0b20pfSR7R3JpZExpbmVzLkJvdHRvbVJpZ2h0fWBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3Qgcm93U2VwYXJhdG9yID0gYCR7bGFiZWxZID8gXCIgXCIgOiBcIlwifSR7d3JhcCA/IEdyaWRMaW5lcy5UTGVmdCA6IFwiXCJ9JHtHcmlkTGluZXMuSG9yaXpvbnRhbFxuICAgICAgICAgICAgLnJlcGVhdCh0aGlzLmJvYXJkV2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAubWF0Y2gobWF0Y2hDZWxsU3BhY2UpIVxuICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLkNyb3NzKX0ke3dyYXAgPyBHcmlkTGluZXMuVFJpZ2h0IDogXCJcIn1cXG5gO1xuICAgICAgICBjb25zdCByb3dzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuYm9hcmRIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgY29uc3QgeUxhYmVsID0gbGFiZWxZID8gYCR7eSArIDF9YCA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBsZWZ0Qm9yZGVyID0gd3JhcCA/IEdyaWRMaW5lcy5WZXJ0aWNhbCA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCByaWdodEJvcmRlciA9IHdyYXAgPyBHcmlkTGluZXMuVmVydGljYWwgOiBcIlwiO1xuICAgICAgICAgICAgbGV0IHJvdyA9IGAke3lMYWJlbH0ke2xlZnRCb3JkZXJ9YDtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5ib2FyZFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0geyB4LCB5IH07XG4gICAgICAgICAgICAgICAgY29uc3QgYmFyID0geCA9PT0gdGhpcy5ib2FyZFdpZHRoIC0gMSA/IFwiXCIgOiBHcmlkTGluZXMuVmVydGljYWw7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbE9jY3VwaWVyID0gdGhpcy5jZWxsT2NjdXBpZXIoY2VsbCk7XG4gICAgICAgICAgICAgICAgaWYgKGNlbGxPY2N1cGllciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYCAke1wiIFwiLnJlcGVhdChzeW1ib2xMZW5ndGgpfSAke2Jhcn1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdyArPSBgICR7Y29sb3VyID8gYFxceDFiWyR7WzkxLCA5M11bY2VsbE9jY3VwaWVyXSF9bWAgOiBcIlwifWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3ltYm9sc1tjZWxsT2NjdXBpZXJdfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7Y29sb3VyID8gXCJcXHgxYlswbVwiIDogXCJcIn0gJHtiYXJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzLnB1c2goYCR7cm93fSR7cmlnaHRCb3JkZXJ9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3hMYWJlbHN9JHt0b3BCb3JkZXJ9JHtyb3dzLmpvaW4ocm93U2VwYXJhdG9yKX0ke2JvdHRvbUJvcmRlcn1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgYSBnaXZlbiBwbGF5ZXIgaGFzIGEgbGluZSBvZiBwaWVjZXMgb24gdGhlIGJvYXJkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGxheWVyLlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBwaWVjZXMgbmVlZGVkLlxuICAgICAqIEBwYXJhbSBtYXhHYXBzIFRoZSBudW1iZXIgb2YgZ2FwcyBhbGxvd2VkIGZvciBhIGxpbmUgdG8gYmUgdmFsaWQuIERlZmF1bHRzIHRvIDAuXG4gICAgICogQHJldHVybnMgSG93IG1hbnkgbGluZXMgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGhhc0xpbmUocGxheWVySWQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIG1heEdhcHM6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgICAgICBpZiAobGVuZ3RoID4gTWF0aC5tYXgodGhpcy5ib2FyZFdpZHRoLCB0aGlzLmJvYXJkSGVpZ2h0KSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBjb25zdCBESVJFQ1RJT05TOiBbUG9zaXRpb24sIFBvc2l0aW9uLCBQb3NpdGlvbiwgUG9zaXRpb25dID0gW3sgeDogMSwgeTogMCB9LCB7IHg6IDAsIHk6IDEgfSwgeyB4OiAxLCB5OiAxIH0sIHsgeDogMSwgeTogLTEgfV07XG4gICAgICAgIGxldCBsaW5lQ291bnQgPSAwO1xuICAgICAgICBsZXQgZ2FwczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMCwgMCwgMCwgMF07XG4gICAgICAgIGxldCBsZW5ndGhzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwLCAwXTtcbiAgICAgICAgY29uc3QgY2hlY2tDZWxsID0gKHg6IG51bWJlciwgeTogbnVtYmVyLCBkaXJlY3Rpb246IDAgfCAxIHwgMiB8IDMpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSB7IHgsIHkgfSBhcyBQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRQb3NpdGlvbihjZWxsKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxPY2N1cGllciA9IHRoaXMuY2VsbE9jY3VwaWVyKGNlbGwpO1xuICAgICAgICAgICAgICAgIGlmIChjZWxsT2NjdXBpZXIgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGdhcHNbZGlyZWN0aW9uXSsrO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNlbGxPY2N1cGllciA9PT0gcGxheWVySWQpXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aHNbZGlyZWN0aW9uXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuYm9hcmRXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHRoaXMuYm9hcmRIZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgICAgIGdhcHMgPSBbMCwgMCwgMCwgMF07XG4gICAgICAgICAgICAgICAgbGVuZ3RocyA9IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwIGFzIDAgfCAxIHwgMiB8IDM7IGogPCA0OyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnYXBzW2pdID4gbWF4R2FwcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2VsbCh4ICsgaSAqIERJUkVDVElPTlNbal0ueCwgeSArIGkgKiBESVJFQ1RJT05TW2pdLnksIGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aHNbal0gPT09IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGluZUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaXQgaW5kZXggZnJvbSBpdHMgY29vcmRpbmF0ZXMgYW5kIHBsYXllciBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb3ZlIFRoZSBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgVGhlIHBsYXllciBJRC5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0IGluZGV4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRCaXRJbmRleChtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1vdmVJbmRleCA9IHRoaXMuZ2V0SW5kZXgobW92ZSk7XG4gICAgICAgIGNvbnN0IGJpdEJvYXJkTW92ZUluZGV4ID0gbW92ZUluZGV4ICsgdGhpcy5ib2FyZFdpZHRoICogdGhpcy5ib2FyZEhlaWdodCAqIHBsYXllcklkO1xuICAgICAgICByZXR1cm4gYml0Qm9hcmRNb3ZlSW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBCaXRCb2FyZCBjb250YWluaW5nIG9ubHkgdGhlIHBsYXllcidzIGJpdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxheWVySWQgVGhlIHBsYXllcidzIElELlxuICAgICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIncyBiaXRzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQbGF5ZXJCb2FyZChwbGF5ZXJJZDogbnVtYmVyKTogVCB7XG4gICAgICAgIGNvbnN0IHRvdGFsQml0cyA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkID8gdGhpcy5iaXRCb2FyZC5kYXRhLndvcmRDb3VudCA6IDEpICogMzI7XG4gICAgICAgIGNvbnN0IGJvYXJkU2l6ZSA9IHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQ7XG4gICAgICAgIHJldHVybiB0aGlzLmJpdEJvYXJkLmxlZnRTaGlmdCh0b3RhbEJpdHMgLSBib2FyZFNpemUgKiAocGxheWVySWQgKyAxKSkucmlnaHRTaGlmdCh0b3RhbEJpdHMgLSBib2FyZFNpemUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBiaXQgaW5kZXggZnJvbSBpdHMgY29vcmRpbmF0ZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW92ZSBUaGUgY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybnMgVGhlIGJpdCBpbmRleC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEluZGV4KG1vdmU6IFBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9hcmRXaWR0aCAqIG1vdmUueSArIG1vdmUueDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtb3ZlIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gYm9hcmQuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgdGhhdCBjZWxsIGlzIGFscmVhZHkgb2NjdXBpZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoYXQgY2VsbCBleGlzdHMgb24gdGhlIGJvYXJkLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNWYWxpZFBvc2l0aW9uKHBvc2l0aW9uOiBQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcG9zaXRpb24ueCA+PSAwICYmIHBvc2l0aW9uLnggPCB0aGlzLmJvYXJkV2lkdGggJiYgcG9zaXRpb24ueSA+PSAwICYmIHBvc2l0aW9uLnkgPCB0aGlzLmJvYXJkSGVpZ2h0O1xuICAgIH1cbn1cbiJdfQ==
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9hcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9ib2FyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLFdBQVcsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLE9BQU8sTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLGVBQWUsTUFBTSxnQ0FBZ0MsQ0FBQztBQXNCN0QsK0JBQStCO0FBQy9CLE1BQU0sQ0FBQyxPQUFPLE9BQWdCLEtBQUs7SUFDL0IsbUNBQW1DO0lBQzVCLE1BQU0sR0FBVyxFQUFFLENBQUM7SUFFM0IsOENBQThDO0lBQzNCLFFBQVEsQ0FBSTtJQUUvQiw4QkFBOEI7SUFDWCxVQUFVLENBQVM7SUFFdEMsK0JBQStCO0lBQ1osV0FBVyxDQUFTO0lBRXZDLHdCQUF3QjtJQUNMLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFeEMsK0VBQStFO0lBQzlELG9CQUFvQixDQUFTO0lBRTlDLHNEQUFzRDtJQUNyQyxjQUFjLENBQVM7SUFLeEM7Ozs7OztPQU1HO0lBQ0gsWUFBc0IsS0FBYSxFQUFFLE1BQWMsRUFBRSxtQkFBMkIsQ0FBQyxFQUFFLGtCQUEwQixDQUFDO1FBQzFHLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxlQUFlLENBQUM7UUFDbEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFM0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FB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LElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFFcEYsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGNBQWMsQ0FBQyxRQUFnQjtRQUNyQyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLFlBQVksZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyRyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFFckQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQztJQUM3RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFFBQVEsQ0FBQyxJQUFjO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLFFBQWtCO1FBQ3RDLE9BQU8sUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMvRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvYml0Qm9hcmQuanNcIjtcbmltcG9ydCBJbnRCaXRCb2FyZCBmcm9tIFwiLi4vYml0Qm9hcmQvaW50Qml0Qm9hcmQuanNcIjtcbmltcG9ydCBMb25nSW50IGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50LmpzXCI7XG5pbXBvcnQgTG9uZ0ludEJpdEJvYXJkIGZyb20gXCIuLi9iaXRCb2FyZC9sb25nSW50Qml0Qm9hcmQuanNcIjtcblxuZXhwb3J0IHR5cGUgUG9zaXRpb24gPSB7XG4gICAgeTogbnVtYmVyO1xuICAgIHg6IG51bWJlcjtcbn07XG5cbi8qKiBEZWZpbmVzIHRoZSBjaGFyYWN0ZXJzIHVzZWQgdG8gZHJhdyBhIGdyaWQuICovXG5leHBvcnQgY29uc3QgZW51bSBHcmlkTGluZXMge1xuICAgIEhvcml6b250YWwgPSBcIlxcdTI1MDBcIixcbiAgICBWZXJ0aWNhbCA9IFwiXFx1MjUwMlwiLFxuICAgIFRvcExlZnQgPSBcIlxcdTI1MENcIixcbiAgICBUb3BSaWdodCA9IFwiXFx1MjUxMFwiLFxuICAgIEJvdHRvbUxlZnQgPSBcIlxcdTI1MTRcIixcbiAgICBCb3R0b21SaWdodCA9IFwiXFx1MjUxOFwiLFxuICAgIFRMZWZ0ID0gXCJcXHUyNTFDXCIsXG4gICAgVFJpZ2h0ID0gXCJcXHUyNTI0XCIsXG4gICAgVFRvcCA9IFwiXFx1MjUyQ1wiLFxuICAgIFRCb3R0b20gPSBcIlxcdTI1MzRcIixcbiAgICBDcm9zcyA9IFwiXFx1MjUzQ1wiLFxufVxuXG4vKiogUmVwcmVzZW50cyBhIGdhbWUgYm9hcmQuICovXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBCb2FyZDxUIGV4dGVuZHMgQml0Qm9hcmQgPSBCaXRCb2FyZD4ge1xuICAgIC8qKiBDb250YWlucyB0aGUgSUQgb2YgdGhlIGdhbWUuICovXG4gICAgcHVibGljIGdhbWVJRDogc3RyaW5nID0gXCJcIjtcblxuICAgIC8qKiBDb250YWlucyB0aGUgZGF0YSBzdG9yZWQgaW4gYSBCaXRCb2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYml0Qm9hcmQ6IFQ7XG5cbiAgICAvKiogVGhlIHdpZHRoIG9mIHRoZSBib2FyZC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYm9hcmRXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIGJvYXJkLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBib2FyZEhlaWdodDogbnVtYmVyO1xuXG4gICAgLyoqIEEgc3RhY2sgb2YgbW92ZXMuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vdmVzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLyoqIEhvdyBtYW55IGJvYXJkcyB0aGVyZSBhcmUgcmVwcmVzZW50aW5nIHBsYXllciBwb3NpdGlvbnMgKG1vc3QgbGlrZWx5IDIpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbnVtYmVyT2ZQbGF5ZXJCb2FyZHM6IG51bWJlcjtcblxuICAgIC8qKiBOdW1iZXIgb2YgYm9hcmRzIGluIHRvdGFsIChtb3N0IGxpa2VseSBhbHNvIDIpLiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbnVtYmVyT2ZCb2FyZHM6IG51bWJlcjtcblxuICAgIC8qKiBUaGUgYm9hcmQgc3RhdGVzIHdoaWNoIHJlcHJlc2VudCBhIHdpbm5pbmcgc3RhdGUuICovXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IHdpbm5pbmdTdGF0ZXM6IFRbXTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQm9hcmQuXG4gICAgICogQHBhcmFtIHdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBib2FyZC5cbiAgICAgKiBAcGFyYW0gcGxheWVyQm9hcmRDb3VudCBIb3cgbWFueSBib2FyZHMgdGhlcmUgYXJlIHJlcHJlc2VudGluZyBwbGF5ZXIgcG9zaXRpb25zIChtb3N0IGxpa2VseSAyKS5cbiAgICAgKiBAcGFyYW0gZXh0cmFCb2FyZENvdW50IE51bWJlciBvZiBleHRyYSBib2FyZHMgKG1vc3QgbGlrZWx5IDApLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgcGxheWVyQm9hcmRDb3VudDogbnVtYmVyID0gMiwgZXh0cmFCb2FyZENvdW50OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMuYm9hcmRXaWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmJvYXJkSGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLm51bWJlck9mUGxheWVyQm9hcmRzID0gcGxheWVyQm9hcmRDb3VudDtcbiAgICAgICAgdGhpcy5udW1iZXJPZkJvYXJkcyA9IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMgKyBleHRyYUJvYXJkQ291bnQ7XG4gICAgICAgIGNvbnN0IHRvdGFsQml0cyA9IHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgKiB0aGlzLm51bWJlck9mQm9hcmRzO1xuXG4gICAgICAgIHRoaXMuYml0Qm9hcmQgPSAodG90YWxCaXRzID4gMzIgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0b3RhbEJpdHMgLyAzMikpIDogbmV3IEludEJpdEJvYXJkKCkpIGFzIFQ7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgd2hldGhlciBvciBub3QgdGhlIGJvYXJkIGlzIGZ1bGwuICovXG4gICAgcHVibGljIGdldCBpc0Z1bGwoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc0Z1bGwgPSAodGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludEJpdEJvYXJkKE1hdGguY2VpbCh0aGlzLmJvYXJkV2lkdGggKiB0aGlzLmJvYXJkSGVpZ2h0IC8gMzIpKVxuICAgICAgICAgICAgOiBuZXcgSW50Qml0Qm9hcmQoKSkgYXMgVDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKylcbiAgICAgICAgICAgIGlzRnVsbCA9IGlzRnVsbC5vcih0aGlzLmdldFBsYXllckJvYXJkKGkpKTtcbiAgICAgICAgY29uc3QgZnVsbFZhbHVlID0gdGhpcy5iaXRCb2FyZCBpbnN0YW5jZW9mIExvbmdJbnRCaXRCb2FyZFxuICAgICAgICAgICAgPyBuZXcgTG9uZ0ludChbXG4gICAgICAgICAgICAgICAgLi4uQXJyYXk8bnVtYmVyPihNYXRoLmNlaWwodGhpcy5ib2FyZFdpZHRoICogdGhpcy5ib2FyZEhlaWdodCAvIDMyKSAtIDEpLmZpbGwofjAgPj4+IDApLFxuICAgICAgICAgICAgICAgIDIgKiogKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgLSAoTWF0aC5jZWlsKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgLyAzMikgLSAxKSAqIDMyKSAtIDEsXG4gICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiAyICoqICh0aGlzLmJvYXJkV2lkdGggKiB0aGlzLmJvYXJkSGVpZ2h0KSAtIDE7XG5cbiAgICAgICAgcmV0dXJuIGlzRnVsbC5lcXVhbHMoZnVsbFZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQ2FsY3VsYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgYm9hcmQgaXMgZW1wdHkuICovXG4gICAgcHVibGljIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNFbXB0eSA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkXG4gICAgICAgICAgICA/IG5ldyBMb25nSW50Qml0Qm9hcmQoTWF0aC5jZWlsKHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQgLyAzMikpXG4gICAgICAgICAgICA6IG5ldyBJbnRCaXRCb2FyZCgpKSBhcyBUO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1iZXJPZlBsYXllckJvYXJkczsgaSsrKVxuICAgICAgICAgICAgaXNFbXB0eSA9IGlzRW1wdHkub3IodGhpcy5nZXRQbGF5ZXJCb2FyZChpKSk7XG5cbiAgICAgICAgcmV0dXJuIGlzRW1wdHkuZXF1YWxzKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZXMgd2hvIHRoZSB3aW5uZXIgaXMuXG4gICAgICogSWYgdGhlIGdhbWUgaXMgbm90IG92ZXIsIHRoZSBvdXRwdXQgaXMgZmFsc2UuXG4gICAgICogSWYgdGhlcmUgaXMgYSB3aW5uZXIsIHRoZSBvdXRwdXQgaXMgdGhlaXIgSUQuXG4gICAgICogSWYgdGhlcmUgaXMgYSBkcmF3LCB0aGUgb3V0cHV0IGlzIG51bGwuXG4gICAgICovXG4gICAgcHVibGljIGdldCB3aW5uZXIoKTogMCB8IDEgfCBmYWxzZSB8IG51bGwge1xuICAgICAgICBjb25zdCBwbGF5ZXJPbmVCb2FyZCA9IHRoaXMuZ2V0UGxheWVyQm9hcmQoMCk7XG4gICAgICAgIGNvbnN0IHBsYXllclR3b0JvYXJkID0gdGhpcy5nZXRQbGF5ZXJCb2FyZCgxKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRoaXMud2lubmluZ1N0YXRlcykge1xuICAgICAgICAgICAgaWYgKHBsYXllck9uZUJvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICAgICAgaWYgKHBsYXllclR3b0JvYXJkLmFuZChzdGF0ZSkuZXF1YWxzKHN0YXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzRnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQ2FsY3VsYXRlcyB3aGljaCBjZWxscyBhcmUgZW1wdHkuICovXG4gICAgcHVibGljIGdldCBlbXB0eUNlbGxzKCk6IFBvc2l0aW9uW10ge1xuICAgICAgICBjb25zdCBlbXB0eUNlbGxzOiBQb3NpdGlvbltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0aGlzLmJvYXJkSGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5ib2FyZFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jZWxsT2NjdXBpZXIoeyB4LCB5IH0pID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICBlbXB0eUNlbGxzLnB1c2goeyB4LCB5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVtcHR5Q2VsbHM7XG4gICAgfVxuXG4gICAgLyoqIENhbGN1bGF0ZXMgdGhlIGhldXJpc3RpYyBzY29yZSBmb3IgYSBnaXZlbiBib2FyZCBzdGF0ZS4gKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2V0IGhldXJpc3RpYygpOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBnYW1lIElELlxuICAgICAqIEBwYXJhbSBpZCBUaGUgSUQgb2YgdGhlIGdhbWUuXG4gICAgICovXG4gICAgcHVibGljIHNldEdhbWVJRChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZ2FtZUlEID0gaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZXMgYSBtb3ZlIG9uIHRoZSBib2FyZC5cbiAgICAgKiBAcGFyYW0gbW92ZSBUaGUgcG9zaXRpb24gb2YgdGhlIG1vdmUuXG4gICAgICogQHBhcmFtIHBsYXllcklkIFRoZSBwbGF5ZXIgd2hvJ3MgbWFraW5nIHRoZSBtb3ZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBtYWtlTW92ZShtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBiaXQgPSB0aGlzLmdldEJpdEluZGV4KG1vdmUsIHBsYXllcklkKTtcblxuICAgICAgICB0aGlzLm1vdmVzLnB1c2goYml0KTtcbiAgICAgICAgdGhpcy5iaXRCb2FyZC5zZXRCaXQoYml0KTtcbiAgICB9XG5cbiAgICAvKiogUmV2ZXJzZXMgdGhlIGxhc3QgbW92ZS4gKi9cbiAgICBwdWJsaWMgdW5kb0xhc3RNb3ZlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBsYXN0TW92ZSA9IHRoaXMubW92ZXMucG9wKCk7XG5cbiAgICAgICAgaWYgKGxhc3RNb3ZlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBtb3ZlIHRvIHVuZG8uXCIpO1xuXG4gICAgICAgIHRoaXMuYml0Qm9hcmQuY2xlYXJCaXQobGFzdE1vdmUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIG1vdmUgaXMgdmFsaWQuXG4gICAgICogQHBhcmFtIG1vdmUgVGhlIG1vdmUuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgaXQncyB2YWxpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUlzVmFsaWQobW92ZTogUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZFBvc2l0aW9uKG1vdmUpICYmIHRoaXMuY2VsbE9jY3VwaWVyKG1vdmUpID09PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGljaCBwbGF5ZXIgaXMgb2NjdXB5aW5nIGEgZ2l2ZW4gY2VsbC5cbiAgICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBJZiB0aGUgY2VsbCBpcyBlbXB0eSwgdGhlIG91dHB1dCBpcyBudWxsLCBvdGhlcndpc2UgdGhlIG91dHB1dCBpcyB0aGUgcGxheWVyJ3MgSUQuXG4gICAgICovXG4gICAgcHVibGljIGNlbGxPY2N1cGllcihjZWxsOiBQb3NpdGlvbik6IG51bWJlciB8IG51bGwge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHM7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYml0Qm9hcmQuZ2V0Qml0KHRoaXMuZ2V0Qml0SW5kZXgoY2VsbCwgaSkpID09PSAxKVxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIHdyYXAgV2hldGhlciBvciBub3QgdG8gcHJvdmlkZSBhIGJvcmRlciBmb3IgdGhlIGJvYXJkLlxuICAgICAqIEBwYXJhbSBsYWJlbFggV2hldGhlciBvciBub3QgdG8gbGFiZWwgeC5cbiAgICAgKiBAcGFyYW0gbGFiZWxZIFdoZXRoZXIgb3Igbm90IHRvIGxhYmVsIHkuXG4gICAgICogQHBhcmFtIHN5bWJvbHMgVGhlIHN5bWJvbHMgdG8gdXNlIGFzIGJvYXJkIHBpZWNlcy5cbiAgICAgKiBAcGFyYW0gY29sb3VyIFdoZXRoZXIgb3Igbm90IHRvIGNvbG91ciB0aGUgcGllY2VzLlxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHRvU3RyaW5nKFxuICAgICAgICB3cmFwOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgbGFiZWxYOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgbGFiZWxZOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgc3ltYm9sczogc3RyaW5nW10gPSBbXCJYXCIsIFwiT1wiXSxcbiAgICAgICAgY29sb3VyOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoc3ltYm9scy5sZW5ndGggIT09IHRoaXMubnVtYmVyT2ZQbGF5ZXJCb2FyZHMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUb28gbWFueSBzeW1ib2xzLlwiKTtcblxuICAgICAgICBjb25zdCBzeW1ib2xMZW5ndGggPSBzeW1ib2xzWzBdIS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHN5bWJvbHMuc29tZSgocykgPT4gcy5sZW5ndGggIT09IHN5bWJvbExlbmd0aCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW1ib2xzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoLlwiKTtcblxuICAgICAgICBjb25zdCBtYXRjaENlbGxTcGFjZSA9IG5ldyBSZWdFeHAoYC57JHtzeW1ib2xMZW5ndGggKyAyfX1gLCBcImd1XCIpO1xuICAgICAgICBjb25zdCBhbHBoYWJldCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwiO1xuICAgICAgICBjb25zdCB4TGFiZWxzID0gbGFiZWxYXG4gICAgICAgICAgICA/IGAke2FscGhhYmV0LnNsaWNlKDAsIHRoaXMuYm9hcmRXaWR0aClcbiAgICAgICAgICAgICAgICAuc3BsaXQoXCJcIilcbiAgICAgICAgICAgICAgICAubWFwKChsZXR0ZXIpID0+IGAgJHtsZXR0ZXIucGFkU3RhcnQoc3ltYm9sTGVuZ3RoKX0gYClcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIgXCIpXG4gICAgICAgICAgICAgICAgLnBhZFN0YXJ0KDQgKiB0aGlzLmJvYXJkV2lkdGggLSAxICsgTnVtYmVyKHdyYXApICsgTnVtYmVyKGxhYmVsWSkpXG4gICAgICAgICAgICB9XFxuYFxuICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICBjb25zdCB0b3BCb3JkZXIgPSB3cmFwXG4gICAgICAgICAgICA/IGAke2xhYmVsWSA/IFwiIFwiIDogXCJcIn0ke0dyaWRMaW5lcy5Ub3BMZWZ0fSR7R3JpZExpbmVzLkhvcml6b250YWxcbiAgICAgICAgICAgICAgICAucmVwZWF0KHRoaXMuYm9hcmRXaWR0aCAqIChzeW1ib2xMZW5ndGggKyAyKSlcbiAgICAgICAgICAgICAgICAubWF0Y2gobWF0Y2hDZWxsU3BhY2UpIVxuICAgICAgICAgICAgICAgIC5qb2luKEdyaWRMaW5lcy5UVG9wKX0ke0dyaWRMaW5lcy5Ub3BSaWdodH1cXG5gXG4gICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIGNvbnN0IGJvdHRvbUJvcmRlciA9IHdyYXBcbiAgICAgICAgICAgID8gYCR7bGFiZWxZID8gXCIgXCIgOiBcIlwifSR7R3JpZExpbmVzLkJvdHRvbUxlZnR9JHtHcmlkTGluZXMuSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgIC5yZXBlYXQodGhpcy5ib2FyZFdpZHRoICogKHN5bWJvbExlbmd0aCArIDIpKVxuICAgICAgICAgICAgICAgIC5tYXRjaChtYXRjaENlbGxTcGFjZSkhXG4gICAgICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLlRCb3R0b20pfSR7R3JpZExpbmVzLkJvdHRvbVJpZ2h0fWBcbiAgICAgICAgICAgIDogXCJcIjtcbiAgICAgICAgY29uc3Qgcm93U2VwYXJhdG9yID0gYCR7bGFiZWxZID8gXCIgXCIgOiBcIlwifSR7d3JhcCA/IEdyaWRMaW5lcy5UTGVmdCA6IFwiXCJ9JHtHcmlkTGluZXMuSG9yaXpvbnRhbFxuICAgICAgICAgICAgLnJlcGVhdCh0aGlzLmJvYXJkV2lkdGggKiAoc3ltYm9sTGVuZ3RoICsgMikpXG4gICAgICAgICAgICAubWF0Y2gobWF0Y2hDZWxsU3BhY2UpIVxuICAgICAgICAgICAgLmpvaW4oR3JpZExpbmVzLkNyb3NzKX0ke3dyYXAgPyBHcmlkTGluZXMuVFJpZ2h0IDogXCJcIn1cXG5gO1xuICAgICAgICBjb25zdCByb3dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5ib2FyZEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICBjb25zdCB5TGFiZWwgPSBsYWJlbFkgPyBgJHt5ICsgMX1gIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRCb3JkZXIgPSB3cmFwID8gR3JpZExpbmVzLlZlcnRpY2FsIDogXCJcIjtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0Qm9yZGVyID0gd3JhcCA/IEdyaWRMaW5lcy5WZXJ0aWNhbCA6IFwiXCI7XG4gICAgICAgICAgICBsZXQgcm93ID0gYCR7eUxhYmVsfSR7bGVmdEJvcmRlcn1gO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHRoaXMuYm9hcmRXaWR0aDsgeCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IHsgeCwgeSB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhciA9IHggPT09IHRoaXMuYm9hcmRXaWR0aCAtIDEgPyBcIlwiIDogR3JpZExpbmVzLlZlcnRpY2FsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxPY2N1cGllciA9IHRoaXMuY2VsbE9jY3VwaWVyKGNlbGwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNlbGxPY2N1cGllciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3cgKz0gYCAke1wiIFwiLnJlcGVhdChzeW1ib2xMZW5ndGgpfSAke2Jhcn1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdyArPSBgICR7Y29sb3VyID8gYFxceDFiWyR7WzkxLCA5M11bY2VsbE9jY3VwaWVyXSF9bWAgOiBcIlwifWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3ltYm9sc1tjZWxsT2NjdXBpZXJdfWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCR7Y29sb3VyID8gXCJcXHgxYlswbVwiIDogXCJcIn0gJHtiYXJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzLnB1c2goYCR7cm93fSR7cmlnaHRCb3JkZXJ9XFxuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7eExhYmVsc30ke3RvcEJvcmRlcn0ke3Jvd3Muam9pbihyb3dTZXBhcmF0b3IpfSR7Ym90dG9tQm9yZGVyfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIHBsYXllciBoYXMgYSBsaW5lIG9mIHBpZWNlcyBvbiB0aGUgYm9hcmQuXG4gICAgICogQHBhcmFtIHBsYXllcklkIFRoZSBJRCBvZiB0aGUgcGxheWVyLlxuICAgICAqIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBwaWVjZXMgbmVlZGVkLlxuICAgICAqIEBwYXJhbSBtYXhHYXBzIFRoZSBudW1iZXIgb2YgZ2FwcyBhbGxvd2VkIGZvciBhIGxpbmUgdG8gYmUgdmFsaWQuIERlZmF1bHRzIHRvIDAuXG4gICAgICogQHJldHVybnMgSG93IG1hbnkgbGluZXMgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGhhc0xpbmUocGxheWVySWQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIG1heEdhcHM6IG51bWJlciA9IDApOiBudW1iZXIge1xuICAgICAgICBpZiAobGVuZ3RoID4gTWF0aC5tYXgodGhpcy5ib2FyZFdpZHRoLCB0aGlzLmJvYXJkSGVpZ2h0KSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuXG4gICAgICAgIGNvbnN0IERJUkVDVElPTlM6IFtQb3NpdGlvbiwgUG9zaXRpb24sIFBvc2l0aW9uLCBQb3NpdGlvbl0gPSBbeyB4OiAxLCB5OiAwIH0sIHsgeDogMCwgeTogMSB9LCB7IHg6IDEsIHk6IDEgfSwgeyB4OiAxLCB5OiAtMSB9XTtcbiAgICAgICAgbGV0IGxpbmVDb3VudCA9IDA7XG4gICAgICAgIGxldCBnYXBzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwLCAwXTtcbiAgICAgICAgbGV0IGxlbmd0aHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICBjb25zdCBjaGVja0NlbGwgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRpcmVjdGlvbjogMCB8IDEgfCAyIHwgMyk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2VsbCA9IHsgeCwgeSB9IGFzIFBvc2l0aW9uO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkUG9zaXRpb24oY2VsbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsT2NjdXBpZXIgPSB0aGlzLmNlbGxPY2N1cGllcihjZWxsKTtcblxuICAgICAgICAgICAgICAgIGlmIChjZWxsT2NjdXBpZXIgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGdhcHNbZGlyZWN0aW9uXSsrO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNlbGxPY2N1cGllciA9PT0gcGxheWVySWQpXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aHNbZGlyZWN0aW9uXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdGhpcy5ib2FyZFdpZHRoOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdGhpcy5ib2FyZEhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgZ2FwcyA9IFswLCAwLCAwLCAwXTtcbiAgICAgICAgICAgICAgICBsZW5ndGhzID0gWzAsIDAsIDAsIDBdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAgYXMgMCB8IDEgfCAyIHwgMzsgaiA8IDQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhcHNbal0gPiBtYXhHYXBzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0NlbGwoeCArIGkgKiBESVJFQ1RJT05TW2pdLngsIHkgKyBpICogRElSRUNUSU9OU1tqXS55LCBqKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aHNbal0gPT09IGxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQ291bnQrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5lQ291bnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpdCBpbmRleCBmcm9tIGl0cyBjb29yZGluYXRlcyBhbmQgcGxheWVyIElELlxuICAgICAqIEBwYXJhbSBtb3ZlIFRoZSBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgVGhlIHBsYXllciBJRC5cbiAgICAgKiBAcmV0dXJucyBUaGUgYml0IGluZGV4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRCaXRJbmRleChtb3ZlOiBQb3NpdGlvbiwgcGxheWVySWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1vdmVJbmRleCA9IHRoaXMuZ2V0SW5kZXgobW92ZSk7XG4gICAgICAgIGNvbnN0IGJpdEJvYXJkTW92ZUluZGV4ID0gbW92ZUluZGV4ICsgdGhpcy5ib2FyZFdpZHRoICogdGhpcy5ib2FyZEhlaWdodCAqIHBsYXllcklkO1xuXG4gICAgICAgIHJldHVybiBiaXRCb2FyZE1vdmVJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIEJpdEJvYXJkIGNvbnRhaW5pbmcgb25seSB0aGUgcGxheWVyJ3MgYml0cy5cbiAgICAgKiBAcGFyYW0gcGxheWVySWQgVGhlIHBsYXllcidzIElELlxuICAgICAqIEByZXR1cm5zIFRoZSBwbGF5ZXIncyBiaXRzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQbGF5ZXJCb2FyZChwbGF5ZXJJZDogbnVtYmVyKTogVCB7XG4gICAgICAgIGNvbnN0IHRvdGFsQml0cyA9ICh0aGlzLmJpdEJvYXJkIGluc3RhbmNlb2YgTG9uZ0ludEJpdEJvYXJkID8gdGhpcy5iaXRCb2FyZC5kYXRhLndvcmRDb3VudCA6IDEpICogMzI7XG4gICAgICAgIGNvbnN0IGJvYXJkU2l6ZSA9IHRoaXMuYm9hcmRXaWR0aCAqIHRoaXMuYm9hcmRIZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYml0Qm9hcmQubGVmdFNoaWZ0KHRvdGFsQml0cyAtIGJvYXJkU2l6ZSAqIChwbGF5ZXJJZCArIDEpKS5yaWdodFNoaWZ0KHRvdGFsQml0cyAtIGJvYXJkU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIGJpdCBpbmRleCBmcm9tIGl0cyBjb29yZGluYXRlcy5cbiAgICAgKiBAcGFyYW0gbW92ZSBUaGUgY29vcmRpbmF0ZXMuXG4gICAgICogQHJldHVybnMgVGhlIGJpdCBpbmRleC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldEluZGV4KG1vdmU6IFBvc2l0aW9uKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm9hcmRXaWR0aCAqIG1vdmUueSArIG1vdmUueDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBtb3ZlIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gYm9hcmQuXG4gICAgICogRG9lcyBub3QgY2hlY2sgaWYgdGhhdCBjZWxsIGlzIGFscmVhZHkgb2NjdXBpZWQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGF0IGNlbGwgZXhpc3RzIG9uIHRoZSBib2FyZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVmFsaWRQb3NpdGlvbihwb3NpdGlvbjogUG9zaXRpb24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uLnggPj0gMCAmJiBwb3NpdGlvbi54IDwgdGhpcy5ib2FyZFdpZHRoICYmIHBvc2l0aW9uLnkgPj0gMCAmJiBwb3NpdGlvbi55IDwgdGhpcy5ib2FyZEhlaWdodDtcbiAgICB9XG59XG4iXX0=
|