dgeoutils 2.2.22 → 2.3.1
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/README.md +5 -0
- package/dist/{DCircle.d.ts → cjs/DCircle.d.ts} +0 -0
- package/dist/cjs/DCircle.js +102 -0
- package/dist/{DLine.d.ts → cjs/DLine.d.ts} +0 -0
- package/dist/cjs/DLine.js +300 -0
- package/dist/{DNumbers.d.ts → cjs/DNumbers.d.ts} +0 -0
- package/dist/cjs/DNumbers.js +30 -0
- package/dist/{DPlane.d.ts → cjs/DPlane.d.ts} +0 -0
- package/dist/cjs/DPlane.js +132 -0
- package/dist/{DPoint.d.ts → cjs/DPoint.d.ts} +0 -0
- package/dist/cjs/DPoint.js +574 -0
- package/dist/{DPolygon.d.ts → cjs/DPolygon.d.ts} +10 -0
- package/dist/cjs/DPolygon.js +1555 -0
- package/dist/{DPolygonLoop.d.ts → cjs/DPolygonLoop.d.ts} +0 -0
- package/dist/cjs/DPolygonLoop.js +401 -0
- package/dist/{FastSearch.d.ts → cjs/FastSearch.d.ts} +0 -0
- package/dist/cjs/FastSearch.js +53 -0
- package/dist/{TraceMatrix.d.ts → cjs/TraceMatrix.d.ts} +0 -0
- package/dist/cjs/TraceMatrix.js +256 -0
- package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- package/dist/{index.js → cjs/index.js} +0 -0
- package/dist/{utils.d.ts → cjs/utils.d.ts} +1 -1
- package/dist/cjs/utils.js +191 -0
- package/dist/{DCircle.js → es2015/DCircle.js} +14 -18
- package/dist/{DLine.js → es2015/DLine.js} +24 -28
- package/dist/es2015/DNumbers.js +22 -0
- package/dist/{DPlane.js → es2015/DPlane.js} +22 -26
- package/dist/{DPoint.js → es2015/DPoint.js} +52 -56
- package/dist/{DPolygon.js → es2015/DPolygon.js} +102 -100
- package/dist/{DPolygonLoop.js → es2015/DPolygonLoop.js} +1 -5
- package/dist/{FastSearch.js → es2015/FastSearch.js} +1 -5
- package/dist/{TraceMatrix.js → es2015/TraceMatrix.js} +35 -39
- package/dist/es2015/index.js +13 -0
- package/dist/{utils.js → es2015/utils.js} +26 -36
- package/dist/esm/DCircle.js +99 -0
- package/dist/esm/DLine.js +297 -0
- package/dist/esm/DNumbers.js +27 -0
- package/dist/esm/DPlane.js +129 -0
- package/dist/esm/DPoint.js +571 -0
- package/dist/esm/DPolygon.js +1552 -0
- package/dist/esm/DPolygonLoop.js +398 -0
- package/dist/esm/FastSearch.js +50 -0
- package/dist/esm/TraceMatrix.js +253 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/utils.js +181 -0
- package/dist/umd/dgeoutils.js +3569 -0
- package/dist/umd/dgeoutils.min.js +1 -0
- package/dist/umd/dgeoutils.min.js.map +1 -0
- package/package.json +17 -10
- package/dist/DNumbers.js +0 -26
|
@@ -0,0 +1,3569 @@
|
|
|
1
|
+
(function (global, factory) {
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jsts')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', 'jsts'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.DGeoUtils = {}, global.jsts));
|
|
5
|
+
})(this, (function (exports, jsts) { 'use strict';
|
|
6
|
+
|
|
7
|
+
var __read$4 = (undefined && undefined.__read) || function (o, n) {
|
|
8
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
9
|
+
if (!m) return o;
|
|
10
|
+
var i = m.call(o), r, ar = [], e;
|
|
11
|
+
try {
|
|
12
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
13
|
+
}
|
|
14
|
+
catch (error) { e = { error: error }; }
|
|
15
|
+
finally {
|
|
16
|
+
try {
|
|
17
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
18
|
+
}
|
|
19
|
+
finally { if (e) throw e.error; }
|
|
20
|
+
}
|
|
21
|
+
return ar;
|
|
22
|
+
};
|
|
23
|
+
var __spreadArray$2 = (undefined && undefined.__spreadArray) || function (to, from, pack) {
|
|
24
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
25
|
+
if (ar || !(i in from)) {
|
|
26
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
27
|
+
ar[i] = from[i];
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
31
|
+
};
|
|
32
|
+
var warn = function () {
|
|
33
|
+
var args = [];
|
|
34
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
35
|
+
args[_i] = arguments[_i];
|
|
36
|
+
}
|
|
37
|
+
if (DGeo.DEBUG) {
|
|
38
|
+
console.warn.apply(console, __spreadArray$2([], __read$4(args), false));
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
var isDefAndNotNull = function (a) { return a != undefined; };
|
|
42
|
+
var hook = function (scope) { return function () { return scope; }; };
|
|
43
|
+
var shouldBeInt = function (scope, funcName, argName) { return function (p) {
|
|
44
|
+
if (!p.clone().round()
|
|
45
|
+
.equal(p)) {
|
|
46
|
+
warn("\"" + funcName + "\" -> \"" + argName + "\" should be Int!");
|
|
47
|
+
}
|
|
48
|
+
return scope;
|
|
49
|
+
}; };
|
|
50
|
+
var shouldBeUInt = function (scope, funcName, argName) { return function (p) {
|
|
51
|
+
if (!p.clone().round()
|
|
52
|
+
.equal(p) || !p.gtOrEqual(DPoint.zero())) {
|
|
53
|
+
warn("\"" + funcName + "\" -> \"" + argName + "\" should be UInt!");
|
|
54
|
+
}
|
|
55
|
+
return scope;
|
|
56
|
+
}; };
|
|
57
|
+
var shouldBeDegree = function (scope, funcName, argName) { return function (p) {
|
|
58
|
+
if (!p.likeWorldGeodeticSystem) {
|
|
59
|
+
warn("\"" + funcName + "\" -> \"" + argName + "\" should be degree!");
|
|
60
|
+
}
|
|
61
|
+
return scope;
|
|
62
|
+
}; };
|
|
63
|
+
var shouldBeRadians = function (scope, funcName, argName) { return function (p) {
|
|
64
|
+
if (!p.likeRadians) {
|
|
65
|
+
warn("\"" + funcName + "\" -> \"" + argName + "\" should be radians!");
|
|
66
|
+
}
|
|
67
|
+
return scope;
|
|
68
|
+
}; };
|
|
69
|
+
var shouldExist = function (scope, funcName, argName) { return function (p) {
|
|
70
|
+
if (!isDefAndNotNull(p)) {
|
|
71
|
+
warn("\"" + funcName + "\" -> \"" + argName + "\" should exist!");
|
|
72
|
+
}
|
|
73
|
+
return scope;
|
|
74
|
+
}; };
|
|
75
|
+
var shouldBeMeters = function (scope, funcName, argName) { return function (p) {
|
|
76
|
+
if (!p.likePseudoMercator) {
|
|
77
|
+
warn("\"" + funcName + "\" -> \"" + argName + "\" should be meters!");
|
|
78
|
+
}
|
|
79
|
+
return scope;
|
|
80
|
+
}; };
|
|
81
|
+
var checkFunction = function (funcName) { return ({
|
|
82
|
+
checkArgument: function (argName) {
|
|
83
|
+
if (!DGeo.DEBUG) {
|
|
84
|
+
return {
|
|
85
|
+
shouldBeDegree: hook(this),
|
|
86
|
+
shouldBeMeters: hook(this),
|
|
87
|
+
shouldBeInt: hook(this),
|
|
88
|
+
shouldBeUInt: hook(this),
|
|
89
|
+
shouldBeRadians: hook(this),
|
|
90
|
+
shouldExist: hook(this)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
shouldBeDegree: shouldBeDegree(this, funcName, argName),
|
|
95
|
+
shouldBeMeters: shouldBeMeters(this, funcName, argName),
|
|
96
|
+
shouldBeInt: shouldBeInt(this, funcName, argName),
|
|
97
|
+
shouldBeUInt: shouldBeUInt(this, funcName, argName),
|
|
98
|
+
shouldBeRadians: shouldBeRadians(this, funcName, argName),
|
|
99
|
+
shouldExist: shouldExist(this, funcName, argName)
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}); };
|
|
103
|
+
var createArray = function (v, fillSymbol) {
|
|
104
|
+
if (fillSymbol === void 0) { fillSymbol = 0; }
|
|
105
|
+
return new Array(v).fill(fillSymbol);
|
|
106
|
+
};
|
|
107
|
+
var createMatrix = function (_a, fillSymbol) {
|
|
108
|
+
var h = _a.h, w = _a.w;
|
|
109
|
+
if (fillSymbol === void 0) { fillSymbol = 0; }
|
|
110
|
+
return createArray(h)
|
|
111
|
+
.map(function () { return createArray(w, fillSymbol); });
|
|
112
|
+
};
|
|
113
|
+
var gaussianElimination = function (matrix) {
|
|
114
|
+
var n = matrix.length;
|
|
115
|
+
var matrixClone = createMatrix(new DPoint(n + 1, n));
|
|
116
|
+
for (var i = 0; i < n; i++) {
|
|
117
|
+
for (var j = 0; j < n + 1; j++) {
|
|
118
|
+
matrix[i][j] = matrix[i][j] === 0 ? gaussianElimination.MIN : matrix[i][j];
|
|
119
|
+
matrixClone[i][j] = matrix[i][j];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (var k = 0; k < n; k++) {
|
|
123
|
+
for (var i = 0; i < n + 1; i++) {
|
|
124
|
+
matrixClone[k][i] /= matrix[k][k];
|
|
125
|
+
}
|
|
126
|
+
for (var i = k + 1; i < n; i++) {
|
|
127
|
+
var K = matrixClone[i][k] / matrixClone[k][k];
|
|
128
|
+
for (var j = 0; j < n + 1; j++) {
|
|
129
|
+
matrixClone[i][j] -= matrixClone[k][j] * K;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
for (var i = 0; i < n; i++) {
|
|
133
|
+
for (var j = 0; j < n + 1; j++) {
|
|
134
|
+
matrix[i][j] = matrixClone[i][j];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (var k = n - 1; k > -1; k--) {
|
|
139
|
+
for (var i = n; i > -1; i--) {
|
|
140
|
+
matrixClone[k][i] /= matrix[k][k];
|
|
141
|
+
}
|
|
142
|
+
for (var i = k - 1; i > -1; i--) {
|
|
143
|
+
var K = matrixClone[i][k] / matrixClone[k][k];
|
|
144
|
+
for (var j = n; j > -1; j--) {
|
|
145
|
+
matrixClone[i][j] -= matrixClone[k][j] * K;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
var answer = createArray(n);
|
|
150
|
+
for (var i = 0; i < n; i++) {
|
|
151
|
+
answer[i] = matrixClone[i][n];
|
|
152
|
+
}
|
|
153
|
+
return answer;
|
|
154
|
+
};
|
|
155
|
+
gaussianElimination.MIN = 1e-10;
|
|
156
|
+
var createCanvas = function (a, b, c) {
|
|
157
|
+
var _a;
|
|
158
|
+
var w = 0;
|
|
159
|
+
var h = 0;
|
|
160
|
+
var offscreen = false;
|
|
161
|
+
if (a instanceof DPoint) {
|
|
162
|
+
var x = a.x, y = a.y;
|
|
163
|
+
w = x;
|
|
164
|
+
h = y;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
w = a;
|
|
168
|
+
h = a;
|
|
169
|
+
}
|
|
170
|
+
if (typeof b === 'boolean') {
|
|
171
|
+
offscreen = b;
|
|
172
|
+
}
|
|
173
|
+
else if (typeof b === 'number') {
|
|
174
|
+
h = b;
|
|
175
|
+
}
|
|
176
|
+
if (typeof c === 'boolean') {
|
|
177
|
+
offscreen = c;
|
|
178
|
+
}
|
|
179
|
+
var canvas = offscreen ? new OffscreenCanvas(w, h) : ((_a = createCanvas.document) !== null && _a !== void 0 ? _a : document).createElement('canvas');
|
|
180
|
+
if (!offscreen) {
|
|
181
|
+
canvas.width = w;
|
|
182
|
+
canvas.height = h;
|
|
183
|
+
}
|
|
184
|
+
return [canvas, canvas.getContext('2d')];
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
var delta = 0.001;
|
|
188
|
+
var DNumbers = (function () {
|
|
189
|
+
function DNumbers() {
|
|
190
|
+
}
|
|
191
|
+
DNumbers.like = function (v, s, d) {
|
|
192
|
+
if (d === void 0) { d = delta; }
|
|
193
|
+
return Math.abs(v - s) < d;
|
|
194
|
+
};
|
|
195
|
+
DNumbers.likeZero = function (v) {
|
|
196
|
+
return DNumbers.like(v, 0);
|
|
197
|
+
};
|
|
198
|
+
DNumbers.like2PI = function (v) {
|
|
199
|
+
return DNumbers.like(DNumbers.rad2Deg(v), DOUBLE_PI_IN_DEGREE);
|
|
200
|
+
};
|
|
201
|
+
DNumbers.likePI = function (v) {
|
|
202
|
+
return DNumbers.like(DNumbers.rad2Deg(v), PI_IN_DEGREE);
|
|
203
|
+
};
|
|
204
|
+
DNumbers.rad2Deg = function (v) {
|
|
205
|
+
return v * DEGREE_TO_PI;
|
|
206
|
+
};
|
|
207
|
+
DNumbers.deg2Rad = function (v) {
|
|
208
|
+
return v * PI_TO_DEGREE;
|
|
209
|
+
};
|
|
210
|
+
return DNumbers;
|
|
211
|
+
}());
|
|
212
|
+
|
|
213
|
+
var DLine = (function () {
|
|
214
|
+
function DLine(a, b, c, begin, end) {
|
|
215
|
+
if (begin === void 0) { begin = DPoint.zero(); }
|
|
216
|
+
if (end === void 0) { end = DPoint.zero(); }
|
|
217
|
+
this.a = a;
|
|
218
|
+
this.b = b;
|
|
219
|
+
this.c = c;
|
|
220
|
+
this.begin = begin;
|
|
221
|
+
this.end = end;
|
|
222
|
+
}
|
|
223
|
+
DLine.prototype.clone = function () {
|
|
224
|
+
return new DLine(this.a, this.b, this.c, this.begin.clone(), this.end.clone());
|
|
225
|
+
};
|
|
226
|
+
DLine.prototype.findPerpendicular = function (p) {
|
|
227
|
+
checkFunction('findPerpendicular')
|
|
228
|
+
.checkArgument('this.begin')
|
|
229
|
+
.shouldBeMeters(this.begin)
|
|
230
|
+
.checkArgument('this.end')
|
|
231
|
+
.shouldBeMeters(this.end)
|
|
232
|
+
.checkArgument('p')
|
|
233
|
+
.shouldBeMeters(p);
|
|
234
|
+
return new DLine(-this.b, this.a, this.b * p.x - this.a * p.y);
|
|
235
|
+
};
|
|
236
|
+
DLine.prototype.perpendicularDistance = function (p) {
|
|
237
|
+
checkFunction('perpendicularDistance')
|
|
238
|
+
.checkArgument('this.begin')
|
|
239
|
+
.shouldBeMeters(this.begin)
|
|
240
|
+
.checkArgument('this.end')
|
|
241
|
+
.shouldBeMeters(this.end)
|
|
242
|
+
.checkArgument('p')
|
|
243
|
+
.shouldBeMeters(p);
|
|
244
|
+
var perpendicularLine = this.findPerpendicular(p);
|
|
245
|
+
var targetPoint = perpendicularLine.findPoint(this);
|
|
246
|
+
return targetPoint.distance(p);
|
|
247
|
+
};
|
|
248
|
+
DLine.prototype.intersection = function (l, d, includeOnly) {
|
|
249
|
+
if (d === void 0) { d = 0; }
|
|
250
|
+
if (includeOnly === void 0) { includeOnly = false; }
|
|
251
|
+
var p = this.findPoint(l);
|
|
252
|
+
if (p) {
|
|
253
|
+
if (includeOnly) {
|
|
254
|
+
return this.insideRange(p, d) && l.insideRange(p, d) ? p : null;
|
|
255
|
+
}
|
|
256
|
+
return this.inRange(p, d) && l.inRange(p, d) ? p : null;
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
};
|
|
260
|
+
DLine.prototype.intersectionWithCircle = function (circle) {
|
|
261
|
+
var center = circle.center, r = circle.r;
|
|
262
|
+
var per = this.findPerpendicular(center);
|
|
263
|
+
var t = this.findPoint(per);
|
|
264
|
+
var distance = t.distance(center);
|
|
265
|
+
if (this.begin.equal(center)) {
|
|
266
|
+
distance = 0;
|
|
267
|
+
}
|
|
268
|
+
if (this.end.equal(center)) {
|
|
269
|
+
distance = 0;
|
|
270
|
+
}
|
|
271
|
+
if (distance < r) {
|
|
272
|
+
var _a = this, a = _a.a, b = _a.b, c = _a.c;
|
|
273
|
+
if (this.isParallel) {
|
|
274
|
+
var ct = center.distance(t);
|
|
275
|
+
var move = Math.sqrt(r * r - ct * ct);
|
|
276
|
+
if (this.isParallelY) {
|
|
277
|
+
t.x = this.begin.x;
|
|
278
|
+
var r1_1 = t.clone().move(0, -move);
|
|
279
|
+
var r2_1 = t.clone().move(0, move);
|
|
280
|
+
return [r1_1, r2_1];
|
|
281
|
+
}
|
|
282
|
+
if (this.isParallelX) {
|
|
283
|
+
t.y = this.begin.y;
|
|
284
|
+
var r1_2 = t.clone().move(move, 0);
|
|
285
|
+
var r2_2 = t.clone().move(-move, 0);
|
|
286
|
+
return [r1_2, r2_2];
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (this.begin.like(center)) {
|
|
290
|
+
var p = this.begin.clone();
|
|
291
|
+
return [this.movePoint(p, r), this.movePoint(p, -r)];
|
|
292
|
+
}
|
|
293
|
+
if (this.end.like(center)) {
|
|
294
|
+
var p = this.end.clone();
|
|
295
|
+
return [this.movePoint(p, r), this.movePoint(p, -r)];
|
|
296
|
+
}
|
|
297
|
+
var s = a * a + b * b;
|
|
298
|
+
var d = r * r - c * c / s;
|
|
299
|
+
var mult = Math.sqrt(d / s);
|
|
300
|
+
var r1 = t.clone().move(b * mult, -a * mult);
|
|
301
|
+
var r2 = t.clone().move(-b * mult, a * mult);
|
|
302
|
+
return [r1, r2];
|
|
303
|
+
}
|
|
304
|
+
if (distance === r) {
|
|
305
|
+
return t;
|
|
306
|
+
}
|
|
307
|
+
return null;
|
|
308
|
+
};
|
|
309
|
+
DLine.prototype.inRange = function (p, d) {
|
|
310
|
+
if (d === void 0) { d = 0; }
|
|
311
|
+
var _a = this, minX = _a.minX, minY = _a.minY, maxX = _a.maxX, maxY = _a.maxY;
|
|
312
|
+
var x = p.x, y = p.y;
|
|
313
|
+
var isInX = x >= minX - d && x <= maxX + d;
|
|
314
|
+
var isInY = y >= minY - d && y <= maxY + d;
|
|
315
|
+
return isInX && isInY;
|
|
316
|
+
};
|
|
317
|
+
DLine.prototype.insideRange = function (p, d) {
|
|
318
|
+
if (d === void 0) { d = 0; }
|
|
319
|
+
var _a = this, begin = _a.begin, end = _a.end;
|
|
320
|
+
return this.inRange(p, d) && !begin.like(p, 0.00001) && !end.like(p, 0.00001);
|
|
321
|
+
};
|
|
322
|
+
Object.defineProperty(DLine.prototype, "center", {
|
|
323
|
+
get: function () {
|
|
324
|
+
return this.begin
|
|
325
|
+
.clone()
|
|
326
|
+
.setIfLessThan(this.end)
|
|
327
|
+
.move(this.end
|
|
328
|
+
.clone()
|
|
329
|
+
.move(this.begin
|
|
330
|
+
.clone()
|
|
331
|
+
.minus())
|
|
332
|
+
.abs()
|
|
333
|
+
.minus()
|
|
334
|
+
.divide(2));
|
|
335
|
+
},
|
|
336
|
+
enumerable: false,
|
|
337
|
+
configurable: true
|
|
338
|
+
});
|
|
339
|
+
Object.defineProperty(DLine.prototype, "minX", {
|
|
340
|
+
get: function () {
|
|
341
|
+
return Math.min(this.begin.x, this.end.x);
|
|
342
|
+
},
|
|
343
|
+
enumerable: false,
|
|
344
|
+
configurable: true
|
|
345
|
+
});
|
|
346
|
+
Object.defineProperty(DLine.prototype, "minY", {
|
|
347
|
+
get: function () {
|
|
348
|
+
return Math.min(this.begin.y, this.end.y);
|
|
349
|
+
},
|
|
350
|
+
enumerable: false,
|
|
351
|
+
configurable: true
|
|
352
|
+
});
|
|
353
|
+
Object.defineProperty(DLine.prototype, "maxX", {
|
|
354
|
+
get: function () {
|
|
355
|
+
return Math.max(this.begin.x, this.end.x);
|
|
356
|
+
},
|
|
357
|
+
enumerable: false,
|
|
358
|
+
configurable: true
|
|
359
|
+
});
|
|
360
|
+
Object.defineProperty(DLine.prototype, "maxY", {
|
|
361
|
+
get: function () {
|
|
362
|
+
return Math.max(this.begin.y, this.end.y);
|
|
363
|
+
},
|
|
364
|
+
enumerable: false,
|
|
365
|
+
configurable: true
|
|
366
|
+
});
|
|
367
|
+
DLine.prototype.toString = function () {
|
|
368
|
+
return "(" + this.a + ", " + this.b + ", " + this.c + ")";
|
|
369
|
+
};
|
|
370
|
+
DLine.prototype.getValue = function () {
|
|
371
|
+
return [this.a, this.b, this.c];
|
|
372
|
+
};
|
|
373
|
+
DLine.prototype.x = function (p) {
|
|
374
|
+
if (this.isParallelY) {
|
|
375
|
+
return new DPoint(-this.c / this.a, p.y);
|
|
376
|
+
}
|
|
377
|
+
if (this.isParallelX) {
|
|
378
|
+
return new DPoint(p.x, -this.c / this.b);
|
|
379
|
+
}
|
|
380
|
+
return new DPoint(-this.b / this.a * p.y - this.c / this.a, p.y);
|
|
381
|
+
};
|
|
382
|
+
DLine.prototype.y = function (p) {
|
|
383
|
+
if (this.isParallelY) {
|
|
384
|
+
return new DPoint(-this.c / this.a, p.y);
|
|
385
|
+
}
|
|
386
|
+
if (this.isParallelX) {
|
|
387
|
+
return new DPoint(p.x, -this.c / this.b);
|
|
388
|
+
}
|
|
389
|
+
return new DPoint(p.x, -this.a / this.b * p.x - this.c / this.b);
|
|
390
|
+
};
|
|
391
|
+
DLine.prototype.findPoint = function (l) {
|
|
392
|
+
if (this.isParallelY && l.isParallelY) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
if (this.isParallelX && l.isParallelX) {
|
|
396
|
+
return null;
|
|
397
|
+
}
|
|
398
|
+
if (this.isParallelX && l.isParallelY) {
|
|
399
|
+
return new DPoint(-l.c / l.a, -this.c / this.b);
|
|
400
|
+
}
|
|
401
|
+
if (this.isParallelY && l.isParallelX) {
|
|
402
|
+
return new DPoint(-this.c / this.a, -l.c / l.b);
|
|
403
|
+
}
|
|
404
|
+
if (this.isParallelY) {
|
|
405
|
+
var x = -this.c / this.a;
|
|
406
|
+
return l.y(new DPoint(x));
|
|
407
|
+
}
|
|
408
|
+
if (this.isParallelX) {
|
|
409
|
+
var y = -this.c / this.b;
|
|
410
|
+
return l.x(new DPoint(0, y));
|
|
411
|
+
}
|
|
412
|
+
if (l.isParallelY) {
|
|
413
|
+
var x = -l.c / l.a;
|
|
414
|
+
return this.y(new DPoint(x));
|
|
415
|
+
}
|
|
416
|
+
if (l.isParallelX) {
|
|
417
|
+
var y = -l.c / l.b;
|
|
418
|
+
return this.x(new DPoint(0, y));
|
|
419
|
+
}
|
|
420
|
+
var res = this.y(new DPoint((l.c / l.b - this.c / this.b) / (this.a / this.b - l.a / l.b)));
|
|
421
|
+
if (!isFinite(res.x) && !isFinite(res.y)) {
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
return res;
|
|
425
|
+
};
|
|
426
|
+
Object.defineProperty(DLine.prototype, "isParallel", {
|
|
427
|
+
get: function () {
|
|
428
|
+
return this.isParallelX || this.isParallelY;
|
|
429
|
+
},
|
|
430
|
+
enumerable: false,
|
|
431
|
+
configurable: true
|
|
432
|
+
});
|
|
433
|
+
Object.defineProperty(DLine.prototype, "isParallelY", {
|
|
434
|
+
get: function () {
|
|
435
|
+
return Math.abs(this.b) < 0.001;
|
|
436
|
+
},
|
|
437
|
+
enumerable: false,
|
|
438
|
+
configurable: true
|
|
439
|
+
});
|
|
440
|
+
Object.defineProperty(DLine.prototype, "isParallelX", {
|
|
441
|
+
get: function () {
|
|
442
|
+
return Math.abs(this.a) < 0.001;
|
|
443
|
+
},
|
|
444
|
+
enumerable: false,
|
|
445
|
+
configurable: true
|
|
446
|
+
});
|
|
447
|
+
Object.defineProperty(DLine.prototype, "points", {
|
|
448
|
+
get: function () {
|
|
449
|
+
return [this.begin, this.end];
|
|
450
|
+
},
|
|
451
|
+
enumerable: false,
|
|
452
|
+
configurable: true
|
|
453
|
+
});
|
|
454
|
+
DLine.prototype.getFi = function () {
|
|
455
|
+
checkFunction('getFi')
|
|
456
|
+
.checkArgument('this.begin')
|
|
457
|
+
.shouldBeMeters(this.begin)
|
|
458
|
+
.checkArgument('this.end')
|
|
459
|
+
.shouldBeMeters(this.end);
|
|
460
|
+
var _a = this.end.clone().move(this.begin.clone().minus()), x = _a.x, y = _a.y;
|
|
461
|
+
var v = Math.atan2(y, x) - Math.PI;
|
|
462
|
+
if (v > 0) {
|
|
463
|
+
v = Math.PI - v;
|
|
464
|
+
}
|
|
465
|
+
return (Math.PI - v) % (Math.PI * 2);
|
|
466
|
+
};
|
|
467
|
+
DLine.prototype.toWKT = function () {
|
|
468
|
+
var _a = this, _b = _a.begin, x1 = _b.x, y1 = _b.y, _c = _a.end, x2 = _c.x, y2 = _c.y;
|
|
469
|
+
return "LINESTRING (" + x1 + " " + y1 + ", " + x2 + " " + y2 + ")";
|
|
470
|
+
};
|
|
471
|
+
DLine.prototype.movePoint = function (p, d) {
|
|
472
|
+
var fi = this.findFi(new DLine(1, 0, 0));
|
|
473
|
+
var td = this.x(new DPoint(1, 1)).distance(this.x(new DPoint(2, 2))) / 2;
|
|
474
|
+
var sinCos = new DPoint(Math.sin(fi), Math.cos(fi));
|
|
475
|
+
var dt = sinCos.clone().scale(td);
|
|
476
|
+
var p1T = p.clone().move(dt.clone().minus());
|
|
477
|
+
var p2T = p.clone().move(dt);
|
|
478
|
+
if (DNumbers.like(this.y(p1T).y, p1T.y) || DNumbers.like(this.y(p2T).y, p2T.y)) {
|
|
479
|
+
return p.clone().move(sinCos.scale(d));
|
|
480
|
+
}
|
|
481
|
+
return p.clone().move(sinCos.scale(d).setX(function (_a) {
|
|
482
|
+
var x = _a.x;
|
|
483
|
+
return -x;
|
|
484
|
+
}));
|
|
485
|
+
};
|
|
486
|
+
DLine.prototype.findFi = function (_a, delta) {
|
|
487
|
+
var a = _a.a, b = _a.b;
|
|
488
|
+
if (delta === void 0) { delta = 1.0001; }
|
|
489
|
+
var _b = this, q = _b.a, w = _b.b;
|
|
490
|
+
var val = (q * a + w * b) / (Math.sqrt(q * q + w * w) * Math.sqrt(a * a + b * b));
|
|
491
|
+
if (val > 1 && val < delta) {
|
|
492
|
+
val = 1;
|
|
493
|
+
}
|
|
494
|
+
else if (val < -1 && val > -delta) {
|
|
495
|
+
val = -1;
|
|
496
|
+
}
|
|
497
|
+
return Math.acos(val);
|
|
498
|
+
};
|
|
499
|
+
DLine.prototype.vectorProduct = function (_a) {
|
|
500
|
+
var a = _a.a, b = _a.b, c = _a.c;
|
|
501
|
+
var _b = this, q = _b.a, w = _b.b, e = _b.c;
|
|
502
|
+
return new DLine(w * c - e * b, e * a - q * c, q * b - w * a);
|
|
503
|
+
};
|
|
504
|
+
return DLine;
|
|
505
|
+
}());
|
|
506
|
+
|
|
507
|
+
var LoopFunctions;
|
|
508
|
+
(function (LoopFunctions) {
|
|
509
|
+
LoopFunctions[LoopFunctions["getTileFromCoords"] = 0] = "getTileFromCoords";
|
|
510
|
+
LoopFunctions[LoopFunctions["getCoordsFromTile"] = 1] = "getCoordsFromTile";
|
|
511
|
+
LoopFunctions[LoopFunctions["height"] = 2] = "height";
|
|
512
|
+
LoopFunctions[LoopFunctions["setX"] = 3] = "setX";
|
|
513
|
+
LoopFunctions[LoopFunctions["setY"] = 4] = "setY";
|
|
514
|
+
LoopFunctions[LoopFunctions["setZ"] = 5] = "setZ";
|
|
515
|
+
LoopFunctions[LoopFunctions["rotate"] = 6] = "rotate";
|
|
516
|
+
LoopFunctions[LoopFunctions["rotate3dX"] = 7] = "rotate3dX";
|
|
517
|
+
LoopFunctions[LoopFunctions["rotate3dY"] = 8] = "rotate3dY";
|
|
518
|
+
LoopFunctions[LoopFunctions["rotate3dZ"] = 9] = "rotate3dZ";
|
|
519
|
+
LoopFunctions[LoopFunctions["move"] = 10] = "move";
|
|
520
|
+
LoopFunctions[LoopFunctions["round"] = 11] = "round";
|
|
521
|
+
LoopFunctions[LoopFunctions["ceil"] = 12] = "ceil";
|
|
522
|
+
LoopFunctions[LoopFunctions["floor"] = 13] = "floor";
|
|
523
|
+
LoopFunctions[LoopFunctions["toFixed"] = 14] = "toFixed";
|
|
524
|
+
LoopFunctions[LoopFunctions["abs"] = 15] = "abs";
|
|
525
|
+
LoopFunctions[LoopFunctions["scale"] = 16] = "scale";
|
|
526
|
+
LoopFunctions[LoopFunctions["divide"] = 17] = "divide";
|
|
527
|
+
LoopFunctions[LoopFunctions["degreeToRadians"] = 18] = "degreeToRadians";
|
|
528
|
+
LoopFunctions[LoopFunctions["radiansToDegrees"] = 19] = "radiansToDegrees";
|
|
529
|
+
LoopFunctions[LoopFunctions["radiansToMeters"] = 20] = "radiansToMeters";
|
|
530
|
+
LoopFunctions[LoopFunctions["metersToRadians"] = 21] = "metersToRadians";
|
|
531
|
+
LoopFunctions[LoopFunctions["hipPoint"] = 22] = "hipPoint";
|
|
532
|
+
LoopFunctions[LoopFunctions["xPoint"] = 23] = "xPoint";
|
|
533
|
+
LoopFunctions[LoopFunctions["yPoint"] = 24] = "yPoint";
|
|
534
|
+
LoopFunctions[LoopFunctions["wPoint"] = 25] = "wPoint";
|
|
535
|
+
LoopFunctions[LoopFunctions["hPoint"] = 26] = "hPoint";
|
|
536
|
+
LoopFunctions[LoopFunctions["setIfLessThan"] = 27] = "setIfLessThan";
|
|
537
|
+
LoopFunctions[LoopFunctions["minus"] = 28] = "minus";
|
|
538
|
+
LoopFunctions[LoopFunctions["degreeToMeters"] = 29] = "degreeToMeters";
|
|
539
|
+
LoopFunctions[LoopFunctions["metersToDegree"] = 30] = "metersToDegree";
|
|
540
|
+
LoopFunctions[LoopFunctions["flipVertically"] = 31] = "flipVertically";
|
|
541
|
+
})(LoopFunctions || (LoopFunctions = {}));
|
|
542
|
+
var decodePoolRecord = function (a, _a) {
|
|
543
|
+
var functionName = _a.functionName, pointArg = _a.pointArg, numberPointArg = _a.numberPointArg, numberArg = _a.numberArg, setterArg = _a.setterArg;
|
|
544
|
+
var res = a;
|
|
545
|
+
switch (functionName) {
|
|
546
|
+
case LoopFunctions.getTileFromCoords:
|
|
547
|
+
res = function (k) { return a(k)
|
|
548
|
+
.getTileFromCoords(numberArg); };
|
|
549
|
+
break;
|
|
550
|
+
case LoopFunctions.getCoordsFromTile:
|
|
551
|
+
res = function (k) { return a(k)
|
|
552
|
+
.getCoordsFromTile(numberArg); };
|
|
553
|
+
break;
|
|
554
|
+
case LoopFunctions.height:
|
|
555
|
+
res = function (k) { return a(k)
|
|
556
|
+
.height(numberArg); };
|
|
557
|
+
break;
|
|
558
|
+
case LoopFunctions.setX:
|
|
559
|
+
res = function (k) { return a(k)
|
|
560
|
+
.setX(setterArg); };
|
|
561
|
+
break;
|
|
562
|
+
case LoopFunctions.setY:
|
|
563
|
+
res = function (k) { return a(k)
|
|
564
|
+
.setY(setterArg); };
|
|
565
|
+
break;
|
|
566
|
+
case LoopFunctions.setZ:
|
|
567
|
+
res = function (k) { return a(k)
|
|
568
|
+
.setZ(setterArg); };
|
|
569
|
+
break;
|
|
570
|
+
case LoopFunctions.rotate:
|
|
571
|
+
res = function (k) { return a(k)
|
|
572
|
+
.rotate(numberArg); };
|
|
573
|
+
break;
|
|
574
|
+
case LoopFunctions.rotate3dX:
|
|
575
|
+
res = function (k) { return a(k)
|
|
576
|
+
.rotate3dX(numberArg); };
|
|
577
|
+
break;
|
|
578
|
+
case LoopFunctions.rotate3dY:
|
|
579
|
+
res = function (k) { return a(k)
|
|
580
|
+
.rotate3dY(numberArg); };
|
|
581
|
+
break;
|
|
582
|
+
case LoopFunctions.rotate3dZ:
|
|
583
|
+
res = function (k) { return a(k)
|
|
584
|
+
.rotate3dZ(numberArg); };
|
|
585
|
+
break;
|
|
586
|
+
case LoopFunctions.move:
|
|
587
|
+
res = function (k) { return a(k)
|
|
588
|
+
.move(numberPointArg, numberArg); };
|
|
589
|
+
break;
|
|
590
|
+
case LoopFunctions.round:
|
|
591
|
+
res = function (k) { return a(k)
|
|
592
|
+
.round(); };
|
|
593
|
+
break;
|
|
594
|
+
case LoopFunctions.ceil:
|
|
595
|
+
res = function (k) { return a(k)
|
|
596
|
+
.ceil(); };
|
|
597
|
+
break;
|
|
598
|
+
case LoopFunctions.floor:
|
|
599
|
+
res = function (k) { return a(k)
|
|
600
|
+
.floor(); };
|
|
601
|
+
break;
|
|
602
|
+
case LoopFunctions.toFixed:
|
|
603
|
+
res = function (k) { return a(k)
|
|
604
|
+
.toFixed(numberArg); };
|
|
605
|
+
break;
|
|
606
|
+
case LoopFunctions.abs:
|
|
607
|
+
res = function (k) { return a(k)
|
|
608
|
+
.abs(); };
|
|
609
|
+
break;
|
|
610
|
+
case LoopFunctions.scale:
|
|
611
|
+
res = function (k) { return a(k)
|
|
612
|
+
.scale(numberPointArg, numberArg); };
|
|
613
|
+
break;
|
|
614
|
+
case LoopFunctions.divide:
|
|
615
|
+
res = function (k) { return a(k)
|
|
616
|
+
.divide(numberPointArg, numberArg); };
|
|
617
|
+
break;
|
|
618
|
+
case LoopFunctions.degreeToRadians:
|
|
619
|
+
res = function (k) { return a(k)
|
|
620
|
+
.degreeToRadians(); };
|
|
621
|
+
break;
|
|
622
|
+
case LoopFunctions.radiansToDegrees:
|
|
623
|
+
res = function (k) { return a(k)
|
|
624
|
+
.radiansToDegrees(); };
|
|
625
|
+
break;
|
|
626
|
+
case LoopFunctions.radiansToMeters:
|
|
627
|
+
res = function (k) { return a(k)
|
|
628
|
+
.radiansToMeters(); };
|
|
629
|
+
break;
|
|
630
|
+
case LoopFunctions.metersToRadians:
|
|
631
|
+
res = function (k) { return a(k)
|
|
632
|
+
.metersToRadians(); };
|
|
633
|
+
break;
|
|
634
|
+
case LoopFunctions.hipPoint:
|
|
635
|
+
res = function (k) { return a(k)
|
|
636
|
+
.hipPoint; };
|
|
637
|
+
break;
|
|
638
|
+
case LoopFunctions.xPoint:
|
|
639
|
+
res = function (k) { return a(k)
|
|
640
|
+
.xPoint; };
|
|
641
|
+
break;
|
|
642
|
+
case LoopFunctions.yPoint:
|
|
643
|
+
res = function (k) { return a(k)
|
|
644
|
+
.yPoint; };
|
|
645
|
+
break;
|
|
646
|
+
case LoopFunctions.wPoint:
|
|
647
|
+
res = function (k) { return a(k)
|
|
648
|
+
.wPoint; };
|
|
649
|
+
break;
|
|
650
|
+
case LoopFunctions.hPoint:
|
|
651
|
+
res = function (k) { return a(k)
|
|
652
|
+
.hPoint; };
|
|
653
|
+
break;
|
|
654
|
+
case LoopFunctions.setIfLessThan:
|
|
655
|
+
res = function (k) { return a(k)
|
|
656
|
+
.setIfLessThan(pointArg); };
|
|
657
|
+
break;
|
|
658
|
+
case LoopFunctions.minus:
|
|
659
|
+
res = function (k) { return a(k)
|
|
660
|
+
.minus(); };
|
|
661
|
+
break;
|
|
662
|
+
case LoopFunctions.degreeToMeters:
|
|
663
|
+
res = function (k) { return a(k)
|
|
664
|
+
.degreeToMeters(); };
|
|
665
|
+
break;
|
|
666
|
+
case LoopFunctions.metersToDegree:
|
|
667
|
+
res = function (k) { return a(k)
|
|
668
|
+
.metersToDegree(); };
|
|
669
|
+
break;
|
|
670
|
+
case LoopFunctions.flipVertically:
|
|
671
|
+
res = function (k) { return a(k)
|
|
672
|
+
.flipVertically(numberPointArg); };
|
|
673
|
+
break;
|
|
674
|
+
}
|
|
675
|
+
return res;
|
|
676
|
+
};
|
|
677
|
+
var DPolygonLoop = (function () {
|
|
678
|
+
function DPolygonLoop(parent) {
|
|
679
|
+
this.parent = parent;
|
|
680
|
+
this.pool = [];
|
|
681
|
+
}
|
|
682
|
+
DPolygonLoop.prototype.getLoopFunction = function () {
|
|
683
|
+
return this.pool.reduce(decodePoolRecord, function (k) { return k; });
|
|
684
|
+
};
|
|
685
|
+
DPolygonLoop.prototype.run = function () {
|
|
686
|
+
return this.parent.map(this.getLoopFunction());
|
|
687
|
+
};
|
|
688
|
+
DPolygonLoop.prototype.getTileFromCoords = function (zoom) {
|
|
689
|
+
this.pool.push({
|
|
690
|
+
functionName: LoopFunctions.getTileFromCoords,
|
|
691
|
+
numberArg: zoom
|
|
692
|
+
});
|
|
693
|
+
return this;
|
|
694
|
+
};
|
|
695
|
+
DPolygonLoop.prototype.getCoordsFromTile = function (zoom) {
|
|
696
|
+
this.pool.push({
|
|
697
|
+
functionName: LoopFunctions.getCoordsFromTile,
|
|
698
|
+
numberArg: zoom
|
|
699
|
+
});
|
|
700
|
+
return this;
|
|
701
|
+
};
|
|
702
|
+
DPolygonLoop.prototype.height = function (z) {
|
|
703
|
+
this.pool.push({
|
|
704
|
+
functionName: LoopFunctions.height,
|
|
705
|
+
numberArg: z
|
|
706
|
+
});
|
|
707
|
+
return this;
|
|
708
|
+
};
|
|
709
|
+
DPolygonLoop.prototype.setX = function (x) {
|
|
710
|
+
this.pool.push({
|
|
711
|
+
functionName: LoopFunctions.setX,
|
|
712
|
+
setterArg: x
|
|
713
|
+
});
|
|
714
|
+
return this;
|
|
715
|
+
};
|
|
716
|
+
DPolygonLoop.prototype.setY = function (y) {
|
|
717
|
+
this.pool.push({
|
|
718
|
+
functionName: LoopFunctions.setY,
|
|
719
|
+
setterArg: y
|
|
720
|
+
});
|
|
721
|
+
return this;
|
|
722
|
+
};
|
|
723
|
+
DPolygonLoop.prototype.setZ = function (z) {
|
|
724
|
+
this.pool.push({
|
|
725
|
+
functionName: LoopFunctions.setZ,
|
|
726
|
+
setterArg: z
|
|
727
|
+
});
|
|
728
|
+
return this;
|
|
729
|
+
};
|
|
730
|
+
DPolygonLoop.prototype.rotate = function (a) {
|
|
731
|
+
this.pool.push({
|
|
732
|
+
functionName: LoopFunctions.rotate,
|
|
733
|
+
numberArg: a
|
|
734
|
+
});
|
|
735
|
+
return this;
|
|
736
|
+
};
|
|
737
|
+
DPolygonLoop.prototype.rotate3dX = function (a) {
|
|
738
|
+
this.pool.push({
|
|
739
|
+
functionName: LoopFunctions.rotate3dX,
|
|
740
|
+
numberArg: a
|
|
741
|
+
});
|
|
742
|
+
return this;
|
|
743
|
+
};
|
|
744
|
+
DPolygonLoop.prototype.rotate3dY = function (a) {
|
|
745
|
+
this.pool.push({
|
|
746
|
+
functionName: LoopFunctions.rotate3dY,
|
|
747
|
+
numberArg: a
|
|
748
|
+
});
|
|
749
|
+
return this;
|
|
750
|
+
};
|
|
751
|
+
DPolygonLoop.prototype.rotate3dZ = function (a) {
|
|
752
|
+
this.pool.push({
|
|
753
|
+
functionName: LoopFunctions.rotate3dZ,
|
|
754
|
+
numberArg: a
|
|
755
|
+
});
|
|
756
|
+
return this;
|
|
757
|
+
};
|
|
758
|
+
DPolygonLoop.prototype.move = function (x, y) {
|
|
759
|
+
if (y === void 0) { y = x; }
|
|
760
|
+
this.pool.push({
|
|
761
|
+
functionName: LoopFunctions.move,
|
|
762
|
+
numberPointArg: x,
|
|
763
|
+
numberArg: y
|
|
764
|
+
});
|
|
765
|
+
return this;
|
|
766
|
+
};
|
|
767
|
+
DPolygonLoop.prototype.round = function () {
|
|
768
|
+
this.pool.push({
|
|
769
|
+
functionName: LoopFunctions.round
|
|
770
|
+
});
|
|
771
|
+
return this;
|
|
772
|
+
};
|
|
773
|
+
DPolygonLoop.prototype.ceil = function () {
|
|
774
|
+
this.pool.push({
|
|
775
|
+
functionName: LoopFunctions.ceil
|
|
776
|
+
});
|
|
777
|
+
return this;
|
|
778
|
+
};
|
|
779
|
+
DPolygonLoop.prototype.floor = function () {
|
|
780
|
+
this.pool.push({
|
|
781
|
+
functionName: LoopFunctions.floor
|
|
782
|
+
});
|
|
783
|
+
return this;
|
|
784
|
+
};
|
|
785
|
+
DPolygonLoop.prototype.toFixed = function (n) {
|
|
786
|
+
if (n === void 0) { n = 2; }
|
|
787
|
+
this.pool.push({
|
|
788
|
+
functionName: LoopFunctions.toFixed,
|
|
789
|
+
numberArg: n
|
|
790
|
+
});
|
|
791
|
+
return this;
|
|
792
|
+
};
|
|
793
|
+
DPolygonLoop.prototype.abs = function () {
|
|
794
|
+
this.pool.push({
|
|
795
|
+
functionName: LoopFunctions.abs
|
|
796
|
+
});
|
|
797
|
+
return this;
|
|
798
|
+
};
|
|
799
|
+
DPolygonLoop.prototype.scale = function (x, y) {
|
|
800
|
+
if (y === void 0) { y = x; }
|
|
801
|
+
this.pool.push({
|
|
802
|
+
functionName: LoopFunctions.scale,
|
|
803
|
+
numberPointArg: x,
|
|
804
|
+
numberArg: y
|
|
805
|
+
});
|
|
806
|
+
return this;
|
|
807
|
+
};
|
|
808
|
+
DPolygonLoop.prototype.divide = function (x, y) {
|
|
809
|
+
this.pool.push({
|
|
810
|
+
functionName: LoopFunctions.divide,
|
|
811
|
+
numberPointArg: x,
|
|
812
|
+
numberArg: y
|
|
813
|
+
});
|
|
814
|
+
return this;
|
|
815
|
+
};
|
|
816
|
+
DPolygonLoop.prototype.degreeToRadians = function () {
|
|
817
|
+
this.pool.push({
|
|
818
|
+
functionName: LoopFunctions.degreeToRadians
|
|
819
|
+
});
|
|
820
|
+
return this;
|
|
821
|
+
};
|
|
822
|
+
DPolygonLoop.prototype.radiansToDegrees = function () {
|
|
823
|
+
this.pool.push({
|
|
824
|
+
functionName: LoopFunctions.radiansToDegrees
|
|
825
|
+
});
|
|
826
|
+
return this;
|
|
827
|
+
};
|
|
828
|
+
DPolygonLoop.prototype.radiansToMeters = function () {
|
|
829
|
+
this.pool.push({
|
|
830
|
+
functionName: LoopFunctions.radiansToMeters
|
|
831
|
+
});
|
|
832
|
+
return this;
|
|
833
|
+
};
|
|
834
|
+
DPolygonLoop.prototype.metersToRadians = function () {
|
|
835
|
+
this.pool.push({
|
|
836
|
+
functionName: LoopFunctions.metersToRadians
|
|
837
|
+
});
|
|
838
|
+
return this;
|
|
839
|
+
};
|
|
840
|
+
DPolygonLoop.prototype.getHipPoint = function () {
|
|
841
|
+
this.pool.push({
|
|
842
|
+
functionName: LoopFunctions.hipPoint
|
|
843
|
+
});
|
|
844
|
+
return this;
|
|
845
|
+
};
|
|
846
|
+
DPolygonLoop.prototype.getXPoint = function () {
|
|
847
|
+
this.pool.push({
|
|
848
|
+
functionName: LoopFunctions.xPoint
|
|
849
|
+
});
|
|
850
|
+
return this;
|
|
851
|
+
};
|
|
852
|
+
DPolygonLoop.prototype.getYPoint = function () {
|
|
853
|
+
this.pool.push({
|
|
854
|
+
functionName: LoopFunctions.yPoint
|
|
855
|
+
});
|
|
856
|
+
return this;
|
|
857
|
+
};
|
|
858
|
+
DPolygonLoop.prototype.getWPoint = function () {
|
|
859
|
+
this.pool.push({
|
|
860
|
+
functionName: LoopFunctions.wPoint
|
|
861
|
+
});
|
|
862
|
+
return this;
|
|
863
|
+
};
|
|
864
|
+
DPolygonLoop.prototype.getHPoint = function () {
|
|
865
|
+
this.pool.push({
|
|
866
|
+
functionName: LoopFunctions.hPoint
|
|
867
|
+
});
|
|
868
|
+
return this;
|
|
869
|
+
};
|
|
870
|
+
DPolygonLoop.prototype.setIfLessThan = function (p) {
|
|
871
|
+
this.pool.push({
|
|
872
|
+
functionName: LoopFunctions.setIfLessThan,
|
|
873
|
+
pointArg: p
|
|
874
|
+
});
|
|
875
|
+
return this;
|
|
876
|
+
};
|
|
877
|
+
DPolygonLoop.prototype.minus = function () {
|
|
878
|
+
this.pool.push({
|
|
879
|
+
functionName: LoopFunctions.minus
|
|
880
|
+
});
|
|
881
|
+
return this;
|
|
882
|
+
};
|
|
883
|
+
DPolygonLoop.prototype.degreeToMeters = function () {
|
|
884
|
+
this.pool.push({
|
|
885
|
+
functionName: LoopFunctions.degreeToMeters
|
|
886
|
+
});
|
|
887
|
+
return this;
|
|
888
|
+
};
|
|
889
|
+
DPolygonLoop.prototype.metersToDegree = function () {
|
|
890
|
+
this.pool.push({
|
|
891
|
+
functionName: LoopFunctions.metersToDegree
|
|
892
|
+
});
|
|
893
|
+
return this;
|
|
894
|
+
};
|
|
895
|
+
DPolygonLoop.prototype.flipVertically = function (size) {
|
|
896
|
+
this.pool.push({
|
|
897
|
+
functionName: LoopFunctions.flipVertically,
|
|
898
|
+
numberPointArg: size
|
|
899
|
+
});
|
|
900
|
+
return this;
|
|
901
|
+
};
|
|
902
|
+
return DPolygonLoop;
|
|
903
|
+
}());
|
|
904
|
+
|
|
905
|
+
var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
|
|
906
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
907
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
908
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
909
|
+
function step(op) {
|
|
910
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
911
|
+
while (_) try {
|
|
912
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
913
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
914
|
+
switch (op[0]) {
|
|
915
|
+
case 0: case 1: t = op; break;
|
|
916
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
917
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
918
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
919
|
+
default:
|
|
920
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
921
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
922
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
923
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
924
|
+
if (t[2]) _.ops.pop();
|
|
925
|
+
_.trys.pop(); continue;
|
|
926
|
+
}
|
|
927
|
+
op = body.call(thisArg, _);
|
|
928
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
929
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
930
|
+
}
|
|
931
|
+
};
|
|
932
|
+
var __values$2 = (undefined && undefined.__values) || function(o) {
|
|
933
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
934
|
+
if (m) return m.call(o);
|
|
935
|
+
if (o && typeof o.length === "number") return {
|
|
936
|
+
next: function () {
|
|
937
|
+
if (o && i >= o.length) o = void 0;
|
|
938
|
+
return { value: o && o[i++], done: !o };
|
|
939
|
+
}
|
|
940
|
+
};
|
|
941
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
942
|
+
};
|
|
943
|
+
var __read$3 = (undefined && undefined.__read) || function (o, n) {
|
|
944
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
945
|
+
if (!m) return o;
|
|
946
|
+
var i = m.call(o), r, ar = [], e;
|
|
947
|
+
try {
|
|
948
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
949
|
+
}
|
|
950
|
+
catch (error) { e = { error: error }; }
|
|
951
|
+
finally {
|
|
952
|
+
try {
|
|
953
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
954
|
+
}
|
|
955
|
+
finally { if (e) throw e.error; }
|
|
956
|
+
}
|
|
957
|
+
return ar;
|
|
958
|
+
};
|
|
959
|
+
var __spreadArray$1 = (undefined && undefined.__spreadArray) || function (to, from, pack) {
|
|
960
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
961
|
+
if (ar || !(i in from)) {
|
|
962
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
963
|
+
ar[i] = from[i];
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
967
|
+
};
|
|
968
|
+
var _a = jsts.operation.buffer.BufferParameters, CAP_ROUND = _a.CAP_ROUND, CAP_FLAT = _a.CAP_FLAT, CAP_SQUARE = _a.CAP_SQUARE;
|
|
969
|
+
var MIN_POINTS_IN_VALID_POLYGON = 3;
|
|
970
|
+
var APPROXIMATION_VALUE = 0.1;
|
|
971
|
+
var MAX_CONVEX_ITERATIONS = 100;
|
|
972
|
+
var CLOSE_TO_INTERSECTION_DISTANCE = 0.001;
|
|
973
|
+
var containCalculator = function (poly, p) {
|
|
974
|
+
var e_1, _a, e_2, _b;
|
|
975
|
+
var hasSamePoint = poly.points.some(function (point) { return point.equal(p); });
|
|
976
|
+
if (hasSamePoint) {
|
|
977
|
+
return true;
|
|
978
|
+
}
|
|
979
|
+
try {
|
|
980
|
+
for (var _c = __values$2(poly.loopPointsGenerator(true)()), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
981
|
+
var _e = __read$3(_d.value, 3), polygonLine = _e[2];
|
|
982
|
+
var onBorder = polygonLine.x(p).equal(p) && polygonLine.inRange(p);
|
|
983
|
+
if (onBorder) {
|
|
984
|
+
return true;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
989
|
+
finally {
|
|
990
|
+
try {
|
|
991
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
992
|
+
}
|
|
993
|
+
finally { if (e_1) throw e_1.error; }
|
|
994
|
+
}
|
|
995
|
+
var totalFi = 0;
|
|
996
|
+
try {
|
|
997
|
+
for (var _f = __values$2(poly.loopPointsGenerator()()), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
998
|
+
var _h = __read$3(_g.value, 2), _j = _h[0], x = _j.x, y = _j.y, _k = _h[1], a = _k.x, b = _k.y;
|
|
999
|
+
var line1 = new DLine(x - p.x, y - p.y, 0);
|
|
1000
|
+
var line2 = new DLine(a - p.x, b - p.y, 0);
|
|
1001
|
+
var fiDif = line1.findFi(line2);
|
|
1002
|
+
if (line1.vectorProduct(line2).c > 0) {
|
|
1003
|
+
totalFi += fiDif;
|
|
1004
|
+
}
|
|
1005
|
+
else {
|
|
1006
|
+
totalFi -= fiDif;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
1011
|
+
finally {
|
|
1012
|
+
try {
|
|
1013
|
+
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
1014
|
+
}
|
|
1015
|
+
finally { if (e_2) throw e_2.error; }
|
|
1016
|
+
}
|
|
1017
|
+
var eps = Math.PI / 10000;
|
|
1018
|
+
var result = false;
|
|
1019
|
+
var absTotalFi = Math.abs(totalFi);
|
|
1020
|
+
if (absTotalFi < eps) {
|
|
1021
|
+
result = false;
|
|
1022
|
+
}
|
|
1023
|
+
else if (Math.abs(2 * Math.PI - absTotalFi) < eps) {
|
|
1024
|
+
result = true;
|
|
1025
|
+
}
|
|
1026
|
+
else {
|
|
1027
|
+
throw new Error('contains2 faild');
|
|
1028
|
+
}
|
|
1029
|
+
return result;
|
|
1030
|
+
};
|
|
1031
|
+
var DPolygon = (function () {
|
|
1032
|
+
function DPolygon(pPoints) {
|
|
1033
|
+
if (pPoints === void 0) { pPoints = []; }
|
|
1034
|
+
this.pPoints = pPoints;
|
|
1035
|
+
this.properties = {};
|
|
1036
|
+
this.holes = [];
|
|
1037
|
+
this.searchStore = {};
|
|
1038
|
+
}
|
|
1039
|
+
DPolygon.arrayOfTrianglesToVertices = function (triangles, height) {
|
|
1040
|
+
return triangles.map(function (v) { return (isDefAndNotNull(height) ? v
|
|
1041
|
+
.loop()
|
|
1042
|
+
.height(height)
|
|
1043
|
+
.run() : v)
|
|
1044
|
+
.toArrayOfCoords(); })
|
|
1045
|
+
.flat(2);
|
|
1046
|
+
};
|
|
1047
|
+
DPolygon.minAreaRectangleSize = function (poly) {
|
|
1048
|
+
var _a = poly.clone().open(), first = _a.first, second = _a.second, last = _a.last;
|
|
1049
|
+
return new DPoint(first.distance(second), first.distance(last));
|
|
1050
|
+
};
|
|
1051
|
+
DPolygon.toDash = function (poly) {
|
|
1052
|
+
var e_3, _a;
|
|
1053
|
+
var p = new DPolygon();
|
|
1054
|
+
var result = [p];
|
|
1055
|
+
var trigger = true;
|
|
1056
|
+
try {
|
|
1057
|
+
for (var _b = __values$2(poly.points), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1058
|
+
var point = _c.value;
|
|
1059
|
+
if (trigger) {
|
|
1060
|
+
p.push(point.clone());
|
|
1061
|
+
}
|
|
1062
|
+
if (point.properties.pieceBorder) {
|
|
1063
|
+
trigger = !trigger;
|
|
1064
|
+
if (trigger) {
|
|
1065
|
+
p = new DPolygon();
|
|
1066
|
+
result.push(p);
|
|
1067
|
+
p.push(point.clone());
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
1073
|
+
finally {
|
|
1074
|
+
try {
|
|
1075
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1076
|
+
}
|
|
1077
|
+
finally { if (e_3) throw e_3.error; }
|
|
1078
|
+
}
|
|
1079
|
+
return result;
|
|
1080
|
+
};
|
|
1081
|
+
DPolygon.minAreaRectangleDirection = function (poly) {
|
|
1082
|
+
var _a = poly.clone().open(), first = _a.first, second = _a.second, last = _a.last;
|
|
1083
|
+
if (!first || !second || !last) {
|
|
1084
|
+
return 0;
|
|
1085
|
+
}
|
|
1086
|
+
if (first.distance(second) > first.distance(last)) {
|
|
1087
|
+
return first.findLine(second).getFi();
|
|
1088
|
+
}
|
|
1089
|
+
return first.findLine(last).getFi();
|
|
1090
|
+
};
|
|
1091
|
+
DPolygon.parseFromWKT = function (wkt) {
|
|
1092
|
+
var data = wkt.trim().toUpperCase();
|
|
1093
|
+
var res = new DPolygon();
|
|
1094
|
+
if (data.indexOf('POLYGON') === 0) {
|
|
1095
|
+
var regexp = /POLYGON \(\((?<data>(?:(?!\)\)$).)*?)\)\)$/miu;
|
|
1096
|
+
var reg = regexp.exec(data);
|
|
1097
|
+
var _a = __read$3(reg.groups.data
|
|
1098
|
+
.split('), (')
|
|
1099
|
+
.map(function (p) { return new DPolygon(p.split(', ')
|
|
1100
|
+
.map(function (pares) { return DPoint.parse(pares.split(' ').map(Number)); })); })), path = _a[0], holes = _a.slice(1);
|
|
1101
|
+
if (holes && holes.length) {
|
|
1102
|
+
path.holes = holes;
|
|
1103
|
+
}
|
|
1104
|
+
res = path;
|
|
1105
|
+
}
|
|
1106
|
+
if (data.indexOf('LINESTRING') === 0) {
|
|
1107
|
+
var regexp = /LINESTRING \((?<data>(?:(?!\)$).)*?)\)$/miu;
|
|
1108
|
+
var reg = regexp.exec(data);
|
|
1109
|
+
res = new DPolygon(reg.groups.data
|
|
1110
|
+
.split(', ').map(function (t) { return DPoint.parse(t.split(' ').map(Number)); }));
|
|
1111
|
+
}
|
|
1112
|
+
if (data.indexOf('POINT') === 0) {
|
|
1113
|
+
res = new DPolygon([DPoint.parseFromWKT(data)]);
|
|
1114
|
+
}
|
|
1115
|
+
return res;
|
|
1116
|
+
};
|
|
1117
|
+
DPolygon.createSquareBySize = function (size) {
|
|
1118
|
+
return new DPolygon([DPoint.zero(), size.clone().setX(0), size.clone(), size.clone().setY(0)]).close();
|
|
1119
|
+
};
|
|
1120
|
+
DPolygon.prototype.loop = function () {
|
|
1121
|
+
return new DPolygonLoop(this);
|
|
1122
|
+
};
|
|
1123
|
+
Object.defineProperty(DPolygon.prototype, "points", {
|
|
1124
|
+
get: function () {
|
|
1125
|
+
return this.pPoints;
|
|
1126
|
+
},
|
|
1127
|
+
set: function (p) {
|
|
1128
|
+
this.pPoints = p;
|
|
1129
|
+
},
|
|
1130
|
+
enumerable: false,
|
|
1131
|
+
configurable: true
|
|
1132
|
+
});
|
|
1133
|
+
Object.defineProperty(DPolygon.prototype, "maxX", {
|
|
1134
|
+
get: function () {
|
|
1135
|
+
return this.reduce(function (a, r) { return Math.max(a, r.x); }, -Infinity);
|
|
1136
|
+
},
|
|
1137
|
+
enumerable: false,
|
|
1138
|
+
configurable: true
|
|
1139
|
+
});
|
|
1140
|
+
Object.defineProperty(DPolygon.prototype, "minX", {
|
|
1141
|
+
get: function () {
|
|
1142
|
+
return this.reduce(function (a, r) { return Math.min(a, r.x); }, Infinity);
|
|
1143
|
+
},
|
|
1144
|
+
enumerable: false,
|
|
1145
|
+
configurable: true
|
|
1146
|
+
});
|
|
1147
|
+
Object.defineProperty(DPolygon.prototype, "maxY", {
|
|
1148
|
+
get: function () {
|
|
1149
|
+
return this.reduce(function (a, r) { return Math.max(a, r.y); }, -Infinity);
|
|
1150
|
+
},
|
|
1151
|
+
enumerable: false,
|
|
1152
|
+
configurable: true
|
|
1153
|
+
});
|
|
1154
|
+
Object.defineProperty(DPolygon.prototype, "minY", {
|
|
1155
|
+
get: function () {
|
|
1156
|
+
return this.reduce(function (a, r) { return Math.min(a, r.y); }, Infinity);
|
|
1157
|
+
},
|
|
1158
|
+
enumerable: false,
|
|
1159
|
+
configurable: true
|
|
1160
|
+
});
|
|
1161
|
+
Object.defineProperty(DPolygon.prototype, "center", {
|
|
1162
|
+
get: function () {
|
|
1163
|
+
return this.leftTop.move(this.size.divide(2));
|
|
1164
|
+
},
|
|
1165
|
+
enumerable: false,
|
|
1166
|
+
configurable: true
|
|
1167
|
+
});
|
|
1168
|
+
Object.defineProperty(DPolygon.prototype, "h", {
|
|
1169
|
+
get: function () {
|
|
1170
|
+
return this.maxY - this.minY;
|
|
1171
|
+
},
|
|
1172
|
+
enumerable: false,
|
|
1173
|
+
configurable: true
|
|
1174
|
+
});
|
|
1175
|
+
Object.defineProperty(DPolygon.prototype, "w", {
|
|
1176
|
+
get: function () {
|
|
1177
|
+
return this.maxX - this.minX;
|
|
1178
|
+
},
|
|
1179
|
+
enumerable: false,
|
|
1180
|
+
configurable: true
|
|
1181
|
+
});
|
|
1182
|
+
Object.defineProperty(DPolygon.prototype, "dY", {
|
|
1183
|
+
get: function () {
|
|
1184
|
+
return this.h;
|
|
1185
|
+
},
|
|
1186
|
+
enumerable: false,
|
|
1187
|
+
configurable: true
|
|
1188
|
+
});
|
|
1189
|
+
Object.defineProperty(DPolygon.prototype, "dX", {
|
|
1190
|
+
get: function () {
|
|
1191
|
+
return this.w;
|
|
1192
|
+
},
|
|
1193
|
+
enumerable: false,
|
|
1194
|
+
configurable: true
|
|
1195
|
+
});
|
|
1196
|
+
Object.defineProperty(DPolygon.prototype, "extend", {
|
|
1197
|
+
get: function () {
|
|
1198
|
+
var _a = this, minX = _a.minX, minY = _a.minY, maxX = _a.maxX, maxY = _a.maxY;
|
|
1199
|
+
return new DPolygon([
|
|
1200
|
+
new DPoint(minX, minY),
|
|
1201
|
+
new DPoint(maxX, minY),
|
|
1202
|
+
new DPoint(maxX, maxY),
|
|
1203
|
+
new DPoint(minX, maxY),
|
|
1204
|
+
new DPoint(minX, minY)
|
|
1205
|
+
]);
|
|
1206
|
+
},
|
|
1207
|
+
enumerable: false,
|
|
1208
|
+
configurable: true
|
|
1209
|
+
});
|
|
1210
|
+
Object.defineProperty(DPolygon.prototype, "size", {
|
|
1211
|
+
get: function () {
|
|
1212
|
+
var _a = this, w = _a.w, h = _a.h;
|
|
1213
|
+
return new DPoint(w, h);
|
|
1214
|
+
},
|
|
1215
|
+
enumerable: false,
|
|
1216
|
+
configurable: true
|
|
1217
|
+
});
|
|
1218
|
+
Object.defineProperty(DPolygon.prototype, "leftTop", {
|
|
1219
|
+
get: function () {
|
|
1220
|
+
var _a = this, minX = _a.minX, minY = _a.minY;
|
|
1221
|
+
return new DPoint(minX, minY);
|
|
1222
|
+
},
|
|
1223
|
+
enumerable: false,
|
|
1224
|
+
configurable: true
|
|
1225
|
+
});
|
|
1226
|
+
Object.defineProperty(DPolygon.prototype, "rightBottom", {
|
|
1227
|
+
get: function () {
|
|
1228
|
+
var _a = this, maxX = _a.maxX, maxY = _a.maxY;
|
|
1229
|
+
return new DPoint(maxX, maxY);
|
|
1230
|
+
},
|
|
1231
|
+
enumerable: false,
|
|
1232
|
+
configurable: true
|
|
1233
|
+
});
|
|
1234
|
+
Object.defineProperty(DPolygon.prototype, "length", {
|
|
1235
|
+
get: function () {
|
|
1236
|
+
return this.pPoints.length;
|
|
1237
|
+
},
|
|
1238
|
+
enumerable: false,
|
|
1239
|
+
configurable: true
|
|
1240
|
+
});
|
|
1241
|
+
Object.defineProperty(DPolygon.prototype, "fullLength", {
|
|
1242
|
+
get: function () {
|
|
1243
|
+
return this.clone().open().perimeter;
|
|
1244
|
+
},
|
|
1245
|
+
enumerable: false,
|
|
1246
|
+
configurable: true
|
|
1247
|
+
});
|
|
1248
|
+
Object.defineProperty(DPolygon.prototype, "perimeter", {
|
|
1249
|
+
get: function () {
|
|
1250
|
+
var e_4, _a;
|
|
1251
|
+
var p = 0;
|
|
1252
|
+
try {
|
|
1253
|
+
for (var _b = __values$2(this.loopPointsGenerator()()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1254
|
+
var _d = __read$3(_c.value, 2), p1 = _d[0], p2 = _d[1];
|
|
1255
|
+
p += p1.distance(p2);
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
1259
|
+
finally {
|
|
1260
|
+
try {
|
|
1261
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1262
|
+
}
|
|
1263
|
+
finally { if (e_4) throw e_4.error; }
|
|
1264
|
+
}
|
|
1265
|
+
return p;
|
|
1266
|
+
},
|
|
1267
|
+
enumerable: false,
|
|
1268
|
+
configurable: true
|
|
1269
|
+
});
|
|
1270
|
+
Object.defineProperty(DPolygon.prototype, "area", {
|
|
1271
|
+
get: function () {
|
|
1272
|
+
var e_5, _a;
|
|
1273
|
+
var sum = 0;
|
|
1274
|
+
try {
|
|
1275
|
+
for (var _b = __values$2(this.deintersection.loopPointsGenerator()()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1276
|
+
var _d = __read$3(_c.value, 2), _e = _d[0], x = _e.x, y = _e.y, _f = _d[1], a = _f.x, b = _f.y;
|
|
1277
|
+
sum += x * b - y * a;
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
1281
|
+
finally {
|
|
1282
|
+
try {
|
|
1283
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1284
|
+
}
|
|
1285
|
+
finally { if (e_5) throw e_5.error; }
|
|
1286
|
+
}
|
|
1287
|
+
return Math.abs(sum / 2) - this.holes.reduce(function (a, hole) { return a + hole.area; }, 0);
|
|
1288
|
+
},
|
|
1289
|
+
enumerable: false,
|
|
1290
|
+
configurable: true
|
|
1291
|
+
});
|
|
1292
|
+
Object.defineProperty(DPolygon.prototype, "deintersection", {
|
|
1293
|
+
get: function () {
|
|
1294
|
+
var e_6, _a;
|
|
1295
|
+
var p = this.clone().close();
|
|
1296
|
+
var store = {};
|
|
1297
|
+
for (var i = 0; i < p.length - 1; i++) {
|
|
1298
|
+
var k = p.at(i).toString();
|
|
1299
|
+
store[k] = store[k] || [];
|
|
1300
|
+
store[k].push(i);
|
|
1301
|
+
var _loop_1 = function (j) {
|
|
1302
|
+
var firstLine = p.at(i).findLine(p.at(i + 1));
|
|
1303
|
+
var secondLine = p.at(j).findLine(p.at(j + 1));
|
|
1304
|
+
var intersectionPoint = firstLine.intersection(secondLine);
|
|
1305
|
+
if (intersectionPoint &&
|
|
1306
|
+
!__spreadArray$1(__spreadArray$1([], __read$3(firstLine.points), false), __read$3(secondLine.points), false).some(function (t) { return t.like(intersectionPoint); })) {
|
|
1307
|
+
var part = p.removePart(i, j - i).reverse();
|
|
1308
|
+
p.insertAfter.apply(p, __spreadArray$1([i], __read$3(part), false));
|
|
1309
|
+
p.insertAfter(j, intersectionPoint);
|
|
1310
|
+
p.insertAfter(i, intersectionPoint);
|
|
1311
|
+
}
|
|
1312
|
+
};
|
|
1313
|
+
for (var j = i + 2; j < p.length - 1; j++) {
|
|
1314
|
+
_loop_1(j);
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
try {
|
|
1318
|
+
for (var _b = __values$2(Object.keys(store)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1319
|
+
var key = _c.value;
|
|
1320
|
+
var record = store[key];
|
|
1321
|
+
if (record.length > 1) {
|
|
1322
|
+
var _loop_2 = function (j) {
|
|
1323
|
+
var origin_1 = p.clone();
|
|
1324
|
+
var d = record[j] - record[j - 1];
|
|
1325
|
+
if (d > 1) {
|
|
1326
|
+
var part = new DPolygon(origin_1.removePart(record[j - 1], d));
|
|
1327
|
+
var allInside = part.reduce(function (a, e) { return a && containCalculator(origin_1, e); }, true);
|
|
1328
|
+
if (allInside && origin_1.isClockwise === part.isClockwise) {
|
|
1329
|
+
origin_1.insertAfter.apply(origin_1, __spreadArray$1([record[j - 1] - 1], __read$3(part.reverse().points), false));
|
|
1330
|
+
p = origin_1;
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
};
|
|
1334
|
+
for (var j = record.length - 1; j > 0; j--) {
|
|
1335
|
+
_loop_2(j);
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
}
|
|
1340
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
1341
|
+
finally {
|
|
1342
|
+
try {
|
|
1343
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1344
|
+
}
|
|
1345
|
+
finally { if (e_6) throw e_6.error; }
|
|
1346
|
+
}
|
|
1347
|
+
return p;
|
|
1348
|
+
},
|
|
1349
|
+
enumerable: false,
|
|
1350
|
+
configurable: true
|
|
1351
|
+
});
|
|
1352
|
+
Object.defineProperty(DPolygon.prototype, "valid", {
|
|
1353
|
+
get: function () {
|
|
1354
|
+
return this.length > MIN_POINTS_IN_VALID_POLYGON;
|
|
1355
|
+
},
|
|
1356
|
+
enumerable: false,
|
|
1357
|
+
configurable: true
|
|
1358
|
+
});
|
|
1359
|
+
Object.defineProperty(DPolygon.prototype, "first", {
|
|
1360
|
+
get: function () {
|
|
1361
|
+
return this.at(0);
|
|
1362
|
+
},
|
|
1363
|
+
enumerable: false,
|
|
1364
|
+
configurable: true
|
|
1365
|
+
});
|
|
1366
|
+
Object.defineProperty(DPolygon.prototype, "second", {
|
|
1367
|
+
get: function () {
|
|
1368
|
+
return this.at(1);
|
|
1369
|
+
},
|
|
1370
|
+
enumerable: false,
|
|
1371
|
+
configurable: true
|
|
1372
|
+
});
|
|
1373
|
+
Object.defineProperty(DPolygon.prototype, "last", {
|
|
1374
|
+
get: function () {
|
|
1375
|
+
return this.at(this.length - 1);
|
|
1376
|
+
},
|
|
1377
|
+
enumerable: false,
|
|
1378
|
+
configurable: true
|
|
1379
|
+
});
|
|
1380
|
+
Object.defineProperty(DPolygon.prototype, "minAreaRectangle", {
|
|
1381
|
+
get: function () {
|
|
1382
|
+
var e_7, _a, e_8, _b;
|
|
1383
|
+
var p = this.convex;
|
|
1384
|
+
var resultPolygon = new DPolygon();
|
|
1385
|
+
var resultArea = Infinity;
|
|
1386
|
+
try {
|
|
1387
|
+
for (var _c = __values$2(p.loopPointsGenerator(true)()), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
1388
|
+
var _e = __read$3(_d.value, 3), l = _e[2];
|
|
1389
|
+
var maxWidth = 0;
|
|
1390
|
+
var maxWidthPoint1 = null;
|
|
1391
|
+
var maxWidthPoint2 = null;
|
|
1392
|
+
var maxHeight = 0;
|
|
1393
|
+
var maxHeightPoint = null;
|
|
1394
|
+
try {
|
|
1395
|
+
for (var _f = (e_8 = void 0, __values$2(p.loopPointsGenerator()())), _g = _f.next(); !_g.done; _g = _f.next()) {
|
|
1396
|
+
var _h = __read$3(_g.value, 4), z = _h[0], i = _h[3];
|
|
1397
|
+
var p1 = l.findPoint(l.findPerpendicular(z));
|
|
1398
|
+
var h = p1.distance(z);
|
|
1399
|
+
if (h >= maxHeight) {
|
|
1400
|
+
maxHeight = h;
|
|
1401
|
+
maxHeightPoint = z;
|
|
1402
|
+
}
|
|
1403
|
+
for (var j = i; j < p.length - 1; j++) {
|
|
1404
|
+
var p2 = l.findPoint(l.findPerpendicular(p.at(j)));
|
|
1405
|
+
var w = p1.distance(p2);
|
|
1406
|
+
if (w >= maxWidth) {
|
|
1407
|
+
maxWidth = w;
|
|
1408
|
+
maxWidthPoint1 = p1;
|
|
1409
|
+
maxWidthPoint2 = p2;
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
1415
|
+
finally {
|
|
1416
|
+
try {
|
|
1417
|
+
if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
|
|
1418
|
+
}
|
|
1419
|
+
finally { if (e_8) throw e_8.error; }
|
|
1420
|
+
}
|
|
1421
|
+
if (!maxWidthPoint1 || !maxWidthPoint2 || !maxHeightPoint) {
|
|
1422
|
+
continue;
|
|
1423
|
+
}
|
|
1424
|
+
var widthLine = maxWidthPoint1.findLine(maxWidthPoint2);
|
|
1425
|
+
var perpendicular1 = widthLine.findPerpendicular(maxWidthPoint1);
|
|
1426
|
+
var perpendicular2 = widthLine.findPerpendicular(maxWidthPoint2);
|
|
1427
|
+
var tempPolygon = new DPolygon([
|
|
1428
|
+
maxWidthPoint1,
|
|
1429
|
+
maxWidthPoint2,
|
|
1430
|
+
perpendicular2.findPoint(perpendicular2.findPerpendicular(maxHeightPoint)),
|
|
1431
|
+
perpendicular1.findPoint(perpendicular1.findPerpendicular(maxHeightPoint))
|
|
1432
|
+
]).close();
|
|
1433
|
+
if (tempPolygon.area < resultArea) {
|
|
1434
|
+
resultPolygon = tempPolygon;
|
|
1435
|
+
resultArea = tempPolygon.area;
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
1440
|
+
finally {
|
|
1441
|
+
try {
|
|
1442
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
1443
|
+
}
|
|
1444
|
+
finally { if (e_7) throw e_7.error; }
|
|
1445
|
+
}
|
|
1446
|
+
return resultPolygon;
|
|
1447
|
+
},
|
|
1448
|
+
enumerable: false,
|
|
1449
|
+
configurable: true
|
|
1450
|
+
});
|
|
1451
|
+
Object.defineProperty(DPolygon.prototype, "convex", {
|
|
1452
|
+
get: function () {
|
|
1453
|
+
var p = this.clone().open();
|
|
1454
|
+
var isClockwise = p.isClockwise;
|
|
1455
|
+
if (!isClockwise) {
|
|
1456
|
+
p.reverse();
|
|
1457
|
+
}
|
|
1458
|
+
var l = 0;
|
|
1459
|
+
do {
|
|
1460
|
+
var p1 = p.last;
|
|
1461
|
+
var p2 = p.first;
|
|
1462
|
+
var p3 = p.second;
|
|
1463
|
+
var d = p2.findInnerAngle(p1, p3);
|
|
1464
|
+
if (d > Math.PI || DNumbers.likeZero(DNumbers.rad2Deg(d)) || DNumbers.likePI(d) || DNumbers.like2PI(d)) {
|
|
1465
|
+
p.removePart(-1, 1);
|
|
1466
|
+
}
|
|
1467
|
+
else {
|
|
1468
|
+
break;
|
|
1469
|
+
}
|
|
1470
|
+
} while (p.length);
|
|
1471
|
+
p.close();
|
|
1472
|
+
var iteration = 0;
|
|
1473
|
+
do {
|
|
1474
|
+
p = p.deintersection;
|
|
1475
|
+
l = p.length;
|
|
1476
|
+
for (var i = 1; i < p.length - 1; i++) {
|
|
1477
|
+
var p1 = p.at(i - 1);
|
|
1478
|
+
var p2 = p.at(i);
|
|
1479
|
+
var p3 = p.at(i + 1);
|
|
1480
|
+
var d = p2.findInnerAngle(p1, p3);
|
|
1481
|
+
if (d > Math.PI || DNumbers.likeZero(DNumbers.rad2Deg(d)) || DNumbers.likePI(d) || DNumbers.like2PI(d)) {
|
|
1482
|
+
p.removePart(--i, 1);
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
iteration++;
|
|
1486
|
+
} while (p.length !== l && iteration < MAX_CONVEX_ITERATIONS);
|
|
1487
|
+
if (!isClockwise) {
|
|
1488
|
+
p.reverse();
|
|
1489
|
+
}
|
|
1490
|
+
return p;
|
|
1491
|
+
},
|
|
1492
|
+
enumerable: false,
|
|
1493
|
+
configurable: true
|
|
1494
|
+
});
|
|
1495
|
+
Object.defineProperty(DPolygon.prototype, "isClockwise", {
|
|
1496
|
+
get: function () {
|
|
1497
|
+
var e_9, _a;
|
|
1498
|
+
var sum = 0;
|
|
1499
|
+
try {
|
|
1500
|
+
for (var _b = __values$2(this.clone().close()
|
|
1501
|
+
.loopPointsGenerator()()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1502
|
+
var _d = __read$3(_c.value, 2), _e = _d[0], x = _e.x, y = _e.y, _f = _d[1], a = _f.x, b = _f.y;
|
|
1503
|
+
sum += (a - x) * (b + y);
|
|
1504
|
+
}
|
|
1505
|
+
}
|
|
1506
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
1507
|
+
finally {
|
|
1508
|
+
try {
|
|
1509
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1510
|
+
}
|
|
1511
|
+
finally { if (e_9) throw e_9.error; }
|
|
1512
|
+
}
|
|
1513
|
+
return sum < 0;
|
|
1514
|
+
},
|
|
1515
|
+
enumerable: false,
|
|
1516
|
+
configurable: true
|
|
1517
|
+
});
|
|
1518
|
+
Object.defineProperty(DPolygon.prototype, "clockWise", {
|
|
1519
|
+
get: function () {
|
|
1520
|
+
if (this.isClockwise) {
|
|
1521
|
+
return this.clone();
|
|
1522
|
+
}
|
|
1523
|
+
return this.clone().reverse();
|
|
1524
|
+
},
|
|
1525
|
+
enumerable: false,
|
|
1526
|
+
configurable: true
|
|
1527
|
+
});
|
|
1528
|
+
Object.defineProperty(DPolygon.prototype, "noHoles", {
|
|
1529
|
+
get: function () {
|
|
1530
|
+
var res = this.clone();
|
|
1531
|
+
res.holes = [];
|
|
1532
|
+
return res;
|
|
1533
|
+
},
|
|
1534
|
+
enumerable: false,
|
|
1535
|
+
configurable: true
|
|
1536
|
+
});
|
|
1537
|
+
DPolygon.prototype.reduce = function (f, v) {
|
|
1538
|
+
return this.pPoints.reduce(f, v);
|
|
1539
|
+
};
|
|
1540
|
+
DPolygon.prototype.intersection = function (l, includeOnly) {
|
|
1541
|
+
var e_10, _a;
|
|
1542
|
+
if (includeOnly === void 0) { includeOnly = false; }
|
|
1543
|
+
var res = [];
|
|
1544
|
+
try {
|
|
1545
|
+
for (var _b = __values$2(this.loopPointsGenerator(true)()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1546
|
+
var _d = __read$3(_c.value, 3), line = _d[2];
|
|
1547
|
+
var intersect = line.intersection(l, 0, includeOnly);
|
|
1548
|
+
if (intersect) {
|
|
1549
|
+
res.push(intersect);
|
|
1550
|
+
}
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
1554
|
+
finally {
|
|
1555
|
+
try {
|
|
1556
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1557
|
+
}
|
|
1558
|
+
finally { if (e_10) throw e_10.error; }
|
|
1559
|
+
}
|
|
1560
|
+
return res;
|
|
1561
|
+
};
|
|
1562
|
+
DPolygon.prototype.setCenter = function (newCenter) {
|
|
1563
|
+
return this.loop()
|
|
1564
|
+
.move(newCenter.clone().move(this.center.minus()))
|
|
1565
|
+
.run();
|
|
1566
|
+
};
|
|
1567
|
+
DPolygon.prototype.toWKT = function (type, withZ) {
|
|
1568
|
+
if (type === void 0) { type = DPolygon.WKT_POLYGON; }
|
|
1569
|
+
if (withZ === void 0) { withZ = false; }
|
|
1570
|
+
if (type === DPolygon.WKT_POLYGON) {
|
|
1571
|
+
var h = '';
|
|
1572
|
+
if (this.holes && this.holes.length) {
|
|
1573
|
+
h = ", " + this.holes.map(function (hole) { return hole.toString(); })
|
|
1574
|
+
.join(', ');
|
|
1575
|
+
}
|
|
1576
|
+
return "POLYGON ((" + this.deintersection.mapArray(function (r) { return r.x + " " + r.y + (withZ ? " " + r.z : ''); })
|
|
1577
|
+
.join(', ') + ")" + h + ")";
|
|
1578
|
+
}
|
|
1579
|
+
return "LINESTRING (" + this.mapArray(function (r) { return r.x + " " + r.y + (withZ ? " " + r.z : ''); })
|
|
1580
|
+
.join(', ') + ")";
|
|
1581
|
+
};
|
|
1582
|
+
DPolygon.prototype.filter = function (f) {
|
|
1583
|
+
this.pPoints = this.pPoints.filter(f);
|
|
1584
|
+
return this;
|
|
1585
|
+
};
|
|
1586
|
+
DPolygon.prototype.map = function (f) {
|
|
1587
|
+
this.pPoints = this.mapArray(f);
|
|
1588
|
+
this.holes = this.holes.map(function (h) { return h.map(f); });
|
|
1589
|
+
return this;
|
|
1590
|
+
};
|
|
1591
|
+
DPolygon.prototype.mapArray = function (f) {
|
|
1592
|
+
return this.pPoints.map(f);
|
|
1593
|
+
};
|
|
1594
|
+
DPolygon.prototype.sort = function (f) {
|
|
1595
|
+
this.points.sort(f);
|
|
1596
|
+
return this;
|
|
1597
|
+
};
|
|
1598
|
+
DPolygon.prototype.at = function (index) {
|
|
1599
|
+
var length = this.length;
|
|
1600
|
+
return this.points[(index % length + length) % length];
|
|
1601
|
+
};
|
|
1602
|
+
DPolygon.prototype.pop = function () {
|
|
1603
|
+
return this.pPoints.pop();
|
|
1604
|
+
};
|
|
1605
|
+
DPolygon.prototype.push = function () {
|
|
1606
|
+
var _a;
|
|
1607
|
+
var args = [];
|
|
1608
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
1609
|
+
args[_i] = arguments[_i];
|
|
1610
|
+
}
|
|
1611
|
+
return (_a = this.pPoints).push.apply(_a, __spreadArray$1([], __read$3(args), false));
|
|
1612
|
+
};
|
|
1613
|
+
DPolygon.prototype.shift = function () {
|
|
1614
|
+
return this.pPoints.shift();
|
|
1615
|
+
};
|
|
1616
|
+
DPolygon.prototype.unshift = function () {
|
|
1617
|
+
var _a;
|
|
1618
|
+
var args = [];
|
|
1619
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
1620
|
+
args[_i] = arguments[_i];
|
|
1621
|
+
}
|
|
1622
|
+
return (_a = this.pPoints).unshift.apply(_a, __spreadArray$1([], __read$3(args), false));
|
|
1623
|
+
};
|
|
1624
|
+
DPolygon.prototype.reverse = function () {
|
|
1625
|
+
this.pPoints = this.pPoints.reverse();
|
|
1626
|
+
this.holes = this.holes.map(function (h) { return h.reverse(); });
|
|
1627
|
+
return this;
|
|
1628
|
+
};
|
|
1629
|
+
DPolygon.prototype.getValue = function () {
|
|
1630
|
+
return (this.pPoints.map(function (r) { return r.getValue(); }) + this.holes
|
|
1631
|
+
.reduce(function (a, h) { return a + h.getValue(); }, ''));
|
|
1632
|
+
};
|
|
1633
|
+
DPolygon.prototype.toString = function () {
|
|
1634
|
+
return "(" + this.mapArray(function (r) { return r.toString(); }).join(', ') + ")";
|
|
1635
|
+
};
|
|
1636
|
+
DPolygon.prototype.close = function () {
|
|
1637
|
+
var p0 = this.first;
|
|
1638
|
+
if (p0 && !this.closed) {
|
|
1639
|
+
this.push(p0.clone());
|
|
1640
|
+
}
|
|
1641
|
+
return this;
|
|
1642
|
+
};
|
|
1643
|
+
DPolygon.prototype.open = function () {
|
|
1644
|
+
var p = this.first;
|
|
1645
|
+
if (this.length > 2 && p && this.closed) {
|
|
1646
|
+
this.pop();
|
|
1647
|
+
}
|
|
1648
|
+
return this;
|
|
1649
|
+
};
|
|
1650
|
+
DPolygon.prototype.add = function (poly) {
|
|
1651
|
+
var res = new DPolygon(__spreadArray$1(__spreadArray$1([], __read$3(this.points), false), __read$3(poly.points), false)).close();
|
|
1652
|
+
res.holes = __spreadArray$1(__spreadArray$1([], __read$3(this.holes), false), __read$3(poly.holes), false).map(function (h) { return h.clone(); });
|
|
1653
|
+
return res;
|
|
1654
|
+
};
|
|
1655
|
+
DPolygon.prototype.has = function (p) {
|
|
1656
|
+
return this.pPoints.some(function (q) { return q.equal(p); });
|
|
1657
|
+
};
|
|
1658
|
+
DPolygon.prototype.clone = function () {
|
|
1659
|
+
var res = new DPolygon(this.points.map(function (r) { return r.clone(); }));
|
|
1660
|
+
res.holes = this.holes.map(function (h) { return h.clone(); });
|
|
1661
|
+
res.properties = this.properties;
|
|
1662
|
+
return res;
|
|
1663
|
+
};
|
|
1664
|
+
DPolygon.prototype.equal = function (p) {
|
|
1665
|
+
if (!(p instanceof DPolygon)) {
|
|
1666
|
+
return false;
|
|
1667
|
+
}
|
|
1668
|
+
if (this.length !== p.length || this.holes.length !== p.holes.length) {
|
|
1669
|
+
return false;
|
|
1670
|
+
}
|
|
1671
|
+
return (this.same(p) &&
|
|
1672
|
+
this.holes.reduce(function (a, hole) { return a && p.holes.some(function (pHoles) { return pHoles.same(hole); }); }, true));
|
|
1673
|
+
};
|
|
1674
|
+
DPolygon.prototype.same = function (p) {
|
|
1675
|
+
var pClone = p.clone().close();
|
|
1676
|
+
var thisAsString = this.clone()
|
|
1677
|
+
.close()
|
|
1678
|
+
.toString();
|
|
1679
|
+
for (var i = 0; i < pClone.length; i++) {
|
|
1680
|
+
if (thisAsString === pClone.toString() || thisAsString === pClone.clone().reverse()
|
|
1681
|
+
.toString()) {
|
|
1682
|
+
return true;
|
|
1683
|
+
}
|
|
1684
|
+
pClone.nextStart();
|
|
1685
|
+
}
|
|
1686
|
+
return false;
|
|
1687
|
+
};
|
|
1688
|
+
DPolygon.prototype.findIndex = function (a) {
|
|
1689
|
+
if (a instanceof DPoint) {
|
|
1690
|
+
return this.points.findIndex(function (t) { return t.equal(a); });
|
|
1691
|
+
}
|
|
1692
|
+
return this.points.findIndex(a);
|
|
1693
|
+
};
|
|
1694
|
+
DPolygon.prototype.approximation = function (e) {
|
|
1695
|
+
if (e === void 0) { e = Math.sqrt(this.perimeter) * APPROXIMATION_VALUE; }
|
|
1696
|
+
return new DPolygon(this.clone().douglasPeucker(this.pPoints, e));
|
|
1697
|
+
};
|
|
1698
|
+
DPolygon.prototype.insertAfter = function (index) {
|
|
1699
|
+
var _a;
|
|
1700
|
+
var points = [];
|
|
1701
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1702
|
+
points[_i - 1] = arguments[_i];
|
|
1703
|
+
}
|
|
1704
|
+
(_a = this.pPoints).splice.apply(_a, __spreadArray$1([index + 1, 0], __read$3(points), false));
|
|
1705
|
+
};
|
|
1706
|
+
DPolygon.prototype.removePart = function (index, count) {
|
|
1707
|
+
return this.pPoints.splice(index + 1, count);
|
|
1708
|
+
};
|
|
1709
|
+
DPolygon.prototype.hasSimpleIntersection = function (p) {
|
|
1710
|
+
var extend1 = this.extend;
|
|
1711
|
+
var extend2 = p.extend;
|
|
1712
|
+
var extend1points = extend1.points;
|
|
1713
|
+
var extend2points = extend2.points;
|
|
1714
|
+
var in1 = extend1points.some(function (t) { return extend2.simpleInclude(t); });
|
|
1715
|
+
var in2 = extend2points.some(function (t) { return extend1.simpleInclude(t); });
|
|
1716
|
+
return in1 || in2;
|
|
1717
|
+
};
|
|
1718
|
+
DPolygon.prototype.simpleInclude = function (p) {
|
|
1719
|
+
return this.simpleIncludeX(p) && this.simpleIncludeY(p);
|
|
1720
|
+
};
|
|
1721
|
+
DPolygon.prototype.drawPolygonOnCanvas = function (canvas, fillColor, strokeColor, shadowColor, lineWidth, steps) {
|
|
1722
|
+
if (lineWidth === void 0) { lineWidth = 1; }
|
|
1723
|
+
if (steps === void 0) { steps = this.length - 1; }
|
|
1724
|
+
if (this.length < 2) {
|
|
1725
|
+
return;
|
|
1726
|
+
}
|
|
1727
|
+
var ctx = canvas.getContext('2d');
|
|
1728
|
+
if (fillColor) {
|
|
1729
|
+
ctx.fillStyle = fillColor;
|
|
1730
|
+
}
|
|
1731
|
+
if (strokeColor) {
|
|
1732
|
+
ctx.strokeStyle = strokeColor;
|
|
1733
|
+
}
|
|
1734
|
+
if (lineWidth) {
|
|
1735
|
+
ctx.lineWidth = lineWidth;
|
|
1736
|
+
}
|
|
1737
|
+
if (fillColor || strokeColor) {
|
|
1738
|
+
ctx.beginPath();
|
|
1739
|
+
}
|
|
1740
|
+
this.goByPath(ctx, steps % this.length);
|
|
1741
|
+
if (shadowColor) {
|
|
1742
|
+
ctx.shadowColor = shadowColor;
|
|
1743
|
+
ctx.shadowBlur = 0;
|
|
1744
|
+
ctx.shadowOffsetX = 1;
|
|
1745
|
+
ctx.shadowOffsetY = 1;
|
|
1746
|
+
}
|
|
1747
|
+
if (fillColor) {
|
|
1748
|
+
ctx.closePath();
|
|
1749
|
+
ctx.fill();
|
|
1750
|
+
}
|
|
1751
|
+
if (strokeColor) {
|
|
1752
|
+
ctx.stroke();
|
|
1753
|
+
}
|
|
1754
|
+
};
|
|
1755
|
+
DPolygon.prototype.clearPolygonOnCanvas = function (canvas) {
|
|
1756
|
+
var ctx = canvas.getContext('2d');
|
|
1757
|
+
var old = ctx.globalCompositeOperation;
|
|
1758
|
+
ctx.globalCompositeOperation = 'destination-out';
|
|
1759
|
+
this.goByPath(ctx);
|
|
1760
|
+
ctx.fill();
|
|
1761
|
+
ctx.globalCompositeOperation = old;
|
|
1762
|
+
};
|
|
1763
|
+
DPolygon.prototype.contain = function (p, isBorderInside) {
|
|
1764
|
+
var e_11, _a;
|
|
1765
|
+
if (isBorderInside === void 0) { isBorderInside = false; }
|
|
1766
|
+
var simpleInclude = this.simpleInclude(p);
|
|
1767
|
+
if (!simpleInclude) {
|
|
1768
|
+
return false;
|
|
1769
|
+
}
|
|
1770
|
+
var onBorder = this.onBorder(p);
|
|
1771
|
+
if (onBorder) {
|
|
1772
|
+
return isBorderInside;
|
|
1773
|
+
}
|
|
1774
|
+
var poly = this.deintersection;
|
|
1775
|
+
var totalFi = 0;
|
|
1776
|
+
try {
|
|
1777
|
+
for (var _b = __values$2(poly.loopPointsGenerator()()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1778
|
+
var _d = __read$3(_c.value, 2), _e = _d[0], x = _e.x, y = _e.y, _f = _d[1], a = _f.x, b = _f.y;
|
|
1779
|
+
var line1 = new DLine(x - p.x, y - p.y, 0);
|
|
1780
|
+
var line2 = new DLine(a - p.x, b - p.y, 0);
|
|
1781
|
+
var fiDif = line1.findFi(line2);
|
|
1782
|
+
if (line1.vectorProduct(line2).c > 0) {
|
|
1783
|
+
totalFi += fiDif;
|
|
1784
|
+
}
|
|
1785
|
+
else {
|
|
1786
|
+
totalFi -= fiDif;
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
1791
|
+
finally {
|
|
1792
|
+
try {
|
|
1793
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1794
|
+
}
|
|
1795
|
+
finally { if (e_11) throw e_11.error; }
|
|
1796
|
+
}
|
|
1797
|
+
var eps = Math.PI / 10000;
|
|
1798
|
+
var absTotalFi = Math.abs(totalFi);
|
|
1799
|
+
if (absTotalFi < eps) {
|
|
1800
|
+
return false;
|
|
1801
|
+
}
|
|
1802
|
+
else if (Math.abs(2 * Math.PI - absTotalFi) < eps) {
|
|
1803
|
+
return true;
|
|
1804
|
+
}
|
|
1805
|
+
throw new Error('contains2 faild');
|
|
1806
|
+
};
|
|
1807
|
+
DPolygon.prototype.onBorder = function (p) {
|
|
1808
|
+
var e_12, _a;
|
|
1809
|
+
var simpleInclude = this.simpleInclude(p);
|
|
1810
|
+
if (simpleInclude) {
|
|
1811
|
+
var poly = this.deintersection;
|
|
1812
|
+
var hasSamePoint = this.points.some(function (point) { return point.equal(p); });
|
|
1813
|
+
if (hasSamePoint) {
|
|
1814
|
+
return true;
|
|
1815
|
+
}
|
|
1816
|
+
try {
|
|
1817
|
+
for (var _b = __values$2(poly.loopPointsGenerator(true)()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1818
|
+
var _d = __read$3(_c.value, 3), polygonLine = _d[2];
|
|
1819
|
+
var onBorder = polygonLine.x(p).equal(p) && polygonLine.inRange(p);
|
|
1820
|
+
if (onBorder) {
|
|
1821
|
+
return true;
|
|
1822
|
+
}
|
|
1823
|
+
}
|
|
1824
|
+
}
|
|
1825
|
+
catch (e_12_1) { e_12 = { error: e_12_1 }; }
|
|
1826
|
+
finally {
|
|
1827
|
+
try {
|
|
1828
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1829
|
+
}
|
|
1830
|
+
finally { if (e_12) throw e_12.error; }
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
return false;
|
|
1834
|
+
};
|
|
1835
|
+
DPolygon.prototype.nextStart = function () {
|
|
1836
|
+
this.open();
|
|
1837
|
+
this.push(this.shift());
|
|
1838
|
+
this.close();
|
|
1839
|
+
return this;
|
|
1840
|
+
};
|
|
1841
|
+
DPolygon.prototype.removeDuplicates = function () {
|
|
1842
|
+
for (var i = 0; i < this.length - 1; i++) {
|
|
1843
|
+
var p1 = this.at(i);
|
|
1844
|
+
var p2 = this.at(i + 1);
|
|
1845
|
+
if (p1.equal(p2)) {
|
|
1846
|
+
this.removePart(i, 1);
|
|
1847
|
+
i--;
|
|
1848
|
+
}
|
|
1849
|
+
}
|
|
1850
|
+
return this;
|
|
1851
|
+
};
|
|
1852
|
+
DPolygon.parse = function (a) {
|
|
1853
|
+
return new DPolygon(a.map(function (r) { return DPoint.parse(r); }));
|
|
1854
|
+
};
|
|
1855
|
+
DPolygon.prototype.toArrayOfCoords = function () {
|
|
1856
|
+
return this.mapArray(function (r) { return r.toCoords(); });
|
|
1857
|
+
};
|
|
1858
|
+
DPolygon.prototype.divideToPieces = function (piecesCount) {
|
|
1859
|
+
var e_13, _a;
|
|
1860
|
+
var fullLength = this.fullLength;
|
|
1861
|
+
var pieceLength = fullLength / piecesCount;
|
|
1862
|
+
var currentPieceLength = pieceLength;
|
|
1863
|
+
var _loop_3 = function (p1, p2, i) {
|
|
1864
|
+
var d = p1.distance(p2);
|
|
1865
|
+
if (d === currentPieceLength) {
|
|
1866
|
+
p2.properties.pieceBorder = true;
|
|
1867
|
+
currentPieceLength = pieceLength;
|
|
1868
|
+
}
|
|
1869
|
+
else if (d - currentPieceLength > 0) {
|
|
1870
|
+
var circle = new DCircle(p1, currentPieceLength);
|
|
1871
|
+
var line_1 = p1.findLine(p2);
|
|
1872
|
+
var intersectionPoint = line_1.intersectionWithCircle(circle)
|
|
1873
|
+
.filter(function (p) { return line_1.inRange(p, CLOSE_TO_INTERSECTION_DISTANCE); })[0];
|
|
1874
|
+
intersectionPoint.properties.pieceBorder = true;
|
|
1875
|
+
this_1.insertAfter(i, intersectionPoint);
|
|
1876
|
+
currentPieceLength = pieceLength;
|
|
1877
|
+
}
|
|
1878
|
+
else {
|
|
1879
|
+
currentPieceLength -= d;
|
|
1880
|
+
}
|
|
1881
|
+
};
|
|
1882
|
+
var this_1 = this;
|
|
1883
|
+
try {
|
|
1884
|
+
for (var _b = __values$2(this.loopPointsGenerator()()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1885
|
+
var _d = __read$3(_c.value, 4), p1 = _d[0], p2 = _d[1], i = _d[3];
|
|
1886
|
+
_loop_3(p1, p2, i);
|
|
1887
|
+
}
|
|
1888
|
+
}
|
|
1889
|
+
catch (e_13_1) { e_13 = { error: e_13_1 }; }
|
|
1890
|
+
finally {
|
|
1891
|
+
try {
|
|
1892
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1893
|
+
}
|
|
1894
|
+
finally { if (e_13) throw e_13.error; }
|
|
1895
|
+
}
|
|
1896
|
+
return this;
|
|
1897
|
+
};
|
|
1898
|
+
DPolygon.prototype.prepareToFastSearch = function () {
|
|
1899
|
+
var e_14, _a;
|
|
1900
|
+
this.searchStore = {};
|
|
1901
|
+
try {
|
|
1902
|
+
for (var _b = __values$2(this.points), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
1903
|
+
var _d = _c.value, x = _d.x, y = _d.y, z = _d.z;
|
|
1904
|
+
if (!this.searchStore[x]) {
|
|
1905
|
+
this.searchStore[x] = {};
|
|
1906
|
+
}
|
|
1907
|
+
if (!this.searchStore[x][y]) {
|
|
1908
|
+
this.searchStore[x][y] = {};
|
|
1909
|
+
}
|
|
1910
|
+
this.searchStore[x][y][z || 'undefined'] = true;
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
catch (e_14_1) { e_14 = { error: e_14_1 }; }
|
|
1914
|
+
finally {
|
|
1915
|
+
try {
|
|
1916
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
1917
|
+
}
|
|
1918
|
+
finally { if (e_14) throw e_14.error; }
|
|
1919
|
+
}
|
|
1920
|
+
};
|
|
1921
|
+
DPolygon.prototype.fastHas = function (_a) {
|
|
1922
|
+
var x = _a.x, y = _a.y, z = _a.z;
|
|
1923
|
+
if (!this.searchStore[x]) {
|
|
1924
|
+
return false;
|
|
1925
|
+
}
|
|
1926
|
+
if (!this.searchStore[x][y]) {
|
|
1927
|
+
return false;
|
|
1928
|
+
}
|
|
1929
|
+
if (!this.searchStore[x][y][z || 'undefined']) {
|
|
1930
|
+
return false;
|
|
1931
|
+
}
|
|
1932
|
+
return this.searchStore[x][y][z || 'undefined'];
|
|
1933
|
+
};
|
|
1934
|
+
Object.defineProperty(DPolygon.prototype, "growingPiecesGenerator", {
|
|
1935
|
+
get: function () {
|
|
1936
|
+
var polygon = this;
|
|
1937
|
+
return function () {
|
|
1938
|
+
var r, _a, _b, p, e_15_1;
|
|
1939
|
+
var e_15, _c;
|
|
1940
|
+
return __generator(this, function (_d) {
|
|
1941
|
+
switch (_d.label) {
|
|
1942
|
+
case 0:
|
|
1943
|
+
r = new DPolygon();
|
|
1944
|
+
_d.label = 1;
|
|
1945
|
+
case 1:
|
|
1946
|
+
_d.trys.push([1, 6, 7, 8]);
|
|
1947
|
+
_a = __values$2(polygon.pPoints), _b = _a.next();
|
|
1948
|
+
_d.label = 2;
|
|
1949
|
+
case 2:
|
|
1950
|
+
if (!!_b.done) return [3, 5];
|
|
1951
|
+
p = _b.value;
|
|
1952
|
+
r.push(p);
|
|
1953
|
+
if (!p.properties.pieceBorder) return [3, 4];
|
|
1954
|
+
return [4, r.clone()];
|
|
1955
|
+
case 3:
|
|
1956
|
+
_d.sent();
|
|
1957
|
+
_d.label = 4;
|
|
1958
|
+
case 4:
|
|
1959
|
+
_b = _a.next();
|
|
1960
|
+
return [3, 2];
|
|
1961
|
+
case 5: return [3, 8];
|
|
1962
|
+
case 6:
|
|
1963
|
+
e_15_1 = _d.sent();
|
|
1964
|
+
e_15 = { error: e_15_1 };
|
|
1965
|
+
return [3, 8];
|
|
1966
|
+
case 7:
|
|
1967
|
+
try {
|
|
1968
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
1969
|
+
}
|
|
1970
|
+
finally { if (e_15) throw e_15.error; }
|
|
1971
|
+
return [7];
|
|
1972
|
+
case 8: return [2, r.clone()];
|
|
1973
|
+
}
|
|
1974
|
+
});
|
|
1975
|
+
};
|
|
1976
|
+
},
|
|
1977
|
+
enumerable: false,
|
|
1978
|
+
configurable: true
|
|
1979
|
+
});
|
|
1980
|
+
DPolygon.prototype.simpleUnion = function (p) {
|
|
1981
|
+
try {
|
|
1982
|
+
var res = this.simpleLogicFunction(p, true, true);
|
|
1983
|
+
if (res === null) {
|
|
1984
|
+
return null;
|
|
1985
|
+
}
|
|
1986
|
+
if (res instanceof DPolygon) {
|
|
1987
|
+
return res;
|
|
1988
|
+
}
|
|
1989
|
+
return null;
|
|
1990
|
+
}
|
|
1991
|
+
catch (ex) {
|
|
1992
|
+
return null;
|
|
1993
|
+
}
|
|
1994
|
+
};
|
|
1995
|
+
DPolygon.prototype.simpleIntersection = function (p) {
|
|
1996
|
+
return this.simpleLogicFunction(p, false, false);
|
|
1997
|
+
};
|
|
1998
|
+
DPolygon.prototype.simpleDifference = function (p) {
|
|
1999
|
+
return this.simpleLogicFunction(p, true, false);
|
|
2000
|
+
};
|
|
2001
|
+
DPolygon.prototype.smartUnion = function (p) {
|
|
2002
|
+
var e_16, _a;
|
|
2003
|
+
var res = this.clone().simpleUnion(p);
|
|
2004
|
+
if (res) {
|
|
2005
|
+
var allHoles = __spreadArray$1(__spreadArray$1(__spreadArray$1([], __read$3(this.holes), false), __read$3(p.holes), false), __read$3(res.holes), false).map(function (h) { return h.clone(); });
|
|
2006
|
+
var _loop_4 = function (a) {
|
|
2007
|
+
var e_17, _b;
|
|
2008
|
+
var _loop_5 = function (b) {
|
|
2009
|
+
if (a.equal(b)) {
|
|
2010
|
+
return "continue";
|
|
2011
|
+
}
|
|
2012
|
+
var r = a.simpleUnion(b);
|
|
2013
|
+
if (r) {
|
|
2014
|
+
allHoles = allHoles.filter(function (v) { return !v.equal(a) && !v.equal(b); });
|
|
2015
|
+
allHoles.push(r);
|
|
2016
|
+
}
|
|
2017
|
+
};
|
|
2018
|
+
try {
|
|
2019
|
+
for (var allHoles_2 = (e_17 = void 0, __values$2(allHoles)), allHoles_2_1 = allHoles_2.next(); !allHoles_2_1.done; allHoles_2_1 = allHoles_2.next()) {
|
|
2020
|
+
var b = allHoles_2_1.value;
|
|
2021
|
+
_loop_5(b);
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
2024
|
+
catch (e_17_1) { e_17 = { error: e_17_1 }; }
|
|
2025
|
+
finally {
|
|
2026
|
+
try {
|
|
2027
|
+
if (allHoles_2_1 && !allHoles_2_1.done && (_b = allHoles_2.return)) _b.call(allHoles_2);
|
|
2028
|
+
}
|
|
2029
|
+
finally { if (e_17) throw e_17.error; }
|
|
2030
|
+
}
|
|
2031
|
+
};
|
|
2032
|
+
try {
|
|
2033
|
+
for (var allHoles_1 = __values$2(allHoles), allHoles_1_1 = allHoles_1.next(); !allHoles_1_1.done; allHoles_1_1 = allHoles_1.next()) {
|
|
2034
|
+
var a = allHoles_1_1.value;
|
|
2035
|
+
_loop_4(a);
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
catch (e_16_1) { e_16 = { error: e_16_1 }; }
|
|
2039
|
+
finally {
|
|
2040
|
+
try {
|
|
2041
|
+
if (allHoles_1_1 && !allHoles_1_1.done && (_a = allHoles_1.return)) _a.call(allHoles_1);
|
|
2042
|
+
}
|
|
2043
|
+
finally { if (e_16) throw e_16.error; }
|
|
2044
|
+
}
|
|
2045
|
+
res.holes = allHoles;
|
|
2046
|
+
}
|
|
2047
|
+
return res;
|
|
2048
|
+
};
|
|
2049
|
+
DPolygon.prototype.toTriangles = function () {
|
|
2050
|
+
var innerAndNotIntersect = function (poly, p1, p2) {
|
|
2051
|
+
var l = p1.findLine(p2);
|
|
2052
|
+
var center = l.center;
|
|
2053
|
+
var intersections = poly.holes.reduce(function (a, hole) { return a && Boolean(hole.clone().close()
|
|
2054
|
+
.intersection(l, true).length); }, Boolean(poly.clone().close()
|
|
2055
|
+
.intersection(l, true).length));
|
|
2056
|
+
var contain = poly.holes.reduce(function (a, hole) { return a && !hole
|
|
2057
|
+
.contain(center); }, poly.contain(center));
|
|
2058
|
+
return !intersections && contain;
|
|
2059
|
+
};
|
|
2060
|
+
var getTriangle = function (poly) {
|
|
2061
|
+
for (var i = 0; i < poly.length; i++) {
|
|
2062
|
+
var p0 = poly.at(0);
|
|
2063
|
+
var p1 = poly.at(1);
|
|
2064
|
+
var p2 = poly.at(2);
|
|
2065
|
+
if (innerAndNotIntersect(poly, p0, p2)) {
|
|
2066
|
+
poly.removePart(0, 1);
|
|
2067
|
+
return new DPolygon([
|
|
2068
|
+
p0.clone(),
|
|
2069
|
+
p1.clone(),
|
|
2070
|
+
p2.clone()
|
|
2071
|
+
]);
|
|
2072
|
+
}
|
|
2073
|
+
poly.push(poly.shift());
|
|
2074
|
+
}
|
|
2075
|
+
return undefined;
|
|
2076
|
+
};
|
|
2077
|
+
var p = this.clone().clockWise.open();
|
|
2078
|
+
while (p.holes.length) {
|
|
2079
|
+
var h = p.holes.shift()
|
|
2080
|
+
.clone()
|
|
2081
|
+
.clockWise
|
|
2082
|
+
.reverse()
|
|
2083
|
+
.close();
|
|
2084
|
+
for (var i = 0; i < p.length; i++) {
|
|
2085
|
+
if (innerAndNotIntersect(p, p.first, h.first)) {
|
|
2086
|
+
p.insertAfter.apply(p, __spreadArray$1(__spreadArray$1([0], __read$3(h.points), false), [p.first], false));
|
|
2087
|
+
break;
|
|
2088
|
+
}
|
|
2089
|
+
p.push(p.shift());
|
|
2090
|
+
}
|
|
2091
|
+
}
|
|
2092
|
+
var res = [];
|
|
2093
|
+
while (p.length > 3) {
|
|
2094
|
+
var triangle = getTriangle(p);
|
|
2095
|
+
if (triangle) {
|
|
2096
|
+
res.push(triangle);
|
|
2097
|
+
}
|
|
2098
|
+
}
|
|
2099
|
+
res.push(p);
|
|
2100
|
+
return res;
|
|
2101
|
+
};
|
|
2102
|
+
DPolygon.prototype.getTrianglesPointIndexes = function () {
|
|
2103
|
+
var innerAndNotIntersect = function (poly, p1, p2) {
|
|
2104
|
+
var l = p1.findLine(p2);
|
|
2105
|
+
var center = l.center;
|
|
2106
|
+
var intersections = poly.holes.reduce(function (a, hole) { return a && Boolean(hole.clone().close()
|
|
2107
|
+
.intersection(l, true).length); }, Boolean(poly.clone().close()
|
|
2108
|
+
.intersection(l, true).length));
|
|
2109
|
+
var contain = poly.holes.reduce(function (a, hole) { return a && !hole
|
|
2110
|
+
.contain(center); }, poly.contain(center));
|
|
2111
|
+
return !intersections && contain;
|
|
2112
|
+
};
|
|
2113
|
+
var getTriangle = function (poly) {
|
|
2114
|
+
for (var i = 0; i < poly.length; i++) {
|
|
2115
|
+
var p0 = poly.at(0);
|
|
2116
|
+
var p1 = poly.at(1);
|
|
2117
|
+
var p2 = poly.at(2);
|
|
2118
|
+
if (innerAndNotIntersect(poly, p0, p2)) {
|
|
2119
|
+
poly.removePart(0, 1);
|
|
2120
|
+
return [
|
|
2121
|
+
p0.properties.index,
|
|
2122
|
+
p1.properties.index,
|
|
2123
|
+
p2.properties.index
|
|
2124
|
+
];
|
|
2125
|
+
}
|
|
2126
|
+
poly.push(poly.shift());
|
|
2127
|
+
}
|
|
2128
|
+
return undefined;
|
|
2129
|
+
};
|
|
2130
|
+
var p = this.clone();
|
|
2131
|
+
var index = 0;
|
|
2132
|
+
p.points.forEach(function (f) {
|
|
2133
|
+
f.properties.index = index++;
|
|
2134
|
+
});
|
|
2135
|
+
p.holes.forEach(function (h) {
|
|
2136
|
+
h.pPoints.forEach(function (f) {
|
|
2137
|
+
f.properties.index = index++;
|
|
2138
|
+
});
|
|
2139
|
+
});
|
|
2140
|
+
p = p.clockWise.open();
|
|
2141
|
+
while (p.holes.length) {
|
|
2142
|
+
var h = p.holes.shift()
|
|
2143
|
+
.clone()
|
|
2144
|
+
.clockWise
|
|
2145
|
+
.reverse()
|
|
2146
|
+
.close();
|
|
2147
|
+
for (var i = 0; i < p.length; i++) {
|
|
2148
|
+
if (innerAndNotIntersect(p, p.first, h.first)) {
|
|
2149
|
+
p.insertAfter.apply(p, __spreadArray$1(__spreadArray$1([0], __read$3(h.points), false), [p.first], false));
|
|
2150
|
+
break;
|
|
2151
|
+
}
|
|
2152
|
+
p.push(p.shift());
|
|
2153
|
+
}
|
|
2154
|
+
}
|
|
2155
|
+
var res = [];
|
|
2156
|
+
while (p.length > 3) {
|
|
2157
|
+
var triangle = getTriangle(p);
|
|
2158
|
+
if (triangle) {
|
|
2159
|
+
res.push.apply(res, __spreadArray$1([], __read$3(triangle), false));
|
|
2160
|
+
}
|
|
2161
|
+
}
|
|
2162
|
+
res.push.apply(res, __spreadArray$1([], __read$3(p.points.map(function (f) { return f.properties.index; })), false));
|
|
2163
|
+
return res;
|
|
2164
|
+
};
|
|
2165
|
+
Object.defineProperty(DPolygon.prototype, "closed", {
|
|
2166
|
+
get: function () {
|
|
2167
|
+
return this.first.equal(this.last);
|
|
2168
|
+
},
|
|
2169
|
+
enumerable: false,
|
|
2170
|
+
configurable: true
|
|
2171
|
+
});
|
|
2172
|
+
DPolygon.prototype.buffer = function (v, quadrantSegments, type) {
|
|
2173
|
+
if (quadrantSegments === void 0) { quadrantSegments = 64; }
|
|
2174
|
+
if (type === void 0) { type = DPolygon.CAP_ROUND; }
|
|
2175
|
+
var reader = new jsts.io.WKTReader();
|
|
2176
|
+
var _a = this, noHoles = _a.noHoles, closed = _a.closed;
|
|
2177
|
+
var points = reader
|
|
2178
|
+
.read(noHoles.toWKT(closed ? DPolygon.WKT_POLYGON : DPolygon.WKT_LINESTRING))
|
|
2179
|
+
.buffer(v, quadrantSegments, type)
|
|
2180
|
+
.getCoordinates();
|
|
2181
|
+
return new DPolygon(points.map(function (_a) {
|
|
2182
|
+
var x = _a.x, y = _a.y;
|
|
2183
|
+
return new DPoint(x, y);
|
|
2184
|
+
}));
|
|
2185
|
+
};
|
|
2186
|
+
DPolygon.prototype.sideBuffers = function (v, quadrantSegments) {
|
|
2187
|
+
if (quadrantSegments === void 0) { quadrantSegments = 64; }
|
|
2188
|
+
var _a = this, first = _a.first, last = _a.last;
|
|
2189
|
+
var buffer = this.buffer(v, quadrantSegments, DPolygon.CAP_FLAT).open();
|
|
2190
|
+
var _b = __read$3(first.sortByDistance(buffer).points.map(function (r) { return r.properties.index; }), 2), start0 = _b[0], start1 = _b[1];
|
|
2191
|
+
var _c = __read$3(last.sortByDistance(buffer).points.map(function (r) { return r.properties.index; }), 2), end0 = _c[0], end1 = _c[1];
|
|
2192
|
+
var fromPoint = Math.min(Math.max(start0, start1), Math.max(end0, end1));
|
|
2193
|
+
var toPoint = Math.max(Math.min(start0, start1), Math.min(end0, end1));
|
|
2194
|
+
var linePart = new DPolygon(buffer.removePart(fromPoint - 1, toPoint - fromPoint + 1));
|
|
2195
|
+
buffer.unshift(buffer.pop());
|
|
2196
|
+
return [linePart, buffer];
|
|
2197
|
+
};
|
|
2198
|
+
DPolygon.prototype.bezier = function (step) {
|
|
2199
|
+
if (step === void 0) { step = 0.1; }
|
|
2200
|
+
var res = new DPolygon();
|
|
2201
|
+
for (var i = 0; i < 1; i += step) {
|
|
2202
|
+
res.push(this.clone().getBezierPoint(i));
|
|
2203
|
+
}
|
|
2204
|
+
return res;
|
|
2205
|
+
};
|
|
2206
|
+
DPolygon.prototype.setGrowingHeight = function (from, to) {
|
|
2207
|
+
var fullLength = this.fullLength;
|
|
2208
|
+
var prevPoint = this.first;
|
|
2209
|
+
var d = to - from;
|
|
2210
|
+
var currentDistance = 0;
|
|
2211
|
+
this.loop()
|
|
2212
|
+
.setZ(function (p) {
|
|
2213
|
+
currentDistance += prevPoint.distance(p);
|
|
2214
|
+
prevPoint = p;
|
|
2215
|
+
return from + currentDistance / fullLength * d;
|
|
2216
|
+
})
|
|
2217
|
+
.run();
|
|
2218
|
+
return this;
|
|
2219
|
+
};
|
|
2220
|
+
DPolygon.prototype.loopPointsGenerator = function (withLine) {
|
|
2221
|
+
if (withLine === void 0) { withLine = false; }
|
|
2222
|
+
var that = this;
|
|
2223
|
+
return function () {
|
|
2224
|
+
var i, p1, p2;
|
|
2225
|
+
return __generator(this, function (_a) {
|
|
2226
|
+
switch (_a.label) {
|
|
2227
|
+
case 0:
|
|
2228
|
+
i = 0;
|
|
2229
|
+
_a.label = 1;
|
|
2230
|
+
case 1:
|
|
2231
|
+
if (!(i < that.length - 1)) return [3, 4];
|
|
2232
|
+
p1 = that.at(i);
|
|
2233
|
+
p2 = that.at(i + 1);
|
|
2234
|
+
return [4, [p1, p2, withLine ? p1.findLine(p2) : undefined, i]];
|
|
2235
|
+
case 2:
|
|
2236
|
+
_a.sent();
|
|
2237
|
+
_a.label = 3;
|
|
2238
|
+
case 3:
|
|
2239
|
+
i++;
|
|
2240
|
+
return [3, 1];
|
|
2241
|
+
case 4: return [2];
|
|
2242
|
+
}
|
|
2243
|
+
});
|
|
2244
|
+
};
|
|
2245
|
+
};
|
|
2246
|
+
DPolygon.prototype.getBezierPoint = function (v) {
|
|
2247
|
+
var e_18, _a;
|
|
2248
|
+
if (this.length === 1) {
|
|
2249
|
+
return this.first;
|
|
2250
|
+
}
|
|
2251
|
+
try {
|
|
2252
|
+
for (var _b = __values$2(this.loopPointsGenerator()()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
2253
|
+
var _d = __read$3(_c.value, 2), p1 = _d[0], p2 = _d[1];
|
|
2254
|
+
p1.move(p2.clone().move(p1.clone().minus())
|
|
2255
|
+
.scale(v));
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
catch (e_18_1) { e_18 = { error: e_18_1 }; }
|
|
2259
|
+
finally {
|
|
2260
|
+
try {
|
|
2261
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
2262
|
+
}
|
|
2263
|
+
finally { if (e_18) throw e_18.error; }
|
|
2264
|
+
}
|
|
2265
|
+
this.pop();
|
|
2266
|
+
return this.getBezierPoint(v);
|
|
2267
|
+
};
|
|
2268
|
+
DPolygon.prototype.simpleIncludeX = function (p) {
|
|
2269
|
+
var x = p.x;
|
|
2270
|
+
return this.minX <= x && this.maxX >= x;
|
|
2271
|
+
};
|
|
2272
|
+
DPolygon.prototype.simpleIncludeY = function (p) {
|
|
2273
|
+
var y = p.y;
|
|
2274
|
+
return this.minY <= y && this.maxY >= y;
|
|
2275
|
+
};
|
|
2276
|
+
DPolygon.prototype.douglasPeucker = function (points, e) {
|
|
2277
|
+
var dMax = 0;
|
|
2278
|
+
var index = 0;
|
|
2279
|
+
var end = points.length - 1;
|
|
2280
|
+
var line = points[0].findLine(points[end]);
|
|
2281
|
+
for (var i = 1; i < end; i++) {
|
|
2282
|
+
var d = line.perpendicularDistance(points[i]);
|
|
2283
|
+
if (d > dMax) {
|
|
2284
|
+
index = i;
|
|
2285
|
+
dMax = d;
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
if (dMax >= e) {
|
|
2289
|
+
var recResult1 = this.douglasPeucker(points.slice(0, index + 1), e);
|
|
2290
|
+
var recResult2 = this.douglasPeucker(points.slice(index), e);
|
|
2291
|
+
recResult1.pop();
|
|
2292
|
+
return __spreadArray$1(__spreadArray$1([], __read$3(recResult1), false), __read$3(recResult2), false);
|
|
2293
|
+
}
|
|
2294
|
+
return [points[0], points[end]];
|
|
2295
|
+
};
|
|
2296
|
+
DPolygon.prototype.goByPath = function (ctx, steps) {
|
|
2297
|
+
if (steps === void 0) { steps = this.length - 1; }
|
|
2298
|
+
var start = this.first;
|
|
2299
|
+
ctx.moveTo(start.x, start.y);
|
|
2300
|
+
for (var i = 1; i <= (steps % this.length); i++) {
|
|
2301
|
+
var _a = this.at(i), x = _a.x, y = _a.y;
|
|
2302
|
+
ctx.lineTo(x, y);
|
|
2303
|
+
}
|
|
2304
|
+
};
|
|
2305
|
+
DPolygon.prototype.getJSTSGeometry = function (p, unionThis, unionThat) {
|
|
2306
|
+
var unionOrIntersection = unionThat === unionThis;
|
|
2307
|
+
var reader = new jsts.io.WKTReader();
|
|
2308
|
+
var a = reader.read(this.noHoles.toWKT());
|
|
2309
|
+
var b = reader.read(p.noHoles.toWKT());
|
|
2310
|
+
if (!unionOrIntersection) {
|
|
2311
|
+
return a.difference(b);
|
|
2312
|
+
}
|
|
2313
|
+
else if (unionThis) {
|
|
2314
|
+
return a.union(b);
|
|
2315
|
+
}
|
|
2316
|
+
else if (!unionThis) {
|
|
2317
|
+
return a.intersection(b);
|
|
2318
|
+
}
|
|
2319
|
+
return undefined;
|
|
2320
|
+
};
|
|
2321
|
+
DPolygon.prototype.simpleLogicFunction = function (p, unionThis, unionThat) {
|
|
2322
|
+
var e_19, _a, e_20, _b, e_21, _c, e_22, _d;
|
|
2323
|
+
var c = this.getJSTSGeometry(p, unionThis, unionThat);
|
|
2324
|
+
if (c) {
|
|
2325
|
+
var coordinates_1 = c.getCoordinates();
|
|
2326
|
+
if (coordinates_1.length) {
|
|
2327
|
+
var result = coordinates_1.reduce(function (ak, _a, index) {
|
|
2328
|
+
var x = _a.x, y = _a.y;
|
|
2329
|
+
var lastIndex = ak.length - 1;
|
|
2330
|
+
var t = new DPoint(x, y);
|
|
2331
|
+
var first = ak[lastIndex].first;
|
|
2332
|
+
if (t.equal(first)) {
|
|
2333
|
+
if (coordinates_1[index + 1]) {
|
|
2334
|
+
var nextPoint = new DPoint(coordinates_1[index + 1].x, coordinates_1[index + 1].y);
|
|
2335
|
+
if (ak[lastIndex].length > 1) {
|
|
2336
|
+
ak.push(new DPolygon([nextPoint]));
|
|
2337
|
+
}
|
|
2338
|
+
}
|
|
2339
|
+
}
|
|
2340
|
+
else {
|
|
2341
|
+
ak[lastIndex].push(t);
|
|
2342
|
+
}
|
|
2343
|
+
return ak;
|
|
2344
|
+
}, [new DPolygon([new DPoint(coordinates_1[0].x, coordinates_1[0].y)])]);
|
|
2345
|
+
if (unionThat && unionThis && result.length > 1) {
|
|
2346
|
+
try {
|
|
2347
|
+
for (var result_1 = __values$2(result), result_1_1 = result_1.next(); !result_1_1.done; result_1_1 = result_1.next()) {
|
|
2348
|
+
var q = result_1_1.value;
|
|
2349
|
+
var _loop_6 = function (r) {
|
|
2350
|
+
var _e;
|
|
2351
|
+
if (q.has(r.first) && !q.equal(r)) {
|
|
2352
|
+
var index = q.findIndex(r.first);
|
|
2353
|
+
(_e = q.points).splice.apply(_e, __spreadArray$1([index, 0], __read$3(r.points), false));
|
|
2354
|
+
result = result.filter(function (h) { return !h.equal(r); });
|
|
2355
|
+
return "continue";
|
|
2356
|
+
}
|
|
2357
|
+
if (result.length < 2) {
|
|
2358
|
+
return "break";
|
|
2359
|
+
}
|
|
2360
|
+
};
|
|
2361
|
+
try {
|
|
2362
|
+
for (var result_2 = (e_20 = void 0, __values$2(result)), result_2_1 = result_2.next(); !result_2_1.done; result_2_1 = result_2.next()) {
|
|
2363
|
+
var r = result_2_1.value;
|
|
2364
|
+
var state_1 = _loop_6(r);
|
|
2365
|
+
if (state_1 === "break")
|
|
2366
|
+
break;
|
|
2367
|
+
}
|
|
2368
|
+
}
|
|
2369
|
+
catch (e_20_1) { e_20 = { error: e_20_1 }; }
|
|
2370
|
+
finally {
|
|
2371
|
+
try {
|
|
2372
|
+
if (result_2_1 && !result_2_1.done && (_b = result_2.return)) _b.call(result_2);
|
|
2373
|
+
}
|
|
2374
|
+
finally { if (e_20) throw e_20.error; }
|
|
2375
|
+
}
|
|
2376
|
+
if (result.length < 2) {
|
|
2377
|
+
break;
|
|
2378
|
+
}
|
|
2379
|
+
}
|
|
2380
|
+
}
|
|
2381
|
+
catch (e_19_1) { e_19 = { error: e_19_1 }; }
|
|
2382
|
+
finally {
|
|
2383
|
+
try {
|
|
2384
|
+
if (result_1_1 && !result_1_1.done && (_a = result_1.return)) _a.call(result_1);
|
|
2385
|
+
}
|
|
2386
|
+
finally { if (e_19) throw e_19.error; }
|
|
2387
|
+
}
|
|
2388
|
+
}
|
|
2389
|
+
result = result.filter(function (h) { return h.length > 2; }).map(function (h) { return h.close(); });
|
|
2390
|
+
try {
|
|
2391
|
+
for (var result_3 = __values$2(result), result_3_1 = result_3.next(); !result_3_1.done; result_3_1 = result_3.next()) {
|
|
2392
|
+
var q = result_3_1.value;
|
|
2393
|
+
var _loop_7 = function (r) {
|
|
2394
|
+
if (result.length < 2) {
|
|
2395
|
+
return "break";
|
|
2396
|
+
}
|
|
2397
|
+
if (!q.equal(r)) {
|
|
2398
|
+
if (q.contain(r.first, true)) {
|
|
2399
|
+
q.holes.push(r);
|
|
2400
|
+
result = result.filter(function (h) { return !h.equal(r); });
|
|
2401
|
+
}
|
|
2402
|
+
}
|
|
2403
|
+
};
|
|
2404
|
+
try {
|
|
2405
|
+
for (var result_4 = (e_22 = void 0, __values$2(result)), result_4_1 = result_4.next(); !result_4_1.done; result_4_1 = result_4.next()) {
|
|
2406
|
+
var r = result_4_1.value;
|
|
2407
|
+
var state_2 = _loop_7(r);
|
|
2408
|
+
if (state_2 === "break")
|
|
2409
|
+
break;
|
|
2410
|
+
}
|
|
2411
|
+
}
|
|
2412
|
+
catch (e_22_1) { e_22 = { error: e_22_1 }; }
|
|
2413
|
+
finally {
|
|
2414
|
+
try {
|
|
2415
|
+
if (result_4_1 && !result_4_1.done && (_d = result_4.return)) _d.call(result_4);
|
|
2416
|
+
}
|
|
2417
|
+
finally { if (e_22) throw e_22.error; }
|
|
2418
|
+
}
|
|
2419
|
+
if (result.length < 2) {
|
|
2420
|
+
break;
|
|
2421
|
+
}
|
|
2422
|
+
}
|
|
2423
|
+
}
|
|
2424
|
+
catch (e_21_1) { e_21 = { error: e_21_1 }; }
|
|
2425
|
+
finally {
|
|
2426
|
+
try {
|
|
2427
|
+
if (result_3_1 && !result_3_1.done && (_c = result_3.return)) _c.call(result_3);
|
|
2428
|
+
}
|
|
2429
|
+
finally { if (e_21) throw e_21.error; }
|
|
2430
|
+
}
|
|
2431
|
+
if (result.length === 0) {
|
|
2432
|
+
return null;
|
|
2433
|
+
}
|
|
2434
|
+
if (result.length === 1) {
|
|
2435
|
+
return result[0].close();
|
|
2436
|
+
}
|
|
2437
|
+
return result.map(function (g) { return g.close(); });
|
|
2438
|
+
}
|
|
2439
|
+
}
|
|
2440
|
+
return null;
|
|
2441
|
+
};
|
|
2442
|
+
DPolygon.CAP_ROUND = CAP_ROUND;
|
|
2443
|
+
DPolygon.CAP_FLAT = CAP_FLAT;
|
|
2444
|
+
DPolygon.CAP_SQUARE = CAP_SQUARE;
|
|
2445
|
+
DPolygon.WKT_LINESTRING = 'LINESTRING';
|
|
2446
|
+
DPolygon.WKT_POLYGON = 'POLYGON';
|
|
2447
|
+
return DPolygon;
|
|
2448
|
+
}());
|
|
2449
|
+
|
|
2450
|
+
var __assign = (undefined && undefined.__assign) || function () {
|
|
2451
|
+
__assign = Object.assign || function(t) {
|
|
2452
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
2453
|
+
s = arguments[i];
|
|
2454
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
2455
|
+
t[p] = s[p];
|
|
2456
|
+
}
|
|
2457
|
+
return t;
|
|
2458
|
+
};
|
|
2459
|
+
return __assign.apply(this, arguments);
|
|
2460
|
+
};
|
|
2461
|
+
var __read$2 = (undefined && undefined.__read) || function (o, n) {
|
|
2462
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
2463
|
+
if (!m) return o;
|
|
2464
|
+
var i = m.call(o), r, ar = [], e;
|
|
2465
|
+
try {
|
|
2466
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
2467
|
+
}
|
|
2468
|
+
catch (error) { e = { error: error }; }
|
|
2469
|
+
finally {
|
|
2470
|
+
try {
|
|
2471
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
2472
|
+
}
|
|
2473
|
+
finally { if (e) throw e.error; }
|
|
2474
|
+
}
|
|
2475
|
+
return ar;
|
|
2476
|
+
};
|
|
2477
|
+
var diff = 0;
|
|
2478
|
+
var radiansPolygon = new DPolygon();
|
|
2479
|
+
var pseudoMercatorPolygon = new DPolygon();
|
|
2480
|
+
var worldGeodeticPolygon = new DPolygon();
|
|
2481
|
+
var EARTH_RADIUS_IN_METERS = 6371008.8;
|
|
2482
|
+
var EARTH_IN_MITERS = 20037508.34;
|
|
2483
|
+
var DEGREES_IN_EARTH = 180;
|
|
2484
|
+
var MITERS_IN_ONE_DEGREE = EARTH_IN_MITERS / DEGREES_IN_EARTH;
|
|
2485
|
+
var DEGREES_IN_ONE_MITER = DEGREES_IN_EARTH / EARTH_IN_MITERS;
|
|
2486
|
+
var HALF_PI_IN_DEGREE = 90;
|
|
2487
|
+
var PI_IN_DEGREE = 180;
|
|
2488
|
+
var DOUBLE_PI_IN_DEGREE = 360;
|
|
2489
|
+
var PI_TO_DEGREE = Math.PI / PI_IN_DEGREE;
|
|
2490
|
+
var DEGREE_TO_PI = PI_IN_DEGREE / Math.PI;
|
|
2491
|
+
var DPoint = (function () {
|
|
2492
|
+
function DPoint(x, y, z) {
|
|
2493
|
+
if (x === void 0) { x = 0; }
|
|
2494
|
+
if (y === void 0) { y = x; }
|
|
2495
|
+
this.x = x;
|
|
2496
|
+
this.y = y;
|
|
2497
|
+
this.z = z;
|
|
2498
|
+
this.properties = {};
|
|
2499
|
+
}
|
|
2500
|
+
DPoint.zero = function () {
|
|
2501
|
+
return new DPoint();
|
|
2502
|
+
};
|
|
2503
|
+
DPoint.parse = function (c) {
|
|
2504
|
+
var _a = c, lat = _a.lat, lng = _a.lng;
|
|
2505
|
+
if (lat && lng) {
|
|
2506
|
+
return new DPoint(lat, lng, 0);
|
|
2507
|
+
}
|
|
2508
|
+
var _b = __read$2(c, 3), x = _b[0], y = _b[1], z = _b[2];
|
|
2509
|
+
return new DPoint(x, y, z);
|
|
2510
|
+
};
|
|
2511
|
+
DPoint.parseFromWKT = function (wkt) {
|
|
2512
|
+
var regexp = /POINT \((?<data>(?:(?!\)).)*?)\)$/miu;
|
|
2513
|
+
var data = wkt.trim().toUpperCase();
|
|
2514
|
+
var res = regexp.exec(data);
|
|
2515
|
+
var _a = __read$2(res.groups.data.split(' ').map(Number), 3), x = _a[0], y = _a[1], z = _a[2];
|
|
2516
|
+
return new DPoint(x, y, z);
|
|
2517
|
+
};
|
|
2518
|
+
DPoint.random = function () {
|
|
2519
|
+
return new DPoint(Math.random(), Math.random());
|
|
2520
|
+
};
|
|
2521
|
+
DPoint.prototype.getTileFromCoords = function (zoom) {
|
|
2522
|
+
if (zoom === void 0) { zoom = this.z; }
|
|
2523
|
+
checkFunction('getTileFromCoords')
|
|
2524
|
+
.checkArgument('this')
|
|
2525
|
+
.shouldBeDegree(this);
|
|
2526
|
+
var x = Math.floor((this.x + PI_IN_DEGREE) / DOUBLE_PI_IN_DEGREE * (Math.pow(2, zoom)));
|
|
2527
|
+
var y = Math.floor((1 - Math.log(Math.tan(this.y * PI_TO_DEGREE) + 1 / Math.cos(this.y * PI_TO_DEGREE)) / Math.PI) / 2 * (Math.pow(2, zoom)));
|
|
2528
|
+
return new DPoint(x, y, zoom);
|
|
2529
|
+
};
|
|
2530
|
+
DPoint.prototype.getCoordsFromTile = function (zoom) {
|
|
2531
|
+
if (zoom === void 0) { zoom = this.z; }
|
|
2532
|
+
checkFunction('getCoordsFromTile')
|
|
2533
|
+
.checkArgument('this')
|
|
2534
|
+
.shouldBeUInt(this);
|
|
2535
|
+
var n = Math.PI - 2 * Math.PI * this.y / (Math.pow(2, zoom));
|
|
2536
|
+
var x = this.x / (Math.pow(2, zoom)) * DOUBLE_PI_IN_DEGREE - PI_IN_DEGREE;
|
|
2537
|
+
var y = PI_IN_DEGREE / Math.PI * Math.atan((Math.exp(n) - Math.exp(-n)) / 2);
|
|
2538
|
+
return new DPoint(x, y, zoom);
|
|
2539
|
+
};
|
|
2540
|
+
DPoint.prototype.toCoords = function () {
|
|
2541
|
+
if (this.z === undefined) {
|
|
2542
|
+
return [this.x, this.y];
|
|
2543
|
+
}
|
|
2544
|
+
return [this.x, this.y, this.z];
|
|
2545
|
+
};
|
|
2546
|
+
DPoint.prototype.findLine = function (p) {
|
|
2547
|
+
checkFunction('findLine')
|
|
2548
|
+
.checkArgument('this')
|
|
2549
|
+
.shouldBeMeters(this)
|
|
2550
|
+
.checkArgument('p')
|
|
2551
|
+
.shouldBeMeters(p);
|
|
2552
|
+
if (this.equal(p)) {
|
|
2553
|
+
return this.findLine(p.clone().move(0, 1));
|
|
2554
|
+
}
|
|
2555
|
+
var a = this.y - p.y - diff;
|
|
2556
|
+
var b = p.x - this.x - diff;
|
|
2557
|
+
var c = this.x * p.y - p.x * this.y - diff;
|
|
2558
|
+
if (a === 0) {
|
|
2559
|
+
return new DLine(0, 1, c / b, this, p);
|
|
2560
|
+
}
|
|
2561
|
+
if (b === 0) {
|
|
2562
|
+
return new DLine(1, 0, c / a, this, p);
|
|
2563
|
+
}
|
|
2564
|
+
return new DLine(a, b, c, this, p);
|
|
2565
|
+
};
|
|
2566
|
+
DPoint.prototype.findInnerAngle = function (p1, p3) {
|
|
2567
|
+
checkFunction('findInnerAngle')
|
|
2568
|
+
.checkArgument('this')
|
|
2569
|
+
.shouldBeMeters(this)
|
|
2570
|
+
.checkArgument('p1')
|
|
2571
|
+
.shouldBeMeters(p1)
|
|
2572
|
+
.checkArgument('p3')
|
|
2573
|
+
.shouldBeMeters(p3);
|
|
2574
|
+
var a1 = this.findLine(p1).getFi();
|
|
2575
|
+
var a2 = this.findLine(p3).getFi();
|
|
2576
|
+
if (a2 >= a1) {
|
|
2577
|
+
return a2 - a1;
|
|
2578
|
+
}
|
|
2579
|
+
return a2 + Math.PI * 2 - a1;
|
|
2580
|
+
};
|
|
2581
|
+
DPoint.prototype.toString = function () {
|
|
2582
|
+
return this.x + " " + this.y;
|
|
2583
|
+
};
|
|
2584
|
+
DPoint.prototype.getValue = function () {
|
|
2585
|
+
return [this.x, this.y];
|
|
2586
|
+
};
|
|
2587
|
+
DPoint.prototype.height = function (z) {
|
|
2588
|
+
this.z = z;
|
|
2589
|
+
return this;
|
|
2590
|
+
};
|
|
2591
|
+
DPoint.prototype.toWKT = function () {
|
|
2592
|
+
var _a = this, x = _a.x, y = _a.y;
|
|
2593
|
+
return "POINT (" + x + " " + y + ")";
|
|
2594
|
+
};
|
|
2595
|
+
DPoint.prototype.distance = function (p) {
|
|
2596
|
+
checkFunction('distance')
|
|
2597
|
+
.checkArgument('this')
|
|
2598
|
+
.shouldBeMeters(this)
|
|
2599
|
+
.checkArgument('p')
|
|
2600
|
+
.shouldBeMeters(p);
|
|
2601
|
+
var dx = p.x - this.x;
|
|
2602
|
+
var dy = p.y - this.y;
|
|
2603
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
2604
|
+
};
|
|
2605
|
+
DPoint.prototype.distance3d = function (p) {
|
|
2606
|
+
checkFunction('distance3d')
|
|
2607
|
+
.checkArgument('this')
|
|
2608
|
+
.shouldBeMeters(this)
|
|
2609
|
+
.checkArgument('p')
|
|
2610
|
+
.shouldBeMeters(p)
|
|
2611
|
+
.checkArgument('this.z')
|
|
2612
|
+
.shouldExist(this.z)
|
|
2613
|
+
.checkArgument('p.z')
|
|
2614
|
+
.shouldExist(p.z);
|
|
2615
|
+
var dx = p.x - this.x;
|
|
2616
|
+
var dy = p.y - this.y;
|
|
2617
|
+
var dz = p.z - this.z;
|
|
2618
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
2619
|
+
};
|
|
2620
|
+
DPoint.prototype.setX = function (x) {
|
|
2621
|
+
this.x = typeof x === 'number' ? x : x(this);
|
|
2622
|
+
return this;
|
|
2623
|
+
};
|
|
2624
|
+
DPoint.prototype.setZ = function (z) {
|
|
2625
|
+
this.z = typeof z === 'number' ? z : z(this);
|
|
2626
|
+
return this;
|
|
2627
|
+
};
|
|
2628
|
+
DPoint.prototype.setY = function (y) {
|
|
2629
|
+
this.y = typeof y === 'number' ? y : y(this);
|
|
2630
|
+
return this;
|
|
2631
|
+
};
|
|
2632
|
+
DPoint.prototype.clone = function () {
|
|
2633
|
+
var p = new DPoint(this.x, this.y, this.z);
|
|
2634
|
+
p.properties = __assign({}, this.properties);
|
|
2635
|
+
return p;
|
|
2636
|
+
};
|
|
2637
|
+
DPoint.prototype.gt = function (p) {
|
|
2638
|
+
return this.x > p.x && this.y > p.y;
|
|
2639
|
+
};
|
|
2640
|
+
DPoint.prototype.lt = function (p) {
|
|
2641
|
+
return this.x < p.x && this.y < p.y;
|
|
2642
|
+
};
|
|
2643
|
+
DPoint.prototype.gtOrEqual = function (p) {
|
|
2644
|
+
return this.gt(p) || this.equal(p);
|
|
2645
|
+
};
|
|
2646
|
+
DPoint.prototype.ltOrEqual = function (p) {
|
|
2647
|
+
return this.lt(p) || this.equal(p);
|
|
2648
|
+
};
|
|
2649
|
+
DPoint.prototype.rotate = function (a) {
|
|
2650
|
+
var x = this.x * Math.cos(a) - this.y * Math.sin(a);
|
|
2651
|
+
var y = this.x * Math.sin(a) + this.y * Math.cos(a);
|
|
2652
|
+
this.x = x;
|
|
2653
|
+
this.y = y;
|
|
2654
|
+
return this;
|
|
2655
|
+
};
|
|
2656
|
+
DPoint.prototype.rotate3dX = function (a) {
|
|
2657
|
+
var _a = this, y = _a.y, z = _a.z;
|
|
2658
|
+
this.y = y * Math.cos(a) + z * Math.sin(a);
|
|
2659
|
+
this.z = -y * Math.sin(a) + z * Math.cos(a);
|
|
2660
|
+
return this;
|
|
2661
|
+
};
|
|
2662
|
+
DPoint.prototype.rotate3dY = function (a) {
|
|
2663
|
+
var _a = this, x = _a.x, z = _a.z;
|
|
2664
|
+
this.x = x * Math.cos(a) + z * Math.sin(a);
|
|
2665
|
+
this.z = -x * Math.sin(a) + z * Math.cos(a);
|
|
2666
|
+
return this;
|
|
2667
|
+
};
|
|
2668
|
+
DPoint.prototype.rotate3dZ = function (a) {
|
|
2669
|
+
var _a = this, x = _a.x, y = _a.y;
|
|
2670
|
+
this.x = x * Math.cos(a) - y * Math.sin(a);
|
|
2671
|
+
this.y = -x * Math.sin(a) + y * Math.cos(a);
|
|
2672
|
+
return this;
|
|
2673
|
+
};
|
|
2674
|
+
DPoint.prototype.move = function (x, y, z) {
|
|
2675
|
+
if (y === void 0) { y = x; }
|
|
2676
|
+
var xV = 0;
|
|
2677
|
+
var yV = 0;
|
|
2678
|
+
var zV = undefined;
|
|
2679
|
+
if (x instanceof DPoint) {
|
|
2680
|
+
xV = this.x + x.x;
|
|
2681
|
+
yV = this.y + x.y;
|
|
2682
|
+
if (isDefAndNotNull(this.z) && isDefAndNotNull(x.z)) {
|
|
2683
|
+
zV = this.z + x.z;
|
|
2684
|
+
}
|
|
2685
|
+
}
|
|
2686
|
+
else {
|
|
2687
|
+
xV = this.x + x;
|
|
2688
|
+
yV = this.y + y;
|
|
2689
|
+
if (isDefAndNotNull(this.z) && isDefAndNotNull(z)) {
|
|
2690
|
+
zV = this.z + z;
|
|
2691
|
+
}
|
|
2692
|
+
}
|
|
2693
|
+
this.x = xV;
|
|
2694
|
+
this.y = yV;
|
|
2695
|
+
if (isDefAndNotNull(zV)) {
|
|
2696
|
+
this.z = zV;
|
|
2697
|
+
}
|
|
2698
|
+
return this;
|
|
2699
|
+
};
|
|
2700
|
+
DPoint.prototype.degreeToMeters = function () {
|
|
2701
|
+
checkFunction('degreeToMeters')
|
|
2702
|
+
.checkArgument('this')
|
|
2703
|
+
.shouldBeDegree(this);
|
|
2704
|
+
var x = ((this.x + PI_IN_DEGREE) % DOUBLE_PI_IN_DEGREE - PI_IN_DEGREE) * MITERS_IN_ONE_DEGREE;
|
|
2705
|
+
var y = (Math.log(Math.tan(((this.y + HALF_PI_IN_DEGREE) % PI_IN_DEGREE) *
|
|
2706
|
+
(Math.PI / DOUBLE_PI_IN_DEGREE))) / PI_TO_DEGREE) * MITERS_IN_ONE_DEGREE;
|
|
2707
|
+
this.x = x;
|
|
2708
|
+
this.y = y;
|
|
2709
|
+
return this;
|
|
2710
|
+
};
|
|
2711
|
+
DPoint.prototype.metersToDegree = function () {
|
|
2712
|
+
checkFunction('metersToDegree')
|
|
2713
|
+
.checkArgument('this')
|
|
2714
|
+
.shouldBeMeters(this);
|
|
2715
|
+
var lon = this.x * DEGREES_IN_ONE_MITER;
|
|
2716
|
+
var lat = Math.atan(Math.pow(Math.E, ((this.y / MITERS_IN_ONE_DEGREE) * PI_TO_DEGREE))) *
|
|
2717
|
+
(DOUBLE_PI_IN_DEGREE / Math.PI) - HALF_PI_IN_DEGREE;
|
|
2718
|
+
this.x = lon;
|
|
2719
|
+
this.y = lat;
|
|
2720
|
+
return this;
|
|
2721
|
+
};
|
|
2722
|
+
DPoint.prototype.degreeToRadians = function () {
|
|
2723
|
+
checkFunction('degreeToRadians')
|
|
2724
|
+
.checkArgument('this')
|
|
2725
|
+
.shouldBeDegree(this);
|
|
2726
|
+
return this.scale(PI_TO_DEGREE);
|
|
2727
|
+
};
|
|
2728
|
+
DPoint.prototype.radiansToDegrees = function () {
|
|
2729
|
+
checkFunction('radiansToDegrees')
|
|
2730
|
+
.checkArgument('this')
|
|
2731
|
+
.shouldBeRadians(this);
|
|
2732
|
+
return this.scale(DEGREE_TO_PI);
|
|
2733
|
+
};
|
|
2734
|
+
DPoint.prototype.radiansToMeters = function () {
|
|
2735
|
+
checkFunction('radiansToMeters')
|
|
2736
|
+
.checkArgument('this')
|
|
2737
|
+
.shouldBeRadians(this);
|
|
2738
|
+
return this.radiansToDegrees().degreeToMeters();
|
|
2739
|
+
};
|
|
2740
|
+
DPoint.prototype.metersToRadians = function () {
|
|
2741
|
+
checkFunction('metersToRadians')
|
|
2742
|
+
.checkArgument('this')
|
|
2743
|
+
.shouldBeMeters(this);
|
|
2744
|
+
return this.metersToDegree().degreeToRadians();
|
|
2745
|
+
};
|
|
2746
|
+
DPoint.prototype.round = function () {
|
|
2747
|
+
this.x = Math.round(this.x);
|
|
2748
|
+
this.y = Math.round(this.y);
|
|
2749
|
+
return this;
|
|
2750
|
+
};
|
|
2751
|
+
DPoint.prototype.ceil = function () {
|
|
2752
|
+
this.x = Math.ceil(this.x);
|
|
2753
|
+
this.y = Math.ceil(this.y);
|
|
2754
|
+
return this;
|
|
2755
|
+
};
|
|
2756
|
+
DPoint.prototype.floor = function () {
|
|
2757
|
+
this.x = Math.floor(this.x);
|
|
2758
|
+
this.y = Math.floor(this.y);
|
|
2759
|
+
return this;
|
|
2760
|
+
};
|
|
2761
|
+
DPoint.prototype.toFixed = function (n) {
|
|
2762
|
+
if (n === void 0) { n = 2; }
|
|
2763
|
+
this.x = parseFloat(this.x.toFixed(n));
|
|
2764
|
+
this.y = parseFloat(this.y.toFixed(n));
|
|
2765
|
+
return this;
|
|
2766
|
+
};
|
|
2767
|
+
DPoint.prototype.abs = function () {
|
|
2768
|
+
this.x = Math.abs(this.x);
|
|
2769
|
+
this.y = Math.abs(this.y);
|
|
2770
|
+
return this;
|
|
2771
|
+
};
|
|
2772
|
+
DPoint.prototype.scale = function (x, y, z) {
|
|
2773
|
+
if (y === void 0) { y = x; }
|
|
2774
|
+
var xV = 0;
|
|
2775
|
+
var yV = 0;
|
|
2776
|
+
var zV = undefined;
|
|
2777
|
+
if (x instanceof DPoint) {
|
|
2778
|
+
xV = this.x * x.x;
|
|
2779
|
+
yV = this.y * x.y;
|
|
2780
|
+
if (isDefAndNotNull(this.z) && isDefAndNotNull(x.z)) {
|
|
2781
|
+
zV = this.z * x.z;
|
|
2782
|
+
}
|
|
2783
|
+
}
|
|
2784
|
+
else {
|
|
2785
|
+
xV = this.x * x;
|
|
2786
|
+
yV = this.y * y;
|
|
2787
|
+
if (isDefAndNotNull(this.z) && isDefAndNotNull(z)) {
|
|
2788
|
+
zV = this.z * z;
|
|
2789
|
+
}
|
|
2790
|
+
}
|
|
2791
|
+
this.x = xV;
|
|
2792
|
+
this.y = yV;
|
|
2793
|
+
if (isDefAndNotNull(zV)) {
|
|
2794
|
+
this.z = zV;
|
|
2795
|
+
}
|
|
2796
|
+
return this;
|
|
2797
|
+
};
|
|
2798
|
+
DPoint.prototype.divide = function (x, y, z) {
|
|
2799
|
+
if (y === void 0) { y = x; }
|
|
2800
|
+
var xV = 0;
|
|
2801
|
+
var yV = 0;
|
|
2802
|
+
var zV = undefined;
|
|
2803
|
+
if (x instanceof DPoint) {
|
|
2804
|
+
xV = this.x / x.x;
|
|
2805
|
+
yV = this.y / x.y;
|
|
2806
|
+
if (isDefAndNotNull(this.z) && isDefAndNotNull(x.z)) {
|
|
2807
|
+
zV = this.z / x.z;
|
|
2808
|
+
}
|
|
2809
|
+
}
|
|
2810
|
+
else {
|
|
2811
|
+
xV = this.x / x;
|
|
2812
|
+
yV = this.y / y;
|
|
2813
|
+
if (isDefAndNotNull(this.z) && isDefAndNotNull(z)) {
|
|
2814
|
+
zV = this.z / z;
|
|
2815
|
+
}
|
|
2816
|
+
}
|
|
2817
|
+
this.x = xV;
|
|
2818
|
+
this.y = yV;
|
|
2819
|
+
if (isDefAndNotNull(zV)) {
|
|
2820
|
+
this.z = zV;
|
|
2821
|
+
}
|
|
2822
|
+
return this;
|
|
2823
|
+
};
|
|
2824
|
+
DPoint.prototype.equal = function (p) {
|
|
2825
|
+
return this.x === p.x && this.y === p.y && this.z === p.z;
|
|
2826
|
+
};
|
|
2827
|
+
DPoint.prototype.like = function (p, d) {
|
|
2828
|
+
var _a, _b, _c, _d;
|
|
2829
|
+
if (d === void 0) { d = 0.001; }
|
|
2830
|
+
if (this.equal(p)) {
|
|
2831
|
+
return true;
|
|
2832
|
+
}
|
|
2833
|
+
var likeX = Math.abs(this.x - p.x) < d;
|
|
2834
|
+
var likeY = Math.abs(this.y - p.y) < d;
|
|
2835
|
+
var likeZ = Math.abs(((_b = (_a = this.z) !== null && _a !== void 0 ? _a : p.z) !== null && _b !== void 0 ? _b : 0) - ((_d = (_c = p.z) !== null && _c !== void 0 ? _c : this.z) !== null && _d !== void 0 ? _d : 0)) < d;
|
|
2836
|
+
return likeX && likeY && likeZ;
|
|
2837
|
+
};
|
|
2838
|
+
DPoint.prototype.flipVertically = function (size) {
|
|
2839
|
+
var v = size;
|
|
2840
|
+
if (size instanceof DPoint) {
|
|
2841
|
+
v = size.y;
|
|
2842
|
+
}
|
|
2843
|
+
this.y = v - this.y;
|
|
2844
|
+
return this;
|
|
2845
|
+
};
|
|
2846
|
+
Object.defineProperty(DPoint.prototype, "likeRadians", {
|
|
2847
|
+
get: function () {
|
|
2848
|
+
if (radiansPolygon.length === 0) {
|
|
2849
|
+
radiansPolygon.push(new DPoint(-Math.PI, -Math.PI / 2), new DPoint(Math.PI, Math.PI / 2));
|
|
2850
|
+
}
|
|
2851
|
+
return radiansPolygon.simpleInclude(this);
|
|
2852
|
+
},
|
|
2853
|
+
enumerable: false,
|
|
2854
|
+
configurable: true
|
|
2855
|
+
});
|
|
2856
|
+
Object.defineProperty(DPoint.prototype, "likeWorldGeodeticSystem", {
|
|
2857
|
+
get: function () {
|
|
2858
|
+
if (worldGeodeticPolygon.length === 0) {
|
|
2859
|
+
worldGeodeticPolygon.push(new DPoint(-180, -90), new DPoint(180, 90));
|
|
2860
|
+
}
|
|
2861
|
+
return !this.likeRadians && worldGeodeticPolygon.simpleInclude(this);
|
|
2862
|
+
},
|
|
2863
|
+
enumerable: false,
|
|
2864
|
+
configurable: true
|
|
2865
|
+
});
|
|
2866
|
+
Object.defineProperty(DPoint.prototype, "likePseudoMercator", {
|
|
2867
|
+
get: function () {
|
|
2868
|
+
if (pseudoMercatorPolygon.length === 0) {
|
|
2869
|
+
pseudoMercatorPolygon.push(new DPoint(-20026376.39, -20048966.10), new DPoint(20026376.39, 20048966.10));
|
|
2870
|
+
}
|
|
2871
|
+
return !this.likeRadians && !this.likeWorldGeodeticSystem && pseudoMercatorPolygon.simpleInclude(this);
|
|
2872
|
+
},
|
|
2873
|
+
enumerable: false,
|
|
2874
|
+
configurable: true
|
|
2875
|
+
});
|
|
2876
|
+
Object.defineProperty(DPoint.prototype, "w", {
|
|
2877
|
+
get: function () {
|
|
2878
|
+
return this.x;
|
|
2879
|
+
},
|
|
2880
|
+
set: function (x) {
|
|
2881
|
+
this.x = x;
|
|
2882
|
+
},
|
|
2883
|
+
enumerable: false,
|
|
2884
|
+
configurable: true
|
|
2885
|
+
});
|
|
2886
|
+
Object.defineProperty(DPoint.prototype, "h", {
|
|
2887
|
+
get: function () {
|
|
2888
|
+
return this.y;
|
|
2889
|
+
},
|
|
2890
|
+
set: function (y) {
|
|
2891
|
+
this.y = y;
|
|
2892
|
+
},
|
|
2893
|
+
enumerable: false,
|
|
2894
|
+
configurable: true
|
|
2895
|
+
});
|
|
2896
|
+
Object.defineProperty(DPoint.prototype, "area", {
|
|
2897
|
+
get: function () {
|
|
2898
|
+
checkFunction('area')
|
|
2899
|
+
.checkArgument('this')
|
|
2900
|
+
.shouldBeMeters(this);
|
|
2901
|
+
return this.w * this.h;
|
|
2902
|
+
},
|
|
2903
|
+
enumerable: false,
|
|
2904
|
+
configurable: true
|
|
2905
|
+
});
|
|
2906
|
+
Object.defineProperty(DPoint.prototype, "hip", {
|
|
2907
|
+
get: function () {
|
|
2908
|
+
checkFunction('hip')
|
|
2909
|
+
.checkArgument('this')
|
|
2910
|
+
.shouldBeMeters(this);
|
|
2911
|
+
return Math.sqrt(this.w * this.w + this.h * this.h);
|
|
2912
|
+
},
|
|
2913
|
+
enumerable: false,
|
|
2914
|
+
configurable: true
|
|
2915
|
+
});
|
|
2916
|
+
Object.defineProperty(DPoint.prototype, "min", {
|
|
2917
|
+
get: function () {
|
|
2918
|
+
return Math.min(this.x, this.y);
|
|
2919
|
+
},
|
|
2920
|
+
enumerable: false,
|
|
2921
|
+
configurable: true
|
|
2922
|
+
});
|
|
2923
|
+
Object.defineProperty(DPoint.prototype, "max", {
|
|
2924
|
+
get: function () {
|
|
2925
|
+
return Math.max(this.x, this.y);
|
|
2926
|
+
},
|
|
2927
|
+
enumerable: false,
|
|
2928
|
+
configurable: true
|
|
2929
|
+
});
|
|
2930
|
+
Object.defineProperty(DPoint.prototype, "hipPoint", {
|
|
2931
|
+
get: function () {
|
|
2932
|
+
var hip = this.hip;
|
|
2933
|
+
return new DPoint(hip, hip);
|
|
2934
|
+
},
|
|
2935
|
+
enumerable: false,
|
|
2936
|
+
configurable: true
|
|
2937
|
+
});
|
|
2938
|
+
Object.defineProperty(DPoint.prototype, "xPoint", {
|
|
2939
|
+
get: function () {
|
|
2940
|
+
var x = this.x;
|
|
2941
|
+
return new DPoint(x, x);
|
|
2942
|
+
},
|
|
2943
|
+
enumerable: false,
|
|
2944
|
+
configurable: true
|
|
2945
|
+
});
|
|
2946
|
+
Object.defineProperty(DPoint.prototype, "yPoint", {
|
|
2947
|
+
get: function () {
|
|
2948
|
+
var y = this.y;
|
|
2949
|
+
return new DPoint(y, y);
|
|
2950
|
+
},
|
|
2951
|
+
enumerable: false,
|
|
2952
|
+
configurable: true
|
|
2953
|
+
});
|
|
2954
|
+
Object.defineProperty(DPoint.prototype, "wPoint", {
|
|
2955
|
+
get: function () {
|
|
2956
|
+
return this.xPoint;
|
|
2957
|
+
},
|
|
2958
|
+
enumerable: false,
|
|
2959
|
+
configurable: true
|
|
2960
|
+
});
|
|
2961
|
+
Object.defineProperty(DPoint.prototype, "hPoint", {
|
|
2962
|
+
get: function () {
|
|
2963
|
+
return this.yPoint;
|
|
2964
|
+
},
|
|
2965
|
+
enumerable: false,
|
|
2966
|
+
configurable: true
|
|
2967
|
+
});
|
|
2968
|
+
DPoint.prototype.simple = function (xKey, yKey) {
|
|
2969
|
+
var _a;
|
|
2970
|
+
if (xKey === void 0) { xKey = 'x'; }
|
|
2971
|
+
if (yKey === void 0) { yKey = 'y'; }
|
|
2972
|
+
return _a = {},
|
|
2973
|
+
_a[xKey] = this.x,
|
|
2974
|
+
_a[yKey] = this.y,
|
|
2975
|
+
_a;
|
|
2976
|
+
};
|
|
2977
|
+
DPoint.prototype.setIfLessThan = function (p) {
|
|
2978
|
+
this.x = Math.max(this.x, p.x);
|
|
2979
|
+
this.y = Math.max(this.y, p.y);
|
|
2980
|
+
return this;
|
|
2981
|
+
};
|
|
2982
|
+
DPoint.prototype.minus = function () {
|
|
2983
|
+
return this.scale(-1);
|
|
2984
|
+
};
|
|
2985
|
+
DPoint.prototype.orthodromicPath = function (point, pointsCount) {
|
|
2986
|
+
if (pointsCount === void 0) { pointsCount = 360; }
|
|
2987
|
+
checkFunction('orthodromicPath')
|
|
2988
|
+
.checkArgument('this')
|
|
2989
|
+
.shouldBeDegree(this)
|
|
2990
|
+
.checkArgument('point')
|
|
2991
|
+
.shouldBeDegree(point);
|
|
2992
|
+
var t = this.clone().degreeToRadians();
|
|
2993
|
+
var p = point.clone().degreeToRadians();
|
|
2994
|
+
var d = Math.sin(p.x - t.x);
|
|
2995
|
+
var step = (p.x - t.x) / (pointsCount - 1);
|
|
2996
|
+
return new DPolygon(createArray(pointsCount)
|
|
2997
|
+
.map(function (v, i) {
|
|
2998
|
+
var x = t.x + step * i;
|
|
2999
|
+
var y = Math.atan((Math.tan(t.y) * Math.sin(p.x - x)) / d +
|
|
3000
|
+
(Math.tan(p.y) * Math.sin(x - t.x)) / d);
|
|
3001
|
+
return new DPoint(x, y).radiansToDegrees();
|
|
3002
|
+
}));
|
|
3003
|
+
};
|
|
3004
|
+
DPoint.prototype.sortByDistance = function (p) {
|
|
3005
|
+
var _this = this;
|
|
3006
|
+
return p
|
|
3007
|
+
.clone()
|
|
3008
|
+
.map(function (d, index) {
|
|
3009
|
+
d.properties.distance = d.distance(_this);
|
|
3010
|
+
d.properties.index = index;
|
|
3011
|
+
return d;
|
|
3012
|
+
})
|
|
3013
|
+
.sort(function (a, b) { return a.properties.distance - b.properties.distance; });
|
|
3014
|
+
};
|
|
3015
|
+
return DPoint;
|
|
3016
|
+
}());
|
|
3017
|
+
|
|
3018
|
+
var DCircle = (function () {
|
|
3019
|
+
function DCircle(center, r) {
|
|
3020
|
+
if (center === void 0) { center = DPoint.zero(); }
|
|
3021
|
+
if (r === void 0) { r = 0; }
|
|
3022
|
+
this.center = center;
|
|
3023
|
+
this.r = r;
|
|
3024
|
+
}
|
|
3025
|
+
DCircle.prototype.toString = function () {
|
|
3026
|
+
return "(" + this.center.toString() + ", " + this.r + ")";
|
|
3027
|
+
};
|
|
3028
|
+
DCircle.prototype.getValue = function () {
|
|
3029
|
+
return { center: this.center, r: this.r };
|
|
3030
|
+
};
|
|
3031
|
+
DCircle.prototype.clone = function () {
|
|
3032
|
+
return new DCircle(this.center, this.r);
|
|
3033
|
+
};
|
|
3034
|
+
DCircle.prototype.findPoints = function (c) {
|
|
3035
|
+
if (this.equal(c)) {
|
|
3036
|
+
return Infinity;
|
|
3037
|
+
}
|
|
3038
|
+
var _a = this, _b = _a.center, x0 = _b.x, y0 = _b.y, r0 = _a.r;
|
|
3039
|
+
var _c = c.center, x1 = _c.x, y1 = _c.y, r1 = c.r;
|
|
3040
|
+
var r02 = r0 * r0;
|
|
3041
|
+
var d = this.center.distance(c.center);
|
|
3042
|
+
var a = (r02 - r1 * r1 + d * d) / (2 * d);
|
|
3043
|
+
var h = Math.sqrt(r02 - a * a);
|
|
3044
|
+
var ad = a / d;
|
|
3045
|
+
var dy = y1 - y0;
|
|
3046
|
+
var dx = x1 - x0;
|
|
3047
|
+
var hd = h / d;
|
|
3048
|
+
var x2 = x0 + ad * (x1 - x0);
|
|
3049
|
+
var y2 = y0 + ad * (y1 - y0);
|
|
3050
|
+
var x31 = x2 + hd * dy;
|
|
3051
|
+
var y31 = y2 - hd * dx;
|
|
3052
|
+
var x32 = x2 - hd * dy;
|
|
3053
|
+
var y32 = y2 + hd * dx;
|
|
3054
|
+
var res = [];
|
|
3055
|
+
if (!isNaN(x31) && !isNaN(y31)) {
|
|
3056
|
+
res.push(new DPoint(x31, y31));
|
|
3057
|
+
}
|
|
3058
|
+
if (!isNaN(x32) && !isNaN(y32) && !(x31 === x32 && y31 === y32)) {
|
|
3059
|
+
res.push(new DPoint(x32, y32));
|
|
3060
|
+
}
|
|
3061
|
+
return res;
|
|
3062
|
+
};
|
|
3063
|
+
DCircle.prototype.equal = function (_a) {
|
|
3064
|
+
var center = _a.center, r = _a.r;
|
|
3065
|
+
return this.center.equal(center) && this.r === r;
|
|
3066
|
+
};
|
|
3067
|
+
DCircle.prototype.findPolygonInside = function (pointCount, startAngle, stopAngle) {
|
|
3068
|
+
if (pointCount === void 0) { pointCount = 64; }
|
|
3069
|
+
if (startAngle === void 0) { startAngle = 0; }
|
|
3070
|
+
if (stopAngle === void 0) { stopAngle = 2 * Math.PI; }
|
|
3071
|
+
var step = 2 * Math.PI / pointCount;
|
|
3072
|
+
var points = [];
|
|
3073
|
+
var angle = startAngle;
|
|
3074
|
+
while (angle < stopAngle - step) {
|
|
3075
|
+
points.push(new DPoint(this.r).scale(Math.cos(angle), Math.sin(angle))
|
|
3076
|
+
.move(this.center));
|
|
3077
|
+
angle += step;
|
|
3078
|
+
}
|
|
3079
|
+
var x = this.r * Math.cos(stopAngle) + this.center.x;
|
|
3080
|
+
var y = this.r * Math.sin(stopAngle) + this.center.y;
|
|
3081
|
+
points.push(new DPoint(x, y));
|
|
3082
|
+
return new DPolygon(points);
|
|
3083
|
+
};
|
|
3084
|
+
DCircle.prototype.findPolygonInsideOnSphere = function (pointCount, startAngle, stopAngle) {
|
|
3085
|
+
if (pointCount === void 0) { pointCount = 64; }
|
|
3086
|
+
if (startAngle === void 0) { startAngle = 0; }
|
|
3087
|
+
if (stopAngle === void 0) { stopAngle = 2 * Math.PI; }
|
|
3088
|
+
checkFunction('findPolygonInsideOnSphere')
|
|
3089
|
+
.checkArgument('center')
|
|
3090
|
+
.shouldBeDegree(this.center);
|
|
3091
|
+
var step = 2 * Math.PI / pointCount;
|
|
3092
|
+
var points = [];
|
|
3093
|
+
var angle = startAngle;
|
|
3094
|
+
while (angle < stopAngle - step) {
|
|
3095
|
+
points.push(this.sphereOffset(angle));
|
|
3096
|
+
angle += step;
|
|
3097
|
+
}
|
|
3098
|
+
points.push(this.sphereOffset(stopAngle));
|
|
3099
|
+
return new DPolygon(points);
|
|
3100
|
+
};
|
|
3101
|
+
DCircle.prototype.sphereOffset = function (bearing, earthRadius) {
|
|
3102
|
+
if (earthRadius === void 0) { earthRadius = EARTH_RADIUS_IN_METERS; }
|
|
3103
|
+
var _a = this.center.clone().degreeToRadians(), lon1 = _a.x, lat1 = _a.y;
|
|
3104
|
+
var dByR = this.r / earthRadius;
|
|
3105
|
+
var lat = Math.asin(Math.sin(lat1) * Math.cos(dByR) +
|
|
3106
|
+
Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));
|
|
3107
|
+
var lon = lon1 +
|
|
3108
|
+
Math.atan2(Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1), Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));
|
|
3109
|
+
return new DPoint(lon, lat).radiansToDegrees();
|
|
3110
|
+
};
|
|
3111
|
+
return DCircle;
|
|
3112
|
+
}());
|
|
3113
|
+
|
|
3114
|
+
var __values$1 = (undefined && undefined.__values) || function(o) {
|
|
3115
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
3116
|
+
if (m) return m.call(o);
|
|
3117
|
+
if (o && typeof o.length === "number") return {
|
|
3118
|
+
next: function () {
|
|
3119
|
+
if (o && i >= o.length) o = void 0;
|
|
3120
|
+
return { value: o && o[i++], done: !o };
|
|
3121
|
+
}
|
|
3122
|
+
};
|
|
3123
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
3124
|
+
};
|
|
3125
|
+
var FastSearch = (function () {
|
|
3126
|
+
function FastSearch() {
|
|
3127
|
+
this.searchStore = {};
|
|
3128
|
+
}
|
|
3129
|
+
FastSearch.prototype.add = function (points) {
|
|
3130
|
+
var e_1, _a;
|
|
3131
|
+
try {
|
|
3132
|
+
for (var points_1 = __values$1(points), points_1_1 = points_1.next(); !points_1_1.done; points_1_1 = points_1.next()) {
|
|
3133
|
+
var _b = points_1_1.value, x = _b.x, y = _b.y, z = _b.z;
|
|
3134
|
+
if (!this.searchStore[x]) {
|
|
3135
|
+
this.searchStore[x] = {};
|
|
3136
|
+
}
|
|
3137
|
+
if (!this.searchStore[x][y]) {
|
|
3138
|
+
this.searchStore[x][y] = {};
|
|
3139
|
+
}
|
|
3140
|
+
this.searchStore[x][y][z || 'undefined'] = true;
|
|
3141
|
+
}
|
|
3142
|
+
}
|
|
3143
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3144
|
+
finally {
|
|
3145
|
+
try {
|
|
3146
|
+
if (points_1_1 && !points_1_1.done && (_a = points_1.return)) _a.call(points_1);
|
|
3147
|
+
}
|
|
3148
|
+
finally { if (e_1) throw e_1.error; }
|
|
3149
|
+
}
|
|
3150
|
+
};
|
|
3151
|
+
FastSearch.prototype.find = function (_a) {
|
|
3152
|
+
var x = _a.x, y = _a.y, z = _a.z;
|
|
3153
|
+
if (!this.searchStore[x]) {
|
|
3154
|
+
return false;
|
|
3155
|
+
}
|
|
3156
|
+
if (!this.searchStore[x][y]) {
|
|
3157
|
+
return false;
|
|
3158
|
+
}
|
|
3159
|
+
return this.searchStore[x][y][z || 'undefined'];
|
|
3160
|
+
};
|
|
3161
|
+
return FastSearch;
|
|
3162
|
+
}());
|
|
3163
|
+
|
|
3164
|
+
var __read$1 = (undefined && undefined.__read) || function (o, n) {
|
|
3165
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
3166
|
+
if (!m) return o;
|
|
3167
|
+
var i = m.call(o), r, ar = [], e;
|
|
3168
|
+
try {
|
|
3169
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
3170
|
+
}
|
|
3171
|
+
catch (error) { e = { error: error }; }
|
|
3172
|
+
finally {
|
|
3173
|
+
try {
|
|
3174
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
3175
|
+
}
|
|
3176
|
+
finally { if (e) throw e.error; }
|
|
3177
|
+
}
|
|
3178
|
+
return ar;
|
|
3179
|
+
};
|
|
3180
|
+
var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from, pack) {
|
|
3181
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3182
|
+
if (ar || !(i in from)) {
|
|
3183
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
3184
|
+
ar[i] = from[i];
|
|
3185
|
+
}
|
|
3186
|
+
}
|
|
3187
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
3188
|
+
};
|
|
3189
|
+
var __values = (undefined && undefined.__values) || function(o) {
|
|
3190
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
3191
|
+
if (m) return m.call(o);
|
|
3192
|
+
if (o && typeof o.length === "number") return {
|
|
3193
|
+
next: function () {
|
|
3194
|
+
if (o && i >= o.length) o = void 0;
|
|
3195
|
+
return { value: o && o[i++], done: !o };
|
|
3196
|
+
}
|
|
3197
|
+
};
|
|
3198
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
3199
|
+
};
|
|
3200
|
+
exports.TraceMatrixValues = void 0;
|
|
3201
|
+
(function (TraceMatrixValues) {
|
|
3202
|
+
TraceMatrixValues[TraceMatrixValues["f"] = 0] = "f";
|
|
3203
|
+
TraceMatrixValues[TraceMatrixValues["t"] = 1] = "t";
|
|
3204
|
+
})(exports.TraceMatrixValues || (exports.TraceMatrixValues = {}));
|
|
3205
|
+
var getByPosition = function (m, p, defaultValue) {
|
|
3206
|
+
if (defaultValue === void 0) { defaultValue = exports.TraceMatrixValues.f; }
|
|
3207
|
+
if (m[p.y] === undefined || m[p.y][p.x] === undefined) {
|
|
3208
|
+
return defaultValue;
|
|
3209
|
+
}
|
|
3210
|
+
return m[p.y][p.x];
|
|
3211
|
+
};
|
|
3212
|
+
var setByPosition = function (m, p, value) {
|
|
3213
|
+
if (m[p.y] === undefined || m[p.y][p.x] === undefined) {
|
|
3214
|
+
return value;
|
|
3215
|
+
}
|
|
3216
|
+
m[p.y][p.x] = value;
|
|
3217
|
+
return m[p.y][p.x];
|
|
3218
|
+
};
|
|
3219
|
+
var TraceMatrix = (function () {
|
|
3220
|
+
function TraceMatrix(size, f) {
|
|
3221
|
+
var _this = this;
|
|
3222
|
+
this.size = size;
|
|
3223
|
+
this.findGroupByIndex = function (m, s) {
|
|
3224
|
+
var res = new DPolygon();
|
|
3225
|
+
if (s && getByPosition(m, s) === exports.TraceMatrixValues.t) {
|
|
3226
|
+
res.push(s);
|
|
3227
|
+
var startIndex = 0;
|
|
3228
|
+
var marked = TraceMatrix.createMatrix(_this.size, function () { return exports.TraceMatrixValues.f; });
|
|
3229
|
+
setByPosition(marked, s, exports.TraceMatrixValues.t);
|
|
3230
|
+
while (startIndex < res.length) {
|
|
3231
|
+
var r = res.at(startIndex);
|
|
3232
|
+
for (var i = -1; i < 2; i++) {
|
|
3233
|
+
for (var j = -1; j < 2; j++) {
|
|
3234
|
+
var t = new DPoint(r.x + i, r.y + j);
|
|
3235
|
+
if (getByPosition(marked, t, exports.TraceMatrixValues.t) === exports.TraceMatrixValues.f &&
|
|
3236
|
+
getByPosition(m, t, exports.TraceMatrixValues.f) === exports.TraceMatrixValues.t) {
|
|
3237
|
+
res.push(t);
|
|
3238
|
+
setByPosition(marked, t, exports.TraceMatrixValues.t);
|
|
3239
|
+
}
|
|
3240
|
+
}
|
|
3241
|
+
}
|
|
3242
|
+
startIndex++;
|
|
3243
|
+
}
|
|
3244
|
+
}
|
|
3245
|
+
return res;
|
|
3246
|
+
};
|
|
3247
|
+
this.findAllGroupsInMatrix = function (m) {
|
|
3248
|
+
var firstMark = _this.findMarked(m);
|
|
3249
|
+
if (!firstMark) {
|
|
3250
|
+
return [];
|
|
3251
|
+
}
|
|
3252
|
+
var group = _this.findGroupByIndex(m, firstMark);
|
|
3253
|
+
var groups = [group];
|
|
3254
|
+
var groupSum = group.length;
|
|
3255
|
+
var allGroups = __spreadArray([], __read$1(group.points), false);
|
|
3256
|
+
var fs = new FastSearch();
|
|
3257
|
+
fs.add(allGroups);
|
|
3258
|
+
while (groupSum < _this.totalCountInMatrix(m)) {
|
|
3259
|
+
var mark = _this.findMarked(m);
|
|
3260
|
+
while (mark && fs.find(mark)) {
|
|
3261
|
+
mark = _this.findMarked(m, mark);
|
|
3262
|
+
}
|
|
3263
|
+
var nextGroup = _this.findGroupByIndex(m, mark);
|
|
3264
|
+
groupSum += nextGroup.length;
|
|
3265
|
+
allGroups = __spreadArray(__spreadArray([], __read$1(allGroups), false), __read$1(nextGroup.points), false);
|
|
3266
|
+
fs.add(nextGroup.points);
|
|
3267
|
+
groups.push(nextGroup);
|
|
3268
|
+
}
|
|
3269
|
+
return groups.filter(function (g) { return g.length > 2; });
|
|
3270
|
+
};
|
|
3271
|
+
this.traceGroup = function (m, group) {
|
|
3272
|
+
var traceDirections = [
|
|
3273
|
+
new DPoint(-1, -1),
|
|
3274
|
+
new DPoint(-1, 0),
|
|
3275
|
+
new DPoint(-1, 1),
|
|
3276
|
+
new DPoint(0, 1),
|
|
3277
|
+
new DPoint(1, 1),
|
|
3278
|
+
new DPoint(1, 0),
|
|
3279
|
+
new DPoint(1, -1),
|
|
3280
|
+
new DPoint(0, -1)
|
|
3281
|
+
];
|
|
3282
|
+
var left = function (d) { return (d + traceDirections.length + 1) % traceDirections.length; };
|
|
3283
|
+
var right = function (d) { return (d + traceDirections.length - 1) % traceDirections.length; };
|
|
3284
|
+
if (group.length < 2) {
|
|
3285
|
+
var t = group.at(0).clone();
|
|
3286
|
+
return new DPolygon([t, t, t]);
|
|
3287
|
+
}
|
|
3288
|
+
var points = new DPolygon();
|
|
3289
|
+
var direction = 0;
|
|
3290
|
+
var prevDirection = Infinity;
|
|
3291
|
+
var p = group.at(0);
|
|
3292
|
+
while (!p.equal(group.at(0)) || points.length < 2) {
|
|
3293
|
+
while (true) {
|
|
3294
|
+
var nextValue = getByPosition(m, p.clone().move(traceDirections[direction]));
|
|
3295
|
+
var nextNeighbourValue = getByPosition(m, p.clone().move(traceDirections[left(direction)]));
|
|
3296
|
+
if (nextValue === exports.TraceMatrixValues.t && nextNeighbourValue === exports.TraceMatrixValues.f) {
|
|
3297
|
+
break;
|
|
3298
|
+
}
|
|
3299
|
+
direction = right(direction);
|
|
3300
|
+
}
|
|
3301
|
+
if (prevDirection !== direction) {
|
|
3302
|
+
points.push(p);
|
|
3303
|
+
prevDirection = direction;
|
|
3304
|
+
}
|
|
3305
|
+
p = p.clone().move(traceDirections[direction]);
|
|
3306
|
+
direction = left(left(direction));
|
|
3307
|
+
}
|
|
3308
|
+
return points.approximation().close();
|
|
3309
|
+
};
|
|
3310
|
+
this.createHoleMatrix = function (group) {
|
|
3311
|
+
var e_1, _a;
|
|
3312
|
+
var fullTraceDirections = [
|
|
3313
|
+
new DPoint(-1, 0),
|
|
3314
|
+
new DPoint(0, 1),
|
|
3315
|
+
new DPoint(1, 0),
|
|
3316
|
+
new DPoint(0, -1)
|
|
3317
|
+
];
|
|
3318
|
+
group.prepareToFastSearch();
|
|
3319
|
+
var tmpMatrix = TraceMatrix
|
|
3320
|
+
.createMatrix(_this.size, function (p) { return group.fastHas(p) ? exports.TraceMatrixValues.t : exports.TraceMatrixValues.f; });
|
|
3321
|
+
var startCoords = new DPolygon();
|
|
3322
|
+
for (var i = 0; i < _this.size.w; i++) {
|
|
3323
|
+
startCoords.push(new DPoint(i, -1));
|
|
3324
|
+
startCoords.push(new DPoint(i, _this.size.h));
|
|
3325
|
+
}
|
|
3326
|
+
for (var i = 0; i < _this.size.h; i++) {
|
|
3327
|
+
startCoords.push(new DPoint(-1, i));
|
|
3328
|
+
startCoords.push(new DPoint(_this.size.w, i));
|
|
3329
|
+
}
|
|
3330
|
+
while (startCoords.length) {
|
|
3331
|
+
var point = startCoords.pop();
|
|
3332
|
+
try {
|
|
3333
|
+
for (var fullTraceDirections_1 = (e_1 = void 0, __values(fullTraceDirections)), fullTraceDirections_1_1 = fullTraceDirections_1.next(); !fullTraceDirections_1_1.done; fullTraceDirections_1_1 = fullTraceDirections_1.next()) {
|
|
3334
|
+
var direction = fullTraceDirections_1_1.value;
|
|
3335
|
+
var tmpPoint = point.clone().move(direction);
|
|
3336
|
+
var value = getByPosition(tmpMatrix, tmpPoint, exports.TraceMatrixValues.t);
|
|
3337
|
+
if (value === exports.TraceMatrixValues.f) {
|
|
3338
|
+
setByPosition(tmpMatrix, tmpPoint, exports.TraceMatrixValues.t);
|
|
3339
|
+
startCoords.push(tmpPoint);
|
|
3340
|
+
}
|
|
3341
|
+
}
|
|
3342
|
+
}
|
|
3343
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3344
|
+
finally {
|
|
3345
|
+
try {
|
|
3346
|
+
if (fullTraceDirections_1_1 && !fullTraceDirections_1_1.done && (_a = fullTraceDirections_1.return)) _a.call(fullTraceDirections_1);
|
|
3347
|
+
}
|
|
3348
|
+
finally { if (e_1) throw e_1.error; }
|
|
3349
|
+
}
|
|
3350
|
+
}
|
|
3351
|
+
var t = _this.reverseMatrix(tmpMatrix);
|
|
3352
|
+
return _this.totalCountInMatrix(t) ? t : null;
|
|
3353
|
+
};
|
|
3354
|
+
this.m = TraceMatrix.createMatrix(this.size, f);
|
|
3355
|
+
}
|
|
3356
|
+
TraceMatrix.prototype.fullMatrixTrace = function () {
|
|
3357
|
+
var _this = this;
|
|
3358
|
+
var groups = this.findAllGroupsInMatrix(this.m);
|
|
3359
|
+
var paths = groups.map(function (g) { return _this.traceGroup(_this.m, g); });
|
|
3360
|
+
var holeMatrixs = groups.map(this.createHoleMatrix);
|
|
3361
|
+
var holesGroups = holeMatrixs.map(function (m) { return m && _this.findAllGroupsInMatrix(m); });
|
|
3362
|
+
var holesPaths = holesGroups.map(function (hg, index) { return hg && hg.map(function (g) { return _this
|
|
3363
|
+
.traceGroup(holeMatrixs[index], g); }).filter(function (r) { return r.length > MIN_POINTS_IN_VALID_POLYGON; }); });
|
|
3364
|
+
return groups.map(function (g, index) {
|
|
3365
|
+
var res = paths[index];
|
|
3366
|
+
if (holesGroups[index] && holesGroups[index].length) {
|
|
3367
|
+
res.holes = holesPaths[index];
|
|
3368
|
+
}
|
|
3369
|
+
return res;
|
|
3370
|
+
});
|
|
3371
|
+
};
|
|
3372
|
+
TraceMatrix.prototype.reverseMatrix = function (m) {
|
|
3373
|
+
return TraceMatrix.createMatrix(this.size, function (p) { return getByPosition(m, p) === exports.TraceMatrixValues.f ? exports.TraceMatrixValues.t : exports.TraceMatrixValues.f; });
|
|
3374
|
+
};
|
|
3375
|
+
TraceMatrix.prototype.findMarked = function (m, init) {
|
|
3376
|
+
var s = this.size;
|
|
3377
|
+
var ini = false;
|
|
3378
|
+
for (var i = 0; i < s.w; i++) {
|
|
3379
|
+
for (var j = 0; j < s.h; j++) {
|
|
3380
|
+
if (!ini && init) {
|
|
3381
|
+
i = init.x;
|
|
3382
|
+
j = init.y;
|
|
3383
|
+
ini = true;
|
|
3384
|
+
continue;
|
|
3385
|
+
}
|
|
3386
|
+
if (getByPosition(m, new DPoint(i, j)) === exports.TraceMatrixValues.t) {
|
|
3387
|
+
return new DPoint(i, j);
|
|
3388
|
+
}
|
|
3389
|
+
}
|
|
3390
|
+
}
|
|
3391
|
+
return null;
|
|
3392
|
+
};
|
|
3393
|
+
TraceMatrix.prototype.totalCountInMatrix = function (m) {
|
|
3394
|
+
var res = 0;
|
|
3395
|
+
var s = this.size;
|
|
3396
|
+
for (var i = 0; i < s.w; i++) {
|
|
3397
|
+
for (var j = 0; j < s.h; j++) {
|
|
3398
|
+
if (getByPosition(m, new DPoint(i, j))) {
|
|
3399
|
+
res++;
|
|
3400
|
+
}
|
|
3401
|
+
}
|
|
3402
|
+
}
|
|
3403
|
+
return res;
|
|
3404
|
+
};
|
|
3405
|
+
TraceMatrix.createMatrix = function (size, f) {
|
|
3406
|
+
if (f === void 0) { f = function () { return exports.TraceMatrixValues.f; }; }
|
|
3407
|
+
return createArray(size.h)
|
|
3408
|
+
.map(function (v, i) { return createArray(size.w).map(function (v2, j) { return f(new DPoint(j, i)); }); });
|
|
3409
|
+
};
|
|
3410
|
+
return TraceMatrix;
|
|
3411
|
+
}());
|
|
3412
|
+
|
|
3413
|
+
var __read = (undefined && undefined.__read) || function (o, n) {
|
|
3414
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
3415
|
+
if (!m) return o;
|
|
3416
|
+
var i = m.call(o), r, ar = [], e;
|
|
3417
|
+
try {
|
|
3418
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
3419
|
+
}
|
|
3420
|
+
catch (error) { e = { error: error }; }
|
|
3421
|
+
finally {
|
|
3422
|
+
try {
|
|
3423
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
3424
|
+
}
|
|
3425
|
+
finally { if (e) throw e.error; }
|
|
3426
|
+
}
|
|
3427
|
+
return ar;
|
|
3428
|
+
};
|
|
3429
|
+
var DPlane = (function () {
|
|
3430
|
+
function DPlane(a, b, c, d, p1, p2, p3) {
|
|
3431
|
+
if (p1 === void 0) { p1 = DPoint.zero(); }
|
|
3432
|
+
if (p2 === void 0) { p2 = DPoint.zero(); }
|
|
3433
|
+
if (p3 === void 0) { p3 = DPoint.zero(); }
|
|
3434
|
+
this.a = a;
|
|
3435
|
+
this.b = b;
|
|
3436
|
+
this.c = c;
|
|
3437
|
+
this.d = d;
|
|
3438
|
+
this.p1 = p1;
|
|
3439
|
+
this.p2 = p2;
|
|
3440
|
+
this.p3 = p3;
|
|
3441
|
+
}
|
|
3442
|
+
DPlane.find = function (p1, p2, p3) {
|
|
3443
|
+
if (p1.x === p2.x && p2.x === p3.x) {
|
|
3444
|
+
return new DPlane(1, 0, 0, -p1.x, p1, p2, p3);
|
|
3445
|
+
}
|
|
3446
|
+
if (p1.y === p2.y && p2.y === p3.y) {
|
|
3447
|
+
return new DPlane(0, 1, 0, -p1.y, p1, p2, p3);
|
|
3448
|
+
}
|
|
3449
|
+
if (p1.z === p2.z && p2.z === p3.z) {
|
|
3450
|
+
return new DPlane(0, 0, 1, -p1.z, p1, p2, p3);
|
|
3451
|
+
}
|
|
3452
|
+
var d = 1;
|
|
3453
|
+
var _a = __read(gaussianElimination([
|
|
3454
|
+
[p1.x, p1.y, p1.z, -d],
|
|
3455
|
+
[p2.x, p2.y, p2.z, -d],
|
|
3456
|
+
[p3.x, p3.y, p3.z, -d]
|
|
3457
|
+
]), 3), a = _a[0], b = _a[1], c = _a[2];
|
|
3458
|
+
return new DPlane(a, b, c, d, p1, p2, p3);
|
|
3459
|
+
};
|
|
3460
|
+
DPlane.prototype.x = function (p) {
|
|
3461
|
+
var _this = this;
|
|
3462
|
+
if (p instanceof DPoint) {
|
|
3463
|
+
var _a = this, a = _a.a, b = _a.b, c = _a.c, d = _a.d;
|
|
3464
|
+
var y = p.y, z = p.z;
|
|
3465
|
+
p.x = -(b * y + c * z + d) / a;
|
|
3466
|
+
return p;
|
|
3467
|
+
}
|
|
3468
|
+
return p.map(function (t) { return _this.x(t); });
|
|
3469
|
+
};
|
|
3470
|
+
DPlane.prototype.y = function (p) {
|
|
3471
|
+
var _this = this;
|
|
3472
|
+
if (p instanceof DPoint) {
|
|
3473
|
+
var _a = this, a = _a.a, b = _a.b, c = _a.c, d = _a.d;
|
|
3474
|
+
var x = p.x, z = p.z;
|
|
3475
|
+
p.y = -(a * x + c * z + d) / b;
|
|
3476
|
+
return p;
|
|
3477
|
+
}
|
|
3478
|
+
return p.map(function (t) { return _this.y(t); });
|
|
3479
|
+
};
|
|
3480
|
+
DPlane.prototype.z = function (p) {
|
|
3481
|
+
var _this = this;
|
|
3482
|
+
if (p instanceof DPoint) {
|
|
3483
|
+
var _a = this, a = _a.a, b = _a.b, c = _a.c, d = _a.d;
|
|
3484
|
+
var x = p.x, y = p.y;
|
|
3485
|
+
p.z = -(a * x + b * y + d) / c;
|
|
3486
|
+
return p;
|
|
3487
|
+
}
|
|
3488
|
+
return p.map(function (t) { return _this.z(t); });
|
|
3489
|
+
};
|
|
3490
|
+
DPlane.prototype.clone = function () {
|
|
3491
|
+
var _a = this, a = _a.a, b = _a.b, c = _a.c, d = _a.d, p1 = _a.p1, p2 = _a.p2, p3 = _a.p3;
|
|
3492
|
+
return new DPlane(a, b, c, d, p1, p2, p3);
|
|
3493
|
+
};
|
|
3494
|
+
DPlane.prototype.distance = function (p) {
|
|
3495
|
+
if (p instanceof DPoint) {
|
|
3496
|
+
var x = p.x, y = p.y, z = p.z;
|
|
3497
|
+
var _a = this, a_1 = _a.a, b_1 = _a.b, c_1 = _a.c, d_1 = _a.d;
|
|
3498
|
+
return Math.abs(a_1 * x + b_1 * y + c_1 * z + d_1) / Math.sqrt(a_1 * a_1 + b_1 * b_1 + c_1 * c_1);
|
|
3499
|
+
}
|
|
3500
|
+
var _b = p, a = _b.a, b = _b.b, c = _b.c, d = _b.d;
|
|
3501
|
+
var r = this.d;
|
|
3502
|
+
return Math.abs(d - r) / Math.sqrt(a * a + b * b + c * c);
|
|
3503
|
+
};
|
|
3504
|
+
DPlane.prototype.equal = function (p) {
|
|
3505
|
+
var a = p.a, b = p.b, c = p.c, d = p.d;
|
|
3506
|
+
var _a = this, q = _a.a, w = _a.b, e = _a.c, r = _a.d;
|
|
3507
|
+
return DNumbers.like(a, q) &&
|
|
3508
|
+
DNumbers.like(b, w) &&
|
|
3509
|
+
DNumbers.like(c, e) &&
|
|
3510
|
+
DNumbers.like(d, r);
|
|
3511
|
+
};
|
|
3512
|
+
DPlane.prototype.same = function (p) {
|
|
3513
|
+
var a = p.a, b = p.b, c = p.c, d = p.d;
|
|
3514
|
+
var _a = this, q = _a.a, w = _a.b, e = _a.c, r = _a.d;
|
|
3515
|
+
var t = a / q;
|
|
3516
|
+
var y = b / w;
|
|
3517
|
+
var u = c / e;
|
|
3518
|
+
var i = d / r;
|
|
3519
|
+
return DNumbers.like(t, y) &&
|
|
3520
|
+
DNumbers.like(t, u) &&
|
|
3521
|
+
DNumbers.like(t, c) &&
|
|
3522
|
+
DNumbers.like(t, i);
|
|
3523
|
+
};
|
|
3524
|
+
DPlane.prototype.parallel = function (p) {
|
|
3525
|
+
var a = p.a, b = p.b, c = p.c, d = p.d;
|
|
3526
|
+
var _a = this, q = _a.a, w = _a.b, e = _a.c, r = _a.d;
|
|
3527
|
+
var t = a / q;
|
|
3528
|
+
var y = b / w;
|
|
3529
|
+
var u = c / e;
|
|
3530
|
+
var i = d / r;
|
|
3531
|
+
return DNumbers.like(t, y) &&
|
|
3532
|
+
DNumbers.like(t, u) &&
|
|
3533
|
+
DNumbers.like(t, c) &&
|
|
3534
|
+
!DNumbers.like(t, i);
|
|
3535
|
+
};
|
|
3536
|
+
return DPlane;
|
|
3537
|
+
}());
|
|
3538
|
+
|
|
3539
|
+
var DGeo = {
|
|
3540
|
+
DEBUG: false
|
|
3541
|
+
};
|
|
3542
|
+
|
|
3543
|
+
exports.DCircle = DCircle;
|
|
3544
|
+
exports.DEGREE_TO_PI = DEGREE_TO_PI;
|
|
3545
|
+
exports.DGeo = DGeo;
|
|
3546
|
+
exports.DLine = DLine;
|
|
3547
|
+
exports.DNumbers = DNumbers;
|
|
3548
|
+
exports.DOUBLE_PI_IN_DEGREE = DOUBLE_PI_IN_DEGREE;
|
|
3549
|
+
exports.DPlane = DPlane;
|
|
3550
|
+
exports.DPoint = DPoint;
|
|
3551
|
+
exports.DPolygon = DPolygon;
|
|
3552
|
+
exports.DPolygonLoop = DPolygonLoop;
|
|
3553
|
+
exports.EARTH_RADIUS_IN_METERS = EARTH_RADIUS_IN_METERS;
|
|
3554
|
+
exports.FastSearch = FastSearch;
|
|
3555
|
+
exports.HALF_PI_IN_DEGREE = HALF_PI_IN_DEGREE;
|
|
3556
|
+
exports.MIN_POINTS_IN_VALID_POLYGON = MIN_POINTS_IN_VALID_POLYGON;
|
|
3557
|
+
exports.PI_IN_DEGREE = PI_IN_DEGREE;
|
|
3558
|
+
exports.PI_TO_DEGREE = PI_TO_DEGREE;
|
|
3559
|
+
exports.TraceMatrix = TraceMatrix;
|
|
3560
|
+
exports.createArray = createArray;
|
|
3561
|
+
exports.createCanvas = createCanvas;
|
|
3562
|
+
exports.createMatrix = createMatrix;
|
|
3563
|
+
exports.gaussianElimination = gaussianElimination;
|
|
3564
|
+
exports.isDefAndNotNull = isDefAndNotNull;
|
|
3565
|
+
|
|
3566
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
3567
|
+
|
|
3568
|
+
}));
|
|
3569
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGdlb3V0aWxzLmpzIiwic291cmNlcyI6WyIuLi9lc20vdXRpbHMuanMiLCIuLi9lc20vRE51bWJlcnMuanMiLCIuLi9lc20vRExpbmUuanMiLCIuLi9lc20vRFBvbHlnb25Mb29wLmpzIiwiLi4vZXNtL0RQb2x5Z29uLmpzIiwiLi4vZXNtL0RQb2ludC5qcyIsIi4uL2VzbS9EQ2lyY2xlLmpzIiwiLi4vZXNtL0Zhc3RTZWFyY2guanMiLCIuLi9lc20vVHJhY2VNYXRyaXguanMiLCIuLi9lc20vRFBsYW5lLmpzIiwiLi4vZXNtL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbmltcG9ydCB7IERHZW8gfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IERQb2ludCB9IGZyb20gJy4vRFBvaW50JztcbmV4cG9ydCB2YXIgd2FybiA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgaWYgKERHZW8uREVCVUcpIHtcbiAgICAgICAgY29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSwgZmFsc2UpKTtcbiAgICB9XG59O1xuZXhwb3J0IHZhciBpc0RlZkFuZE5vdE51bGwgPSBmdW5jdGlvbiAoYSkgeyByZXR1cm4gYSAhPSB1bmRlZmluZWQ7IH07XG52YXIgaG9vayA9IGZ1bmN0aW9uIChzY29wZSkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gc2NvcGU7IH07IH07XG52YXIgc2hvdWxkQmVJbnQgPSBmdW5jdGlvbiAoc2NvcGUsIGZ1bmNOYW1lLCBhcmdOYW1lKSB7IHJldHVybiBmdW5jdGlvbiAocCkge1xuICAgIGlmICghcC5jbG9uZSgpLnJvdW5kKClcbiAgICAgICAgLmVxdWFsKHApKSB7XG4gICAgICAgIHdhcm4oXCJcXFwiXCIgKyBmdW5jTmFtZSArIFwiXFxcIiAtPiBcXFwiXCIgKyBhcmdOYW1lICsgXCJcXFwiIHNob3VsZCBiZSBJbnQhXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2NvcGU7XG59OyB9O1xudmFyIHNob3VsZEJlVUludCA9IGZ1bmN0aW9uIChzY29wZSwgZnVuY05hbWUsIGFyZ05hbWUpIHsgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgaWYgKCFwLmNsb25lKCkucm91bmQoKVxuICAgICAgICAuZXF1YWwocCkgfHwgIXAuZ3RPckVxdWFsKERQb2ludC56ZXJvKCkpKSB7XG4gICAgICAgIHdhcm4oXCJcXFwiXCIgKyBmdW5jTmFtZSArIFwiXFxcIiAtPiBcXFwiXCIgKyBhcmdOYW1lICsgXCJcXFwiIHNob3VsZCBiZSBVSW50IVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlO1xufTsgfTtcbnZhciBzaG91bGRCZURlZ3JlZSA9IGZ1bmN0aW9uIChzY29wZSwgZnVuY05hbWUsIGFyZ05hbWUpIHsgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgaWYgKCFwLmxpa2VXb3JsZEdlb2RldGljU3lzdGVtKSB7XG4gICAgICAgIHdhcm4oXCJcXFwiXCIgKyBmdW5jTmFtZSArIFwiXFxcIiAtPiBcXFwiXCIgKyBhcmdOYW1lICsgXCJcXFwiIHNob3VsZCBiZSBkZWdyZWUhXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2NvcGU7XG59OyB9O1xudmFyIHNob3VsZEJlUmFkaWFucyA9IGZ1bmN0aW9uIChzY29wZSwgZnVuY05hbWUsIGFyZ05hbWUpIHsgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgaWYgKCFwLmxpa2VSYWRpYW5zKSB7XG4gICAgICAgIHdhcm4oXCJcXFwiXCIgKyBmdW5jTmFtZSArIFwiXFxcIiAtPiBcXFwiXCIgKyBhcmdOYW1lICsgXCJcXFwiIHNob3VsZCBiZSByYWRpYW5zIVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlO1xufTsgfTtcbnZhciBzaG91bGRFeGlzdCA9IGZ1bmN0aW9uIChzY29wZSwgZnVuY05hbWUsIGFyZ05hbWUpIHsgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgaWYgKCFpc0RlZkFuZE5vdE51bGwocCkpIHtcbiAgICAgICAgd2FybihcIlxcXCJcIiArIGZ1bmNOYW1lICsgXCJcXFwiIC0+IFxcXCJcIiArIGFyZ05hbWUgKyBcIlxcXCIgc2hvdWxkIGV4aXN0IVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlO1xufTsgfTtcbnZhciBzaG91bGRCZU1ldGVycyA9IGZ1bmN0aW9uIChzY29wZSwgZnVuY05hbWUsIGFyZ05hbWUpIHsgcmV0dXJuIGZ1bmN0aW9uIChwKSB7XG4gICAgaWYgKCFwLmxpa2VQc2V1ZG9NZXJjYXRvcikge1xuICAgICAgICB3YXJuKFwiXFxcIlwiICsgZnVuY05hbWUgKyBcIlxcXCIgLT4gXFxcIlwiICsgYXJnTmFtZSArIFwiXFxcIiBzaG91bGQgYmUgbWV0ZXJzIVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjb3BlO1xufTsgfTtcbmV4cG9ydCB2YXIgY2hlY2tGdW5jdGlvbiA9IGZ1bmN0aW9uIChmdW5jTmFtZSkgeyByZXR1cm4gKHtcbiAgICBjaGVja0FyZ3VtZW50OiBmdW5jdGlvbiAoYXJnTmFtZSkge1xuICAgICAgICBpZiAoIURHZW8uREVCVUcpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc2hvdWxkQmVEZWdyZWU6IGhvb2sodGhpcyksXG4gICAgICAgICAgICAgICAgc2hvdWxkQmVNZXRlcnM6IGhvb2sodGhpcyksXG4gICAgICAgICAgICAgICAgc2hvdWxkQmVJbnQ6IGhvb2sodGhpcyksXG4gICAgICAgICAgICAgICAgc2hvdWxkQmVVSW50OiBob29rKHRoaXMpLFxuICAgICAgICAgICAgICAgIHNob3VsZEJlUmFkaWFuczogaG9vayh0aGlzKSxcbiAgICAgICAgICAgICAgICBzaG91bGRFeGlzdDogaG9vayh0aGlzKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hvdWxkQmVEZWdyZWU6IHNob3VsZEJlRGVncmVlKHRoaXMsIGZ1bmNOYW1lLCBhcmdOYW1lKSxcbiAgICAgICAgICAgIHNob3VsZEJlTWV0ZXJzOiBzaG91bGRCZU1ldGVycyh0aGlzLCBmdW5jTmFtZSwgYXJnTmFtZSksXG4gICAgICAgICAgICBzaG91bGRCZUludDogc2hvdWxkQmVJbnQodGhpcywgZnVuY05hbWUsIGFyZ05hbWUpLFxuICAgICAgICAgICAgc2hvdWxkQmVVSW50OiBzaG91bGRCZVVJbnQodGhpcywgZnVuY05hbWUsIGFyZ05hbWUpLFxuICAgICAgICAgICAgc2hvdWxkQmVSYWRpYW5zOiBzaG91bGRCZVJhZGlhbnModGhpcywgZnVuY05hbWUsIGFyZ05hbWUpLFxuICAgICAgICAgICAgc2hvdWxkRXhpc3Q6IHNob3VsZEV4aXN0KHRoaXMsIGZ1bmNOYW1lLCBhcmdOYW1lKVxuICAgICAgICB9O1xuICAgIH1cbn0pOyB9O1xuZXhwb3J0IHZhciBjcmVhdGVBcnJheSA9IGZ1bmN0aW9uICh2LCBmaWxsU3ltYm9sKSB7XG4gICAgaWYgKGZpbGxTeW1ib2wgPT09IHZvaWQgMCkgeyBmaWxsU3ltYm9sID0gMDsgfVxuICAgIHJldHVybiBuZXcgQXJyYXkodikuZmlsbChmaWxsU3ltYm9sKTtcbn07XG5leHBvcnQgdmFyIGNyZWF0ZU1hdHJpeCA9IGZ1bmN0aW9uIChfYSwgZmlsbFN5bWJvbCkge1xuICAgIHZhciBoID0gX2EuaCwgdyA9IF9hLnc7XG4gICAgaWYgKGZpbGxTeW1ib2wgPT09IHZvaWQgMCkgeyBmaWxsU3ltYm9sID0gMDsgfVxuICAgIHJldHVybiBjcmVhdGVBcnJheShoKVxuICAgICAgICAubWFwKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNyZWF0ZUFycmF5KHcsIGZpbGxTeW1ib2wpOyB9KTtcbn07XG5leHBvcnQgdmFyIGdhdXNzaWFuRWxpbWluYXRpb24gPSBmdW5jdGlvbiAobWF0cml4KSB7XG4gICAgdmFyIG4gPSBtYXRyaXgubGVuZ3RoO1xuICAgIHZhciBtYXRyaXhDbG9uZSA9IGNyZWF0ZU1hdHJpeChuZXcgRFBvaW50KG4gKyAxLCBuKSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuICsgMTsgaisrKSB7XG4gICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhbaV1bal0gPT09IDAgPyBnYXVzc2lhbkVsaW1pbmF0aW9uLk1JTiA6IG1hdHJpeFtpXVtqXTtcbiAgICAgICAgICAgIG1hdHJpeENsb25lW2ldW2pdID0gbWF0cml4W2ldW2pdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgaysrKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbiArIDE7IGkrKykge1xuICAgICAgICAgICAgbWF0cml4Q2xvbmVba11baV0gLz0gbWF0cml4W2tdW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSBrICsgMTsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgdmFyIEsgPSBtYXRyaXhDbG9uZVtpXVtrXSAvIG1hdHJpeENsb25lW2tdW2tdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuICsgMTsgaisrKSB7XG4gICAgICAgICAgICAgICAgbWF0cml4Q2xvbmVbaV1bal0gLT0gbWF0cml4Q2xvbmVba11bal0gKiBLO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG4gKyAxOyBqKyspIHtcbiAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBtYXRyaXhDbG9uZVtpXVtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHZhciBrID0gbiAtIDE7IGsgPiAtMTsgay0tKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBuOyBpID4gLTE7IGktLSkge1xuICAgICAgICAgICAgbWF0cml4Q2xvbmVba11baV0gLz0gbWF0cml4W2tdW2tdO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGkgPSBrIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgICAgICAgIHZhciBLID0gbWF0cml4Q2xvbmVbaV1ba10gLyBtYXRyaXhDbG9uZVtrXVtrXTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSBuOyBqID4gLTE7IGotLSkge1xuICAgICAgICAgICAgICAgIG1hdHJpeENsb25lW2ldW2pdIC09IG1hdHJpeENsb25lW2tdW2pdICogSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgYW5zd2VyID0gY3JlYXRlQXJyYXkobik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgYW5zd2VyW2ldID0gbWF0cml4Q2xvbmVbaV1bbl07XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXI7XG59O1xuZ2F1c3NpYW5FbGltaW5hdGlvbi5NSU4gPSAxZS0xMDtcbmV4cG9ydCB2YXIgY3JlYXRlQ2FudmFzID0gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIHcgPSAwO1xuICAgIHZhciBoID0gMDtcbiAgICB2YXIgb2Zmc2NyZWVuID0gZmFsc2U7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBEUG9pbnQpIHtcbiAgICAgICAgdmFyIHggPSBhLngsIHkgPSBhLnk7XG4gICAgICAgIHcgPSB4O1xuICAgICAgICBoID0geTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHcgPSBhO1xuICAgICAgICBoID0gYTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBiID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgb2Zmc2NyZWVuID0gYjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGggPSBiO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGMgPT09ICdib29sZWFuJykge1xuICAgICAgICBvZmZzY3JlZW4gPSBjO1xuICAgIH1cbiAgICB2YXIgY2FudmFzID0gb2Zmc2NyZWVuID8gbmV3IE9mZnNjcmVlbkNhbnZhcyh3LCBoKSA6ICgoX2EgPSBjcmVhdGVDYW52YXMuZG9jdW1lbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGRvY3VtZW50KS5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBpZiAoIW9mZnNjcmVlbikge1xuICAgICAgICBjYW52YXMud2lkdGggPSB3O1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICB9XG4gICAgcmV0dXJuIFtjYW52YXMsIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpXTtcbn07XG4iLCJpbXBvcnQgeyBERUdSRUVfVE9fUEksIERPVUJMRV9QSV9JTl9ERUdSRUUsIFBJX0lOX0RFR1JFRSwgUElfVE9fREVHUkVFIH0gZnJvbSAnLi9EUG9pbnQnO1xudmFyIGRlbHRhID0gMC4wMDE7XG52YXIgRE51bWJlcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEROdW1iZXJzKCkge1xuICAgIH1cbiAgICBETnVtYmVycy5saWtlID0gZnVuY3Rpb24gKHYsIHMsIGQpIHtcbiAgICAgICAgaWYgKGQgPT09IHZvaWQgMCkgeyBkID0gZGVsdGE7IH1cbiAgICAgICAgcmV0dXJuIE1hdGguYWJzKHYgLSBzKSA8IGQ7XG4gICAgfTtcbiAgICBETnVtYmVycy5saWtlWmVybyA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBETnVtYmVycy5saWtlKHYsIDApO1xuICAgIH07XG4gICAgRE51bWJlcnMubGlrZTJQSSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIHJldHVybiBETnVtYmVycy5saWtlKEROdW1iZXJzLnJhZDJEZWcodiksIERPVUJMRV9QSV9JTl9ERUdSRUUpO1xuICAgIH07XG4gICAgRE51bWJlcnMubGlrZVBJID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgcmV0dXJuIEROdW1iZXJzLmxpa2UoRE51bWJlcnMucmFkMkRlZyh2KSwgUElfSU5fREVHUkVFKTtcbiAgICB9O1xuICAgIEROdW1iZXJzLnJhZDJEZWcgPSBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdiAqIERFR1JFRV9UT19QSTtcbiAgICB9O1xuICAgIEROdW1iZXJzLmRlZzJSYWQgPSBmdW5jdGlvbiAodikge1xuICAgICAgICByZXR1cm4gdiAqIFBJX1RPX0RFR1JFRTtcbiAgICB9O1xuICAgIHJldHVybiBETnVtYmVycztcbn0oKSk7XG5leHBvcnQgeyBETnVtYmVycyB9O1xuIiwiaW1wb3J0IHsgRFBvaW50IH0gZnJvbSAnLi9EUG9pbnQnO1xuaW1wb3J0IHsgY2hlY2tGdW5jdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRE51bWJlcnMgfSBmcm9tICcuL0ROdW1iZXJzJztcbnZhciBETGluZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRExpbmUoYSwgYiwgYywgYmVnaW4sIGVuZCkge1xuICAgICAgICBpZiAoYmVnaW4gPT09IHZvaWQgMCkgeyBiZWdpbiA9IERQb2ludC56ZXJvKCk7IH1cbiAgICAgICAgaWYgKGVuZCA9PT0gdm9pZCAwKSB7IGVuZCA9IERQb2ludC56ZXJvKCk7IH1cbiAgICAgICAgdGhpcy5hID0gYTtcbiAgICAgICAgdGhpcy5iID0gYjtcbiAgICAgICAgdGhpcy5jID0gYztcbiAgICAgICAgdGhpcy5iZWdpbiA9IGJlZ2luO1xuICAgICAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB9XG4gICAgRExpbmUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERMaW5lKHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRoaXMuYmVnaW4uY2xvbmUoKSwgdGhpcy5lbmQuY2xvbmUoKSk7XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUuZmluZFBlcnBlbmRpY3VsYXIgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdmaW5kUGVycGVuZGljdWxhcicpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcy5iZWdpbicpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcy5iZWdpbilcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCd0aGlzLmVuZCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcy5lbmQpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgncCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnMocCk7XG4gICAgICAgIHJldHVybiBuZXcgRExpbmUoLXRoaXMuYiwgdGhpcy5hLCB0aGlzLmIgKiBwLnggLSB0aGlzLmEgKiBwLnkpO1xuICAgIH07XG4gICAgRExpbmUucHJvdG90eXBlLnBlcnBlbmRpY3VsYXJEaXN0YW5jZSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGNoZWNrRnVuY3Rpb24oJ3BlcnBlbmRpY3VsYXJEaXN0YW5jZScpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcy5iZWdpbicpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcy5iZWdpbilcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCd0aGlzLmVuZCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcy5lbmQpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgncCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnMocCk7XG4gICAgICAgIHZhciBwZXJwZW5kaWN1bGFyTGluZSA9IHRoaXMuZmluZFBlcnBlbmRpY3VsYXIocCk7XG4gICAgICAgIHZhciB0YXJnZXRQb2ludCA9IHBlcnBlbmRpY3VsYXJMaW5lLmZpbmRQb2ludCh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFBvaW50LmRpc3RhbmNlKHApO1xuICAgIH07XG4gICAgRExpbmUucHJvdG90eXBlLmludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIChsLCBkLCBpbmNsdWRlT25seSkge1xuICAgICAgICBpZiAoZCA9PT0gdm9pZCAwKSB7IGQgPSAwOyB9XG4gICAgICAgIGlmIChpbmNsdWRlT25seSA9PT0gdm9pZCAwKSB7IGluY2x1ZGVPbmx5ID0gZmFsc2U7IH1cbiAgICAgICAgdmFyIHAgPSB0aGlzLmZpbmRQb2ludChsKTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAgIGlmIChpbmNsdWRlT25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc2lkZVJhbmdlKHAsIGQpICYmIGwuaW5zaWRlUmFuZ2UocCwgZCkgPyBwIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluUmFuZ2UocCwgZCkgJiYgbC5pblJhbmdlKHAsIGQpID8gcCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUuaW50ZXJzZWN0aW9uV2l0aENpcmNsZSA9IGZ1bmN0aW9uIChjaXJjbGUpIHtcbiAgICAgICAgdmFyIGNlbnRlciA9IGNpcmNsZS5jZW50ZXIsIHIgPSBjaXJjbGUucjtcbiAgICAgICAgdmFyIHBlciA9IHRoaXMuZmluZFBlcnBlbmRpY3VsYXIoY2VudGVyKTtcbiAgICAgICAgdmFyIHQgPSB0aGlzLmZpbmRQb2ludChwZXIpO1xuICAgICAgICB2YXIgZGlzdGFuY2UgPSB0LmRpc3RhbmNlKGNlbnRlcik7XG4gICAgICAgIGlmICh0aGlzLmJlZ2luLmVxdWFsKGNlbnRlcikpIHtcbiAgICAgICAgICAgIGRpc3RhbmNlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lbmQuZXF1YWwoY2VudGVyKSkge1xuICAgICAgICAgICAgZGlzdGFuY2UgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXN0YW5jZSA8IHIpIHtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMsIGEgPSBfYS5hLCBiID0gX2EuYiwgYyA9IF9hLmM7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1BhcmFsbGVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN0ID0gY2VudGVyLmRpc3RhbmNlKHQpO1xuICAgICAgICAgICAgICAgIHZhciBtb3ZlID0gTWF0aC5zcXJ0KHIgKiByIC0gY3QgKiBjdCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFkpIHtcbiAgICAgICAgICAgICAgICAgICAgdC54ID0gdGhpcy5iZWdpbi54O1xuICAgICAgICAgICAgICAgICAgICB2YXIgcjFfMSA9IHQuY2xvbmUoKS5tb3ZlKDAsIC1tb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHIyXzEgPSB0LmNsb25lKCkubW92ZSgwLCBtb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtyMV8xLCByMl8xXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFgpIHtcbiAgICAgICAgICAgICAgICAgICAgdC55ID0gdGhpcy5iZWdpbi55O1xuICAgICAgICAgICAgICAgICAgICB2YXIgcjFfMiA9IHQuY2xvbmUoKS5tb3ZlKG1vdmUsIDApO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcjJfMiA9IHQuY2xvbmUoKS5tb3ZlKC1tb3ZlLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtyMV8yLCByMl8yXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5iZWdpbi5saWtlKGNlbnRlcikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuYmVnaW4uY2xvbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMubW92ZVBvaW50KHAsIHIpLCB0aGlzLm1vdmVQb2ludChwLCAtcildO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZW5kLmxpa2UoY2VudGVyKSkge1xuICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5lbmQuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMubW92ZVBvaW50KHAsIHIpLCB0aGlzLm1vdmVQb2ludChwLCAtcildO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHMgPSBhICogYSArIGIgKiBiO1xuICAgICAgICAgICAgdmFyIGQgPSByICogciAtIGMgKiBjIC8gcztcbiAgICAgICAgICAgIHZhciBtdWx0ID0gTWF0aC5zcXJ0KGQgLyBzKTtcbiAgICAgICAgICAgIHZhciByMSA9IHQuY2xvbmUoKS5tb3ZlKGIgKiBtdWx0LCAtYSAqIG11bHQpO1xuICAgICAgICAgICAgdmFyIHIyID0gdC5jbG9uZSgpLm1vdmUoLWIgKiBtdWx0LCBhICogbXVsdCk7XG4gICAgICAgICAgICByZXR1cm4gW3IxLCByMl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpc3RhbmNlID09PSByKSB7XG4gICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIERMaW5lLnByb3RvdHlwZS5pblJhbmdlID0gZnVuY3Rpb24gKHAsIGQpIHtcbiAgICAgICAgaWYgKGQgPT09IHZvaWQgMCkgeyBkID0gMDsgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBtaW5YID0gX2EubWluWCwgbWluWSA9IF9hLm1pblksIG1heFggPSBfYS5tYXhYLCBtYXhZID0gX2EubWF4WTtcbiAgICAgICAgdmFyIHggPSBwLngsIHkgPSBwLnk7XG4gICAgICAgIHZhciBpc0luWCA9IHggPj0gbWluWCAtIGQgJiYgeCA8PSBtYXhYICsgZDtcbiAgICAgICAgdmFyIGlzSW5ZID0geSA+PSBtaW5ZIC0gZCAmJiB5IDw9IG1heFkgKyBkO1xuICAgICAgICByZXR1cm4gaXNJblggJiYgaXNJblk7XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUuaW5zaWRlUmFuZ2UgPSBmdW5jdGlvbiAocCwgZCkge1xuICAgICAgICBpZiAoZCA9PT0gdm9pZCAwKSB7IGQgPSAwOyB9XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIGJlZ2luID0gX2EuYmVnaW4sIGVuZCA9IF9hLmVuZDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5SYW5nZShwLCBkKSAmJiAhYmVnaW4ubGlrZShwLCAwLjAwMDAxKSAmJiAhZW5kLmxpa2UocCwgMC4wMDAwMSk7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRExpbmUucHJvdG90eXBlLCBcImNlbnRlclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmVnaW5cbiAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgIC5zZXRJZkxlc3NUaGFuKHRoaXMuZW5kKVxuICAgICAgICAgICAgICAgIC5tb3ZlKHRoaXMuZW5kXG4gICAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgICAubW92ZSh0aGlzLmJlZ2luXG4gICAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgICAubWludXMoKSlcbiAgICAgICAgICAgICAgICAuYWJzKClcbiAgICAgICAgICAgICAgICAubWludXMoKVxuICAgICAgICAgICAgICAgIC5kaXZpZGUoMikpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERMaW5lLnByb3RvdHlwZSwgXCJtaW5YXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5iZWdpbi54LCB0aGlzLmVuZC54KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShETGluZS5wcm90b3R5cGUsIFwibWluWVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuYmVnaW4ueSwgdGhpcy5lbmQueSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRExpbmUucHJvdG90eXBlLCBcIm1heFhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmJlZ2luLngsIHRoaXMuZW5kLngpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERMaW5lLnByb3RvdHlwZSwgXCJtYXhZXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5iZWdpbi55LCB0aGlzLmVuZC55KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIERMaW5lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiKFwiICsgdGhpcy5hICsgXCIsIFwiICsgdGhpcy5iICsgXCIsIFwiICsgdGhpcy5jICsgXCIpXCI7XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5hLCB0aGlzLmIsIHRoaXMuY107XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUueCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUGFyYWxsZWxZKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludCgtdGhpcy5jIC8gdGhpcy5hLCBwLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzUGFyYWxsZWxYKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludChwLngsIC10aGlzLmMgLyB0aGlzLmIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRFBvaW50KC10aGlzLmIgLyB0aGlzLmEgKiBwLnkgLSB0aGlzLmMgLyB0aGlzLmEsIHAueSk7XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUueSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUGFyYWxsZWxZKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludCgtdGhpcy5jIC8gdGhpcy5hLCBwLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzUGFyYWxsZWxYKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludChwLngsIC10aGlzLmMgLyB0aGlzLmIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRFBvaW50KHAueCwgLXRoaXMuYSAvIHRoaXMuYiAqIHAueCAtIHRoaXMuYyAvIHRoaXMuYik7XG4gICAgfTtcbiAgICBETGluZS5wcm90b3R5cGUuZmluZFBvaW50ID0gZnVuY3Rpb24gKGwpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFkgJiYgbC5pc1BhcmFsbGVsWSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFggJiYgbC5pc1BhcmFsbGVsWCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFggJiYgbC5pc1BhcmFsbGVsWSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQoLWwuYyAvIGwuYSwgLXRoaXMuYyAvIHRoaXMuYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFkgJiYgbC5pc1BhcmFsbGVsWCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQoLXRoaXMuYyAvIHRoaXMuYSwgLWwuYyAvIGwuYik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gLXRoaXMuYyAvIHRoaXMuYTtcbiAgICAgICAgICAgIHJldHVybiBsLnkobmV3IERQb2ludCh4KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQYXJhbGxlbFgpIHtcbiAgICAgICAgICAgIHZhciB5ID0gLXRoaXMuYyAvIHRoaXMuYjtcbiAgICAgICAgICAgIHJldHVybiBsLngobmV3IERQb2ludCgwLCB5KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGwuaXNQYXJhbGxlbFkpIHtcbiAgICAgICAgICAgIHZhciB4ID0gLWwuYyAvIGwuYTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnkobmV3IERQb2ludCh4KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGwuaXNQYXJhbGxlbFgpIHtcbiAgICAgICAgICAgIHZhciB5ID0gLWwuYyAvIGwuYjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLngobmV3IERQb2ludCgwLCB5KSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlcyA9IHRoaXMueShuZXcgRFBvaW50KChsLmMgLyBsLmIgLSB0aGlzLmMgLyB0aGlzLmIpIC8gKHRoaXMuYSAvIHRoaXMuYiAtIGwuYSAvIGwuYikpKTtcbiAgICAgICAgaWYgKCFpc0Zpbml0ZShyZXMueCkgJiYgIWlzRmluaXRlKHJlcy55KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShETGluZS5wcm90b3R5cGUsIFwiaXNQYXJhbGxlbFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNQYXJhbGxlbFggfHwgdGhpcy5pc1BhcmFsbGVsWTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShETGluZS5wcm90b3R5cGUsIFwiaXNQYXJhbGxlbFlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyh0aGlzLmIpIDwgMC4wMDE7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRExpbmUucHJvdG90eXBlLCBcImlzUGFyYWxsZWxYXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnModGhpcy5hKSA8IDAuMDAxO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERMaW5lLnByb3RvdHlwZSwgXCJwb2ludHNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGhpcy5iZWdpbiwgdGhpcy5lbmRdO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRExpbmUucHJvdG90eXBlLmdldEZpID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdnZXRGaScpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcy5iZWdpbicpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcy5iZWdpbilcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCd0aGlzLmVuZCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcy5lbmQpO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLmVuZC5jbG9uZSgpLm1vdmUodGhpcy5iZWdpbi5jbG9uZSgpLm1pbnVzKCkpLCB4ID0gX2EueCwgeSA9IF9hLnk7XG4gICAgICAgIHZhciB2ID0gTWF0aC5hdGFuMih5LCB4KSAtIE1hdGguUEk7XG4gICAgICAgIGlmICh2ID4gMCkge1xuICAgICAgICAgICAgdiA9IE1hdGguUEkgLSB2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoTWF0aC5QSSAtIHYpICUgKE1hdGguUEkgKiAyKTtcbiAgICB9O1xuICAgIERMaW5lLnByb3RvdHlwZS50b1dLVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgX2IgPSBfYS5iZWdpbiwgeDEgPSBfYi54LCB5MSA9IF9iLnksIF9jID0gX2EuZW5kLCB4MiA9IF9jLngsIHkyID0gX2MueTtcbiAgICAgICAgcmV0dXJuIFwiTElORVNUUklORyAoXCIgKyB4MSArIFwiIFwiICsgeTEgKyBcIiwgXCIgKyB4MiArIFwiIFwiICsgeTIgKyBcIilcIjtcbiAgICB9O1xuICAgIERMaW5lLnByb3RvdHlwZS5tb3ZlUG9pbnQgPSBmdW5jdGlvbiAocCwgZCkge1xuICAgICAgICB2YXIgZmkgPSB0aGlzLmZpbmRGaShuZXcgRExpbmUoMSwgMCwgMCkpO1xuICAgICAgICB2YXIgdGQgPSB0aGlzLngobmV3IERQb2ludCgxLCAxKSkuZGlzdGFuY2UodGhpcy54KG5ldyBEUG9pbnQoMiwgMikpKSAvIDI7XG4gICAgICAgIHZhciBzaW5Db3MgPSBuZXcgRFBvaW50KE1hdGguc2luKGZpKSwgTWF0aC5jb3MoZmkpKTtcbiAgICAgICAgdmFyIGR0ID0gc2luQ29zLmNsb25lKCkuc2NhbGUodGQpO1xuICAgICAgICB2YXIgcDFUID0gcC5jbG9uZSgpLm1vdmUoZHQuY2xvbmUoKS5taW51cygpKTtcbiAgICAgICAgdmFyIHAyVCA9IHAuY2xvbmUoKS5tb3ZlKGR0KTtcbiAgICAgICAgaWYgKEROdW1iZXJzLmxpa2UodGhpcy55KHAxVCkueSwgcDFULnkpIHx8IEROdW1iZXJzLmxpa2UodGhpcy55KHAyVCkueSwgcDJULnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gcC5jbG9uZSgpLm1vdmUoc2luQ29zLnNjYWxlKGQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcC5jbG9uZSgpLm1vdmUoc2luQ29zLnNjYWxlKGQpLnNldFgoZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICB2YXIgeCA9IF9hLng7XG4gICAgICAgICAgICByZXR1cm4gLXg7XG4gICAgICAgIH0pKTtcbiAgICB9O1xuICAgIERMaW5lLnByb3RvdHlwZS5maW5kRmkgPSBmdW5jdGlvbiAoX2EsIGRlbHRhKSB7XG4gICAgICAgIHZhciBhID0gX2EuYSwgYiA9IF9hLmI7XG4gICAgICAgIGlmIChkZWx0YSA9PT0gdm9pZCAwKSB7IGRlbHRhID0gMS4wMDAxOyB9XG4gICAgICAgIHZhciBfYiA9IHRoaXMsIHEgPSBfYi5hLCB3ID0gX2IuYjtcbiAgICAgICAgdmFyIHZhbCA9IChxICogYSArIHcgKiBiKSAvIChNYXRoLnNxcnQocSAqIHEgKyB3ICogdykgKiBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpO1xuICAgICAgICBpZiAodmFsID4gMSAmJiB2YWwgPCBkZWx0YSkge1xuICAgICAgICAgICAgdmFsID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWwgPCAtMSAmJiB2YWwgPiAtZGVsdGEpIHtcbiAgICAgICAgICAgIHZhbCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3ModmFsKTtcbiAgICB9O1xuICAgIERMaW5lLnByb3RvdHlwZS52ZWN0b3JQcm9kdWN0ID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBhID0gX2EuYSwgYiA9IF9hLmIsIGMgPSBfYS5jO1xuICAgICAgICB2YXIgX2IgPSB0aGlzLCBxID0gX2IuYSwgdyA9IF9iLmIsIGUgPSBfYi5jO1xuICAgICAgICByZXR1cm4gbmV3IERMaW5lKHcgKiBjIC0gZSAqIGIsIGUgKiBhIC0gcSAqIGMsIHEgKiBiIC0gdyAqIGEpO1xuICAgIH07XG4gICAgcmV0dXJuIERMaW5lO1xufSgpKTtcbmV4cG9ydCB7IERMaW5lIH07XG4iLCJ2YXIgTG9vcEZ1bmN0aW9ucztcbihmdW5jdGlvbiAoTG9vcEZ1bmN0aW9ucykge1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcImdldFRpbGVGcm9tQ29vcmRzXCJdID0gMF0gPSBcImdldFRpbGVGcm9tQ29vcmRzXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiZ2V0Q29vcmRzRnJvbVRpbGVcIl0gPSAxXSA9IFwiZ2V0Q29vcmRzRnJvbVRpbGVcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJoZWlnaHRcIl0gPSAyXSA9IFwiaGVpZ2h0XCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wic2V0WFwiXSA9IDNdID0gXCJzZXRYXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wic2V0WVwiXSA9IDRdID0gXCJzZXRZXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wic2V0WlwiXSA9IDVdID0gXCJzZXRaXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wicm90YXRlXCJdID0gNl0gPSBcInJvdGF0ZVwiO1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcInJvdGF0ZTNkWFwiXSA9IDddID0gXCJyb3RhdGUzZFhcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJyb3RhdGUzZFlcIl0gPSA4XSA9IFwicm90YXRlM2RZXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wicm90YXRlM2RaXCJdID0gOV0gPSBcInJvdGF0ZTNkWlwiO1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcIm1vdmVcIl0gPSAxMF0gPSBcIm1vdmVcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJyb3VuZFwiXSA9IDExXSA9IFwicm91bmRcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJjZWlsXCJdID0gMTJdID0gXCJjZWlsXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiZmxvb3JcIl0gPSAxM10gPSBcImZsb29yXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1widG9GaXhlZFwiXSA9IDE0XSA9IFwidG9GaXhlZFwiO1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcImFic1wiXSA9IDE1XSA9IFwiYWJzXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wic2NhbGVcIl0gPSAxNl0gPSBcInNjYWxlXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiZGl2aWRlXCJdID0gMTddID0gXCJkaXZpZGVcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJkZWdyZWVUb1JhZGlhbnNcIl0gPSAxOF0gPSBcImRlZ3JlZVRvUmFkaWFuc1wiO1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcInJhZGlhbnNUb0RlZ3JlZXNcIl0gPSAxOV0gPSBcInJhZGlhbnNUb0RlZ3JlZXNcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJyYWRpYW5zVG9NZXRlcnNcIl0gPSAyMF0gPSBcInJhZGlhbnNUb01ldGVyc1wiO1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcIm1ldGVyc1RvUmFkaWFuc1wiXSA9IDIxXSA9IFwibWV0ZXJzVG9SYWRpYW5zXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiaGlwUG9pbnRcIl0gPSAyMl0gPSBcImhpcFBvaW50XCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wieFBvaW50XCJdID0gMjNdID0gXCJ4UG9pbnRcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJ5UG9pbnRcIl0gPSAyNF0gPSBcInlQb2ludFwiO1xuICAgIExvb3BGdW5jdGlvbnNbTG9vcEZ1bmN0aW9uc1tcIndQb2ludFwiXSA9IDI1XSA9IFwid1BvaW50XCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiaFBvaW50XCJdID0gMjZdID0gXCJoUG9pbnRcIjtcbiAgICBMb29wRnVuY3Rpb25zW0xvb3BGdW5jdGlvbnNbXCJzZXRJZkxlc3NUaGFuXCJdID0gMjddID0gXCJzZXRJZkxlc3NUaGFuXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wibWludXNcIl0gPSAyOF0gPSBcIm1pbnVzXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiZGVncmVlVG9NZXRlcnNcIl0gPSAyOV0gPSBcImRlZ3JlZVRvTWV0ZXJzXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wibWV0ZXJzVG9EZWdyZWVcIl0gPSAzMF0gPSBcIm1ldGVyc1RvRGVncmVlXCI7XG4gICAgTG9vcEZ1bmN0aW9uc1tMb29wRnVuY3Rpb25zW1wiZmxpcFZlcnRpY2FsbHlcIl0gPSAzMV0gPSBcImZsaXBWZXJ0aWNhbGx5XCI7XG59KShMb29wRnVuY3Rpb25zIHx8IChMb29wRnVuY3Rpb25zID0ge30pKTtcbnZhciBkZWNvZGVQb29sUmVjb3JkID0gZnVuY3Rpb24gKGEsIF9hKSB7XG4gICAgdmFyIGZ1bmN0aW9uTmFtZSA9IF9hLmZ1bmN0aW9uTmFtZSwgcG9pbnRBcmcgPSBfYS5wb2ludEFyZywgbnVtYmVyUG9pbnRBcmcgPSBfYS5udW1iZXJQb2ludEFyZywgbnVtYmVyQXJnID0gX2EubnVtYmVyQXJnLCBzZXR0ZXJBcmcgPSBfYS5zZXR0ZXJBcmc7XG4gICAgdmFyIHJlcyA9IGE7XG4gICAgc3dpdGNoIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLmdldFRpbGVGcm9tQ29vcmRzOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuZ2V0VGlsZUZyb21Db29yZHMobnVtYmVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuZ2V0Q29vcmRzRnJvbVRpbGU6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5nZXRDb29yZHNGcm9tVGlsZShudW1iZXJBcmcpOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy5oZWlnaHQ6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5oZWlnaHQobnVtYmVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuc2V0WDpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnNldFgoc2V0dGVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuc2V0WTpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnNldFkoc2V0dGVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuc2V0WjpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnNldFooc2V0dGVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMucm90YXRlOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAucm90YXRlKG51bWJlckFyZyk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLnJvdGF0ZTNkWDpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnJvdGF0ZTNkWChudW1iZXJBcmcpOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy5yb3RhdGUzZFk6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5yb3RhdGUzZFkobnVtYmVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMucm90YXRlM2RaOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAucm90YXRlM2RaKG51bWJlckFyZyk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLm1vdmU6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5tb3ZlKG51bWJlclBvaW50QXJnLCBudW1iZXJBcmcpOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy5yb3VuZDpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnJvdW5kKCk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLmNlaWw6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5jZWlsKCk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLmZsb29yOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuZmxvb3IoKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMudG9GaXhlZDpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnRvRml4ZWQobnVtYmVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuYWJzOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuYWJzKCk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLnNjYWxlOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuc2NhbGUobnVtYmVyUG9pbnRBcmcsIG51bWJlckFyZyk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLmRpdmlkZTpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLmRpdmlkZShudW1iZXJQb2ludEFyZywgbnVtYmVyQXJnKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuZGVncmVlVG9SYWRpYW5zOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuZGVncmVlVG9SYWRpYW5zKCk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLnJhZGlhbnNUb0RlZ3JlZXM6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5yYWRpYW5zVG9EZWdyZWVzKCk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLnJhZGlhbnNUb01ldGVyczpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLnJhZGlhbnNUb01ldGVycygpOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy5tZXRlcnNUb1JhZGlhbnM6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5tZXRlcnNUb1JhZGlhbnMoKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuaGlwUG9pbnQ6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5oaXBQb2ludDsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMueFBvaW50OlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAueFBvaW50OyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy55UG9pbnQ6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC55UG9pbnQ7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLndQb2ludDpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLndQb2ludDsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuaFBvaW50OlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuaFBvaW50OyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy5zZXRJZkxlc3NUaGFuOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuc2V0SWZMZXNzVGhhbihwb2ludEFyZyk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLm1pbnVzOlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAubWludXMoKTsgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIExvb3BGdW5jdGlvbnMuZGVncmVlVG9NZXRlcnM6XG4gICAgICAgICAgICByZXMgPSBmdW5jdGlvbiAoaykgeyByZXR1cm4gYShrKVxuICAgICAgICAgICAgICAgIC5kZWdyZWVUb01ldGVycygpOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9vcEZ1bmN0aW9ucy5tZXRlcnNUb0RlZ3JlZTpcbiAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uIChrKSB7IHJldHVybiBhKGspXG4gICAgICAgICAgICAgICAgLm1ldGVyc1RvRGVncmVlKCk7IH07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBMb29wRnVuY3Rpb25zLmZsaXBWZXJ0aWNhbGx5OlxuICAgICAgICAgICAgcmVzID0gZnVuY3Rpb24gKGspIHsgcmV0dXJuIGEoaylcbiAgICAgICAgICAgICAgICAuZmxpcFZlcnRpY2FsbHkobnVtYmVyUG9pbnRBcmcpOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xudmFyIERQb2x5Z29uTG9vcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRFBvbHlnb25Mb29wKHBhcmVudCkge1xuICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICAgICAgdGhpcy5wb29sID0gW107XG4gICAgfVxuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUuZ2V0TG9vcEZ1bmN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wb29sLnJlZHVjZShkZWNvZGVQb29sUmVjb3JkLCBmdW5jdGlvbiAoaykgeyByZXR1cm4gazsgfSk7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Lm1hcCh0aGlzLmdldExvb3BGdW5jdGlvbigpKTtcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUuZ2V0VGlsZUZyb21Db29yZHMgPSBmdW5jdGlvbiAoem9vbSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuZ2V0VGlsZUZyb21Db29yZHMsXG4gICAgICAgICAgICBudW1iZXJBcmc6IHpvb21cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5nZXRDb29yZHNGcm9tVGlsZSA9IGZ1bmN0aW9uICh6b29tKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5nZXRDb29yZHNGcm9tVGlsZSxcbiAgICAgICAgICAgIG51bWJlckFyZzogem9vbVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmhlaWdodCA9IGZ1bmN0aW9uICh6KSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5oZWlnaHQsXG4gICAgICAgICAgICBudW1iZXJBcmc6IHpcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5zZXRYID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLnNldFgsXG4gICAgICAgICAgICBzZXR0ZXJBcmc6IHhcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5zZXRZID0gZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLnNldFksXG4gICAgICAgICAgICBzZXR0ZXJBcmc6IHlcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5zZXRaID0gZnVuY3Rpb24gKHopIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLnNldFosXG4gICAgICAgICAgICBzZXR0ZXJBcmc6IHpcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMucm90YXRlLFxuICAgICAgICAgICAgbnVtYmVyQXJnOiBhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUucm90YXRlM2RYID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLnJvdGF0ZTNkWCxcbiAgICAgICAgICAgIG51bWJlckFyZzogYVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLnJvdGF0ZTNkWSA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5yb3RhdGUzZFksXG4gICAgICAgICAgICBudW1iZXJBcmc6IGFcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5yb3RhdGUzZFogPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMucm90YXRlM2RaLFxuICAgICAgICAgICAgbnVtYmVyQXJnOiBhXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUubW92ZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGlmICh5ID09PSB2b2lkIDApIHsgeSA9IHg7IH1cbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLm1vdmUsXG4gICAgICAgICAgICBudW1iZXJQb2ludEFyZzogeCxcbiAgICAgICAgICAgIG51bWJlckFyZzogeVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLnJvdW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMucm91bmRcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5jZWlsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuY2VpbFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmZsb29yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuZmxvb3JcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS50b0ZpeGVkID0gZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgaWYgKG4gPT09IHZvaWQgMCkgeyBuID0gMjsgfVxuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMudG9GaXhlZCxcbiAgICAgICAgICAgIG51bWJlckFyZzogblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLmFic1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0geDsgfVxuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuc2NhbGUsXG4gICAgICAgICAgICBudW1iZXJQb2ludEFyZzogeCxcbiAgICAgICAgICAgIG51bWJlckFyZzogeVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5kaXZpZGUsXG4gICAgICAgICAgICBudW1iZXJQb2ludEFyZzogeCxcbiAgICAgICAgICAgIG51bWJlckFyZzogeVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmRlZ3JlZVRvUmFkaWFucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLmRlZ3JlZVRvUmFkaWFuc1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLnJhZGlhbnNUb0RlZ3JlZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5yYWRpYW5zVG9EZWdyZWVzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUucmFkaWFuc1RvTWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMucmFkaWFuc1RvTWV0ZXJzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUubWV0ZXJzVG9SYWRpYW5zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMubWV0ZXJzVG9SYWRpYW5zXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUuZ2V0SGlwUG9pbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5oaXBQb2ludFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmdldFhQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLnhQb2ludFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmdldFlQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLnlQb2ludFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmdldFdQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLndQb2ludFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmdldEhQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLmhQb2ludFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLnNldElmTGVzc1RoYW4gPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuc2V0SWZMZXNzVGhhbixcbiAgICAgICAgICAgIHBvaW50QXJnOiBwXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUubWludXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogTG9vcEZ1bmN0aW9ucy5taW51c1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbkxvb3AucHJvdG90eXBlLmRlZ3JlZVRvTWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuZGVncmVlVG9NZXRlcnNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb25Mb29wLnByb3RvdHlwZS5tZXRlcnNUb0RlZ3JlZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wb29sLnB1c2goe1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBMb29wRnVuY3Rpb25zLm1ldGVyc1RvRGVncmVlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uTG9vcC5wcm90b3R5cGUuZmxpcFZlcnRpY2FsbHkgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh7XG4gICAgICAgICAgICBmdW5jdGlvbk5hbWU6IExvb3BGdW5jdGlvbnMuZmxpcFZlcnRpY2FsbHksXG4gICAgICAgICAgICBudW1iZXJQb2ludEFyZzogc2l6ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICByZXR1cm4gRFBvbHlnb25Mb29wO1xufSgpKTtcbmV4cG9ydCB7IERQb2x5Z29uTG9vcCB9O1xuIiwidmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX192YWx1ZXMgPSAodGhpcyAmJiB0aGlzLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkID0gKHRoaXMgJiYgdGhpcy5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19zcHJlYWRBcnJheSA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG5pbXBvcnQgeyBEUG9pbnQgfSBmcm9tICcuL0RQb2ludCc7XG5pbXBvcnQgeyBETGluZSB9IGZyb20gJy4vRExpbmUnO1xuaW1wb3J0IHsgRENpcmNsZSB9IGZyb20gJy4vRENpcmNsZSc7XG5pbXBvcnQgeyBETnVtYmVycyB9IGZyb20gJy4vRE51bWJlcnMnO1xuaW1wb3J0IHsgaW8gYXMganN0c0lvLCBvcGVyYXRpb24gfSBmcm9tICdqc3RzJztcbmltcG9ydCB7IERQb2x5Z29uTG9vcCB9IGZyb20gJy4vRFBvbHlnb25Mb29wJztcbmltcG9ydCB7IGlzRGVmQW5kTm90TnVsbCB9IGZyb20gJy4vdXRpbHMnO1xudmFyIF9hID0gb3BlcmF0aW9uLmJ1ZmZlci5CdWZmZXJQYXJhbWV0ZXJzLCBDQVBfUk9VTkQgPSBfYS5DQVBfUk9VTkQsIENBUF9GTEFUID0gX2EuQ0FQX0ZMQVQsIENBUF9TUVVBUkUgPSBfYS5DQVBfU1FVQVJFO1xuZXhwb3J0IHZhciBNSU5fUE9JTlRTX0lOX1ZBTElEX1BPTFlHT04gPSAzO1xudmFyIEFQUFJPWElNQVRJT05fVkFMVUUgPSAwLjE7XG52YXIgTUFYX0NPTlZFWF9JVEVSQVRJT05TID0gMTAwO1xudmFyIENMT1NFX1RPX0lOVEVSU0VDVElPTl9ESVNUQU5DRSA9IDAuMDAxO1xudmFyIGNvbnRhaW5DYWxjdWxhdG9yID0gZnVuY3Rpb24gKHBvbHksIHApIHtcbiAgICB2YXIgZV8xLCBfYSwgZV8yLCBfYjtcbiAgICB2YXIgaGFzU2FtZVBvaW50ID0gcG9seS5wb2ludHMuc29tZShmdW5jdGlvbiAocG9pbnQpIHsgcmV0dXJuIHBvaW50LmVxdWFsKHApOyB9KTtcbiAgICBpZiAoaGFzU2FtZVBvaW50KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYyA9IF9fdmFsdWVzKHBvbHkubG9vcFBvaW50c0dlbmVyYXRvcih0cnVlKSgpKSwgX2QgPSBfYy5uZXh0KCk7ICFfZC5kb25lOyBfZCA9IF9jLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIF9lID0gX19yZWFkKF9kLnZhbHVlLCAzKSwgcG9seWdvbkxpbmUgPSBfZVsyXTtcbiAgICAgICAgICAgIHZhciBvbkJvcmRlciA9IHBvbHlnb25MaW5lLngocCkuZXF1YWwocCkgJiYgcG9seWdvbkxpbmUuaW5SYW5nZShwKTtcbiAgICAgICAgICAgIGlmIChvbkJvcmRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoX2QgJiYgIV9kLmRvbmUgJiYgKF9hID0gX2MucmV0dXJuKSkgX2EuY2FsbChfYyk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgIH1cbiAgICB2YXIgdG90YWxGaSA9IDA7XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yICh2YXIgX2YgPSBfX3ZhbHVlcyhwb2x5Lmxvb3BQb2ludHNHZW5lcmF0b3IoKSgpKSwgX2cgPSBfZi5uZXh0KCk7ICFfZy5kb25lOyBfZyA9IF9mLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIF9oID0gX19yZWFkKF9nLnZhbHVlLCAyKSwgX2ogPSBfaFswXSwgeCA9IF9qLngsIHkgPSBfai55LCBfayA9IF9oWzFdLCBhID0gX2sueCwgYiA9IF9rLnk7XG4gICAgICAgICAgICB2YXIgbGluZTEgPSBuZXcgRExpbmUoeCAtIHAueCwgeSAtIHAueSwgMCk7XG4gICAgICAgICAgICB2YXIgbGluZTIgPSBuZXcgRExpbmUoYSAtIHAueCwgYiAtIHAueSwgMCk7XG4gICAgICAgICAgICB2YXIgZmlEaWYgPSBsaW5lMS5maW5kRmkobGluZTIpO1xuICAgICAgICAgICAgaWYgKGxpbmUxLnZlY3RvclByb2R1Y3QobGluZTIpLmMgPiAwKSB7XG4gICAgICAgICAgICAgICAgdG90YWxGaSArPSBmaURpZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvdGFsRmkgLT0gZmlEaWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChfZyAmJiAhX2cuZG9uZSAmJiAoX2IgPSBfZi5yZXR1cm4pKSBfYi5jYWxsKF9mKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMikgdGhyb3cgZV8yLmVycm9yOyB9XG4gICAgfVxuICAgIHZhciBlcHMgPSBNYXRoLlBJIC8gMTAwMDA7XG4gICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuICAgIHZhciBhYnNUb3RhbEZpID0gTWF0aC5hYnModG90YWxGaSk7XG4gICAgaWYgKGFic1RvdGFsRmkgPCBlcHMpIHtcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2UgaWYgKE1hdGguYWJzKDIgKiBNYXRoLlBJIC0gYWJzVG90YWxGaSkgPCBlcHMpIHtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY29udGFpbnMyIGZhaWxkJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIERQb2x5Z29uID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEUG9seWdvbihwUG9pbnRzKSB7XG4gICAgICAgIGlmIChwUG9pbnRzID09PSB2b2lkIDApIHsgcFBvaW50cyA9IFtdOyB9XG4gICAgICAgIHRoaXMucFBvaW50cyA9IHBQb2ludHM7XG4gICAgICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgICAgICB0aGlzLmhvbGVzID0gW107XG4gICAgICAgIHRoaXMuc2VhcmNoU3RvcmUgPSB7fTtcbiAgICB9XG4gICAgRFBvbHlnb24uYXJyYXlPZlRyaWFuZ2xlc1RvVmVydGljZXMgPSBmdW5jdGlvbiAodHJpYW5nbGVzLCBoZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIHRyaWFuZ2xlcy5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChpc0RlZkFuZE5vdE51bGwoaGVpZ2h0KSA/IHZcbiAgICAgICAgICAgIC5sb29wKClcbiAgICAgICAgICAgIC5oZWlnaHQoaGVpZ2h0KVxuICAgICAgICAgICAgLnJ1bigpIDogdilcbiAgICAgICAgICAgIC50b0FycmF5T2ZDb29yZHMoKTsgfSlcbiAgICAgICAgICAgIC5mbGF0KDIpO1xuICAgIH07XG4gICAgRFBvbHlnb24ubWluQXJlYVJlY3RhbmdsZVNpemUgPSBmdW5jdGlvbiAocG9seSkge1xuICAgICAgICB2YXIgX2EgPSBwb2x5LmNsb25lKCkub3BlbigpLCBmaXJzdCA9IF9hLmZpcnN0LCBzZWNvbmQgPSBfYS5zZWNvbmQsIGxhc3QgPSBfYS5sYXN0O1xuICAgICAgICByZXR1cm4gbmV3IERQb2ludChmaXJzdC5kaXN0YW5jZShzZWNvbmQpLCBmaXJzdC5kaXN0YW5jZShsYXN0KSk7XG4gICAgfTtcbiAgICBEUG9seWdvbi50b0Rhc2ggPSBmdW5jdGlvbiAocG9seSkge1xuICAgICAgICB2YXIgZV8zLCBfYTtcbiAgICAgICAgdmFyIHAgPSBuZXcgRFBvbHlnb24oKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtwXTtcbiAgICAgICAgdmFyIHRyaWdnZXIgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhwb2x5LnBvaW50cyksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9pbnQgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICBwLnB1c2gocG9pbnQuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwb2ludC5wcm9wZXJ0aWVzLnBpZWNlQm9yZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgPSAhdHJpZ2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBuZXcgRFBvbHlnb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5wdXNoKHBvaW50LmNsb25lKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzNfMSkgeyBlXzMgPSB7IGVycm9yOiBlXzNfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMykgdGhyb3cgZV8zLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIERQb2x5Z29uLm1pbkFyZWFSZWN0YW5nbGVEaXJlY3Rpb24gPSBmdW5jdGlvbiAocG9seSkge1xuICAgICAgICB2YXIgX2EgPSBwb2x5LmNsb25lKCkub3BlbigpLCBmaXJzdCA9IF9hLmZpcnN0LCBzZWNvbmQgPSBfYS5zZWNvbmQsIGxhc3QgPSBfYS5sYXN0O1xuICAgICAgICBpZiAoIWZpcnN0IHx8ICFzZWNvbmQgfHwgIWxhc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaXJzdC5kaXN0YW5jZShzZWNvbmQpID4gZmlyc3QuZGlzdGFuY2UobGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdC5maW5kTGluZShzZWNvbmQpLmdldEZpKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpcnN0LmZpbmRMaW5lKGxhc3QpLmdldEZpKCk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wYXJzZUZyb21XS1QgPSBmdW5jdGlvbiAod2t0KSB7XG4gICAgICAgIHZhciBkYXRhID0gd2t0LnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB2YXIgcmVzID0gbmV3IERQb2x5Z29uKCk7XG4gICAgICAgIGlmIChkYXRhLmluZGV4T2YoJ1BPTFlHT04nKSA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHJlZ2V4cCA9IC9QT0xZR09OIFxcKFxcKCg/PGRhdGE+KD86KD8hXFwpXFwpJCkuKSo/KVxcKVxcKSQvbWl1O1xuICAgICAgICAgICAgdmFyIHJlZyA9IHJlZ2V4cC5leGVjKGRhdGEpO1xuICAgICAgICAgICAgdmFyIF9hID0gX19yZWFkKHJlZy5ncm91cHMuZGF0YVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnKSwgKCcpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAocCkgeyByZXR1cm4gbmV3IERQb2x5Z29uKHAuc3BsaXQoJywgJylcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChwYXJlcykgeyByZXR1cm4gRFBvaW50LnBhcnNlKHBhcmVzLnNwbGl0KCcgJykubWFwKE51bWJlcikpOyB9KSk7IH0pKSwgcGF0aCA9IF9hWzBdLCBob2xlcyA9IF9hLnNsaWNlKDEpO1xuICAgICAgICAgICAgaWYgKGhvbGVzICYmIGhvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHBhdGguaG9sZXMgPSBob2xlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcyA9IHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuaW5kZXhPZignTElORVNUUklORycpID09PSAwKSB7XG4gICAgICAgICAgICB2YXIgcmVnZXhwID0gL0xJTkVTVFJJTkcgXFwoKD88ZGF0YT4oPzooPyFcXCkkKS4pKj8pXFwpJC9taXU7XG4gICAgICAgICAgICB2YXIgcmVnID0gcmVnZXhwLmV4ZWMoZGF0YSk7XG4gICAgICAgICAgICByZXMgPSBuZXcgRFBvbHlnb24ocmVnLmdyb3Vwcy5kYXRhXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcsICcpLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gRFBvaW50LnBhcnNlKHQuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKSk7IH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5pbmRleE9mKCdQT0lOVCcpID09PSAwKSB7XG4gICAgICAgICAgICByZXMgPSBuZXcgRFBvbHlnb24oW0RQb2ludC5wYXJzZUZyb21XS1QoZGF0YSldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgRFBvbHlnb24uY3JlYXRlU3F1YXJlQnlTaXplID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEUG9seWdvbihbRFBvaW50Lnplcm8oKSwgc2l6ZS5jbG9uZSgpLnNldFgoMCksIHNpemUuY2xvbmUoKSwgc2l6ZS5jbG9uZSgpLnNldFkoMCldKS5jbG9zZSgpO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmxvb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRFBvbHlnb25Mb29wKHRoaXMpO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJwb2ludHNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBQb2ludHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHApIHtcbiAgICAgICAgICAgIHRoaXMucFBvaW50cyA9IHA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcIm1heFhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZHVjZShmdW5jdGlvbiAoYSwgcikgeyByZXR1cm4gTWF0aC5tYXgoYSwgci54KTsgfSwgLUluZmluaXR5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwibWluWFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVkdWNlKGZ1bmN0aW9uIChhLCByKSB7IHJldHVybiBNYXRoLm1pbihhLCByLngpOyB9LCBJbmZpbml0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcIm1heFlcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZHVjZShmdW5jdGlvbiAoYSwgcikgeyByZXR1cm4gTWF0aC5tYXgoYSwgci55KTsgfSwgLUluZmluaXR5KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwibWluWVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVkdWNlKGZ1bmN0aW9uIChhLCByKSB7IHJldHVybiBNYXRoLm1pbihhLCByLnkpOyB9LCBJbmZpbml0eSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcImNlbnRlclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdFRvcC5tb3ZlKHRoaXMuc2l6ZS5kaXZpZGUoMikpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhZIC0gdGhpcy5taW5ZO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJ3XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhYIC0gdGhpcy5taW5YO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJkWVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwiZFhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnc7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcImV4dGVuZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgbWluWCA9IF9hLm1pblgsIG1pblkgPSBfYS5taW5ZLCBtYXhYID0gX2EubWF4WCwgbWF4WSA9IF9hLm1heFk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2x5Z29uKFtcbiAgICAgICAgICAgICAgICBuZXcgRFBvaW50KG1pblgsIG1pblkpLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQobWF4WCwgbWluWSksXG4gICAgICAgICAgICAgICAgbmV3IERQb2ludChtYXhYLCBtYXhZKSxcbiAgICAgICAgICAgICAgICBuZXcgRFBvaW50KG1pblgsIG1heFkpLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQobWluWCwgbWluWSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLCB3ID0gX2EudywgaCA9IF9hLmg7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludCh3LCBoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwibGVmdFRvcFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgbWluWCA9IF9hLm1pblgsIG1pblkgPSBfYS5taW5ZO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQobWluWCwgbWluWSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcInJpZ2h0Qm90dG9tXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLCBtYXhYID0gX2EubWF4WCwgbWF4WSA9IF9hLm1heFk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludChtYXhYLCBtYXhZKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wUG9pbnRzLmxlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwiZnVsbExlbmd0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5vcGVuKCkucGVyaW1ldGVyO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJwZXJpbWV0ZXJcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBlXzQsIF9hO1xuICAgICAgICAgICAgdmFyIHAgPSAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHRoaXMubG9vcFBvaW50c0dlbmVyYXRvcigpKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZChfYy52YWx1ZSwgMiksIHAxID0gX2RbMF0sIHAyID0gX2RbMV07XG4gICAgICAgICAgICAgICAgICAgIHAgKz0gcDEuZGlzdGFuY2UocDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlXzRfMSkgeyBlXzQgPSB7IGVycm9yOiBlXzRfMSB9OyB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV80KSB0aHJvdyBlXzQuZXJyb3I7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJhcmVhXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZV81LCBfYTtcbiAgICAgICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHRoaXMuZGVpbnRlcnNlY3Rpb24ubG9vcFBvaW50c0dlbmVyYXRvcigpKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZChfYy52YWx1ZSwgMiksIF9lID0gX2RbMF0sIHggPSBfZS54LCB5ID0gX2UueSwgX2YgPSBfZFsxXSwgYSA9IF9mLngsIGIgPSBfZi55O1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0geCAqIGIgLSB5ICogYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV81XzEpIHsgZV81ID0geyBlcnJvcjogZV81XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNSkgdGhyb3cgZV81LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoc3VtIC8gMikgLSB0aGlzLmhvbGVzLnJlZHVjZShmdW5jdGlvbiAoYSwgaG9sZSkgeyByZXR1cm4gYSArIGhvbGUuYXJlYTsgfSwgMCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcImRlaW50ZXJzZWN0aW9uXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZV82LCBfYTtcbiAgICAgICAgICAgIHZhciBwID0gdGhpcy5jbG9uZSgpLmNsb3NlKCk7XG4gICAgICAgICAgICB2YXIgc3RvcmUgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgayA9IHAuYXQoaSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBzdG9yZVtrXSA9IHN0b3JlW2tdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHN0b3JlW2tdLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoaikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RMaW5lID0gcC5hdChpKS5maW5kTGluZShwLmF0KGkgKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWNvbmRMaW5lID0gcC5hdChqKS5maW5kTGluZShwLmF0KGogKyAxKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb25Qb2ludCA9IGZpcnN0TGluZS5pbnRlcnNlY3Rpb24oc2Vjb25kTGluZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3Rpb25Qb2ludCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIV9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKGZpcnN0TGluZS5wb2ludHMpLCBmYWxzZSksIF9fcmVhZChzZWNvbmRMaW5lLnBvaW50cyksIGZhbHNlKS5zb21lKGZ1bmN0aW9uICh0KSB7IHJldHVybiB0Lmxpa2UoaW50ZXJzZWN0aW9uUG9pbnQpOyB9KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBwLnJlbW92ZVBhcnQoaSwgaiAtIGkpLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5zZXJ0QWZ0ZXIuYXBwbHkocCwgX19zcHJlYWRBcnJheShbaV0sIF9fcmVhZChwYXJ0KSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAuaW5zZXJ0QWZ0ZXIoaiwgaW50ZXJzZWN0aW9uUG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcC5pbnNlcnRBZnRlcihpLCBpbnRlcnNlY3Rpb25Qb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSBpICsgMjsgaiA8IHAubGVuZ3RoIC0gMTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIF9sb29wXzEoaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKE9iamVjdC5rZXlzKHN0b3JlKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IF9jLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVjb3JkID0gc3RvcmVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMiA9IGZ1bmN0aW9uIChqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbl8xID0gcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gcmVjb3JkW2pdIC0gcmVjb3JkW2ogLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBuZXcgRFBvbHlnb24ob3JpZ2luXzEucmVtb3ZlUGFydChyZWNvcmRbaiAtIDFdLCBkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbGxJbnNpZGUgPSBwYXJ0LnJlZHVjZShmdW5jdGlvbiAoYSwgZSkgeyByZXR1cm4gYSAmJiBjb250YWluQ2FsY3VsYXRvcihvcmlnaW5fMSwgZSk7IH0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsSW5zaWRlICYmIG9yaWdpbl8xLmlzQ2xvY2t3aXNlID09PSBwYXJ0LmlzQ2xvY2t3aXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5fMS5pbnNlcnRBZnRlci5hcHBseShvcmlnaW5fMSwgX19zcHJlYWRBcnJheShbcmVjb3JkW2ogLSAxXSAtIDFdLCBfX3JlYWQocGFydC5yZXZlcnNlKCkucG9pbnRzKSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBvcmlnaW5fMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gcmVjb3JkLmxlbmd0aCAtIDE7IGogPiAwOyBqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8yKGopO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfNl8xKSB7IGVfNiA9IHsgZXJyb3I6IGVfNl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzYpIHRocm93IGVfNi5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcInZhbGlkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPiBNSU5fUE9JTlRTX0lOX1ZBTElEX1BPTFlHT047XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcImZpcnN0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdCgwKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwic2Vjb25kXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdCgxKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwibGFzdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXQodGhpcy5sZW5ndGggLSAxKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwibWluQXJlYVJlY3RhbmdsZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVfNywgX2EsIGVfOCwgX2I7XG4gICAgICAgICAgICB2YXIgcCA9IHRoaXMuY29udmV4O1xuICAgICAgICAgICAgdmFyIHJlc3VsdFBvbHlnb24gPSBuZXcgRFBvbHlnb24oKTtcbiAgICAgICAgICAgIHZhciByZXN1bHRBcmVhID0gSW5maW5pdHk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIF9jID0gX192YWx1ZXMocC5sb29wUG9pbnRzR2VuZXJhdG9yKHRydWUpKCkpLCBfZCA9IF9jLm5leHQoKTsgIV9kLmRvbmU7IF9kID0gX2MubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZSA9IF9fcmVhZChfZC52YWx1ZSwgMyksIGwgPSBfZVsyXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heFdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heFdpZHRoUG9pbnQxID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heFdpZHRoUG9pbnQyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1heEhlaWdodCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXhIZWlnaHRQb2ludCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfZiA9IChlXzggPSB2b2lkIDAsIF9fdmFsdWVzKHAubG9vcFBvaW50c0dlbmVyYXRvcigpKCkpKSwgX2cgPSBfZi5uZXh0KCk7ICFfZy5kb25lOyBfZyA9IF9mLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfaCA9IF9fcmVhZChfZy52YWx1ZSwgNCksIHogPSBfaFswXSwgaSA9IF9oWzNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwMSA9IGwuZmluZFBvaW50KGwuZmluZFBlcnBlbmRpY3VsYXIoeikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gcDEuZGlzdGFuY2Uoeik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPj0gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodFBvaW50ID0gejtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IGk7IGogPCBwLmxlbmd0aCAtIDE7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcDIgPSBsLmZpbmRQb2ludChsLmZpbmRQZXJwZW5kaWN1bGFyKHAuYXQoaikpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBwMS5kaXN0YW5jZShwMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IHc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aFBvaW50MSA9IHAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGhQb2ludDIgPSBwMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZV84XzEpIHsgZV84ID0geyBlcnJvcjogZV84XzEgfTsgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9nICYmICFfZy5kb25lICYmIChfYiA9IF9mLnJldHVybikpIF9iLmNhbGwoX2YpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzgpIHRocm93IGVfOC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWF4V2lkdGhQb2ludDEgfHwgIW1heFdpZHRoUG9pbnQyIHx8ICFtYXhIZWlnaHRQb2ludCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoTGluZSA9IG1heFdpZHRoUG9pbnQxLmZpbmRMaW5lKG1heFdpZHRoUG9pbnQyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcnBlbmRpY3VsYXIxID0gd2lkdGhMaW5lLmZpbmRQZXJwZW5kaWN1bGFyKG1heFdpZHRoUG9pbnQxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBlcnBlbmRpY3VsYXIyID0gd2lkdGhMaW5lLmZpbmRQZXJwZW5kaWN1bGFyKG1heFdpZHRoUG9pbnQyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRlbXBQb2x5Z29uID0gbmV3IERQb2x5Z29uKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoUG9pbnQxLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGhQb2ludDIsXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJwZW5kaWN1bGFyMi5maW5kUG9pbnQocGVycGVuZGljdWxhcjIuZmluZFBlcnBlbmRpY3VsYXIobWF4SGVpZ2h0UG9pbnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnBlbmRpY3VsYXIxLmZpbmRQb2ludChwZXJwZW5kaWN1bGFyMS5maW5kUGVycGVuZGljdWxhcihtYXhIZWlnaHRQb2ludCkpXG4gICAgICAgICAgICAgICAgICAgIF0pLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUG9seWdvbi5hcmVhIDwgcmVzdWx0QXJlYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0UG9seWdvbiA9IHRlbXBQb2x5Z29uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QXJlYSA9IHRlbXBQb2x5Z29uLmFyZWE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZV83XzEpIHsgZV83ID0geyBlcnJvcjogZV83XzEgfTsgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kICYmICFfZC5kb25lICYmIChfYSA9IF9jLnJldHVybikpIF9hLmNhbGwoX2MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfNykgdGhyb3cgZV83LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0UG9seWdvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9seWdvbi5wcm90b3R5cGUsIFwiY29udmV4XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHRoaXMuY2xvbmUoKS5vcGVuKCk7XG4gICAgICAgICAgICB2YXIgaXNDbG9ja3dpc2UgPSBwLmlzQ2xvY2t3aXNlO1xuICAgICAgICAgICAgaWYgKCFpc0Nsb2Nrd2lzZSkge1xuICAgICAgICAgICAgICAgIHAucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGwgPSAwO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBwMSA9IHAubGFzdDtcbiAgICAgICAgICAgICAgICB2YXIgcDIgPSBwLmZpcnN0O1xuICAgICAgICAgICAgICAgIHZhciBwMyA9IHAuc2Vjb25kO1xuICAgICAgICAgICAgICAgIHZhciBkID0gcDIuZmluZElubmVyQW5nbGUocDEsIHAzKTtcbiAgICAgICAgICAgICAgICBpZiAoZCA+IE1hdGguUEkgfHwgRE51bWJlcnMubGlrZVplcm8oRE51bWJlcnMucmFkMkRlZyhkKSkgfHwgRE51bWJlcnMubGlrZVBJKGQpIHx8IEROdW1iZXJzLmxpa2UyUEkoZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcC5yZW1vdmVQYXJ0KC0xLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHAubGVuZ3RoKTtcbiAgICAgICAgICAgIHAuY2xvc2UoKTtcbiAgICAgICAgICAgIHZhciBpdGVyYXRpb24gPSAwO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHAgPSBwLmRlaW50ZXJzZWN0aW9uO1xuICAgICAgICAgICAgICAgIGwgPSBwLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHAubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwMSA9IHAuYXQoaSAtIDEpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcDIgPSBwLmF0KGkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcDMgPSBwLmF0KGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBwMi5maW5kSW5uZXJBbmdsZShwMSwgcDMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZCA+IE1hdGguUEkgfHwgRE51bWJlcnMubGlrZVplcm8oRE51bWJlcnMucmFkMkRlZyhkKSkgfHwgRE51bWJlcnMubGlrZVBJKGQpIHx8IEROdW1iZXJzLmxpa2UyUEkoZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHAucmVtb3ZlUGFydCgtLWksIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbisrO1xuICAgICAgICAgICAgfSB3aGlsZSAocC5sZW5ndGggIT09IGwgJiYgaXRlcmF0aW9uIDwgTUFYX0NPTlZFWF9JVEVSQVRJT05TKTtcbiAgICAgICAgICAgIGlmICghaXNDbG9ja3dpc2UpIHtcbiAgICAgICAgICAgICAgICBwLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJpc0Nsb2Nrd2lzZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGVfOSwgX2E7XG4gICAgICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyh0aGlzLmNsb25lKCkuY2xvc2UoKVxuICAgICAgICAgICAgICAgICAgICAubG9vcFBvaW50c0dlbmVyYXRvcigpKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZChfYy52YWx1ZSwgMiksIF9lID0gX2RbMF0sIHggPSBfZS54LCB5ID0gX2UueSwgX2YgPSBfZFsxXSwgYSA9IF9mLngsIGIgPSBfZi55O1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKGEgLSB4KSAqIChiICsgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfOV8xKSB7IGVfOSA9IHsgZXJyb3I6IGVfOV8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzkpIHRocm93IGVfOS5lcnJvcjsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN1bSA8IDA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcImNsb2NrV2lzZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDbG9ja3dpc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5yZXZlcnNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcIm5vSG9sZXNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgICAgICByZXMuaG9sZXMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUucmVkdWNlID0gZnVuY3Rpb24gKGYsIHYpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucFBvaW50cy5yZWR1Y2UoZiwgdik7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuaW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKGwsIGluY2x1ZGVPbmx5KSB7XG4gICAgICAgIHZhciBlXzEwLCBfYTtcbiAgICAgICAgaWYgKGluY2x1ZGVPbmx5ID09PSB2b2lkIDApIHsgaW5jbHVkZU9ubHkgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHRoaXMubG9vcFBvaW50c0dlbmVyYXRvcih0cnVlKSgpKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBfZCA9IF9fcmVhZChfYy52YWx1ZSwgMyksIGxpbmUgPSBfZFsyXTtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZXJzZWN0ID0gbGluZS5pbnRlcnNlY3Rpb24obCwgMCwgaW5jbHVkZU9ubHkpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goaW50ZXJzZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMTBfMSkgeyBlXzEwID0geyBlcnJvcjogZV8xMF8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMCkgdGhyb3cgZV8xMC5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2V0Q2VudGVyID0gZnVuY3Rpb24gKG5ld0NlbnRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5sb29wKClcbiAgICAgICAgICAgIC5tb3ZlKG5ld0NlbnRlci5jbG9uZSgpLm1vdmUodGhpcy5jZW50ZXIubWludXMoKSkpXG4gICAgICAgICAgICAucnVuKCk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUudG9XS1QgPSBmdW5jdGlvbiAodHlwZSwgd2l0aFopIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHZvaWQgMCkgeyB0eXBlID0gRFBvbHlnb24uV0tUX1BPTFlHT047IH1cbiAgICAgICAgaWYgKHdpdGhaID09PSB2b2lkIDApIHsgd2l0aFogPSBmYWxzZTsgfVxuICAgICAgICBpZiAodHlwZSA9PT0gRFBvbHlnb24uV0tUX1BPTFlHT04pIHtcbiAgICAgICAgICAgIHZhciBoID0gJyc7XG4gICAgICAgICAgICBpZiAodGhpcy5ob2xlcyAmJiB0aGlzLmhvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGggPSBcIiwgXCIgKyB0aGlzLmhvbGVzLm1hcChmdW5jdGlvbiAoaG9sZSkgeyByZXR1cm4gaG9sZS50b1N0cmluZygpOyB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIlBPTFlHT04gKChcIiArIHRoaXMuZGVpbnRlcnNlY3Rpb24ubWFwQXJyYXkoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIueCArIFwiIFwiICsgci55ICsgKHdpdGhaID8gXCIgXCIgKyByLnogOiAnJyk7IH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJykgKyBcIilcIiArIGggKyBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCJMSU5FU1RSSU5HIChcIiArIHRoaXMubWFwQXJyYXkoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIueCArIFwiIFwiICsgci55ICsgKHdpdGhaID8gXCIgXCIgKyByLnogOiAnJyk7IH0pXG4gICAgICAgICAgICAuam9pbignLCAnKSArIFwiKVwiO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHRoaXMucFBvaW50cyA9IHRoaXMucFBvaW50cy5maWx0ZXIoZik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHRoaXMucFBvaW50cyA9IHRoaXMubWFwQXJyYXkoZik7XG4gICAgICAgIHRoaXMuaG9sZXMgPSB0aGlzLmhvbGVzLm1hcChmdW5jdGlvbiAoaCkgeyByZXR1cm4gaC5tYXAoZik7IH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5tYXBBcnJheSA9IGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBQb2ludHMubWFwKGYpO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbiAoZikge1xuICAgICAgICB0aGlzLnBvaW50cy5zb3J0KGYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50c1soaW5kZXggJSBsZW5ndGggKyBsZW5ndGgpICUgbGVuZ3RoXTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBQb2ludHMucG9wKCk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoX2EgPSB0aGlzLnBQb2ludHMpLnB1c2guYXBwbHkoX2EsIF9fc3ByZWFkQXJyYXkoW10sIF9fcmVhZChhcmdzKSwgZmFsc2UpKTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucFBvaW50cy5zaGlmdCgpO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnVuc2hpZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKF9hID0gdGhpcy5wUG9pbnRzKS51bnNoaWZ0LmFwcGx5KF9hLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYXJncyksIGZhbHNlKSk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUucmV2ZXJzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5wUG9pbnRzID0gdGhpcy5wUG9pbnRzLnJldmVyc2UoKTtcbiAgICAgICAgdGhpcy5ob2xlcyA9IHRoaXMuaG9sZXMubWFwKGZ1bmN0aW9uIChoKSB7IHJldHVybiBoLnJldmVyc2UoKTsgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucFBvaW50cy5tYXAoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIuZ2V0VmFsdWUoKTsgfSkgKyB0aGlzLmhvbGVzXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhLCBoKSB7IHJldHVybiBhICsgaC5nZXRWYWx1ZSgpOyB9LCAnJykpO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gXCIoXCIgKyB0aGlzLm1hcEFycmF5KGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnRvU3RyaW5nKCk7IH0pLmpvaW4oJywgJykgKyBcIilcIjtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHAwID0gdGhpcy5maXJzdDtcbiAgICAgICAgaWYgKHAwICYmICF0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5wdXNoKHAwLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwID0gdGhpcy5maXJzdDtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID4gMiAmJiBwICYmIHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChwb2x5KSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgRFBvbHlnb24oX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5wb2ludHMpLCBmYWxzZSksIF9fcmVhZChwb2x5LnBvaW50cyksIGZhbHNlKSkuY2xvc2UoKTtcbiAgICAgICAgcmVzLmhvbGVzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodGhpcy5ob2xlcyksIGZhbHNlKSwgX19yZWFkKHBvbHkuaG9sZXMpLCBmYWxzZSkubWFwKGZ1bmN0aW9uIChoKSB7IHJldHVybiBoLmNsb25lKCk7IH0pO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBQb2ludHMuc29tZShmdW5jdGlvbiAocSkgeyByZXR1cm4gcS5lcXVhbChwKTsgfSk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXMgPSBuZXcgRFBvbHlnb24odGhpcy5wb2ludHMubWFwKGZ1bmN0aW9uIChyKSB7IHJldHVybiByLmNsb25lKCk7IH0pKTtcbiAgICAgICAgcmVzLmhvbGVzID0gdGhpcy5ob2xlcy5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguY2xvbmUoKTsgfSk7XG4gICAgICAgIHJlcy5wcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmVxdWFsID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgaWYgKCEocCBpbnN0YW5jZW9mIERQb2x5Z29uKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gcC5sZW5ndGggfHwgdGhpcy5ob2xlcy5sZW5ndGggIT09IHAuaG9sZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0aGlzLnNhbWUocCkgJiZcbiAgICAgICAgICAgIHRoaXMuaG9sZXMucmVkdWNlKGZ1bmN0aW9uIChhLCBob2xlKSB7IHJldHVybiBhICYmIHAuaG9sZXMuc29tZShmdW5jdGlvbiAocEhvbGVzKSB7IHJldHVybiBwSG9sZXMuc2FtZShob2xlKTsgfSk7IH0sIHRydWUpKTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5zYW1lID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIHBDbG9uZSA9IHAuY2xvbmUoKS5jbG9zZSgpO1xuICAgICAgICB2YXIgdGhpc0FzU3RyaW5nID0gdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAuY2xvc2UoKVxuICAgICAgICAgICAgLnRvU3RyaW5nKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcENsb25lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpc0FzU3RyaW5nID09PSBwQ2xvbmUudG9TdHJpbmcoKSB8fCB0aGlzQXNTdHJpbmcgPT09IHBDbG9uZS5jbG9uZSgpLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwQ2xvbmUubmV4dFN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmZpbmRJbmRleCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgRFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wb2ludHMuZmluZEluZGV4KGZ1bmN0aW9uICh0KSB7IHJldHVybiB0LmVxdWFsKGEpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wb2ludHMuZmluZEluZGV4KGEpO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmFwcHJveGltYXRpb24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZSA9PT0gdm9pZCAwKSB7IGUgPSBNYXRoLnNxcnQodGhpcy5wZXJpbWV0ZXIpICogQVBQUk9YSU1BVElPTl9WQUxVRTsgfVxuICAgICAgICByZXR1cm4gbmV3IERQb2x5Z29uKHRoaXMuY2xvbmUoKS5kb3VnbGFzUGV1Y2tlcih0aGlzLnBQb2ludHMsIGUpKTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5pbnNlcnRBZnRlciA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIHBvaW50c1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLnBQb2ludHMpLnNwbGljZS5hcHBseShfYSwgX19zcHJlYWRBcnJheShbaW5kZXggKyAxLCAwXSwgX19yZWFkKHBvaW50cyksIGZhbHNlKSk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUucmVtb3ZlUGFydCA9IGZ1bmN0aW9uIChpbmRleCwgY291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucFBvaW50cy5zcGxpY2UoaW5kZXggKyAxLCBjb3VudCk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuaGFzU2ltcGxlSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIGV4dGVuZDEgPSB0aGlzLmV4dGVuZDtcbiAgICAgICAgdmFyIGV4dGVuZDIgPSBwLmV4dGVuZDtcbiAgICAgICAgdmFyIGV4dGVuZDFwb2ludHMgPSBleHRlbmQxLnBvaW50cztcbiAgICAgICAgdmFyIGV4dGVuZDJwb2ludHMgPSBleHRlbmQyLnBvaW50cztcbiAgICAgICAgdmFyIGluMSA9IGV4dGVuZDFwb2ludHMuc29tZShmdW5jdGlvbiAodCkgeyByZXR1cm4gZXh0ZW5kMi5zaW1wbGVJbmNsdWRlKHQpOyB9KTtcbiAgICAgICAgdmFyIGluMiA9IGV4dGVuZDJwb2ludHMuc29tZShmdW5jdGlvbiAodCkgeyByZXR1cm4gZXh0ZW5kMS5zaW1wbGVJbmNsdWRlKHQpOyB9KTtcbiAgICAgICAgcmV0dXJuIGluMSB8fCBpbjI7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2ltcGxlSW5jbHVkZSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpbXBsZUluY2x1ZGVYKHApICYmIHRoaXMuc2ltcGxlSW5jbHVkZVkocCk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuZHJhd1BvbHlnb25PbkNhbnZhcyA9IGZ1bmN0aW9uIChjYW52YXMsIGZpbGxDb2xvciwgc3Ryb2tlQ29sb3IsIHNoYWRvd0NvbG9yLCBsaW5lV2lkdGgsIHN0ZXBzKSB7XG4gICAgICAgIGlmIChsaW5lV2lkdGggPT09IHZvaWQgMCkgeyBsaW5lV2lkdGggPSAxOyB9XG4gICAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7IHN0ZXBzID0gdGhpcy5sZW5ndGggLSAxOyB9XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGlmIChmaWxsQ29sb3IpIHtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsQ29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0cm9rZUNvbG9yKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2VDb2xvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGluZVdpZHRoKSB7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxsQ29sb3IgfHwgc3Ryb2tlQ29sb3IpIHtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdvQnlQYXRoKGN0eCwgc3RlcHMgJSB0aGlzLmxlbmd0aCk7XG4gICAgICAgIGlmIChzaGFkb3dDb2xvcikge1xuICAgICAgICAgICAgY3R4LnNoYWRvd0NvbG9yID0gc2hhZG93Q29sb3I7XG4gICAgICAgICAgICBjdHguc2hhZG93Qmx1ciA9IDA7XG4gICAgICAgICAgICBjdHguc2hhZG93T2Zmc2V0WCA9IDE7XG4gICAgICAgICAgICBjdHguc2hhZG93T2Zmc2V0WSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGxDb2xvcikge1xuICAgICAgICAgICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Ryb2tlQ29sb3IpIHtcbiAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmNsZWFyUG9seWdvbk9uQ2FudmFzID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICAgICAgICB2YXIgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIHZhciBvbGQgPSBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICBjdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG4gICAgICAgIHRoaXMuZ29CeVBhdGgoY3R4KTtcbiAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IG9sZDtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5jb250YWluID0gZnVuY3Rpb24gKHAsIGlzQm9yZGVySW5zaWRlKSB7XG4gICAgICAgIHZhciBlXzExLCBfYTtcbiAgICAgICAgaWYgKGlzQm9yZGVySW5zaWRlID09PSB2b2lkIDApIHsgaXNCb3JkZXJJbnNpZGUgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgc2ltcGxlSW5jbHVkZSA9IHRoaXMuc2ltcGxlSW5jbHVkZShwKTtcbiAgICAgICAgaWYgKCFzaW1wbGVJbmNsdWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9uQm9yZGVyID0gdGhpcy5vbkJvcmRlcihwKTtcbiAgICAgICAgaWYgKG9uQm9yZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNCb3JkZXJJbnNpZGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvbHkgPSB0aGlzLmRlaW50ZXJzZWN0aW9uO1xuICAgICAgICB2YXIgdG90YWxGaSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHBvbHkubG9vcFBvaW50c0dlbmVyYXRvcigpKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkKF9jLnZhbHVlLCAyKSwgX2UgPSBfZFswXSwgeCA9IF9lLngsIHkgPSBfZS55LCBfZiA9IF9kWzFdLCBhID0gX2YueCwgYiA9IF9mLnk7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmUxID0gbmV3IERMaW5lKHggLSBwLngsIHkgLSBwLnksIDApO1xuICAgICAgICAgICAgICAgIHZhciBsaW5lMiA9IG5ldyBETGluZShhIC0gcC54LCBiIC0gcC55LCAwKTtcbiAgICAgICAgICAgICAgICB2YXIgZmlEaWYgPSBsaW5lMS5maW5kRmkobGluZTIpO1xuICAgICAgICAgICAgICAgIGlmIChsaW5lMS52ZWN0b3JQcm9kdWN0KGxpbmUyKS5jID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0b3RhbEZpICs9IGZpRGlmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxGaSAtPSBmaURpZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVfMTFfMSkgeyBlXzExID0geyBlcnJvcjogZV8xMV8xIH07IH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xMSkgdGhyb3cgZV8xMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBlcHMgPSBNYXRoLlBJIC8gMTAwMDA7XG4gICAgICAgIHZhciBhYnNUb3RhbEZpID0gTWF0aC5hYnModG90YWxGaSk7XG4gICAgICAgIGlmIChhYnNUb3RhbEZpIDwgZXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnMoMiAqIE1hdGguUEkgLSBhYnNUb3RhbEZpKSA8IGVwcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250YWluczIgZmFpbGQnKTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5vbkJvcmRlciA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHZhciBlXzEyLCBfYTtcbiAgICAgICAgdmFyIHNpbXBsZUluY2x1ZGUgPSB0aGlzLnNpbXBsZUluY2x1ZGUocCk7XG4gICAgICAgIGlmIChzaW1wbGVJbmNsdWRlKSB7XG4gICAgICAgICAgICB2YXIgcG9seSA9IHRoaXMuZGVpbnRlcnNlY3Rpb247XG4gICAgICAgICAgICB2YXIgaGFzU2FtZVBvaW50ID0gdGhpcy5wb2ludHMuc29tZShmdW5jdGlvbiAocG9pbnQpIHsgcmV0dXJuIHBvaW50LmVxdWFsKHApOyB9KTtcbiAgICAgICAgICAgIGlmIChoYXNTYW1lUG9pbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSBfX3ZhbHVlcyhwb2x5Lmxvb3BQb2ludHNHZW5lcmF0b3IodHJ1ZSkoKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkKF9jLnZhbHVlLCAzKSwgcG9seWdvbkxpbmUgPSBfZFsyXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9uQm9yZGVyID0gcG9seWdvbkxpbmUueChwKS5lcXVhbChwKSAmJiBwb2x5Z29uTGluZS5pblJhbmdlKHApO1xuICAgICAgICAgICAgICAgICAgICBpZiAob25Cb3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMTJfMSkgeyBlXzEyID0geyBlcnJvcjogZV8xMl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfYyAmJiAhX2MuZG9uZSAmJiAoX2EgPSBfYi5yZXR1cm4pKSBfYS5jYWxsKF9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEyKSB0aHJvdyBlXzEyLmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLm5leHRTdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIHRoaXMucHVzaCh0aGlzLnNoaWZ0KCkpO1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnJlbW92ZUR1cGxpY2F0ZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBwMSA9IHRoaXMuYXQoaSk7XG4gICAgICAgICAgICB2YXIgcDIgPSB0aGlzLmF0KGkgKyAxKTtcbiAgICAgICAgICAgIGlmIChwMS5lcXVhbChwMikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVBhcnQoaSwgMSk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucGFyc2UgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gbmV3IERQb2x5Z29uKGEubWFwKGZ1bmN0aW9uIChyKSB7IHJldHVybiBEUG9pbnQucGFyc2Uocik7IH0pKTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS50b0FycmF5T2ZDb29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1hcEFycmF5KGZ1bmN0aW9uIChyKSB7IHJldHVybiByLnRvQ29vcmRzKCk7IH0pO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmRpdmlkZVRvUGllY2VzID0gZnVuY3Rpb24gKHBpZWNlc0NvdW50KSB7XG4gICAgICAgIHZhciBlXzEzLCBfYTtcbiAgICAgICAgdmFyIGZ1bGxMZW5ndGggPSB0aGlzLmZ1bGxMZW5ndGg7XG4gICAgICAgIHZhciBwaWVjZUxlbmd0aCA9IGZ1bGxMZW5ndGggLyBwaWVjZXNDb3VudDtcbiAgICAgICAgdmFyIGN1cnJlbnRQaWVjZUxlbmd0aCA9IHBpZWNlTGVuZ3RoO1xuICAgICAgICB2YXIgX2xvb3BfMyA9IGZ1bmN0aW9uIChwMSwgcDIsIGkpIHtcbiAgICAgICAgICAgIHZhciBkID0gcDEuZGlzdGFuY2UocDIpO1xuICAgICAgICAgICAgaWYgKGQgPT09IGN1cnJlbnRQaWVjZUxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHAyLnByb3BlcnRpZXMucGllY2VCb3JkZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQaWVjZUxlbmd0aCA9IHBpZWNlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZCAtIGN1cnJlbnRQaWVjZUxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgY2lyY2xlID0gbmV3IERDaXJjbGUocDEsIGN1cnJlbnRQaWVjZUxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmVfMSA9IHAxLmZpbmRMaW5lKHAyKTtcbiAgICAgICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uUG9pbnQgPSBsaW5lXzEuaW50ZXJzZWN0aW9uV2l0aENpcmNsZShjaXJjbGUpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHApIHsgcmV0dXJuIGxpbmVfMS5pblJhbmdlKHAsIENMT1NFX1RPX0lOVEVSU0VDVElPTl9ESVNUQU5DRSk7IH0pWzBdO1xuICAgICAgICAgICAgICAgIGludGVyc2VjdGlvblBvaW50LnByb3BlcnRpZXMucGllY2VCb3JkZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXNfMS5pbnNlcnRBZnRlcihpLCBpbnRlcnNlY3Rpb25Qb2ludCk7XG4gICAgICAgICAgICAgICAgY3VycmVudFBpZWNlTGVuZ3RoID0gcGllY2VMZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UGllY2VMZW5ndGggLT0gZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHRoaXMubG9vcFBvaW50c0dlbmVyYXRvcigpKCkpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9kID0gX19yZWFkKF9jLnZhbHVlLCA0KSwgcDEgPSBfZFswXSwgcDIgPSBfZFsxXSwgaSA9IF9kWzNdO1xuICAgICAgICAgICAgICAgIF9sb29wXzMocDEsIHAyLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xM18xKSB7IGVfMTMgPSB7IGVycm9yOiBlXzEzXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEzKSB0aHJvdyBlXzEzLmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUucHJlcGFyZVRvRmFzdFNlYXJjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVfMTQsIF9hO1xuICAgICAgICB0aGlzLnNlYXJjaFN0b3JlID0ge307XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzKHRoaXMucG9pbnRzKSwgX2MgPSBfYi5uZXh0KCk7ICFfYy5kb25lOyBfYyA9IF9iLm5leHQoKSkge1xuICAgICAgICAgICAgICAgIHZhciBfZCA9IF9jLnZhbHVlLCB4ID0gX2QueCwgeSA9IF9kLnksIHogPSBfZC56O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0b3JlW3hdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XVt5XSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0b3JlW3hdW3ldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RvcmVbeF1beV1beiB8fCAndW5kZWZpbmVkJ10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzE0XzEpIHsgZV8xNCA9IHsgZXJyb3I6IGVfMTRfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoX2MgJiYgIV9jLmRvbmUgJiYgKF9hID0gX2IucmV0dXJuKSkgX2EuY2FsbChfYik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTQpIHRocm93IGVfMTQuZXJyb3I7IH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmZhc3RIYXMgPSBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIHggPSBfYS54LCB5ID0gX2EueSwgeiA9IF9hLno7XG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XVt5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XVt5XVt6IHx8ICd1bmRlZmluZWQnXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaFN0b3JlW3hdW3ldW3ogfHwgJ3VuZGVmaW5lZCddO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2x5Z29uLnByb3RvdHlwZSwgXCJncm93aW5nUGllY2VzR2VuZXJhdG9yXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcG9seWdvbiA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByLCBfYSwgX2IsIHAsIGVfMTVfMTtcbiAgICAgICAgICAgICAgICB2YXIgZV8xNSwgX2M7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfZCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9kLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG5ldyBEUG9seWdvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZC50cnlzLnB1c2goWzEsIDYsIDcsIDhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYSA9IF9fdmFsdWVzKHBvbHlnb24ucFBvaW50cyksIF9iID0gX2EubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kLmxhYmVsID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISFfYi5kb25lKSByZXR1cm4gWzMsIDVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBfYi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwLnByb3BlcnRpZXMucGllY2VCb3JkZXIpIHJldHVybiBbMywgNF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0LCByLmNsb25lKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZC5sYWJlbCA9IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2IgPSBfYS5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszLCAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogcmV0dXJuIFszLCA4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlXzE1XzEgPSBfZC5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZV8xNSA9IHsgZXJyb3I6IGVfMTVfMSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMywgOF07XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9iICYmICFfYi5kb25lICYmIChfYyA9IF9hLnJldHVybikpIF9jLmNhbGwoX2EpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMTUpIHRocm93IGVfMTUuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzddO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiByZXR1cm4gWzIsIHIuY2xvbmUoKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2ltcGxlVW5pb24gPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXMuc2ltcGxlTG9naWNGdW5jdGlvbihwLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChyZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXMgaW5zdGFuY2VvZiBEUG9seWdvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2ltcGxlSW50ZXJzZWN0aW9uID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2ltcGxlTG9naWNGdW5jdGlvbihwLCBmYWxzZSwgZmFsc2UpO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnNpbXBsZURpZmZlcmVuY2UgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaW1wbGVMb2dpY0Z1bmN0aW9uKHAsIHRydWUsIGZhbHNlKTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5zbWFydFVuaW9uID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIGVfMTYsIF9hO1xuICAgICAgICB2YXIgcmVzID0gdGhpcy5jbG9uZSgpLnNpbXBsZVVuaW9uKHApO1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB2YXIgYWxsSG9sZXMgPSBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHRoaXMuaG9sZXMpLCBmYWxzZSksIF9fcmVhZChwLmhvbGVzKSwgZmFsc2UpLCBfX3JlYWQocmVzLmhvbGVzKSwgZmFsc2UpLm1hcChmdW5jdGlvbiAoaCkgeyByZXR1cm4gaC5jbG9uZSgpOyB9KTtcbiAgICAgICAgICAgIHZhciBfbG9vcF80ID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgZV8xNywgX2I7XG4gICAgICAgICAgICAgICAgdmFyIF9sb29wXzUgPSBmdW5jdGlvbiAoYikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYS5lcXVhbChiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEuc2ltcGxlVW5pb24oYik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxIb2xlcyA9IGFsbEhvbGVzLmZpbHRlcihmdW5jdGlvbiAodikgeyByZXR1cm4gIXYuZXF1YWwoYSkgJiYgIXYuZXF1YWwoYik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsSG9sZXMucHVzaChyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYWxsSG9sZXNfMiA9IChlXzE3ID0gdm9pZCAwLCBfX3ZhbHVlcyhhbGxIb2xlcykpLCBhbGxIb2xlc18yXzEgPSBhbGxIb2xlc18yLm5leHQoKTsgIWFsbEhvbGVzXzJfMS5kb25lOyBhbGxIb2xlc18yXzEgPSBhbGxIb2xlc18yLm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhbGxIb2xlc18yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF81KGIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzE3XzEpIHsgZV8xNyA9IHsgZXJyb3I6IGVfMTdfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsSG9sZXNfMl8xICYmICFhbGxIb2xlc18yXzEuZG9uZSAmJiAoX2IgPSBhbGxIb2xlc18yLnJldHVybikpIF9iLmNhbGwoYWxsSG9sZXNfMik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE3KSB0aHJvdyBlXzE3LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYWxsSG9sZXNfMSA9IF9fdmFsdWVzKGFsbEhvbGVzKSwgYWxsSG9sZXNfMV8xID0gYWxsSG9sZXNfMS5uZXh0KCk7ICFhbGxIb2xlc18xXzEuZG9uZTsgYWxsSG9sZXNfMV8xID0gYWxsSG9sZXNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBhbGxIb2xlc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIF9sb29wXzQoYSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVfMTZfMSkgeyBlXzE2ID0geyBlcnJvcjogZV8xNl8xIH07IH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxIb2xlc18xXzEgJiYgIWFsbEhvbGVzXzFfMS5kb25lICYmIChfYSA9IGFsbEhvbGVzXzEucmV0dXJuKSkgX2EuY2FsbChhbGxIb2xlc18xKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE2KSB0aHJvdyBlXzE2LmVycm9yOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuaG9sZXMgPSBhbGxIb2xlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnRvVHJpYW5nbGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5uZXJBbmROb3RJbnRlcnNlY3QgPSBmdW5jdGlvbiAocG9seSwgcDEsIHAyKSB7XG4gICAgICAgICAgICB2YXIgbCA9IHAxLmZpbmRMaW5lKHAyKTtcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSBsLmNlbnRlcjtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gcG9seS5ob2xlcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGhvbGUpIHsgcmV0dXJuIGEgJiYgQm9vbGVhbihob2xlLmNsb25lKCkuY2xvc2UoKVxuICAgICAgICAgICAgICAgIC5pbnRlcnNlY3Rpb24obCwgdHJ1ZSkubGVuZ3RoKTsgfSwgQm9vbGVhbihwb2x5LmNsb25lKCkuY2xvc2UoKVxuICAgICAgICAgICAgICAgIC5pbnRlcnNlY3Rpb24obCwgdHJ1ZSkubGVuZ3RoKSk7XG4gICAgICAgICAgICB2YXIgY29udGFpbiA9IHBvbHkuaG9sZXMucmVkdWNlKGZ1bmN0aW9uIChhLCBob2xlKSB7IHJldHVybiBhICYmICFob2xlXG4gICAgICAgICAgICAgICAgLmNvbnRhaW4oY2VudGVyKTsgfSwgcG9seS5jb250YWluKGNlbnRlcikpO1xuICAgICAgICAgICAgcmV0dXJuICFpbnRlcnNlY3Rpb25zICYmIGNvbnRhaW47XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRUcmlhbmdsZSA9IGZ1bmN0aW9uIChwb2x5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvbHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcDAgPSBwb2x5LmF0KDApO1xuICAgICAgICAgICAgICAgIHZhciBwMSA9IHBvbHkuYXQoMSk7XG4gICAgICAgICAgICAgICAgdmFyIHAyID0gcG9seS5hdCgyKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXJBbmROb3RJbnRlcnNlY3QocG9seSwgcDAsIHAyKSkge1xuICAgICAgICAgICAgICAgICAgICBwb2x5LnJlbW92ZVBhcnQoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRFBvbHlnb24oW1xuICAgICAgICAgICAgICAgICAgICAgICAgcDAuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAxLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwMi5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwb2x5LnB1c2gocG9seS5zaGlmdCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgICAgIHZhciBwID0gdGhpcy5jbG9uZSgpLmNsb2NrV2lzZS5vcGVuKCk7XG4gICAgICAgIHdoaWxlIChwLmhvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGggPSBwLmhvbGVzLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgIC5jbG9ja1dpc2VcbiAgICAgICAgICAgICAgICAucmV2ZXJzZSgpXG4gICAgICAgICAgICAgICAgLmNsb3NlKCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXJBbmROb3RJbnRlcnNlY3QocCwgcC5maXJzdCwgaC5maXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcC5pbnNlcnRBZnRlci5hcHBseShwLCBfX3NwcmVhZEFycmF5KF9fc3ByZWFkQXJyYXkoWzBdLCBfX3JlYWQoaC5wb2ludHMpLCBmYWxzZSksIFtwLmZpcnN0XSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHAucHVzaChwLnNoaWZ0KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgd2hpbGUgKHAubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgdmFyIHRyaWFuZ2xlID0gZ2V0VHJpYW5nbGUocCk7XG4gICAgICAgICAgICBpZiAodHJpYW5nbGUpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0cmlhbmdsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2gocCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuZ2V0VHJpYW5nbGVzUG9pbnRJbmRleGVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5uZXJBbmROb3RJbnRlcnNlY3QgPSBmdW5jdGlvbiAocG9seSwgcDEsIHAyKSB7XG4gICAgICAgICAgICB2YXIgbCA9IHAxLmZpbmRMaW5lKHAyKTtcbiAgICAgICAgICAgIHZhciBjZW50ZXIgPSBsLmNlbnRlcjtcbiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gcG9seS5ob2xlcy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGhvbGUpIHsgcmV0dXJuIGEgJiYgQm9vbGVhbihob2xlLmNsb25lKCkuY2xvc2UoKVxuICAgICAgICAgICAgICAgIC5pbnRlcnNlY3Rpb24obCwgdHJ1ZSkubGVuZ3RoKTsgfSwgQm9vbGVhbihwb2x5LmNsb25lKCkuY2xvc2UoKVxuICAgICAgICAgICAgICAgIC5pbnRlcnNlY3Rpb24obCwgdHJ1ZSkubGVuZ3RoKSk7XG4gICAgICAgICAgICB2YXIgY29udGFpbiA9IHBvbHkuaG9sZXMucmVkdWNlKGZ1bmN0aW9uIChhLCBob2xlKSB7IHJldHVybiBhICYmICFob2xlXG4gICAgICAgICAgICAgICAgLmNvbnRhaW4oY2VudGVyKTsgfSwgcG9seS5jb250YWluKGNlbnRlcikpO1xuICAgICAgICAgICAgcmV0dXJuICFpbnRlcnNlY3Rpb25zICYmIGNvbnRhaW47XG4gICAgICAgIH07XG4gICAgICAgIHZhciBnZXRUcmlhbmdsZSA9IGZ1bmN0aW9uIChwb2x5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBvbHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcDAgPSBwb2x5LmF0KDApO1xuICAgICAgICAgICAgICAgIHZhciBwMSA9IHBvbHkuYXQoMSk7XG4gICAgICAgICAgICAgICAgdmFyIHAyID0gcG9seS5hdCgyKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXJBbmROb3RJbnRlcnNlY3QocG9seSwgcDAsIHAyKSkge1xuICAgICAgICAgICAgICAgICAgICBwb2x5LnJlbW92ZVBhcnQoMCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBwMC5wcm9wZXJ0aWVzLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcDEucHJvcGVydGllcy5pbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHAyLnByb3BlcnRpZXMuaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9seS5wdXNoKHBvbHkuc2hpZnQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB2YXIgcCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgcC5wb2ludHMuZm9yRWFjaChmdW5jdGlvbiAoZikge1xuICAgICAgICAgICAgZi5wcm9wZXJ0aWVzLmluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgfSk7XG4gICAgICAgIHAuaG9sZXMuZm9yRWFjaChmdW5jdGlvbiAoaCkge1xuICAgICAgICAgICAgaC5wUG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgICAgICAgICBmLnByb3BlcnRpZXMuaW5kZXggPSBpbmRleCsrO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwID0gcC5jbG9ja1dpc2Uub3BlbigpO1xuICAgICAgICB3aGlsZSAocC5ob2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBoID0gcC5ob2xlcy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgLmNsb25lKClcbiAgICAgICAgICAgICAgICAuY2xvY2tXaXNlXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgIC5jbG9zZSgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyQW5kTm90SW50ZXJzZWN0KHAsIHAuZmlyc3QsIGguZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHAuaW5zZXJ0QWZ0ZXIuYXBwbHkocCwgX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFswXSwgX19yZWFkKGgucG9pbnRzKSwgZmFsc2UpLCBbcC5maXJzdF0sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwLnB1c2gocC5zaGlmdCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzID0gW107XG4gICAgICAgIHdoaWxlIChwLmxlbmd0aCA+IDMpIHtcbiAgICAgICAgICAgIHZhciB0cmlhbmdsZSA9IGdldFRyaWFuZ2xlKHApO1xuICAgICAgICAgICAgaWYgKHRyaWFuZ2xlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQodHJpYW5nbGUpLCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHAucG9pbnRzLm1hcChmdW5jdGlvbiAoZikgeyByZXR1cm4gZi5wcm9wZXJ0aWVzLmluZGV4OyB9KSksIGZhbHNlKSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvbHlnb24ucHJvdG90eXBlLCBcImNsb3NlZFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3QuZXF1YWwodGhpcy5sYXN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5idWZmZXIgPSBmdW5jdGlvbiAodiwgcXVhZHJhbnRTZWdtZW50cywgdHlwZSkge1xuICAgICAgICBpZiAocXVhZHJhbnRTZWdtZW50cyA9PT0gdm9pZCAwKSB7IHF1YWRyYW50U2VnbWVudHMgPSA2NDsgfVxuICAgICAgICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7IHR5cGUgPSBEUG9seWdvbi5DQVBfUk9VTkQ7IH1cbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBqc3RzSW8uV0tUUmVhZGVyKCk7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIG5vSG9sZXMgPSBfYS5ub0hvbGVzLCBjbG9zZWQgPSBfYS5jbG9zZWQ7XG4gICAgICAgIHZhciBwb2ludHMgPSByZWFkZXJcbiAgICAgICAgICAgIC5yZWFkKG5vSG9sZXMudG9XS1QoY2xvc2VkID8gRFBvbHlnb24uV0tUX1BPTFlHT04gOiBEUG9seWdvbi5XS1RfTElORVNUUklORykpXG4gICAgICAgICAgICAuYnVmZmVyKHYsIHF1YWRyYW50U2VnbWVudHMsIHR5cGUpXG4gICAgICAgICAgICAuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEUG9seWdvbihwb2ludHMubWFwKGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgdmFyIHggPSBfYS54LCB5ID0gX2EueTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRFBvaW50KHgsIHkpO1xuICAgICAgICB9KSk7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2lkZUJ1ZmZlcnMgPSBmdW5jdGlvbiAodiwgcXVhZHJhbnRTZWdtZW50cykge1xuICAgICAgICBpZiAocXVhZHJhbnRTZWdtZW50cyA9PT0gdm9pZCAwKSB7IHF1YWRyYW50U2VnbWVudHMgPSA2NDsgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBmaXJzdCA9IF9hLmZpcnN0LCBsYXN0ID0gX2EubGFzdDtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyKHYsIHF1YWRyYW50U2VnbWVudHMsIERQb2x5Z29uLkNBUF9GTEFUKS5vcGVuKCk7XG4gICAgICAgIHZhciBfYiA9IF9fcmVhZChmaXJzdC5zb3J0QnlEaXN0YW5jZShidWZmZXIpLnBvaW50cy5tYXAoZnVuY3Rpb24gKHIpIHsgcmV0dXJuIHIucHJvcGVydGllcy5pbmRleDsgfSksIDIpLCBzdGFydDAgPSBfYlswXSwgc3RhcnQxID0gX2JbMV07XG4gICAgICAgIHZhciBfYyA9IF9fcmVhZChsYXN0LnNvcnRCeURpc3RhbmNlKGJ1ZmZlcikucG9pbnRzLm1hcChmdW5jdGlvbiAocikgeyByZXR1cm4gci5wcm9wZXJ0aWVzLmluZGV4OyB9KSwgMiksIGVuZDAgPSBfY1swXSwgZW5kMSA9IF9jWzFdO1xuICAgICAgICB2YXIgZnJvbVBvaW50ID0gTWF0aC5taW4oTWF0aC5tYXgoc3RhcnQwLCBzdGFydDEpLCBNYXRoLm1heChlbmQwLCBlbmQxKSk7XG4gICAgICAgIHZhciB0b1BvaW50ID0gTWF0aC5tYXgoTWF0aC5taW4oc3RhcnQwLCBzdGFydDEpLCBNYXRoLm1pbihlbmQwLCBlbmQxKSk7XG4gICAgICAgIHZhciBsaW5lUGFydCA9IG5ldyBEUG9seWdvbihidWZmZXIucmVtb3ZlUGFydChmcm9tUG9pbnQgLSAxLCB0b1BvaW50IC0gZnJvbVBvaW50ICsgMSkpO1xuICAgICAgICBidWZmZXIudW5zaGlmdChidWZmZXIucG9wKCkpO1xuICAgICAgICByZXR1cm4gW2xpbmVQYXJ0LCBidWZmZXJdO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmJlemllciA9IGZ1bmN0aW9uIChzdGVwKSB7XG4gICAgICAgIGlmIChzdGVwID09PSB2b2lkIDApIHsgc3RlcCA9IDAuMTsgfVxuICAgICAgICB2YXIgcmVzID0gbmV3IERQb2x5Z29uKCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTsgaSArPSBzdGVwKSB7XG4gICAgICAgICAgICByZXMucHVzaCh0aGlzLmNsb25lKCkuZ2V0QmV6aWVyUG9pbnQoaSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2V0R3Jvd2luZ0hlaWdodCA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgICAgICB2YXIgZnVsbExlbmd0aCA9IHRoaXMuZnVsbExlbmd0aDtcbiAgICAgICAgdmFyIHByZXZQb2ludCA9IHRoaXMuZmlyc3Q7XG4gICAgICAgIHZhciBkID0gdG8gLSBmcm9tO1xuICAgICAgICB2YXIgY3VycmVudERpc3RhbmNlID0gMDtcbiAgICAgICAgdGhpcy5sb29wKClcbiAgICAgICAgICAgIC5zZXRaKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgICAgICBjdXJyZW50RGlzdGFuY2UgKz0gcHJldlBvaW50LmRpc3RhbmNlKHApO1xuICAgICAgICAgICAgcHJldlBvaW50ID0gcDtcbiAgICAgICAgICAgIHJldHVybiBmcm9tICsgY3VycmVudERpc3RhbmNlIC8gZnVsbExlbmd0aCAqIGQ7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAucnVuKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmxvb3BQb2ludHNHZW5lcmF0b3IgPSBmdW5jdGlvbiAod2l0aExpbmUpIHtcbiAgICAgICAgaWYgKHdpdGhMaW5lID09PSB2b2lkIDApIHsgd2l0aExpbmUgPSBmYWxzZTsgfVxuICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaSwgcDEsIHAyO1xuICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYS5sYWJlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGkgPCB0aGF0Lmxlbmd0aCAtIDEpKSByZXR1cm4gWzMsIDRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSB0aGF0LmF0KGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSB0aGF0LmF0KGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCwgW3AxLCBwMiwgd2l0aExpbmUgPyBwMS5maW5kTGluZShwMikgOiB1bmRlZmluZWQsIGldXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2EubGFiZWwgPSAzO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMsIDFdO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBbMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuZ2V0QmV6aWVyUG9pbnQgPSBmdW5jdGlvbiAodikge1xuICAgICAgICB2YXIgZV8xOCwgX2E7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3Q7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5sb29wUG9pbnRzR2VuZXJhdG9yKCkoKSksIF9jID0gX2IubmV4dCgpOyAhX2MuZG9uZTsgX2MgPSBfYi5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQoX2MudmFsdWUsIDIpLCBwMSA9IF9kWzBdLCBwMiA9IF9kWzFdO1xuICAgICAgICAgICAgICAgIHAxLm1vdmUocDIuY2xvbmUoKS5tb3ZlKHAxLmNsb25lKCkubWludXMoKSlcbiAgICAgICAgICAgICAgICAgICAgLnNjYWxlKHYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xOF8xKSB7IGVfMTggPSB7IGVycm9yOiBlXzE4XzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE4KSB0aHJvdyBlXzE4LmVycm9yOyB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QmV6aWVyUG9pbnQodik7XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuc2ltcGxlSW5jbHVkZVggPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgeCA9IHAueDtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluWCA8PSB4ICYmIHRoaXMubWF4WCA+PSB4O1xuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLnNpbXBsZUluY2x1ZGVZID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIHkgPSBwLnk7XG4gICAgICAgIHJldHVybiB0aGlzLm1pblkgPD0geSAmJiB0aGlzLm1heFkgPj0geTtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5kb3VnbGFzUGV1Y2tlciA9IGZ1bmN0aW9uIChwb2ludHMsIGUpIHtcbiAgICAgICAgdmFyIGRNYXggPSAwO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB2YXIgZW5kID0gcG9pbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBsaW5lID0gcG9pbnRzWzBdLmZpbmRMaW5lKHBvaW50c1tlbmRdKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgICAgICAgdmFyIGQgPSBsaW5lLnBlcnBlbmRpY3VsYXJEaXN0YW5jZShwb2ludHNbaV0pO1xuICAgICAgICAgICAgaWYgKGQgPiBkTWF4KSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgIGRNYXggPSBkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkTWF4ID49IGUpIHtcbiAgICAgICAgICAgIHZhciByZWNSZXN1bHQxID0gdGhpcy5kb3VnbGFzUGV1Y2tlcihwb2ludHMuc2xpY2UoMCwgaW5kZXggKyAxKSwgZSk7XG4gICAgICAgICAgICB2YXIgcmVjUmVzdWx0MiA9IHRoaXMuZG91Z2xhc1BldWNrZXIocG9pbnRzLnNsaWNlKGluZGV4KSwgZSk7XG4gICAgICAgICAgICByZWNSZXN1bHQxLnBvcCgpO1xuICAgICAgICAgICAgcmV0dXJuIF9fc3ByZWFkQXJyYXkoX19zcHJlYWRBcnJheShbXSwgX19yZWFkKHJlY1Jlc3VsdDEpLCBmYWxzZSksIF9fcmVhZChyZWNSZXN1bHQyKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcG9pbnRzWzBdLCBwb2ludHNbZW5kXV07XG4gICAgfTtcbiAgICBEUG9seWdvbi5wcm90b3R5cGUuZ29CeVBhdGggPSBmdW5jdGlvbiAoY3R4LCBzdGVwcykge1xuICAgICAgICBpZiAoc3RlcHMgPT09IHZvaWQgMCkgeyBzdGVwcyA9IHRoaXMubGVuZ3RoIC0gMTsgfVxuICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLmZpcnN0O1xuICAgICAgICBjdHgubW92ZVRvKHN0YXJ0LngsIHN0YXJ0LnkpO1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSAoc3RlcHMgJSB0aGlzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5hdChpKSwgeCA9IF9hLngsIHkgPSBfYS55O1xuICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCB5KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRFBvbHlnb24ucHJvdG90eXBlLmdldEpTVFNHZW9tZXRyeSA9IGZ1bmN0aW9uIChwLCB1bmlvblRoaXMsIHVuaW9uVGhhdCkge1xuICAgICAgICB2YXIgdW5pb25PckludGVyc2VjdGlvbiA9IHVuaW9uVGhhdCA9PT0gdW5pb25UaGlzO1xuICAgICAgICB2YXIgcmVhZGVyID0gbmV3IGpzdHNJby5XS1RSZWFkZXIoKTtcbiAgICAgICAgdmFyIGEgPSByZWFkZXIucmVhZCh0aGlzLm5vSG9sZXMudG9XS1QoKSk7XG4gICAgICAgIHZhciBiID0gcmVhZGVyLnJlYWQocC5ub0hvbGVzLnRvV0tUKCkpO1xuICAgICAgICBpZiAoIXVuaW9uT3JJbnRlcnNlY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhLmRpZmZlcmVuY2UoYik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodW5pb25UaGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gYS51bmlvbihiKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdW5pb25UaGlzKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pbnRlcnNlY3Rpb24oYik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIERQb2x5Z29uLnByb3RvdHlwZS5zaW1wbGVMb2dpY0Z1bmN0aW9uID0gZnVuY3Rpb24gKHAsIHVuaW9uVGhpcywgdW5pb25UaGF0KSB7XG4gICAgICAgIHZhciBlXzE5LCBfYSwgZV8yMCwgX2IsIGVfMjEsIF9jLCBlXzIyLCBfZDtcbiAgICAgICAgdmFyIGMgPSB0aGlzLmdldEpTVFNHZW9tZXRyeShwLCB1bmlvblRoaXMsIHVuaW9uVGhhdCk7XG4gICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXNfMSA9IGMuZ2V0Q29vcmRpbmF0ZXMoKTtcbiAgICAgICAgICAgIGlmIChjb29yZGluYXRlc18xLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb29yZGluYXRlc18xLnJlZHVjZShmdW5jdGlvbiAoYWssIF9hLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IF9hLngsIHkgPSBfYS55O1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEluZGV4ID0gYWsubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRFBvaW50KHgsIHkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBha1tsYXN0SW5kZXhdLmZpcnN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAodC5lcXVhbChmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlc18xW2luZGV4ICsgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFBvaW50ID0gbmV3IERQb2ludChjb29yZGluYXRlc18xW2luZGV4ICsgMV0ueCwgY29vcmRpbmF0ZXNfMVtpbmRleCArIDFdLnkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChha1tsYXN0SW5kZXhdLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWsucHVzaChuZXcgRFBvbHlnb24oW25leHRQb2ludF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBha1tsYXN0SW5kZXhdLnB1c2godCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFrO1xuICAgICAgICAgICAgICAgIH0sIFtuZXcgRFBvbHlnb24oW25ldyBEUG9pbnQoY29vcmRpbmF0ZXNfMVswXS54LCBjb29yZGluYXRlc18xWzBdLnkpXSldKTtcbiAgICAgICAgICAgICAgICBpZiAodW5pb25UaGF0ICYmIHVuaW9uVGhpcyAmJiByZXN1bHQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcmVzdWx0XzEgPSBfX3ZhbHVlcyhyZXN1bHQpLCByZXN1bHRfMV8xID0gcmVzdWx0XzEubmV4dCgpOyAhcmVzdWx0XzFfMS5kb25lOyByZXN1bHRfMV8xID0gcmVzdWx0XzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSByZXN1bHRfMV8xLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfbG9vcF82ID0gZnVuY3Rpb24gKHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5oYXMoci5maXJzdCkgJiYgIXEuZXF1YWwocikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHEuZmluZEluZGV4KHIuZmlyc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lID0gcS5wb2ludHMpLnNwbGljZS5hcHBseShfZSwgX19zcHJlYWRBcnJheShbaW5kZXgsIDBdLCBfX3JlYWQoci5wb2ludHMpLCBmYWxzZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAoaCkgeyByZXR1cm4gIWguZXF1YWwocik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiY29udGludWVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHJlc3VsdF8yID0gKGVfMjAgPSB2b2lkIDAsIF9fdmFsdWVzKHJlc3VsdCkpLCByZXN1bHRfMl8xID0gcmVzdWx0XzIubmV4dCgpOyAhcmVzdWx0XzJfMS5kb25lOyByZXN1bHRfMl8xID0gcmVzdWx0XzIubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHJlc3VsdF8yXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGVfMSA9IF9sb29wXzYocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMSA9PT0gXCJicmVha1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzIwXzEpIHsgZV8yMCA9IHsgZXJyb3I6IGVfMjBfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0XzJfMSAmJiAhcmVzdWx0XzJfMS5kb25lICYmIChfYiA9IHJlc3VsdF8yLnJldHVybikpIF9iLmNhbGwocmVzdWx0XzIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yMCkgdGhyb3cgZV8yMC5lcnJvcjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzE5XzEpIHsgZV8xOSA9IHsgZXJyb3I6IGVfMTlfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0XzFfMSAmJiAhcmVzdWx0XzFfMS5kb25lICYmIChfYSA9IHJlc3VsdF8xLnJldHVybikpIF9hLmNhbGwocmVzdWx0XzEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzE5KSB0aHJvdyBlXzE5LmVycm9yOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcihmdW5jdGlvbiAoaCkgeyByZXR1cm4gaC5sZW5ndGggPiAyOyB9KS5tYXAoZnVuY3Rpb24gKGgpIHsgcmV0dXJuIGguY2xvc2UoKTsgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcmVzdWx0XzMgPSBfX3ZhbHVlcyhyZXN1bHQpLCByZXN1bHRfM18xID0gcmVzdWx0XzMubmV4dCgpOyAhcmVzdWx0XzNfMS5kb25lOyByZXN1bHRfM18xID0gcmVzdWx0XzMubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IHJlc3VsdF8zXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfNyA9IGZ1bmN0aW9uIChyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJyZWFrXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcS5lcXVhbChyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocS5jb250YWluKHIuZmlyc3QsIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmhvbGVzLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uIChoKSB7IHJldHVybiAhaC5lcXVhbChyKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByZXN1bHRfNCA9IChlXzIyID0gdm9pZCAwLCBfX3ZhbHVlcyhyZXN1bHQpKSwgcmVzdWx0XzRfMSA9IHJlc3VsdF80Lm5leHQoKTsgIXJlc3VsdF80XzEuZG9uZTsgcmVzdWx0XzRfMSA9IHJlc3VsdF80Lm5leHQoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHJlc3VsdF80XzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0ZV8yID0gX2xvb3BfNyhyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlXzIgPT09IFwiYnJlYWtcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlXzIyXzEpIHsgZV8yMiA9IHsgZXJyb3I6IGVfMjJfMSB9OyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0XzRfMSAmJiAhcmVzdWx0XzRfMS5kb25lICYmIChfZCA9IHJlc3VsdF80LnJldHVybikpIF9kLmNhbGwocmVzdWx0XzQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMjIpIHRocm93IGVfMjIuZXJyb3I7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzIxXzEpIHsgZV8yMSA9IHsgZXJyb3I6IGVfMjFfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0XzNfMSAmJiAhcmVzdWx0XzNfMS5kb25lICYmIChfYyA9IHJlc3VsdF8zLnJldHVybikpIF9jLmNhbGwocmVzdWx0XzMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZV8yMSkgdGhyb3cgZV8yMS5lcnJvcjsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFswXS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChmdW5jdGlvbiAoZykgeyByZXR1cm4gZy5jbG9zZSgpOyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIERQb2x5Z29uLkNBUF9ST1VORCA9IENBUF9ST1VORDtcbiAgICBEUG9seWdvbi5DQVBfRkxBVCA9IENBUF9GTEFUO1xuICAgIERQb2x5Z29uLkNBUF9TUVVBUkUgPSBDQVBfU1FVQVJFO1xuICAgIERQb2x5Z29uLldLVF9MSU5FU1RSSU5HID0gJ0xJTkVTVFJJTkcnO1xuICAgIERQb2x5Z29uLldLVF9QT0xZR09OID0gJ1BPTFlHT04nO1xuICAgIHJldHVybiBEUG9seWdvbjtcbn0oKSk7XG5leHBvcnQgeyBEUG9seWdvbiB9O1xuIiwidmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbmltcG9ydCB7IERMaW5lIH0gZnJvbSAnLi9ETGluZSc7XG5pbXBvcnQgeyBEUG9seWdvbiB9IGZyb20gJy4vRFBvbHlnb24nO1xuaW1wb3J0IHsgY2hlY2tGdW5jdGlvbiwgY3JlYXRlQXJyYXksIGlzRGVmQW5kTm90TnVsbCB9IGZyb20gJy4vdXRpbHMnO1xudmFyIGRpZmYgPSAwO1xudmFyIHJhZGlhbnNQb2x5Z29uID0gbmV3IERQb2x5Z29uKCk7XG52YXIgcHNldWRvTWVyY2F0b3JQb2x5Z29uID0gbmV3IERQb2x5Z29uKCk7XG52YXIgd29ybGRHZW9kZXRpY1BvbHlnb24gPSBuZXcgRFBvbHlnb24oKTtcbmV4cG9ydCB2YXIgRUFSVEhfUkFESVVTX0lOX01FVEVSUyA9IDYzNzEwMDguODtcbnZhciBFQVJUSF9JTl9NSVRFUlMgPSAyMDAzNzUwOC4zNDtcbnZhciBERUdSRUVTX0lOX0VBUlRIID0gMTgwO1xudmFyIE1JVEVSU19JTl9PTkVfREVHUkVFID0gRUFSVEhfSU5fTUlURVJTIC8gREVHUkVFU19JTl9FQVJUSDtcbnZhciBERUdSRUVTX0lOX09ORV9NSVRFUiA9IERFR1JFRVNfSU5fRUFSVEggLyBFQVJUSF9JTl9NSVRFUlM7XG5leHBvcnQgdmFyIEhBTEZfUElfSU5fREVHUkVFID0gOTA7XG5leHBvcnQgdmFyIFBJX0lOX0RFR1JFRSA9IDE4MDtcbmV4cG9ydCB2YXIgRE9VQkxFX1BJX0lOX0RFR1JFRSA9IDM2MDtcbmV4cG9ydCB2YXIgUElfVE9fREVHUkVFID0gTWF0aC5QSSAvIFBJX0lOX0RFR1JFRTtcbmV4cG9ydCB2YXIgREVHUkVFX1RPX1BJID0gUElfSU5fREVHUkVFIC8gTWF0aC5QSTtcbnZhciBEUG9pbnQgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERQb2ludCh4LCB5LCB6KSB7XG4gICAgICAgIGlmICh4ID09PSB2b2lkIDApIHsgeCA9IDA7IH1cbiAgICAgICAgaWYgKHkgPT09IHZvaWQgMCkgeyB5ID0geDsgfVxuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB0aGlzLnogPSB6O1xuICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG4gICAgRFBvaW50Lnplcm8gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRFBvaW50KCk7XG4gICAgfTtcbiAgICBEUG9pbnQucGFyc2UgPSBmdW5jdGlvbiAoYykge1xuICAgICAgICB2YXIgX2EgPSBjLCBsYXQgPSBfYS5sYXQsIGxuZyA9IF9hLmxuZztcbiAgICAgICAgaWYgKGxhdCAmJiBsbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRFBvaW50KGxhdCwgbG5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2IgPSBfX3JlYWQoYywgMyksIHggPSBfYlswXSwgeSA9IF9iWzFdLCB6ID0gX2JbMl07XG4gICAgICAgIHJldHVybiBuZXcgRFBvaW50KHgsIHksIHopO1xuICAgIH07XG4gICAgRFBvaW50LnBhcnNlRnJvbVdLVCA9IGZ1bmN0aW9uICh3a3QpIHtcbiAgICAgICAgdmFyIHJlZ2V4cCA9IC9QT0lOVCBcXCgoPzxkYXRhPig/Oig/IVxcKSkuKSo/KVxcKSQvbWl1O1xuICAgICAgICB2YXIgZGF0YSA9IHdrdC50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgdmFyIHJlcyA9IHJlZ2V4cC5leGVjKGRhdGEpO1xuICAgICAgICB2YXIgX2EgPSBfX3JlYWQocmVzLmdyb3Vwcy5kYXRhLnNwbGl0KCcgJykubWFwKE51bWJlciksIDMpLCB4ID0gX2FbMF0sIHkgPSBfYVsxXSwgeiA9IF9hWzJdO1xuICAgICAgICByZXR1cm4gbmV3IERQb2ludCh4LCB5LCB6KTtcbiAgICB9O1xuICAgIERQb2ludC5yYW5kb20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRFBvaW50KE1hdGgucmFuZG9tKCksIE1hdGgucmFuZG9tKCkpO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5nZXRUaWxlRnJvbUNvb3JkcyA9IGZ1bmN0aW9uICh6b29tKSB7XG4gICAgICAgIGlmICh6b29tID09PSB2b2lkIDApIHsgem9vbSA9IHRoaXMuejsgfVxuICAgICAgICBjaGVja0Z1bmN0aW9uKCdnZXRUaWxlRnJvbUNvb3JkcycpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcycpXG4gICAgICAgICAgICAuc2hvdWxkQmVEZWdyZWUodGhpcyk7XG4gICAgICAgIHZhciB4ID0gTWF0aC5mbG9vcigodGhpcy54ICsgUElfSU5fREVHUkVFKSAvIERPVUJMRV9QSV9JTl9ERUdSRUUgKiAoTWF0aC5wb3coMiwgem9vbSkpKTtcbiAgICAgICAgdmFyIHkgPSBNYXRoLmZsb29yKCgxIC0gTWF0aC5sb2coTWF0aC50YW4odGhpcy55ICogUElfVE9fREVHUkVFKSArIDEgLyBNYXRoLmNvcyh0aGlzLnkgKiBQSV9UT19ERUdSRUUpKSAvIE1hdGguUEkpIC8gMiAqIChNYXRoLnBvdygyLCB6b29tKSkpO1xuICAgICAgICByZXR1cm4gbmV3IERQb2ludCh4LCB5LCB6b29tKTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuZ2V0Q29vcmRzRnJvbVRpbGUgPSBmdW5jdGlvbiAoem9vbSkge1xuICAgICAgICBpZiAoem9vbSA9PT0gdm9pZCAwKSB7IHpvb20gPSB0aGlzLno7IH1cbiAgICAgICAgY2hlY2tGdW5jdGlvbignZ2V0Q29vcmRzRnJvbVRpbGUnKVxuICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgLnNob3VsZEJlVUludCh0aGlzKTtcbiAgICAgICAgdmFyIG4gPSBNYXRoLlBJIC0gMiAqIE1hdGguUEkgKiB0aGlzLnkgLyAoTWF0aC5wb3coMiwgem9vbSkpO1xuICAgICAgICB2YXIgeCA9IHRoaXMueCAvIChNYXRoLnBvdygyLCB6b29tKSkgKiBET1VCTEVfUElfSU5fREVHUkVFIC0gUElfSU5fREVHUkVFO1xuICAgICAgICB2YXIgeSA9IFBJX0lOX0RFR1JFRSAvIE1hdGguUEkgKiBNYXRoLmF0YW4oKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSAvIDIpO1xuICAgICAgICByZXR1cm4gbmV3IERQb2ludCh4LCB5LCB6b29tKTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUudG9Db29yZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLnogPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIFt0aGlzLngsIHRoaXMueV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0aGlzLngsIHRoaXMueSwgdGhpcy56XTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuZmluZExpbmUgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdmaW5kTGluZScpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcycpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcylcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCdwJylcbiAgICAgICAgICAgIC5zaG91bGRCZU1ldGVycyhwKTtcbiAgICAgICAgaWYgKHRoaXMuZXF1YWwocCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRMaW5lKHAuY2xvbmUoKS5tb3ZlKDAsIDEpKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYSA9IHRoaXMueSAtIHAueSAtIGRpZmY7XG4gICAgICAgIHZhciBiID0gcC54IC0gdGhpcy54IC0gZGlmZjtcbiAgICAgICAgdmFyIGMgPSB0aGlzLnggKiBwLnkgLSBwLnggKiB0aGlzLnkgLSBkaWZmO1xuICAgICAgICBpZiAoYSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBETGluZSgwLCAxLCBjIC8gYiwgdGhpcywgcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRExpbmUoMSwgMCwgYyAvIGEsIHRoaXMsIHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRExpbmUoYSwgYiwgYywgdGhpcywgcCk7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLmZpbmRJbm5lckFuZ2xlID0gZnVuY3Rpb24gKHAxLCBwMykge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdmaW5kSW5uZXJBbmdsZScpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcycpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcylcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCdwMScpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnMocDEpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgncDMnKVxuICAgICAgICAgICAgLnNob3VsZEJlTWV0ZXJzKHAzKTtcbiAgICAgICAgdmFyIGExID0gdGhpcy5maW5kTGluZShwMSkuZ2V0RmkoKTtcbiAgICAgICAgdmFyIGEyID0gdGhpcy5maW5kTGluZShwMykuZ2V0RmkoKTtcbiAgICAgICAgaWYgKGEyID49IGExKSB7XG4gICAgICAgICAgICByZXR1cm4gYTIgLSBhMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYTIgKyBNYXRoLlBJICogMiAtIGExO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCArIFwiIFwiICsgdGhpcy55O1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5nZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLngsIHRoaXMueV07XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLmhlaWdodCA9IGZ1bmN0aW9uICh6KSB7XG4gICAgICAgIHRoaXMueiA9IHo7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS50b1dLVCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgeCA9IF9hLngsIHkgPSBfYS55O1xuICAgICAgICByZXR1cm4gXCJQT0lOVCAoXCIgKyB4ICsgXCIgXCIgKyB5ICsgXCIpXCI7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLmRpc3RhbmNlID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgY2hlY2tGdW5jdGlvbignZGlzdGFuY2UnKVxuICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgLnNob3VsZEJlTWV0ZXJzKHRoaXMpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgncCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnMocCk7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueDtcbiAgICAgICAgdmFyIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuZGlzdGFuY2UzZCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIGNoZWNrRnVuY3Rpb24oJ2Rpc3RhbmNlM2QnKVxuICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgLnNob3VsZEJlTWV0ZXJzKHRoaXMpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgncCcpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnMocClcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCd0aGlzLnonKVxuICAgICAgICAgICAgLnNob3VsZEV4aXN0KHRoaXMueilcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCdwLnonKVxuICAgICAgICAgICAgLnNob3VsZEV4aXN0KHAueik7XG4gICAgICAgIHZhciBkeCA9IHAueCAtIHRoaXMueDtcbiAgICAgICAgdmFyIGR5ID0gcC55IC0gdGhpcy55O1xuICAgICAgICB2YXIgZHogPSBwLnogLSB0aGlzLno7XG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6KTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuc2V0WCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHRoaXMueCA9IHR5cGVvZiB4ID09PSAnbnVtYmVyJyA/IHggOiB4KHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuc2V0WiA9IGZ1bmN0aW9uICh6KSB7XG4gICAgICAgIHRoaXMueiA9IHR5cGVvZiB6ID09PSAnbnVtYmVyJyA/IHogOiB6KHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuc2V0WSA9IGZ1bmN0aW9uICh5KSB7XG4gICAgICAgIHRoaXMueSA9IHR5cGVvZiB5ID09PSAnbnVtYmVyJyA/IHkgOiB5KHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwID0gbmV3IERQb2ludCh0aGlzLngsIHRoaXMueSwgdGhpcy56KTtcbiAgICAgICAgcC5wcm9wZXJ0aWVzID0gX19hc3NpZ24oe30sIHRoaXMucHJvcGVydGllcyk7XG4gICAgICAgIHJldHVybiBwO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPiBwLnggJiYgdGhpcy55ID4gcC55O1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnggPCBwLnggJiYgdGhpcy55IDwgcC55O1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5ndE9yRXF1YWwgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ndChwKSB8fCB0aGlzLmVxdWFsKHApO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5sdE9yRXF1YWwgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sdChwKSB8fCB0aGlzLmVxdWFsKHApO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5yb3RhdGUgPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgeCA9IHRoaXMueCAqIE1hdGguY29zKGEpIC0gdGhpcy55ICogTWF0aC5zaW4oYSk7XG4gICAgICAgIHZhciB5ID0gdGhpcy54ICogTWF0aC5zaW4oYSkgKyB0aGlzLnkgKiBNYXRoLmNvcyhhKTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLnJvdGF0ZTNkWCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHkgPSBfYS55LCB6ID0gX2EuejtcbiAgICAgICAgdGhpcy55ID0geSAqIE1hdGguY29zKGEpICsgeiAqIE1hdGguc2luKGEpO1xuICAgICAgICB0aGlzLnogPSAteSAqIE1hdGguc2luKGEpICsgeiAqIE1hdGguY29zKGEpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUucm90YXRlM2RZID0gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgdmFyIF9hID0gdGhpcywgeCA9IF9hLngsIHogPSBfYS56O1xuICAgICAgICB0aGlzLnggPSB4ICogTWF0aC5jb3MoYSkgKyB6ICogTWF0aC5zaW4oYSk7XG4gICAgICAgIHRoaXMueiA9IC14ICogTWF0aC5zaW4oYSkgKyB6ICogTWF0aC5jb3MoYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5yb3RhdGUzZFogPSBmdW5jdGlvbiAoYSkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCB4ID0gX2EueCwgeSA9IF9hLnk7XG4gICAgICAgIHRoaXMueCA9IHggKiBNYXRoLmNvcyhhKSAtIHkgKiBNYXRoLnNpbihhKTtcbiAgICAgICAgdGhpcy55ID0gLXggKiBNYXRoLnNpbihhKSArIHkgKiBNYXRoLmNvcyhhKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLm1vdmUgPSBmdW5jdGlvbiAoeCwgeSwgeikge1xuICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSB4OyB9XG4gICAgICAgIHZhciB4ViA9IDA7XG4gICAgICAgIHZhciB5ViA9IDA7XG4gICAgICAgIHZhciB6ViA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBEUG9pbnQpIHtcbiAgICAgICAgICAgIHhWID0gdGhpcy54ICsgeC54O1xuICAgICAgICAgICAgeVYgPSB0aGlzLnkgKyB4Lnk7XG4gICAgICAgICAgICBpZiAoaXNEZWZBbmROb3ROdWxsKHRoaXMueikgJiYgaXNEZWZBbmROb3ROdWxsKHgueikpIHtcbiAgICAgICAgICAgICAgICB6ViA9IHRoaXMueiArIHguejtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHhWID0gdGhpcy54ICsgeDtcbiAgICAgICAgICAgIHlWID0gdGhpcy55ICsgeTtcbiAgICAgICAgICAgIGlmIChpc0RlZkFuZE5vdE51bGwodGhpcy56KSAmJiBpc0RlZkFuZE5vdE51bGwoeikpIHtcbiAgICAgICAgICAgICAgICB6ViA9IHRoaXMueiArIHo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54ID0geFY7XG4gICAgICAgIHRoaXMueSA9IHlWO1xuICAgICAgICBpZiAoaXNEZWZBbmROb3ROdWxsKHpWKSkge1xuICAgICAgICAgICAgdGhpcy56ID0gelY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLmRlZ3JlZVRvTWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdkZWdyZWVUb01ldGVycycpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcycpXG4gICAgICAgICAgICAuc2hvdWxkQmVEZWdyZWUodGhpcyk7XG4gICAgICAgIHZhciB4ID0gKCh0aGlzLnggKyBQSV9JTl9ERUdSRUUpICUgRE9VQkxFX1BJX0lOX0RFR1JFRSAtIFBJX0lOX0RFR1JFRSkgKiBNSVRFUlNfSU5fT05FX0RFR1JFRTtcbiAgICAgICAgdmFyIHkgPSAoTWF0aC5sb2coTWF0aC50YW4oKCh0aGlzLnkgKyBIQUxGX1BJX0lOX0RFR1JFRSkgJSBQSV9JTl9ERUdSRUUpICpcbiAgICAgICAgICAgIChNYXRoLlBJIC8gRE9VQkxFX1BJX0lOX0RFR1JFRSkpKSAvIFBJX1RPX0RFR1JFRSkgKiBNSVRFUlNfSU5fT05FX0RFR1JFRTtcbiAgICAgICAgdGhpcy54ID0geDtcbiAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLm1ldGVyc1RvRGVncmVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdtZXRlcnNUb0RlZ3JlZScpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcycpXG4gICAgICAgICAgICAuc2hvdWxkQmVNZXRlcnModGhpcyk7XG4gICAgICAgIHZhciBsb24gPSB0aGlzLnggKiBERUdSRUVTX0lOX09ORV9NSVRFUjtcbiAgICAgICAgdmFyIGxhdCA9IE1hdGguYXRhbihNYXRoLnBvdyhNYXRoLkUsICgodGhpcy55IC8gTUlURVJTX0lOX09ORV9ERUdSRUUpICogUElfVE9fREVHUkVFKSkpICpcbiAgICAgICAgICAgIChET1VCTEVfUElfSU5fREVHUkVFIC8gTWF0aC5QSSkgLSBIQUxGX1BJX0lOX0RFR1JFRTtcbiAgICAgICAgdGhpcy54ID0gbG9uO1xuICAgICAgICB0aGlzLnkgPSBsYXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5kZWdyZWVUb1JhZGlhbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrRnVuY3Rpb24oJ2RlZ3JlZVRvUmFkaWFucycpXG4gICAgICAgICAgICAuY2hlY2tBcmd1bWVudCgndGhpcycpXG4gICAgICAgICAgICAuc2hvdWxkQmVEZWdyZWUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNjYWxlKFBJX1RPX0RFR1JFRSk7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLnJhZGlhbnNUb0RlZ3JlZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrRnVuY3Rpb24oJ3JhZGlhbnNUb0RlZ3JlZXMnKVxuICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgLnNob3VsZEJlUmFkaWFucyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUoREVHUkVFX1RPX1BJKTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUucmFkaWFuc1RvTWV0ZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGVja0Z1bmN0aW9uKCdyYWRpYW5zVG9NZXRlcnMnKVxuICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgLnNob3VsZEJlUmFkaWFucyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmFkaWFuc1RvRGVncmVlcygpLmRlZ3JlZVRvTWV0ZXJzKCk7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLm1ldGVyc1RvUmFkaWFucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hlY2tGdW5jdGlvbignbWV0ZXJzVG9SYWRpYW5zJylcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCd0aGlzJylcbiAgICAgICAgICAgIC5zaG91bGRCZU1ldGVycyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0ZXJzVG9EZWdyZWUoKS5kZWdyZWVUb1JhZGlhbnMoKTtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUucm91bmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGgucm91bmQodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5yb3VuZCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuY2VpbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy54ID0gTWF0aC5jZWlsKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGguY2VpbCh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuZmxvb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMueCA9IE1hdGguZmxvb3IodGhpcy54KTtcbiAgICAgICAgdGhpcy55ID0gTWF0aC5mbG9vcih0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUudG9GaXhlZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIGlmIChuID09PSB2b2lkIDApIHsgbiA9IDI7IH1cbiAgICAgICAgdGhpcy54ID0gcGFyc2VGbG9hdCh0aGlzLngudG9GaXhlZChuKSk7XG4gICAgICAgIHRoaXMueSA9IHBhcnNlRmxvYXQodGhpcy55LnRvRml4ZWQobikpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuYWJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLmFicyh0aGlzLngpO1xuICAgICAgICB0aGlzLnkgPSBNYXRoLmFicyh0aGlzLnkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAoeCwgeSwgeikge1xuICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSB4OyB9XG4gICAgICAgIHZhciB4ViA9IDA7XG4gICAgICAgIHZhciB5ViA9IDA7XG4gICAgICAgIHZhciB6ViA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHggaW5zdGFuY2VvZiBEUG9pbnQpIHtcbiAgICAgICAgICAgIHhWID0gdGhpcy54ICogeC54O1xuICAgICAgICAgICAgeVYgPSB0aGlzLnkgKiB4Lnk7XG4gICAgICAgICAgICBpZiAoaXNEZWZBbmROb3ROdWxsKHRoaXMueikgJiYgaXNEZWZBbmROb3ROdWxsKHgueikpIHtcbiAgICAgICAgICAgICAgICB6ViA9IHRoaXMueiAqIHguejtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHhWID0gdGhpcy54ICogeDtcbiAgICAgICAgICAgIHlWID0gdGhpcy55ICogeTtcbiAgICAgICAgICAgIGlmIChpc0RlZkFuZE5vdE51bGwodGhpcy56KSAmJiBpc0RlZkFuZE5vdE51bGwoeikpIHtcbiAgICAgICAgICAgICAgICB6ViA9IHRoaXMueiAqIHo7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54ID0geFY7XG4gICAgICAgIHRoaXMueSA9IHlWO1xuICAgICAgICBpZiAoaXNEZWZBbmROb3ROdWxsKHpWKSkge1xuICAgICAgICAgICAgdGhpcy56ID0gelY7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLmRpdmlkZSA9IGZ1bmN0aW9uICh4LCB5LCB6KSB7XG4gICAgICAgIGlmICh5ID09PSB2b2lkIDApIHsgeSA9IHg7IH1cbiAgICAgICAgdmFyIHhWID0gMDtcbiAgICAgICAgdmFyIHlWID0gMDtcbiAgICAgICAgdmFyIHpWID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIERQb2ludCkge1xuICAgICAgICAgICAgeFYgPSB0aGlzLnggLyB4Lng7XG4gICAgICAgICAgICB5ViA9IHRoaXMueSAvIHgueTtcbiAgICAgICAgICAgIGlmIChpc0RlZkFuZE5vdE51bGwodGhpcy56KSAmJiBpc0RlZkFuZE5vdE51bGwoeC56KSkge1xuICAgICAgICAgICAgICAgIHpWID0gdGhpcy56IC8geC56O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeFYgPSB0aGlzLnggLyB4O1xuICAgICAgICAgICAgeVYgPSB0aGlzLnkgLyB5O1xuICAgICAgICAgICAgaWYgKGlzRGVmQW5kTm90TnVsbCh0aGlzLnopICYmIGlzRGVmQW5kTm90TnVsbCh6KSkge1xuICAgICAgICAgICAgICAgIHpWID0gdGhpcy56IC8gejtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnggPSB4VjtcbiAgICAgICAgdGhpcy55ID0geVY7XG4gICAgICAgIGlmIChpc0RlZkFuZE5vdE51bGwoelYpKSB7XG4gICAgICAgICAgICB0aGlzLnogPSB6VjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuZXF1YWwgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICByZXR1cm4gdGhpcy54ID09PSBwLnggJiYgdGhpcy55ID09PSBwLnkgJiYgdGhpcy56ID09PSBwLno7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLmxpa2UgPSBmdW5jdGlvbiAocCwgZCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIGlmIChkID09PSB2b2lkIDApIHsgZCA9IDAuMDAxOyB9XG4gICAgICAgIGlmICh0aGlzLmVxdWFsKHApKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlrZVggPSBNYXRoLmFicyh0aGlzLnggLSBwLngpIDwgZDtcbiAgICAgICAgdmFyIGxpa2VZID0gTWF0aC5hYnModGhpcy55IC0gcC55KSA8IGQ7XG4gICAgICAgIHZhciBsaWtlWiA9IE1hdGguYWJzKCgoX2IgPSAoX2EgPSB0aGlzLnopICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHAueikgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCkgLSAoKF9kID0gKF9jID0gcC56KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB0aGlzLnopICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IDApKSA8IGQ7XG4gICAgICAgIHJldHVybiBsaWtlWCAmJiBsaWtlWSAmJiBsaWtlWjtcbiAgICB9O1xuICAgIERQb2ludC5wcm90b3R5cGUuZmxpcFZlcnRpY2FsbHkgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgICB2YXIgdiA9IHNpemU7XG4gICAgICAgIGlmIChzaXplIGluc3RhbmNlb2YgRFBvaW50KSB7XG4gICAgICAgICAgICB2ID0gc2l6ZS55O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMueSA9IHYgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2ludC5wcm90b3R5cGUsIFwibGlrZVJhZGlhbnNcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChyYWRpYW5zUG9seWdvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByYWRpYW5zUG9seWdvbi5wdXNoKG5ldyBEUG9pbnQoLU1hdGguUEksIC1NYXRoLlBJIC8gMiksIG5ldyBEUG9pbnQoTWF0aC5QSSwgTWF0aC5QSSAvIDIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByYWRpYW5zUG9seWdvbi5zaW1wbGVJbmNsdWRlKHRoaXMpO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2ludC5wcm90b3R5cGUsIFwibGlrZVdvcmxkR2VvZGV0aWNTeXN0ZW1cIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh3b3JsZEdlb2RldGljUG9seWdvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB3b3JsZEdlb2RldGljUG9seWdvbi5wdXNoKG5ldyBEUG9pbnQoLTE4MCwgLTkwKSwgbmV3IERQb2ludCgxODAsIDkwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMubGlrZVJhZGlhbnMgJiYgd29ybGRHZW9kZXRpY1BvbHlnb24uc2ltcGxlSW5jbHVkZSh0aGlzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9pbnQucHJvdG90eXBlLCBcImxpa2VQc2V1ZG9NZXJjYXRvclwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHBzZXVkb01lcmNhdG9yUG9seWdvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBwc2V1ZG9NZXJjYXRvclBvbHlnb24ucHVzaChuZXcgRFBvaW50KC0yMDAyNjM3Ni4zOSwgLTIwMDQ4OTY2LjEwKSwgbmV3IERQb2ludCgyMDAyNjM3Ni4zOSwgMjAwNDg5NjYuMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhdGhpcy5saWtlUmFkaWFucyAmJiAhdGhpcy5saWtlV29ybGRHZW9kZXRpY1N5c3RlbSAmJiBwc2V1ZG9NZXJjYXRvclBvbHlnb24uc2ltcGxlSW5jbHVkZSh0aGlzKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9pbnQucHJvdG90eXBlLCBcIndcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLng7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvaW50LnByb3RvdHlwZSwgXCJoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy55O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KERQb2ludC5wcm90b3R5cGUsIFwiYXJlYVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2hlY2tGdW5jdGlvbignYXJlYScpXG4gICAgICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgICAgIC5zaG91bGRCZU1ldGVycyh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLncgKiB0aGlzLmg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvaW50LnByb3RvdHlwZSwgXCJoaXBcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNoZWNrRnVuY3Rpb24oJ2hpcCcpXG4gICAgICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3RoaXMnKVxuICAgICAgICAgICAgICAgIC5zaG91bGRCZU1ldGVycyh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQodGhpcy53ICogdGhpcy53ICsgdGhpcy5oICogdGhpcy5oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9pbnQucHJvdG90eXBlLCBcIm1pblwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9pbnQucHJvdG90eXBlLCBcIm1heFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9pbnQucHJvdG90eXBlLCBcImhpcFBvaW50XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaGlwID0gdGhpcy5oaXA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQb2ludChoaXAsIGhpcCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvaW50LnByb3RvdHlwZSwgXCJ4UG9pbnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy54O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQoeCwgeCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvaW50LnByb3RvdHlwZSwgXCJ5UG9pbnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB5ID0gdGhpcy55O1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQoeSwgeSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRFBvaW50LnByb3RvdHlwZSwgXCJ3UG9pbnRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnhQb2ludDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEUG9pbnQucHJvdG90eXBlLCBcImhQb2ludFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueVBvaW50O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgRFBvaW50LnByb3RvdHlwZS5zaW1wbGUgPSBmdW5jdGlvbiAoeEtleSwgeUtleSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh4S2V5ID09PSB2b2lkIDApIHsgeEtleSA9ICd4JzsgfVxuICAgICAgICBpZiAoeUtleSA9PT0gdm9pZCAwKSB7IHlLZXkgPSAneSc7IH1cbiAgICAgICAgcmV0dXJuIF9hID0ge30sXG4gICAgICAgICAgICBfYVt4S2V5XSA9IHRoaXMueCxcbiAgICAgICAgICAgIF9hW3lLZXldID0gdGhpcy55LFxuICAgICAgICAgICAgX2E7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLnNldElmTGVzc1RoYW4gPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLm1heCh0aGlzLngsIHAueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgubWF4KHRoaXMueSwgcC55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLm1pbnVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSgtMSk7XG4gICAgfTtcbiAgICBEUG9pbnQucHJvdG90eXBlLm9ydGhvZHJvbWljUGF0aCA9IGZ1bmN0aW9uIChwb2ludCwgcG9pbnRzQ291bnQpIHtcbiAgICAgICAgaWYgKHBvaW50c0NvdW50ID09PSB2b2lkIDApIHsgcG9pbnRzQ291bnQgPSAzNjA7IH1cbiAgICAgICAgY2hlY2tGdW5jdGlvbignb3J0aG9kcm9taWNQYXRoJylcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCd0aGlzJylcbiAgICAgICAgICAgIC5zaG91bGRCZURlZ3JlZSh0aGlzKVxuICAgICAgICAgICAgLmNoZWNrQXJndW1lbnQoJ3BvaW50JylcbiAgICAgICAgICAgIC5zaG91bGRCZURlZ3JlZShwb2ludCk7XG4gICAgICAgIHZhciB0ID0gdGhpcy5jbG9uZSgpLmRlZ3JlZVRvUmFkaWFucygpO1xuICAgICAgICB2YXIgcCA9IHBvaW50LmNsb25lKCkuZGVncmVlVG9SYWRpYW5zKCk7XG4gICAgICAgIHZhciBkID0gTWF0aC5zaW4ocC54IC0gdC54KTtcbiAgICAgICAgdmFyIHN0ZXAgPSAocC54IC0gdC54KSAvIChwb2ludHNDb3VudCAtIDEpO1xuICAgICAgICByZXR1cm4gbmV3IERQb2x5Z29uKGNyZWF0ZUFycmF5KHBvaW50c0NvdW50KVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodiwgaSkge1xuICAgICAgICAgICAgdmFyIHggPSB0LnggKyBzdGVwICogaTtcbiAgICAgICAgICAgIHZhciB5ID0gTWF0aC5hdGFuKChNYXRoLnRhbih0LnkpICogTWF0aC5zaW4ocC54IC0geCkpIC8gZCArXG4gICAgICAgICAgICAgICAgKE1hdGgudGFuKHAueSkgKiBNYXRoLnNpbih4IC0gdC54KSkgLyBkKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRFBvaW50KHgsIHkpLnJhZGlhbnNUb0RlZ3JlZXMoKTtcbiAgICAgICAgfSkpO1xuICAgIH07XG4gICAgRFBvaW50LnByb3RvdHlwZS5zb3J0QnlEaXN0YW5jZSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiBwXG4gICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoZCwgaW5kZXgpIHtcbiAgICAgICAgICAgIGQucHJvcGVydGllcy5kaXN0YW5jZSA9IGQuZGlzdGFuY2UoX3RoaXMpO1xuICAgICAgICAgICAgZC5wcm9wZXJ0aWVzLmluZGV4ID0gaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLnByb3BlcnRpZXMuZGlzdGFuY2UgLSBiLnByb3BlcnRpZXMuZGlzdGFuY2U7IH0pO1xuICAgIH07XG4gICAgcmV0dXJuIERQb2ludDtcbn0oKSk7XG5leHBvcnQgeyBEUG9pbnQgfTtcbiIsImltcG9ydCB7IERQb2ludCwgRUFSVEhfUkFESVVTX0lOX01FVEVSUyB9IGZyb20gJy4vRFBvaW50JztcbmltcG9ydCB7IERQb2x5Z29uIH0gZnJvbSAnLi9EUG9seWdvbic7XG5pbXBvcnQgeyBjaGVja0Z1bmN0aW9uIH0gZnJvbSAnLi91dGlscyc7XG52YXIgRENpcmNsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRENpcmNsZShjZW50ZXIsIHIpIHtcbiAgICAgICAgaWYgKGNlbnRlciA9PT0gdm9pZCAwKSB7IGNlbnRlciA9IERQb2ludC56ZXJvKCk7IH1cbiAgICAgICAgaWYgKHIgPT09IHZvaWQgMCkgeyByID0gMDsgfVxuICAgICAgICB0aGlzLmNlbnRlciA9IGNlbnRlcjtcbiAgICAgICAgdGhpcy5yID0gcjtcbiAgICB9XG4gICAgRENpcmNsZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIihcIiArIHRoaXMuY2VudGVyLnRvU3RyaW5nKCkgKyBcIiwgXCIgKyB0aGlzLnIgKyBcIilcIjtcbiAgICB9O1xuICAgIERDaXJjbGUucHJvdG90eXBlLmdldFZhbHVlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4geyBjZW50ZXI6IHRoaXMuY2VudGVyLCByOiB0aGlzLnIgfTtcbiAgICB9O1xuICAgIERDaXJjbGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IERDaXJjbGUodGhpcy5jZW50ZXIsIHRoaXMucik7XG4gICAgfTtcbiAgICBEQ2lyY2xlLnByb3RvdHlwZS5maW5kUG9pbnRzID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgaWYgKHRoaXMuZXF1YWwoYykpIHtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgX2EgPSB0aGlzLCBfYiA9IF9hLmNlbnRlciwgeDAgPSBfYi54LCB5MCA9IF9iLnksIHIwID0gX2EucjtcbiAgICAgICAgdmFyIF9jID0gYy5jZW50ZXIsIHgxID0gX2MueCwgeTEgPSBfYy55LCByMSA9IGMucjtcbiAgICAgICAgdmFyIHIwMiA9IHIwICogcjA7XG4gICAgICAgIHZhciBkID0gdGhpcy5jZW50ZXIuZGlzdGFuY2UoYy5jZW50ZXIpO1xuICAgICAgICB2YXIgYSA9IChyMDIgLSByMSAqIHIxICsgZCAqIGQpIC8gKDIgKiBkKTtcbiAgICAgICAgdmFyIGggPSBNYXRoLnNxcnQocjAyIC0gYSAqIGEpO1xuICAgICAgICB2YXIgYWQgPSBhIC8gZDtcbiAgICAgICAgdmFyIGR5ID0geTEgLSB5MDtcbiAgICAgICAgdmFyIGR4ID0geDEgLSB4MDtcbiAgICAgICAgdmFyIGhkID0gaCAvIGQ7XG4gICAgICAgIHZhciB4MiA9IHgwICsgYWQgKiAoeDEgLSB4MCk7XG4gICAgICAgIHZhciB5MiA9IHkwICsgYWQgKiAoeTEgLSB5MCk7XG4gICAgICAgIHZhciB4MzEgPSB4MiArIGhkICogZHk7XG4gICAgICAgIHZhciB5MzEgPSB5MiAtIGhkICogZHg7XG4gICAgICAgIHZhciB4MzIgPSB4MiAtIGhkICogZHk7XG4gICAgICAgIHZhciB5MzIgPSB5MiArIGhkICogZHg7XG4gICAgICAgIHZhciByZXMgPSBbXTtcbiAgICAgICAgaWYgKCFpc05hTih4MzEpICYmICFpc05hTih5MzEpKSB7XG4gICAgICAgICAgICByZXMucHVzaChuZXcgRFBvaW50KHgzMSwgeTMxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc05hTih4MzIpICYmICFpc05hTih5MzIpICYmICEoeDMxID09PSB4MzIgJiYgeTMxID09PSB5MzIpKSB7XG4gICAgICAgICAgICByZXMucHVzaChuZXcgRFBvaW50KHgzMiwgeTMyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICAgIERDaXJjbGUucHJvdG90eXBlLmVxdWFsID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciBjZW50ZXIgPSBfYS5jZW50ZXIsIHIgPSBfYS5yO1xuICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXIuZXF1YWwoY2VudGVyKSAmJiB0aGlzLnIgPT09IHI7XG4gICAgfTtcbiAgICBEQ2lyY2xlLnByb3RvdHlwZS5maW5kUG9seWdvbkluc2lkZSA9IGZ1bmN0aW9uIChwb2ludENvdW50LCBzdGFydEFuZ2xlLCBzdG9wQW5nbGUpIHtcbiAgICAgICAgaWYgKHBvaW50Q291bnQgPT09IHZvaWQgMCkgeyBwb2ludENvdW50ID0gNjQ7IH1cbiAgICAgICAgaWYgKHN0YXJ0QW5nbGUgPT09IHZvaWQgMCkgeyBzdGFydEFuZ2xlID0gMDsgfVxuICAgICAgICBpZiAoc3RvcEFuZ2xlID09PSB2b2lkIDApIHsgc3RvcEFuZ2xlID0gMiAqIE1hdGguUEk7IH1cbiAgICAgICAgdmFyIHN0ZXAgPSAyICogTWF0aC5QSSAvIHBvaW50Q291bnQ7XG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgdmFyIGFuZ2xlID0gc3RhcnRBbmdsZTtcbiAgICAgICAgd2hpbGUgKGFuZ2xlIDwgc3RvcEFuZ2xlIC0gc3RlcCkge1xuICAgICAgICAgICAgcG9pbnRzLnB1c2gobmV3IERQb2ludCh0aGlzLnIpLnNjYWxlKE1hdGguY29zKGFuZ2xlKSwgTWF0aC5zaW4oYW5nbGUpKVxuICAgICAgICAgICAgICAgIC5tb3ZlKHRoaXMuY2VudGVyKSk7XG4gICAgICAgICAgICBhbmdsZSArPSBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIHZhciB4ID0gdGhpcy5yICogTWF0aC5jb3Moc3RvcEFuZ2xlKSArIHRoaXMuY2VudGVyLng7XG4gICAgICAgIHZhciB5ID0gdGhpcy5yICogTWF0aC5zaW4oc3RvcEFuZ2xlKSArIHRoaXMuY2VudGVyLnk7XG4gICAgICAgIHBvaW50cy5wdXNoKG5ldyBEUG9pbnQoeCwgeSkpO1xuICAgICAgICByZXR1cm4gbmV3IERQb2x5Z29uKHBvaW50cyk7XG4gICAgfTtcbiAgICBEQ2lyY2xlLnByb3RvdHlwZS5maW5kUG9seWdvbkluc2lkZU9uU3BoZXJlID0gZnVuY3Rpb24gKHBvaW50Q291bnQsIHN0YXJ0QW5nbGUsIHN0b3BBbmdsZSkge1xuICAgICAgICBpZiAocG9pbnRDb3VudCA9PT0gdm9pZCAwKSB7IHBvaW50Q291bnQgPSA2NDsgfVxuICAgICAgICBpZiAoc3RhcnRBbmdsZSA9PT0gdm9pZCAwKSB7IHN0YXJ0QW5nbGUgPSAwOyB9XG4gICAgICAgIGlmIChzdG9wQW5nbGUgPT09IHZvaWQgMCkgeyBzdG9wQW5nbGUgPSAyICogTWF0aC5QSTsgfVxuICAgICAgICBjaGVja0Z1bmN0aW9uKCdmaW5kUG9seWdvbkluc2lkZU9uU3BoZXJlJylcbiAgICAgICAgICAgIC5jaGVja0FyZ3VtZW50KCdjZW50ZXInKVxuICAgICAgICAgICAgLnNob3VsZEJlRGVncmVlKHRoaXMuY2VudGVyKTtcbiAgICAgICAgdmFyIHN0ZXAgPSAyICogTWF0aC5QSSAvIHBvaW50Q291bnQ7XG4gICAgICAgIHZhciBwb2ludHMgPSBbXTtcbiAgICAgICAgdmFyIGFuZ2xlID0gc3RhcnRBbmdsZTtcbiAgICAgICAgd2hpbGUgKGFuZ2xlIDwgc3RvcEFuZ2xlIC0gc3RlcCkge1xuICAgICAgICAgICAgcG9pbnRzLnB1c2godGhpcy5zcGhlcmVPZmZzZXQoYW5nbGUpKTtcbiAgICAgICAgICAgIGFuZ2xlICs9IHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgcG9pbnRzLnB1c2godGhpcy5zcGhlcmVPZmZzZXQoc3RvcEFuZ2xlKSk7XG4gICAgICAgIHJldHVybiBuZXcgRFBvbHlnb24ocG9pbnRzKTtcbiAgICB9O1xuICAgIERDaXJjbGUucHJvdG90eXBlLnNwaGVyZU9mZnNldCA9IGZ1bmN0aW9uIChiZWFyaW5nLCBlYXJ0aFJhZGl1cykge1xuICAgICAgICBpZiAoZWFydGhSYWRpdXMgPT09IHZvaWQgMCkgeyBlYXJ0aFJhZGl1cyA9IEVBUlRIX1JBRElVU19JTl9NRVRFUlM7IH1cbiAgICAgICAgdmFyIF9hID0gdGhpcy5jZW50ZXIuY2xvbmUoKS5kZWdyZWVUb1JhZGlhbnMoKSwgbG9uMSA9IF9hLngsIGxhdDEgPSBfYS55O1xuICAgICAgICB2YXIgZEJ5UiA9IHRoaXMuciAvIGVhcnRoUmFkaXVzO1xuICAgICAgICB2YXIgbGF0ID0gTWF0aC5hc2luKE1hdGguc2luKGxhdDEpICogTWF0aC5jb3MoZEJ5UikgK1xuICAgICAgICAgICAgTWF0aC5jb3MobGF0MSkgKiBNYXRoLnNpbihkQnlSKSAqIE1hdGguY29zKGJlYXJpbmcpKTtcbiAgICAgICAgdmFyIGxvbiA9IGxvbjEgK1xuICAgICAgICAgICAgTWF0aC5hdGFuMihNYXRoLnNpbihiZWFyaW5nKSAqIE1hdGguc2luKGRCeVIpICogTWF0aC5jb3MobGF0MSksIE1hdGguY29zKGRCeVIpIC0gTWF0aC5zaW4obGF0MSkgKiBNYXRoLnNpbihsYXQpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQobG9uLCBsYXQpLnJhZGlhbnNUb0RlZ3JlZXMoKTtcbiAgICB9O1xuICAgIHJldHVybiBEQ2lyY2xlO1xufSgpKTtcbmV4cG9ydCB7IERDaXJjbGUgfTtcbiIsInZhciBfX3ZhbHVlcyA9ICh0aGlzICYmIHRoaXMuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbnZhciBGYXN0U2VhcmNoID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBGYXN0U2VhcmNoKCkge1xuICAgICAgICB0aGlzLnNlYXJjaFN0b3JlID0ge307XG4gICAgfVxuICAgIEZhc3RTZWFyY2gucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChwb2ludHMpIHtcbiAgICAgICAgdmFyIGVfMSwgX2E7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwb2ludHNfMSA9IF9fdmFsdWVzKHBvaW50cyksIHBvaW50c18xXzEgPSBwb2ludHNfMS5uZXh0KCk7ICFwb2ludHNfMV8xLmRvbmU7IHBvaW50c18xXzEgPSBwb2ludHNfMS5uZXh0KCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2IgPSBwb2ludHNfMV8xLnZhbHVlLCB4ID0gX2IueCwgeSA9IF9iLnksIHogPSBfYi56O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0b3JlW3hdID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZWFyY2hTdG9yZVt4XVt5XSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaFN0b3JlW3hdW3ldID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RvcmVbeF1beV1beiB8fCAndW5kZWZpbmVkJ10gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAocG9pbnRzXzFfMSAmJiAhcG9pbnRzXzFfMS5kb25lICYmIChfYSA9IHBvaW50c18xLnJldHVybikpIF9hLmNhbGwocG9pbnRzXzEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBGYXN0U2VhcmNoLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgIHZhciB4ID0gX2EueCwgeSA9IF9hLnksIHogPSBfYS56O1xuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoU3RvcmVbeF0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoU3RvcmVbeF1beV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hTdG9yZVt4XVt5XVt6IHx8ICd1bmRlZmluZWQnXTtcbiAgICB9O1xuICAgIHJldHVybiBGYXN0U2VhcmNoO1xufSgpKTtcbmV4cG9ydCB7IEZhc3RTZWFyY2ggfTtcbiIsInZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHRoaXMgJiYgdGhpcy5fX3NwcmVhZEFycmF5KSB8fCBmdW5jdGlvbiAodG8sIGZyb20sIHBhY2spIHtcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufTtcbnZhciBfX3ZhbHVlcyA9ICh0aGlzICYmIHRoaXMuX192YWx1ZXMpIHx8IGZ1bmN0aW9uKG8pIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufTtcbmltcG9ydCB7IERQb2ludCB9IGZyb20gJy4vRFBvaW50JztcbmltcG9ydCB7IERQb2x5Z29uLCBNSU5fUE9JTlRTX0lOX1ZBTElEX1BPTFlHT04gfSBmcm9tICcuL0RQb2x5Z29uJztcbmltcG9ydCB7IEZhc3RTZWFyY2ggfSBmcm9tICcuL0Zhc3RTZWFyY2gnO1xuaW1wb3J0IHsgY3JlYXRlQXJyYXkgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB2YXIgVHJhY2VNYXRyaXhWYWx1ZXM7XG4oZnVuY3Rpb24gKFRyYWNlTWF0cml4VmFsdWVzKSB7XG4gICAgVHJhY2VNYXRyaXhWYWx1ZXNbVHJhY2VNYXRyaXhWYWx1ZXNbXCJmXCJdID0gMF0gPSBcImZcIjtcbiAgICBUcmFjZU1hdHJpeFZhbHVlc1tUcmFjZU1hdHJpeFZhbHVlc1tcInRcIl0gPSAxXSA9IFwidFwiO1xufSkoVHJhY2VNYXRyaXhWYWx1ZXMgfHwgKFRyYWNlTWF0cml4VmFsdWVzID0ge30pKTtcbnZhciBnZXRCeVBvc2l0aW9uID0gZnVuY3Rpb24gKG0sIHAsIGRlZmF1bHRWYWx1ZSkge1xuICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHZvaWQgMCkgeyBkZWZhdWx0VmFsdWUgPSBUcmFjZU1hdHJpeFZhbHVlcy5mOyB9XG4gICAgaWYgKG1bcC55XSA9PT0gdW5kZWZpbmVkIHx8IG1bcC55XVtwLnhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1bcC55XVtwLnhdO1xufTtcbnZhciBzZXRCeVBvc2l0aW9uID0gZnVuY3Rpb24gKG0sIHAsIHZhbHVlKSB7XG4gICAgaWYgKG1bcC55XSA9PT0gdW5kZWZpbmVkIHx8IG1bcC55XVtwLnhdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBtW3AueV1bcC54XSA9IHZhbHVlO1xuICAgIHJldHVybiBtW3AueV1bcC54XTtcbn07XG52YXIgVHJhY2VNYXRyaXggPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlTWF0cml4KHNpemUsIGYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5maW5kR3JvdXBCeUluZGV4ID0gZnVuY3Rpb24gKG0sIHMpIHtcbiAgICAgICAgICAgIHZhciByZXMgPSBuZXcgRFBvbHlnb24oKTtcbiAgICAgICAgICAgIGlmIChzICYmIGdldEJ5UG9zaXRpb24obSwgcykgPT09IFRyYWNlTWF0cml4VmFsdWVzLnQpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChzKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIG1hcmtlZCA9IFRyYWNlTWF0cml4LmNyZWF0ZU1hdHJpeChfdGhpcy5zaXplLCBmdW5jdGlvbiAoKSB7IHJldHVybiBUcmFjZU1hdHJpeFZhbHVlcy5mOyB9KTtcbiAgICAgICAgICAgICAgICBzZXRCeVBvc2l0aW9uKG1hcmtlZCwgcywgVHJhY2VNYXRyaXhWYWx1ZXMudCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0SW5kZXggPCByZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gcmVzLmF0KHN0YXJ0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gLTE7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAtMTsgaiA8IDI7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IERQb2ludChyLnggKyBpLCByLnkgKyBqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0QnlQb3NpdGlvbihtYXJrZWQsIHQsIFRyYWNlTWF0cml4VmFsdWVzLnQpID09PSBUcmFjZU1hdHJpeFZhbHVlcy5mICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJ5UG9zaXRpb24obSwgdCwgVHJhY2VNYXRyaXhWYWx1ZXMuZikgPT09IFRyYWNlTWF0cml4VmFsdWVzLnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2godCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJ5UG9zaXRpb24obWFya2VkLCB0LCBUcmFjZU1hdHJpeFZhbHVlcy50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZmluZEFsbEdyb3Vwc0luTWF0cml4ID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgIHZhciBmaXJzdE1hcmsgPSBfdGhpcy5maW5kTWFya2VkKG0pO1xuICAgICAgICAgICAgaWYgKCFmaXJzdE1hcmspIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZ3JvdXAgPSBfdGhpcy5maW5kR3JvdXBCeUluZGV4KG0sIGZpcnN0TWFyayk7XG4gICAgICAgICAgICB2YXIgZ3JvdXBzID0gW2dyb3VwXTtcbiAgICAgICAgICAgIHZhciBncm91cFN1bSA9IGdyb3VwLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBhbGxHcm91cHMgPSBfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoZ3JvdXAucG9pbnRzKSwgZmFsc2UpO1xuICAgICAgICAgICAgdmFyIGZzID0gbmV3IEZhc3RTZWFyY2goKTtcbiAgICAgICAgICAgIGZzLmFkZChhbGxHcm91cHMpO1xuICAgICAgICAgICAgd2hpbGUgKGdyb3VwU3VtIDwgX3RoaXMudG90YWxDb3VudEluTWF0cml4KG0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hcmsgPSBfdGhpcy5maW5kTWFya2VkKG0pO1xuICAgICAgICAgICAgICAgIHdoaWxlIChtYXJrICYmIGZzLmZpbmQobWFyaykpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFyayA9IF90aGlzLmZpbmRNYXJrZWQobSwgbWFyayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBuZXh0R3JvdXAgPSBfdGhpcy5maW5kR3JvdXBCeUluZGV4KG0sIG1hcmspO1xuICAgICAgICAgICAgICAgIGdyb3VwU3VtICs9IG5leHRHcm91cC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgYWxsR3JvdXBzID0gX19zcHJlYWRBcnJheShfX3NwcmVhZEFycmF5KFtdLCBfX3JlYWQoYWxsR3JvdXBzKSwgZmFsc2UpLCBfX3JlYWQobmV4dEdyb3VwLnBvaW50cyksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBmcy5hZGQobmV4dEdyb3VwLnBvaW50cyk7XG4gICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2gobmV4dEdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBncm91cHMuZmlsdGVyKGZ1bmN0aW9uIChnKSB7IHJldHVybiBnLmxlbmd0aCA+IDI7IH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRyYWNlR3JvdXAgPSBmdW5jdGlvbiAobSwgZ3JvdXApIHtcbiAgICAgICAgICAgIHZhciB0cmFjZURpcmVjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgbmV3IERQb2ludCgtMSwgLTEpLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoLTEsIDApLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoLTEsIDEpLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoMCwgMSksXG4gICAgICAgICAgICAgICAgbmV3IERQb2ludCgxLCAxKSxcbiAgICAgICAgICAgICAgICBuZXcgRFBvaW50KDEsIDApLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoMSwgLTEpLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoMCwgLTEpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgdmFyIGxlZnQgPSBmdW5jdGlvbiAoZCkgeyByZXR1cm4gKGQgKyB0cmFjZURpcmVjdGlvbnMubGVuZ3RoICsgMSkgJSB0cmFjZURpcmVjdGlvbnMubGVuZ3RoOyB9O1xuICAgICAgICAgICAgdmFyIHJpZ2h0ID0gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIChkICsgdHJhY2VEaXJlY3Rpb25zLmxlbmd0aCAtIDEpICUgdHJhY2VEaXJlY3Rpb25zLmxlbmd0aDsgfTtcbiAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSBncm91cC5hdCgwKS5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRFBvbHlnb24oW3QsIHQsIHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwb2ludHMgPSBuZXcgRFBvbHlnb24oKTtcbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSAwO1xuICAgICAgICAgICAgdmFyIHByZXZEaXJlY3Rpb24gPSBJbmZpbml0eTtcbiAgICAgICAgICAgIHZhciBwID0gZ3JvdXAuYXQoMCk7XG4gICAgICAgICAgICB3aGlsZSAoIXAuZXF1YWwoZ3JvdXAuYXQoMCkpIHx8IHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRWYWx1ZSA9IGdldEJ5UG9zaXRpb24obSwgcC5jbG9uZSgpLm1vdmUodHJhY2VEaXJlY3Rpb25zW2RpcmVjdGlvbl0pKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHROZWlnaGJvdXJWYWx1ZSA9IGdldEJ5UG9zaXRpb24obSwgcC5jbG9uZSgpLm1vdmUodHJhY2VEaXJlY3Rpb25zW2xlZnQoZGlyZWN0aW9uKV0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRWYWx1ZSA9PT0gVHJhY2VNYXRyaXhWYWx1ZXMudCAmJiBuZXh0TmVpZ2hib3VyVmFsdWUgPT09IFRyYWNlTWF0cml4VmFsdWVzLmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHJpZ2h0KGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcmV2RGlyZWN0aW9uICE9PSBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnRzLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHByZXZEaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHAgPSBwLmNsb25lKCkubW92ZSh0cmFjZURpcmVjdGlvbnNbZGlyZWN0aW9uXSk7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gbGVmdChsZWZ0KGRpcmVjdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvaW50cy5hcHByb3hpbWF0aW9uKCkuY2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jcmVhdGVIb2xlTWF0cml4ID0gZnVuY3Rpb24gKGdyb3VwKSB7XG4gICAgICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgICAgIHZhciBmdWxsVHJhY2VEaXJlY3Rpb25zID0gW1xuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoLTEsIDApLFxuICAgICAgICAgICAgICAgIG5ldyBEUG9pbnQoMCwgMSksXG4gICAgICAgICAgICAgICAgbmV3IERQb2ludCgxLCAwKSxcbiAgICAgICAgICAgICAgICBuZXcgRFBvaW50KDAsIC0xKVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGdyb3VwLnByZXBhcmVUb0Zhc3RTZWFyY2goKTtcbiAgICAgICAgICAgIHZhciB0bXBNYXRyaXggPSBUcmFjZU1hdHJpeFxuICAgICAgICAgICAgICAgIC5jcmVhdGVNYXRyaXgoX3RoaXMuc2l6ZSwgZnVuY3Rpb24gKHApIHsgcmV0dXJuIGdyb3VwLmZhc3RIYXMocCkgPyBUcmFjZU1hdHJpeFZhbHVlcy50IDogVHJhY2VNYXRyaXhWYWx1ZXMuZjsgfSk7XG4gICAgICAgICAgICB2YXIgc3RhcnRDb29yZHMgPSBuZXcgRFBvbHlnb24oKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMuc2l6ZS53OyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGFydENvb3Jkcy5wdXNoKG5ldyBEUG9pbnQoaSwgLTEpKTtcbiAgICAgICAgICAgICAgICBzdGFydENvb3Jkcy5wdXNoKG5ldyBEUG9pbnQoaSwgX3RoaXMuc2l6ZS5oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF90aGlzLnNpemUuaDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3RhcnRDb29yZHMucHVzaChuZXcgRFBvaW50KC0xLCBpKSk7XG4gICAgICAgICAgICAgICAgc3RhcnRDb29yZHMucHVzaChuZXcgRFBvaW50KF90aGlzLnNpemUudywgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHN0YXJ0Q29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBwb2ludCA9IHN0YXJ0Q29vcmRzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGZ1bGxUcmFjZURpcmVjdGlvbnNfMSA9IChlXzEgPSB2b2lkIDAsIF9fdmFsdWVzKGZ1bGxUcmFjZURpcmVjdGlvbnMpKSwgZnVsbFRyYWNlRGlyZWN0aW9uc18xXzEgPSBmdWxsVHJhY2VEaXJlY3Rpb25zXzEubmV4dCgpOyAhZnVsbFRyYWNlRGlyZWN0aW9uc18xXzEuZG9uZTsgZnVsbFRyYWNlRGlyZWN0aW9uc18xXzEgPSBmdWxsVHJhY2VEaXJlY3Rpb25zXzEubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gZnVsbFRyYWNlRGlyZWN0aW9uc18xXzEudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wUG9pbnQgPSBwb2ludC5jbG9uZSgpLm1vdmUoZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGdldEJ5UG9zaXRpb24odG1wTWF0cml4LCB0bXBQb2ludCwgVHJhY2VNYXRyaXhWYWx1ZXMudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IFRyYWNlTWF0cml4VmFsdWVzLmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCeVBvc2l0aW9uKHRtcE1hdHJpeCwgdG1wUG9pbnQsIFRyYWNlTWF0cml4VmFsdWVzLnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29vcmRzLnB1c2godG1wUG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlXzFfMSkgeyBlXzEgPSB7IGVycm9yOiBlXzFfMSB9OyB9XG4gICAgICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFRyYWNlRGlyZWN0aW9uc18xXzEgJiYgIWZ1bGxUcmFjZURpcmVjdGlvbnNfMV8xLmRvbmUgJiYgKF9hID0gZnVsbFRyYWNlRGlyZWN0aW9uc18xLnJldHVybikpIF9hLmNhbGwoZnVsbFRyYWNlRGlyZWN0aW9uc18xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHQgPSBfdGhpcy5yZXZlcnNlTWF0cml4KHRtcE1hdHJpeCk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMudG90YWxDb3VudEluTWF0cml4KHQpID8gdCA6IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubSA9IFRyYWNlTWF0cml4LmNyZWF0ZU1hdHJpeCh0aGlzLnNpemUsIGYpO1xuICAgIH1cbiAgICBUcmFjZU1hdHJpeC5wcm90b3R5cGUuZnVsbE1hdHJpeFRyYWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB2YXIgZ3JvdXBzID0gdGhpcy5maW5kQWxsR3JvdXBzSW5NYXRyaXgodGhpcy5tKTtcbiAgICAgICAgdmFyIHBhdGhzID0gZ3JvdXBzLm1hcChmdW5jdGlvbiAoZykgeyByZXR1cm4gX3RoaXMudHJhY2VHcm91cChfdGhpcy5tLCBnKTsgfSk7XG4gICAgICAgIHZhciBob2xlTWF0cml4cyA9IGdyb3Vwcy5tYXAodGhpcy5jcmVhdGVIb2xlTWF0cml4KTtcbiAgICAgICAgdmFyIGhvbGVzR3JvdXBzID0gaG9sZU1hdHJpeHMubWFwKGZ1bmN0aW9uIChtKSB7IHJldHVybiBtICYmIF90aGlzLmZpbmRBbGxHcm91cHNJbk1hdHJpeChtKTsgfSk7XG4gICAgICAgIHZhciBob2xlc1BhdGhzID0gaG9sZXNHcm91cHMubWFwKGZ1bmN0aW9uIChoZywgaW5kZXgpIHsgcmV0dXJuIGhnICYmIGhnLm1hcChmdW5jdGlvbiAoZykgeyByZXR1cm4gX3RoaXNcbiAgICAgICAgICAgIC50cmFjZUdyb3VwKGhvbGVNYXRyaXhzW2luZGV4XSwgZyk7IH0pLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gci5sZW5ndGggPiBNSU5fUE9JTlRTX0lOX1ZBTElEX1BPTFlHT047IH0pOyB9KTtcbiAgICAgICAgcmV0dXJuIGdyb3Vwcy5tYXAoZnVuY3Rpb24gKGcsIGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgcmVzID0gcGF0aHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGhvbGVzR3JvdXBzW2luZGV4XSAmJiBob2xlc0dyb3Vwc1tpbmRleF0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmVzLmhvbGVzID0gaG9sZXNQYXRoc1tpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIFRyYWNlTWF0cml4LnByb3RvdHlwZS5yZXZlcnNlTWF0cml4ID0gZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgcmV0dXJuIFRyYWNlTWF0cml4LmNyZWF0ZU1hdHJpeCh0aGlzLnNpemUsIGZ1bmN0aW9uIChwKSB7IHJldHVybiBnZXRCeVBvc2l0aW9uKG0sIHApID09PSBUcmFjZU1hdHJpeFZhbHVlcy5mID8gVHJhY2VNYXRyaXhWYWx1ZXMudCA6IFRyYWNlTWF0cml4VmFsdWVzLmY7IH0pO1xuICAgIH07XG4gICAgVHJhY2VNYXRyaXgucHJvdG90eXBlLmZpbmRNYXJrZWQgPSBmdW5jdGlvbiAobSwgaW5pdCkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc2l6ZTtcbiAgICAgICAgdmFyIGluaSA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMudzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHMuaDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbmkgJiYgaW5pdCkge1xuICAgICAgICAgICAgICAgICAgICBpID0gaW5pdC54O1xuICAgICAgICAgICAgICAgICAgICBqID0gaW5pdC55O1xuICAgICAgICAgICAgICAgICAgICBpbmkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdldEJ5UG9zaXRpb24obSwgbmV3IERQb2ludChpLCBqKSkgPT09IFRyYWNlTWF0cml4VmFsdWVzLnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEUG9pbnQoaSwgaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgVHJhY2VNYXRyaXgucHJvdG90eXBlLnRvdGFsQ291bnRJbk1hdHJpeCA9IGZ1bmN0aW9uIChtKSB7XG4gICAgICAgIHZhciByZXMgPSAwO1xuICAgICAgICB2YXIgcyA9IHRoaXMuc2l6ZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLnc7IGkrKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzLmg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChnZXRCeVBvc2l0aW9uKG0sIG5ldyBEUG9pbnQoaSwgaikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgVHJhY2VNYXRyaXguY3JlYXRlTWF0cml4ID0gZnVuY3Rpb24gKHNpemUsIGYpIHtcbiAgICAgICAgaWYgKGYgPT09IHZvaWQgMCkgeyBmID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gVHJhY2VNYXRyaXhWYWx1ZXMuZjsgfTsgfVxuICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXkoc2l6ZS5oKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodiwgaSkgeyByZXR1cm4gY3JlYXRlQXJyYXkoc2l6ZS53KS5tYXAoZnVuY3Rpb24gKHYyLCBqKSB7IHJldHVybiBmKG5ldyBEUG9pbnQoaiwgaSkpOyB9KTsgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VNYXRyaXg7XG59KCkpO1xuZXhwb3J0IHsgVHJhY2VNYXRyaXggfTtcbiIsInZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbmltcG9ydCB7IERQb2ludCB9IGZyb20gJy4vRFBvaW50JztcbmltcG9ydCB7IGdhdXNzaWFuRWxpbWluYXRpb24gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEROdW1iZXJzIH0gZnJvbSAnLi9ETnVtYmVycyc7XG52YXIgRFBsYW5lID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBEUGxhbmUoYSwgYiwgYywgZCwgcDEsIHAyLCBwMykge1xuICAgICAgICBpZiAocDEgPT09IHZvaWQgMCkgeyBwMSA9IERQb2ludC56ZXJvKCk7IH1cbiAgICAgICAgaWYgKHAyID09PSB2b2lkIDApIHsgcDIgPSBEUG9pbnQuemVybygpOyB9XG4gICAgICAgIGlmIChwMyA9PT0gdm9pZCAwKSB7IHAzID0gRFBvaW50Lnplcm8oKTsgfVxuICAgICAgICB0aGlzLmEgPSBhO1xuICAgICAgICB0aGlzLmIgPSBiO1xuICAgICAgICB0aGlzLmMgPSBjO1xuICAgICAgICB0aGlzLmQgPSBkO1xuICAgICAgICB0aGlzLnAxID0gcDE7XG4gICAgICAgIHRoaXMucDIgPSBwMjtcbiAgICAgICAgdGhpcy5wMyA9IHAzO1xuICAgIH1cbiAgICBEUGxhbmUuZmluZCA9IGZ1bmN0aW9uIChwMSwgcDIsIHAzKSB7XG4gICAgICAgIGlmIChwMS54ID09PSBwMi54ICYmIHAyLnggPT09IHAzLngpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRFBsYW5lKDEsIDAsIDAsIC1wMS54LCBwMSwgcDIsIHAzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocDEueSA9PT0gcDIueSAmJiBwMi55ID09PSBwMy55KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERQbGFuZSgwLCAxLCAwLCAtcDEueSwgcDEsIHAyLCBwMyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAxLnogPT09IHAyLnogJiYgcDIueiA9PT0gcDMueikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEUGxhbmUoMCwgMCwgMSwgLXAxLnosIHAxLCBwMiwgcDMpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkID0gMTtcbiAgICAgICAgdmFyIF9hID0gX19yZWFkKGdhdXNzaWFuRWxpbWluYXRpb24oW1xuICAgICAgICAgICAgW3AxLngsIHAxLnksIHAxLnosIC1kXSxcbiAgICAgICAgICAgIFtwMi54LCBwMi55LCBwMi56LCAtZF0sXG4gICAgICAgICAgICBbcDMueCwgcDMueSwgcDMueiwgLWRdXG4gICAgICAgIF0pLCAzKSwgYSA9IF9hWzBdLCBiID0gX2FbMV0sIGMgPSBfYVsyXTtcbiAgICAgICAgcmV0dXJuIG5ldyBEUGxhbmUoYSwgYiwgYywgZCwgcDEsIHAyLCBwMyk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLnggPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAocCBpbnN0YW5jZW9mIERQb2ludCkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgYSA9IF9hLmEsIGIgPSBfYS5iLCBjID0gX2EuYywgZCA9IF9hLmQ7XG4gICAgICAgICAgICB2YXIgeSA9IHAueSwgeiA9IHAuejtcbiAgICAgICAgICAgIHAueCA9IC0oYiAqIHkgKyBjICogeiArIGQpIC8gYTtcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gX3RoaXMueCh0KTsgfSk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLnkgPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAocCBpbnN0YW5jZW9mIERQb2ludCkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgYSA9IF9hLmEsIGIgPSBfYS5iLCBjID0gX2EuYywgZCA9IF9hLmQ7XG4gICAgICAgICAgICB2YXIgeCA9IHAueCwgeiA9IHAuejtcbiAgICAgICAgICAgIHAueSA9IC0oYSAqIHggKyBjICogeiArIGQpIC8gYjtcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gX3RoaXMueSh0KTsgfSk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLnogPSBmdW5jdGlvbiAocCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAocCBpbnN0YW5jZW9mIERQb2ludCkge1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgYSA9IF9hLmEsIGIgPSBfYS5iLCBjID0gX2EuYywgZCA9IF9hLmQ7XG4gICAgICAgICAgICB2YXIgeCA9IHAueCwgeSA9IHAueTtcbiAgICAgICAgICAgIHAueiA9IC0oYSAqIHggKyBiICogeSArIGQpIC8gYztcbiAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwLm1hcChmdW5jdGlvbiAodCkgeyByZXR1cm4gX3RoaXMueih0KTsgfSk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBhID0gX2EuYSwgYiA9IF9hLmIsIGMgPSBfYS5jLCBkID0gX2EuZCwgcDEgPSBfYS5wMSwgcDIgPSBfYS5wMiwgcDMgPSBfYS5wMztcbiAgICAgICAgcmV0dXJuIG5ldyBEUGxhbmUoYSwgYiwgYywgZCwgcDEsIHAyLCBwMyk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLmRpc3RhbmNlID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBEUG9pbnQpIHtcbiAgICAgICAgICAgIHZhciB4ID0gcC54LCB5ID0gcC55LCB6ID0gcC56O1xuICAgICAgICAgICAgdmFyIF9hID0gdGhpcywgYV8xID0gX2EuYSwgYl8xID0gX2EuYiwgY18xID0gX2EuYywgZF8xID0gX2EuZDtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhhXzEgKiB4ICsgYl8xICogeSArIGNfMSAqIHogKyBkXzEpIC8gTWF0aC5zcXJ0KGFfMSAqIGFfMSArIGJfMSAqIGJfMSArIGNfMSAqIGNfMSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIF9iID0gcCwgYSA9IF9iLmEsIGIgPSBfYi5iLCBjID0gX2IuYywgZCA9IF9iLmQ7XG4gICAgICAgIHZhciByID0gdGhpcy5kO1xuICAgICAgICByZXR1cm4gTWF0aC5hYnMoZCAtIHIpIC8gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIgKyBjICogYyk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLmVxdWFsID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIGEgPSBwLmEsIGIgPSBwLmIsIGMgPSBwLmMsIGQgPSBwLmQ7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHEgPSBfYS5hLCB3ID0gX2EuYiwgZSA9IF9hLmMsIHIgPSBfYS5kO1xuICAgICAgICByZXR1cm4gRE51bWJlcnMubGlrZShhLCBxKSAmJlxuICAgICAgICAgICAgRE51bWJlcnMubGlrZShiLCB3KSAmJlxuICAgICAgICAgICAgRE51bWJlcnMubGlrZShjLCBlKSAmJlxuICAgICAgICAgICAgRE51bWJlcnMubGlrZShkLCByKTtcbiAgICB9O1xuICAgIERQbGFuZS5wcm90b3R5cGUuc2FtZSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHZhciBhID0gcC5hLCBiID0gcC5iLCBjID0gcC5jLCBkID0gcC5kO1xuICAgICAgICB2YXIgX2EgPSB0aGlzLCBxID0gX2EuYSwgdyA9IF9hLmIsIGUgPSBfYS5jLCByID0gX2EuZDtcbiAgICAgICAgdmFyIHQgPSBhIC8gcTtcbiAgICAgICAgdmFyIHkgPSBiIC8gdztcbiAgICAgICAgdmFyIHUgPSBjIC8gZTtcbiAgICAgICAgdmFyIGkgPSBkIC8gcjtcbiAgICAgICAgcmV0dXJuIEROdW1iZXJzLmxpa2UodCwgeSkgJiZcbiAgICAgICAgICAgIEROdW1iZXJzLmxpa2UodCwgdSkgJiZcbiAgICAgICAgICAgIEROdW1iZXJzLmxpa2UodCwgYykgJiZcbiAgICAgICAgICAgIEROdW1iZXJzLmxpa2UodCwgaSk7XG4gICAgfTtcbiAgICBEUGxhbmUucHJvdG90eXBlLnBhcmFsbGVsID0gZnVuY3Rpb24gKHApIHtcbiAgICAgICAgdmFyIGEgPSBwLmEsIGIgPSBwLmIsIGMgPSBwLmMsIGQgPSBwLmQ7XG4gICAgICAgIHZhciBfYSA9IHRoaXMsIHEgPSBfYS5hLCB3ID0gX2EuYiwgZSA9IF9hLmMsIHIgPSBfYS5kO1xuICAgICAgICB2YXIgdCA9IGEgLyBxO1xuICAgICAgICB2YXIgeSA9IGIgLyB3O1xuICAgICAgICB2YXIgdSA9IGMgLyBlO1xuICAgICAgICB2YXIgaSA9IGQgLyByO1xuICAgICAgICByZXR1cm4gRE51bWJlcnMubGlrZSh0LCB5KSAmJlxuICAgICAgICAgICAgRE51bWJlcnMubGlrZSh0LCB1KSAmJlxuICAgICAgICAgICAgRE51bWJlcnMubGlrZSh0LCBjKSAmJlxuICAgICAgICAgICAgIUROdW1iZXJzLmxpa2UodCwgaSk7XG4gICAgfTtcbiAgICByZXR1cm4gRFBsYW5lO1xufSgpKTtcbmV4cG9ydCB7IERQbGFuZSB9O1xuIiwiZXhwb3J0ICogZnJvbSAnLi9EQ2lyY2xlJztcbmV4cG9ydCAqIGZyb20gJy4vRExpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9ETnVtYmVycyc7XG5leHBvcnQgKiBmcm9tICcuL0RQb2ludCc7XG5leHBvcnQgKiBmcm9tICcuL0RQb2x5Z29uJztcbmV4cG9ydCAqIGZyb20gJy4vRmFzdFNlYXJjaCc7XG5leHBvcnQgKiBmcm9tICcuL1RyYWNlTWF0cml4JztcbmV4cG9ydCAqIGZyb20gJy4vRFBvbHlnb25Mb29wJztcbmV4cG9ydCAqIGZyb20gJy4vRFBsYW5lJztcbmV4cG9ydCB7IGdhdXNzaWFuRWxpbWluYXRpb24sIGNyZWF0ZUNhbnZhcywgY3JlYXRlQXJyYXksIGNyZWF0ZU1hdHJpeCwgaXNEZWZBbmROb3ROdWxsIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIERHZW8gPSB7XG4gICAgREVCVUc6IGZhbHNlXG59O1xuIl0sIm5hbWVzIjpbIl9fcmVhZCIsInRoaXMiLCJfX3NwcmVhZEFycmF5IiwiX192YWx1ZXMiLCJvcGVyYXRpb24iLCJqc3RzSW8iLCJUcmFjZU1hdHJpeFZhbHVlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBQUEsSUFBSUEsUUFBTSxHQUFHLENBQUNDLFNBQUksSUFBSUEsU0FBSSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdEQsSUFBSSxJQUFJLENBQUMsR0FBRyxPQUFPLE1BQU0sS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvRCxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNy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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsU0FBUztJQUNULEtBQUs7SUFDTCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDaEMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUN4QyxZQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsU0FBUztJQUNULFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDeEMsWUFBWSxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDNUMsZ0JBQWdCLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNELGFBQWE7SUFDYixTQUFTO0lBQ1QsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQ3BDLFlBQVksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDNUMsZ0JBQWdCLE1BQU0sQ0FBQyxD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LENBQUM7SUFDckIsU0FBUztJQUNULFFBQVEsT0FBTyxJQUFJLENBQUM7SUFDcEIsS0FBSyxDQUFDO0lBQ04sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDOUMsUUFBUSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtJQUNwQyxRQUFRLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztJQUN0RixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsUUFBUSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuRCxRQUFRLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDO0lBQzlCLEtBQUssQ0FBQztJQUNOLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2xELFFBQVEsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7SUFDcEMsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDdEQsUUFBUSxPQUFPLElB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LENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRixRQUFRLElBQUksTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELFFBQVEsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxRQUFRLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckQsUUFBUSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUN4RixZQUFZLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsU0FBUztJQUNULFFBQVEsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO0lBQ2pFLFlBQVksSUFBSSxD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QUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDdEUsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDdEIsUUFBUSxJQUFJLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDdEUsUUFBUSxPQUFPLENBQUMsRUFBRSxJQUFJO0lBQ3RCLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekssWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELFlBQVksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLGdCQUFnQixLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQzlDLGdCQUFnQixLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDeEUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7SUFDakUsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFNBQVM7SUFDakUsZ0JBQWdCO0lBQ2hCLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFO0lBQ2hJLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFO0lBQzFHLG9CQUFvQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFD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QUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUs7SUFDcEYsYUFBYSxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtJQUN2RSxLQUFLLENBQUM7SUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFlBQVk7SUFDOUMsUUFBUSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUMzRixLQUFLLENBQUM7SUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7SUFDM0MsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzVCLFFBQVEsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO0lBQ2hDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNsQyxTQUFTO0lBQ1QsUUFBUSxPQUFPLElBQUksQ0FBQztJQUNwQixLQUFLLENBQUM7SUFDTixJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFlBQVk7SUFDMUMsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzNCLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtJQUNqRCxZQUFZLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixTQUFTO0lBQ1QsUUFBUSxPQUFPLElBQUksQ0FBQztJQUNwQixLQUFLLENBQUM7SUFD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SyxDQUFDO0lBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsRUFBRTtJQUMzQyxRQUFRLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixRQUFRLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLEtBQUssQ0FBQztJQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDOUMsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELFFBQVEsT0FBTyxJQUFJLENBQUM7SUFDcEIsS0FBSyxDQUFDO0lBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUM5QyxRQUFRLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsUUFBUSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsUUFBUSxPQUFPLElBQUksQ0FBQztJQUNwQixLQUFLLENBQUM7SUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQzlDLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLFFBQVEsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxRQUFRLE9BQU8sSUFBSSxDQUFDO0lBQ3BCLEtBQUssQ0FBQztJQUNOLElBQUksTUFBTSxDQUFDLFNB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QyxDQUFDO0lBQ2xELFFBQVEsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixRQUFRLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDekIsUUFBUSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLFFBQVEsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QixRQUFRLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLFFBQVEsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDckMsUUFBUSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMvQixRQUFRLElBQUksR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQy9CLFFBQVEsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0IsUUFBUSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUMvQixRQUFRLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUNyQixRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDeEMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNDLFNBQVM7SUFDVCxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FB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QUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUQsU0FBUztJQUNULFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLFFBQVEsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDO0lBQzVDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hELFFBQVEsT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRCxLQUFLLENBQUM7SUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFO0lBQ3RDLFFBQVEsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLFFBQVEsSUFBSSxDQUFDLFlBQVksTUFBTSxFQUFFO0lBQ2pDLFlBQVksSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLFlBQVksT0FBTyxDQUFDLENBQUM7SUFDckIsU0FBUztJQUNULFFBQVEsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFELEtBQUssQ0FBQztJQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDdEMsUUFBUSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDekIsUUFBUSxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUU7SUFDakMsWUFBWSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEUsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsWUFBWSxPQUFPLENBQUMsQ0FBQztJQUNyQixTQUFTO0lBQ1QsUUFBUSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUQsS0FBSyxDQUFDO0lBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUN0QyxRQUFRLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztJQUN6QixRQUFRLElBQUksQ0FBQyxZQUFZLE1BQU0sRUFBRTtJQUNqQyxZQUFZLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxZQUFZLE9BQU8sQ0FBQyxDQUFDO0lBQ3JCLFNBQVM7SUFDVCxRQUFRLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxLQUFLLENBQUM7SUFDTixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7SUFDekMsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDbEcsUUFBUSxPQUFPLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELEtBQUssQ0FBQztJQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDN0MsUUFBUSxJQUFJLENBQUMsWUFBWSxNQUFNLEVBQUU7SUFDakMsWUFBWSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLFlBQVksSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLFlBQVksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUM5RyxTQUFTO0lBQ1QsUUFBUSxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0QsUUFBUSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLFFBQVEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEUsS0FBSyxDQUFDO0lBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsRUFBRTtJQUMxQyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsUUFBUSxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQyxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvQixZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLEtBQUssQ0FBQztJQUNOLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEVBQUU7SUFDekMsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLFFBQVEsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixRQUFRLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEMsS0FBSyxDQUFDO0lBQ04sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsRUFBRTtJQUM3QyxRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsUUFBUSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QixRQUFRLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEIsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLFFBQVEsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEMsWUFBWSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsWUFBWSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLEtBQUssQ0FBQztJQUNOLElBQUksT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQyxFQUFFOztBQ3JITyxRQUFDLElBQUksR0FBRztJQUNsQixJQUFJLEtBQUssRUFBRSxLQUFLO0lBQ2hCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9
|