@macrostrat/cesium-martini 1.2.2 → 1.3.0

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/dist/index.js CHANGED
@@ -1,47 +1,328 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var cesium = require('cesium');
6
-
7
- function ownKeys(object, enumerableOnly) {
8
- var keys = Object.keys(object);
1
+ import { Resource, Credit, Event, Math as Math$1, Ellipsoid, Rectangle, Cartographic, OrientedBoundingBox, BoundingSphere, QuantizedMeshTerrainData, TerrainProvider, WebMercatorTilingScheme } from 'cesium';
2
+ import ndarray from 'ndarray';
9
3
 
4
+ function ownKeys(e, r) {
5
+ var t = Object.keys(e);
10
6
  if (Object.getOwnPropertySymbols) {
11
- var symbols = Object.getOwnPropertySymbols(object);
12
-
13
- if (enumerableOnly) {
14
- symbols = symbols.filter(function (sym) {
15
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
16
- });
17
- }
18
-
19
- keys.push.apply(keys, symbols);
7
+ var o = Object.getOwnPropertySymbols(e);
8
+ r && (o = o.filter(function (r) {
9
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
10
+ })), t.push.apply(t, o);
20
11
  }
21
-
22
- return keys;
12
+ return t;
23
13
  }
24
-
25
- function _objectSpread2(target) {
26
- for (var i = 1; i < arguments.length; i++) {
27
- var source = arguments[i] != null ? arguments[i] : {};
28
-
29
- if (i % 2) {
30
- ownKeys(Object(source), true).forEach(function (key) {
31
- _defineProperty(target, key, source[key]);
32
- });
33
- } else if (Object.getOwnPropertyDescriptors) {
34
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
35
- } else {
36
- ownKeys(Object(source)).forEach(function (key) {
37
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
14
+ function _objectSpread2(e) {
15
+ for (var r = 1; r < arguments.length; r++) {
16
+ var t = null != arguments[r] ? arguments[r] : {};
17
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
18
+ _defineProperty(e, r, t[r]);
19
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
20
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
21
+ });
22
+ }
23
+ return e;
24
+ }
25
+ function _regeneratorRuntime() {
26
+ _regeneratorRuntime = function () {
27
+ return e;
28
+ };
29
+ var t,
30
+ e = {},
31
+ r = Object.prototype,
32
+ n = r.hasOwnProperty,
33
+ o = Object.defineProperty || function (t, e, r) {
34
+ t[e] = r.value;
35
+ },
36
+ i = "function" == typeof Symbol ? Symbol : {},
37
+ a = i.iterator || "@@iterator",
38
+ c = i.asyncIterator || "@@asyncIterator",
39
+ u = i.toStringTag || "@@toStringTag";
40
+ function define(t, e, r) {
41
+ return Object.defineProperty(t, e, {
42
+ value: r,
43
+ enumerable: !0,
44
+ configurable: !0,
45
+ writable: !0
46
+ }), t[e];
47
+ }
48
+ try {
49
+ define({}, "");
50
+ } catch (t) {
51
+ define = function (t, e, r) {
52
+ return t[e] = r;
53
+ };
54
+ }
55
+ function wrap(t, e, r, n) {
56
+ var i = e && e.prototype instanceof Generator ? e : Generator,
57
+ a = Object.create(i.prototype),
58
+ c = new Context(n || []);
59
+ return o(a, "_invoke", {
60
+ value: makeInvokeMethod(t, r, c)
61
+ }), a;
62
+ }
63
+ function tryCatch(t, e, r) {
64
+ try {
65
+ return {
66
+ type: "normal",
67
+ arg: t.call(e, r)
68
+ };
69
+ } catch (t) {
70
+ return {
71
+ type: "throw",
72
+ arg: t
73
+ };
74
+ }
75
+ }
76
+ e.wrap = wrap;
77
+ var h = "suspendedStart",
78
+ l = "suspendedYield",
79
+ f = "executing",
80
+ s = "completed",
81
+ y = {};
82
+ function Generator() {}
83
+ function GeneratorFunction() {}
84
+ function GeneratorFunctionPrototype() {}
85
+ var p = {};
86
+ define(p, a, function () {
87
+ return this;
88
+ });
89
+ var d = Object.getPrototypeOf,
90
+ v = d && d(d(values([])));
91
+ v && v !== r && n.call(v, a) && (p = v);
92
+ var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
93
+ function defineIteratorMethods(t) {
94
+ ["next", "throw", "return"].forEach(function (e) {
95
+ define(t, e, function (t) {
96
+ return this._invoke(e, t);
38
97
  });
98
+ });
99
+ }
100
+ function AsyncIterator(t, e) {
101
+ function invoke(r, o, i, a) {
102
+ var c = tryCatch(t[r], t, o);
103
+ if ("throw" !== c.type) {
104
+ var u = c.arg,
105
+ h = u.value;
106
+ return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
107
+ invoke("next", t, i, a);
108
+ }, function (t) {
109
+ invoke("throw", t, i, a);
110
+ }) : e.resolve(h).then(function (t) {
111
+ u.value = t, i(u);
112
+ }, function (t) {
113
+ return invoke("throw", t, i, a);
114
+ });
115
+ }
116
+ a(c.arg);
39
117
  }
118
+ var r;
119
+ o(this, "_invoke", {
120
+ value: function (t, n) {
121
+ function callInvokeWithMethodAndArg() {
122
+ return new e(function (e, r) {
123
+ invoke(t, n, e, r);
124
+ });
125
+ }
126
+ return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
127
+ }
128
+ });
40
129
  }
41
-
42
- return target;
130
+ function makeInvokeMethod(e, r, n) {
131
+ var o = h;
132
+ return function (i, a) {
133
+ if (o === f) throw new Error("Generator is already running");
134
+ if (o === s) {
135
+ if ("throw" === i) throw a;
136
+ return {
137
+ value: t,
138
+ done: !0
139
+ };
140
+ }
141
+ for (n.method = i, n.arg = a;;) {
142
+ var c = n.delegate;
143
+ if (c) {
144
+ var u = maybeInvokeDelegate(c, n);
145
+ if (u) {
146
+ if (u === y) continue;
147
+ return u;
148
+ }
149
+ }
150
+ if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
151
+ if (o === h) throw o = s, n.arg;
152
+ n.dispatchException(n.arg);
153
+ } else "return" === n.method && n.abrupt("return", n.arg);
154
+ o = f;
155
+ var p = tryCatch(e, r, n);
156
+ if ("normal" === p.type) {
157
+ if (o = n.done ? s : l, p.arg === y) continue;
158
+ return {
159
+ value: p.arg,
160
+ done: n.done
161
+ };
162
+ }
163
+ "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
164
+ }
165
+ };
166
+ }
167
+ function maybeInvokeDelegate(e, r) {
168
+ var n = r.method,
169
+ o = e.iterator[n];
170
+ if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
171
+ var i = tryCatch(o, e.iterator, r.arg);
172
+ if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
173
+ var a = i.arg;
174
+ return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
175
+ }
176
+ function pushTryEntry(t) {
177
+ var e = {
178
+ tryLoc: t[0]
179
+ };
180
+ 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
181
+ }
182
+ function resetTryEntry(t) {
183
+ var e = t.completion || {};
184
+ e.type = "normal", delete e.arg, t.completion = e;
185
+ }
186
+ function Context(t) {
187
+ this.tryEntries = [{
188
+ tryLoc: "root"
189
+ }], t.forEach(pushTryEntry, this), this.reset(!0);
190
+ }
191
+ function values(e) {
192
+ if (e || "" === e) {
193
+ var r = e[a];
194
+ if (r) return r.call(e);
195
+ if ("function" == typeof e.next) return e;
196
+ if (!isNaN(e.length)) {
197
+ var o = -1,
198
+ i = function next() {
199
+ for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
200
+ return next.value = t, next.done = !0, next;
201
+ };
202
+ return i.next = i;
203
+ }
204
+ }
205
+ throw new TypeError(typeof e + " is not iterable");
206
+ }
207
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
208
+ value: GeneratorFunctionPrototype,
209
+ configurable: !0
210
+ }), o(GeneratorFunctionPrototype, "constructor", {
211
+ value: GeneratorFunction,
212
+ configurable: !0
213
+ }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
214
+ var e = "function" == typeof t && t.constructor;
215
+ return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
216
+ }, e.mark = function (t) {
217
+ return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
218
+ }, e.awrap = function (t) {
219
+ return {
220
+ __await: t
221
+ };
222
+ }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
223
+ return this;
224
+ }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
225
+ void 0 === i && (i = Promise);
226
+ var a = new AsyncIterator(wrap(t, r, n, o), i);
227
+ return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
228
+ return t.done ? t.value : a.next();
229
+ });
230
+ }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
231
+ return this;
232
+ }), define(g, "toString", function () {
233
+ return "[object Generator]";
234
+ }), e.keys = function (t) {
235
+ var e = Object(t),
236
+ r = [];
237
+ for (var n in e) r.push(n);
238
+ return r.reverse(), function next() {
239
+ for (; r.length;) {
240
+ var t = r.pop();
241
+ if (t in e) return next.value = t, next.done = !1, next;
242
+ }
243
+ return next.done = !0, next;
244
+ };
245
+ }, e.values = values, Context.prototype = {
246
+ constructor: Context,
247
+ reset: function (e) {
248
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
249
+ },
250
+ stop: function () {
251
+ this.done = !0;
252
+ var t = this.tryEntries[0].completion;
253
+ if ("throw" === t.type) throw t.arg;
254
+ return this.rval;
255
+ },
256
+ dispatchException: function (e) {
257
+ if (this.done) throw e;
258
+ var r = this;
259
+ function handle(n, o) {
260
+ return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
261
+ }
262
+ for (var o = this.tryEntries.length - 1; o >= 0; --o) {
263
+ var i = this.tryEntries[o],
264
+ a = i.completion;
265
+ if ("root" === i.tryLoc) return handle("end");
266
+ if (i.tryLoc <= this.prev) {
267
+ var c = n.call(i, "catchLoc"),
268
+ u = n.call(i, "finallyLoc");
269
+ if (c && u) {
270
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
271
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
272
+ } else if (c) {
273
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
274
+ } else {
275
+ if (!u) throw new Error("try statement without catch or finally");
276
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
277
+ }
278
+ }
279
+ }
280
+ },
281
+ abrupt: function (t, e) {
282
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
283
+ var o = this.tryEntries[r];
284
+ if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
285
+ var i = o;
286
+ break;
287
+ }
288
+ }
289
+ i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
290
+ var a = i ? i.completion : {};
291
+ return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
292
+ },
293
+ complete: function (t, e) {
294
+ if ("throw" === t.type) throw t.arg;
295
+ return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
296
+ },
297
+ finish: function (t) {
298
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
299
+ var r = this.tryEntries[e];
300
+ if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
301
+ }
302
+ },
303
+ catch: function (t) {
304
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
305
+ var r = this.tryEntries[e];
306
+ if (r.tryLoc === t) {
307
+ var n = r.completion;
308
+ if ("throw" === n.type) {
309
+ var o = n.arg;
310
+ resetTryEntry(r);
311
+ }
312
+ return o;
313
+ }
314
+ }
315
+ throw new Error("illegal catch attempt");
316
+ },
317
+ delegateYield: function (e, r, n) {
318
+ return this.delegate = {
319
+ iterator: values(e),
320
+ resultName: r,
321
+ nextLoc: n
322
+ }, "next" === this.method && (this.arg = t), y;
323
+ }
324
+ }, e;
43
325
  }
44
-
45
326
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
46
327
  try {
47
328
  var info = gen[key](arg);
@@ -50,57 +331,52 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
50
331
  reject(error);
51
332
  return;
52
333
  }
53
-
54
334
  if (info.done) {
55
335
  resolve(value);
56
336
  } else {
57
337
  Promise.resolve(value).then(_next, _throw);
58
338
  }
59
339
  }
60
-
61
340
  function _asyncToGenerator(fn) {
62
341
  return function () {
63
342
  var self = this,
64
- args = arguments;
343
+ args = arguments;
65
344
  return new Promise(function (resolve, reject) {
66
345
  var gen = fn.apply(self, args);
67
-
68
346
  function _next(value) {
69
347
  asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
70
348
  }
71
-
72
349
  function _throw(err) {
73
350
  asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
74
351
  }
75
-
76
352
  _next(undefined);
77
353
  });
78
354
  };
79
355
  }
80
-
81
356
  function _classCallCheck(instance, Constructor) {
82
357
  if (!(instance instanceof Constructor)) {
83
358
  throw new TypeError("Cannot call a class as a function");
84
359
  }
85
360
  }
86
-
87
361
  function _defineProperties(target, props) {
88
362
  for (var i = 0; i < props.length; i++) {
89
363
  var descriptor = props[i];
90
364
  descriptor.enumerable = descriptor.enumerable || false;
91
365
  descriptor.configurable = true;
92
366
  if ("value" in descriptor) descriptor.writable = true;
93
- Object.defineProperty(target, descriptor.key, descriptor);
367
+ Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
94
368
  }
95
369
  }
96
-
97
370
  function _createClass(Constructor, protoProps, staticProps) {
98
371
  if (protoProps) _defineProperties(Constructor.prototype, protoProps);
99
372
  if (staticProps) _defineProperties(Constructor, staticProps);
373
+ Object.defineProperty(Constructor, "prototype", {
374
+ writable: false
375
+ });
100
376
  return Constructor;
101
377
  }
102
-
103
378
  function _defineProperty(obj, key, value) {
379
+ key = _toPropertyKey(key);
104
380
  if (key in obj) {
105
381
  Object.defineProperty(obj, key, {
106
382
  value: value,
@@ -111,15 +387,12 @@ function _defineProperty(obj, key, value) {
111
387
  } else {
112
388
  obj[key] = value;
113
389
  }
114
-
115
390
  return obj;
116
391
  }
117
-
118
392
  function _inherits(subClass, superClass) {
119
393
  if (typeof superClass !== "function" && superClass !== null) {
120
394
  throw new TypeError("Super expression must either be null or a function");
121
395
  }
122
-
123
396
  subClass.prototype = Object.create(superClass && superClass.prototype, {
124
397
  constructor: {
125
398
  value: subClass,
@@ -127,30 +400,28 @@ function _inherits(subClass, superClass) {
127
400
  configurable: true
128
401
  }
129
402
  });
403
+ Object.defineProperty(subClass, "prototype", {
404
+ writable: false
405
+ });
130
406
  if (superClass) _setPrototypeOf(subClass, superClass);
131
407
  }
132
-
133
408
  function _getPrototypeOf(o) {
134
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
409
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
135
410
  return o.__proto__ || Object.getPrototypeOf(o);
136
411
  };
137
412
  return _getPrototypeOf(o);
138
413
  }
139
-
140
414
  function _setPrototypeOf(o, p) {
141
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
415
+ _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
142
416
  o.__proto__ = p;
143
417
  return o;
144
418
  };
145
-
146
419
  return _setPrototypeOf(o, p);
147
420
  }
148
-
149
421
  function _isNativeReflectConstruct() {
150
422
  if (typeof Reflect === "undefined" || !Reflect.construct) return false;
151
423
  if (Reflect.construct.sham) return false;
152
424
  if (typeof Proxy === "function") return true;
153
-
154
425
  try {
155
426
  Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
156
427
  return true;
@@ -158,86 +429,66 @@ function _isNativeReflectConstruct() {
158
429
  return false;
159
430
  }
160
431
  }
161
-
162
432
  function _assertThisInitialized(self) {
163
433
  if (self === void 0) {
164
434
  throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
165
435
  }
166
-
167
436
  return self;
168
437
  }
169
-
170
438
  function _possibleConstructorReturn(self, call) {
171
439
  if (call && (typeof call === "object" || typeof call === "function")) {
172
440
  return call;
173
441
  } else if (call !== void 0) {
174
442
  throw new TypeError("Derived constructors may only return object or undefined");
175
443
  }
176
-
177
444
  return _assertThisInitialized(self);
178
445
  }
179
-
180
446
  function _createSuper(Derived) {
181
447
  var hasNativeReflectConstruct = _isNativeReflectConstruct();
182
-
183
448
  return function _createSuperInternal() {
184
449
  var Super = _getPrototypeOf(Derived),
185
- result;
186
-
450
+ result;
187
451
  if (hasNativeReflectConstruct) {
188
452
  var NewTarget = _getPrototypeOf(this).constructor;
189
-
190
453
  result = Reflect.construct(Super, arguments, NewTarget);
191
454
  } else {
192
455
  result = Super.apply(this, arguments);
193
456
  }
194
-
195
457
  return _possibleConstructorReturn(this, result);
196
458
  };
197
459
  }
198
-
199
460
  function _superPropBase(object, property) {
200
461
  while (!Object.prototype.hasOwnProperty.call(object, property)) {
201
462
  object = _getPrototypeOf(object);
202
463
  if (object === null) break;
203
464
  }
204
-
205
465
  return object;
206
466
  }
207
-
208
467
  function _get() {
209
468
  if (typeof Reflect !== "undefined" && Reflect.get) {
210
- _get = Reflect.get;
469
+ _get = Reflect.get.bind();
211
470
  } else {
212
471
  _get = function _get(target, property, receiver) {
213
472
  var base = _superPropBase(target, property);
214
-
215
473
  if (!base) return;
216
474
  var desc = Object.getOwnPropertyDescriptor(base, property);
217
-
218
475
  if (desc.get) {
219
476
  return desc.get.call(arguments.length < 3 ? target : receiver);
220
477
  }
221
-
222
478
  return desc.value;
223
479
  };
224
480
  }
225
-
226
481
  return _get.apply(this, arguments);
227
482
  }
228
-
229
483
  function _toConsumableArray(arr) {
230
484
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
231
485
  }
232
-
233
486
  function _arrayWithoutHoles(arr) {
234
487
  if (Array.isArray(arr)) return _arrayLikeToArray(arr);
235
488
  }
236
-
237
489
  function _iterableToArray(iter) {
238
490
  if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
239
491
  }
240
-
241
492
  function _unsupportedIterableToArray(o, minLen) {
242
493
  if (!o) return;
243
494
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
@@ -246,18 +497,28 @@ function _unsupportedIterableToArray(o, minLen) {
246
497
  if (n === "Map" || n === "Set") return Array.from(o);
247
498
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
248
499
  }
249
-
250
500
  function _arrayLikeToArray(arr, len) {
251
501
  if (len == null || len > arr.length) len = arr.length;
252
-
253
502
  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
254
-
255
503
  return arr2;
256
504
  }
257
-
258
505
  function _nonIterableSpread() {
259
506
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
260
507
  }
508
+ function _toPrimitive(input, hint) {
509
+ if (typeof input !== "object" || input === null) return input;
510
+ var prim = input[Symbol.toPrimitive];
511
+ if (prim !== undefined) {
512
+ var res = prim.call(input, hint || "default");
513
+ if (typeof res !== "object") return res;
514
+ throw new TypeError("@@toPrimitive must return a primitive value.");
515
+ }
516
+ return (hint === "string" ? String : Number)(input);
517
+ }
518
+ function _toPropertyKey(arg) {
519
+ var key = _toPrimitive(arg, "string");
520
+ return typeof key === "symbol" ? key : String(key);
521
+ }
261
522
 
262
523
  var loadImage = function loadImage(url) {
263
524
  return new Promise(function (resolve, reject) {
@@ -272,71 +533,51 @@ var loadImage = function loadImage(url) {
272
533
  img.src = url;
273
534
  });
274
535
  };
275
-
276
536
  var DefaultHeightmapResource = /*#__PURE__*/function () {
277
537
  function DefaultHeightmapResource() {
278
538
  var _this = this,
279
- _opts$skipOddLevels,
280
- _opts$tileSize,
281
- _opts$maxZoom;
282
-
539
+ _opts$skipOddLevels,
540
+ _opts$tileSize,
541
+ _opts$maxZoom;
283
542
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
284
-
285
543
  _classCallCheck(this, DefaultHeightmapResource);
286
-
287
544
  _defineProperty(this, "resource", null);
288
-
289
545
  _defineProperty(this, "tileSize", 256);
290
-
291
- _defineProperty(this, "maxZoom", void 0);
292
-
293
546
  _defineProperty(this, "skipOddLevels", false);
294
-
295
- _defineProperty(this, "contextQueue", void 0);
296
-
297
547
  _defineProperty(this, "getTilePixels", /*#__PURE__*/function () {
298
- var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(coords) {
548
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(coords) {
299
549
  var url, img;
300
- return regeneratorRuntime.wrap(function _callee$(_context) {
301
- while (1) {
302
- switch (_context.prev = _context.next) {
303
- case 0:
304
- url = _this.buildTileURL(coords);
305
- _context.next = 3;
306
- return loadImage(url);
307
-
308
- case 3:
309
- img = _context.sent;
310
- return _context.abrupt("return", _this.getPixels(img));
311
-
312
- case 5:
313
- case "end":
314
- return _context.stop();
315
- }
550
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
551
+ while (1) switch (_context.prev = _context.next) {
552
+ case 0:
553
+ url = _this.buildTileURL(coords);
554
+ _context.next = 3;
555
+ return loadImage(url);
556
+ case 3:
557
+ img = _context.sent;
558
+ return _context.abrupt("return", _this.getPixels(img));
559
+ case 5:
560
+ case "end":
561
+ return _context.stop();
316
562
  }
317
563
  }, _callee);
318
564
  }));
319
-
320
565
  return function (_x) {
321
566
  return _ref.apply(this, arguments);
322
567
  };
323
568
  }());
324
-
325
569
  if (opts.url) {
326
- this.resource = cesium.Resource.createIfNeeded(opts.url);
570
+ this.resource = Resource.createIfNeeded(opts.url);
327
571
  }
328
-
329
572
  this.skipOddLevels = (_opts$skipOddLevels = opts.skipOddLevels) !== null && _opts$skipOddLevels !== void 0 ? _opts$skipOddLevels : false;
330
573
  this.tileSize = (_opts$tileSize = opts.tileSize) !== null && _opts$tileSize !== void 0 ? _opts$tileSize : 256;
331
574
  this.maxZoom = (_opts$maxZoom = opts.maxZoom) !== null && _opts$maxZoom !== void 0 ? _opts$maxZoom : 15;
332
575
  this.contextQueue = [];
333
576
  }
334
-
335
577
  _createClass(DefaultHeightmapResource, [{
336
578
  key: "getCanvas",
337
579
  value: function getCanvas() {
338
580
  var ctx = this.contextQueue.pop();
339
-
340
581
  if (ctx == null) {
341
582
  var canvas = document.createElement("canvas");
342
583
  canvas.width = this.tileSize;
@@ -347,17 +588,16 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
347
588
  context: context
348
589
  };
349
590
  }
350
-
351
591
  return ctx;
352
592
  }
353
593
  }, {
354
594
  key: "getPixels",
355
595
  value: function getPixels(img) {
356
596
  var canvasRef = this.getCanvas();
357
- var context = canvasRef.context; //context.scale(1, -1);
597
+ var context = canvasRef.context;
598
+ //context.scale(1, -1);
358
599
  // Chrome appears to vertically flip the image for reasons that are unclear
359
600
  // We can make it work in Chrome by drawing the image upside-down at this step.
360
-
361
601
  context.drawImage(img, 0, 0, this.tileSize, this.tileSize);
362
602
  var pixels = context.getImageData(0, 0, this.tileSize, this.tileSize);
363
603
  context.clearRect(0, 0, this.tileSize, this.tileSize);
@@ -368,11 +608,10 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
368
608
  key: "buildTileURL",
369
609
  value: function buildTileURL(tileCoords) {
370
610
  var _this$resource;
371
-
372
611
  // reverseY for TMS tiling (https://gist.github.com/tmcw/4954720)
373
612
  // See tiling schemes here: https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/
374
613
  var z = tileCoords.z,
375
- y = tileCoords.y;
614
+ y = tileCoords.y;
376
615
  return (_this$resource = this.resource) === null || _this$resource === void 0 ? void 0 : _this$resource.getDerivedResource({
377
616
  templateValues: _objectSpread2(_objectSpread2({}, tileCoords), {}, {
378
617
  reverseY: Math.pow(2, z) - y - 1
@@ -390,61 +629,46 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
390
629
  return true;
391
630
  }
392
631
  }]);
393
-
394
632
  return DefaultHeightmapResource;
395
633
  }();
396
634
 
397
- var ImageFormat;
398
-
399
- (function (ImageFormat) {
635
+ var ImageFormat = /*#__PURE__*/function (ImageFormat) {
400
636
  ImageFormat["WEBP"] = "webp";
401
637
  ImageFormat["PNG"] = "png";
402
638
  ImageFormat["PNGRAW"] = "pngraw";
403
- })(ImageFormat || (ImageFormat = {}));
404
-
639
+ return ImageFormat;
640
+ }({});
405
641
  var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
406
642
  _inherits(MapboxTerrainResource, _DefaultHeightmapReso);
407
-
408
643
  var _super = _createSuper(MapboxTerrainResource);
409
-
410
644
  function MapboxTerrainResource() {
411
645
  var _opts$highResolution, _opts$imageFormat;
412
-
413
646
  var _this;
414
-
415
647
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
416
-
417
648
  _classCallCheck(this, MapboxTerrainResource);
418
-
419
649
  _this = _super.call(this, opts);
420
-
421
650
  _defineProperty(_assertThisInitialized(_this), "resource", null);
422
-
423
651
  var highResolution = (_opts$highResolution = opts.highResolution) !== null && _opts$highResolution !== void 0 ? _opts$highResolution : false;
424
- var format = (_opts$imageFormat = opts.imageFormat) !== null && _opts$imageFormat !== void 0 ? _opts$imageFormat : ImageFormat.WEBP; // overrides based on highResolution flag
652
+ var format = (_opts$imageFormat = opts.imageFormat) !== null && _opts$imageFormat !== void 0 ? _opts$imageFormat : ImageFormat.WEBP;
425
653
 
654
+ // overrides based on highResolution flag
426
655
  if (highResolution) {
427
656
  if (opts.maxZoom === undefined) {
428
657
  _this.maxZoom = 14;
429
658
  }
430
-
431
659
  if (opts.tileSize === undefined) {
432
660
  _this.tileSize = 512;
433
661
  }
434
662
  }
435
-
436
- _this.resource = cesium.Resource.createIfNeeded("https://api.mapbox.com/v4/mapbox.terrain-rgb/{z}/{x}/{y}".concat(highResolution ? "@2x" : "", ".").concat(format));
437
-
663
+ _this.resource = Resource.createIfNeeded("https://api.mapbox.com/v4/mapbox.terrain-rgb/{z}/{x}/{y}".concat(highResolution ? "@2x" : "", ".").concat(format));
438
664
  if (opts.accessToken) {
439
665
  _this.resource.setQueryParameters({
440
666
  access_token: opts.accessToken
441
667
  });
442
668
  }
443
-
444
669
  return _this;
445
670
  }
446
-
447
- return MapboxTerrainResource;
671
+ return _createClass(MapboxTerrainResource);
448
672
  }(DefaultHeightmapResource);
449
673
 
450
674
  function decodeBase64(base64, enableUnicode) {
@@ -477,63 +701,53 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
477
701
  };
478
702
  }
479
703
 
480
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAndXNlIHN0cmljdCc7CgogIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQoKICBmdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7CiAgICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTsKICB9CgogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgewogICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICJ1bmRlZmluZWQiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbIkBAaXRlcmF0b3IiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsKICB9CgogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsKICAgIGlmICghbykgcmV0dXJuOwogICAgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7CiAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7CiAgICBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsKICAgIGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7CiAgICBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOwogIH0KCiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHsKICAgIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoOwoKICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTsKCiAgICByZXR1cm4gYXJyMjsKICB9CgogIGZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHsKICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOwogIH0KCiAgLy8gV2Ugc2hvdWxkIHNhdmUgdGhlc2UKICAvL2NvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMjU2LCAyNTYpOwogIC8vY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgZnVuY3Rpb24gbWFwYm94VGVycmFpblRvR3JpZChwbmcsIGludGVydmFsLCBvZmZzZXQpIHsKICAgIHZhciBfaW50ZXJ2YWwsIF9vZmZzZXQ7CgogICAgLy8gbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgb24gdGhlIEdQVSB1c2luZyBSRUdMPwogICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBHUFUgLT4gQ1BVIC0+IEdQVQogICAgdmFyIGdyaWRTaXplID0gcG5nLnNoYXBlWzBdICsgMTsKICAgIHZhciB0ZXJyYWluID0gbmV3IEZsb2F0MzJBcnJheShncmlkU2l6ZSAqIGdyaWRTaXplKTsKICAgIHZhciB0aWxlU2l6ZSA9IHBuZy5zaGFwZVswXTsKICAgIGludGVydmFsID0gKF9pbnRlcnZhbCA9IGludGVydmFsKSAhPT0gbnVsbCAmJiBfaW50ZXJ2YWwgIT09IHZvaWQgMCA/IF9pbnRlcnZhbCA6IDAuMTsKICAgIG9mZnNldCA9IChfb2Zmc2V0ID0gb2Zmc2V0KSAhPT0gbnVsbCAmJiBfb2Zmc2V0ICE9PSB2b2lkIDAgPyBfb2Zmc2V0IDogLTEwMDAwOyAvLyBkZWNvZGUgdGVycmFpbiB2YWx1ZXMKCiAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHRpbGVTaXplOyB5KyspIHsKICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aWxlU2l6ZTsgeCsrKSB7CiAgICAgICAgdmFyIHljID0geTsKICAgICAgICB2YXIgciA9IHBuZy5nZXQoeCwgeWMsIDApOwogICAgICAgIHZhciBnID0gcG5nLmdldCh4LCB5YywgMSk7CiAgICAgICAgdmFyIGIgPSBwbmcuZ2V0KHgsIHljLCAyKTsKICAgICAgICB0ZXJyYWluW3kgKiBncmlkU2l6ZSArIHhdID0gciAqIDI1NiAqIDI1NiAqIGludGVydmFsICsgZyAqIDI1Ni4wICogaW50ZXJ2YWwgKyBiICogaW50ZXJ2YWwgKyBvZmZzZXQ7CiAgICAgIH0KICAgIH0gLy8gYmFja2ZpbGwgcmlnaHQgYW5kIGJvdHRvbSBib3JkZXJzCgoKICAgIGZvciAodmFyIF94ID0gMDsgX3ggPCBncmlkU2l6ZSAtIDE7IF94KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIChncmlkU2l6ZSAtIDEpICsgX3hdID0gdGVycmFpbltncmlkU2l6ZSAqIChncmlkU2l6ZSAtIDIpICsgX3hdOwogICAgfQoKICAgIGZvciAodmFyIF95ID0gMDsgX3kgPCBncmlkU2l6ZTsgX3krKykgewogICAgICB0ZXJyYWluW2dyaWRTaXplICogX3kgKyBncmlkU2l6ZSAtIDFdID0gdGVycmFpbltncmlkU2l6ZSAqIF95ICsgZ3JpZFNpemUgLSAyXTsKICAgIH0KCiAgICByZXR1cm4gdGVycmFpbjsKICB9CgogIGZ1bmN0aW9uIGNyZWF0ZVF1YW50aXplZE1lc2hEYXRhKHRpbGUsIG1lc2gsIHRpbGVTaXplKSB7CiAgICB2YXIgeHZhbHMgPSBbXTsKICAgIHZhciB5dmFscyA9IFtdOwogICAgdmFyIGhlaWdodE1ldGVycyA9IFtdOwogICAgdmFyIG5vcnRoSW5kaWNlcyA9IFtdOwogICAgdmFyIHNvdXRoSW5kaWNlcyA9IFtdOwogICAgdmFyIGVhc3RJbmRpY2VzID0gW107CiAgICB2YXIgd2VzdEluZGljZXMgPSBbXTsKICAgIHZhciBtaW5pbXVtSGVpZ2h0ID0gSW5maW5pdHk7CiAgICB2YXIgbWF4aW11bUhlaWdodCA9IC1JbmZpbml0eTsKICAgIHZhciBzY2FsYXIgPSAzMjc2OC4wIC8gdGlsZVNpemU7CgogICAgZm9yICh2YXIgaXggPSAwOyBpeCA8IG1lc2gudmVydGljZXMubGVuZ3RoIC8gMjsgaXgrKykgewogICAgICB2YXIgdmVydGV4SXggPSBpeDsKICAgICAgdmFyIHB4ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDJdOwogICAgICB2YXIgcHkgPSBtZXNoLnZlcnRpY2VzW2l4ICogMiArIDFdOwogICAgICB2YXIgaGVpZ2h0ID0gdGlsZS50ZXJyYWluW3B5ICogKHRpbGVTaXplICsgMSkgKyBweF07CiAgICAgIGlmIChoZWlnaHQgPiBtYXhpbXVtSGVpZ2h0KSBtYXhpbXVtSGVpZ2h0ID0gaGVpZ2h0OwogICAgICBpZiAoaGVpZ2h0IDwgbWluaW11bUhlaWdodCkgbWluaW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaGVpZ2h0TWV0ZXJzLnB1c2goaGVpZ2h0KTsKICAgICAgaWYgKHB5ID09IDApIG5vcnRoSW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgaWYgKHB5ID09IHRpbGVTaXplKSBzb3V0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSAwKSB3ZXN0SW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgaWYgKHB4ID09IHRpbGVTaXplKSBlYXN0SW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgdmFyIHh2ID0gcHggKiBzY2FsYXI7CiAgICAgIHZhciB5diA9ICh0aWxlU2l6ZSAtIHB5KSAqIHNjYWxhcjsKICAgICAgeHZhbHMucHVzaCh4dik7CiAgICAgIHl2YWxzLnB1c2goeXYpOwogICAgfQoKICAgIHZhciBoZWlnaHRSYW5nZSA9IG1heGltdW1IZWlnaHQgLSBtaW5pbXVtSGVpZ2h0OwogICAgdmFyIGhlaWdodHMgPSBoZWlnaHRNZXRlcnMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgIGlmIChoZWlnaHRSYW5nZSA8IDEpIHJldHVybiAwOwogICAgICByZXR1cm4gKGQgLSBtaW5pbXVtSGVpZ2h0KSAqICgzMjc2Ny4wIC8gaGVpZ2h0UmFuZ2UpOwogICAgfSk7CiAgICB2YXIgdHJpYW5nbGVzID0gbmV3IFVpbnQxNkFycmF5KG1lc2gudHJpYW5nbGVzKTsKICAgIHZhciBxdWFudGl6ZWRWZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSggLy92ZXJ0cwogICAgW10uY29uY2F0KHh2YWxzLCB5dmFscywgX3RvQ29uc3VtYWJsZUFycmF5KGhlaWdodHMpKSk7IC8vIFNFIE5XIE5FCiAgICAvLyBORSBOVyBTRQoKICAgIHJldHVybiB7CiAgICAgIG1pbmltdW1IZWlnaHQ6IG1pbmltdW1IZWlnaHQsCiAgICAgIG1heGltdW1IZWlnaHQ6IG1heGltdW1IZWlnaHQsCiAgICAgIHF1YW50aXplZFZlcnRpY2VzOiBxdWFudGl6ZWRWZXJ0aWNlcywKICAgICAgaW5kaWNlczogdHJpYW5nbGVzLAogICAgICB3ZXN0SW5kaWNlczogd2VzdEluZGljZXMsCiAgICAgIHNvdXRoSW5kaWNlczogc291dGhJbmRpY2VzLAogICAgICBlYXN0SW5kaWNlczogZWFzdEluZGljZXMsCiAgICAgIG5vcnRoSW5kaWNlczogbm9ydGhJbmRpY2VzCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW90YShuKSB7CiAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG4pOwogICAgZm9yKHZhciBpPTA7IGk8bjsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQoKICB2YXIgaW90YV8xID0gaW90YTsKCiAgLyohCiAgICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlcgogICAqCiAgICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz4KICAgKiBAbGljZW5zZSAgTUlUCiAgICovCiAgLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZwogIC8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkKICB2YXIgaXNCdWZmZXJfMSA9IGZ1bmN0aW9uIChvYmopIHsKICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpCiAgfTsKCiAgZnVuY3Rpb24gaXNCdWZmZXIgKG9iaikgewogICAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikKICB9CgogIC8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuCiAgZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHsKICAgIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKQogIH0KCiAgdmFyIGhhc1R5cGVkQXJyYXlzICA9ICgodHlwZW9mIEZsb2F0NjRBcnJheSkgIT09ICJ1bmRlZmluZWQiKTsKCiAgZnVuY3Rpb24gY29tcGFyZTFzdChhLCBiKSB7CiAgICByZXR1cm4gYVswXSAtIGJbMF0KICB9CgogIGZ1bmN0aW9uIG9yZGVyKCkgewogICAgdmFyIHN0cmlkZSA9IHRoaXMuc3RyaWRlOwogICAgdmFyIHRlcm1zID0gbmV3IEFycmF5KHN0cmlkZS5sZW5ndGgpOwogICAgdmFyIGk7CiAgICBmb3IoaT0wOyBpPHRlcm1zLmxlbmd0aDsgKytpKSB7CiAgICAgIHRlcm1zW2ldID0gW01hdGguYWJzKHN0cmlkZVtpXSksIGldOwogICAgfQogICAgdGVybXMuc29ydChjb21wYXJlMXN0KTsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkodGVybXMubGVuZ3RoKTsKICAgIGZvcihpPTA7IGk8cmVzdWx0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IHRlcm1zW2ldWzFdOwogICAgfQogICAgcmV0dXJuIHJlc3VsdAogIH0KCiAgZnVuY3Rpb24gY29tcGlsZUNvbnN0cnVjdG9yKGR0eXBlLCBkaW1lbnNpb24pIHsKICAgIHZhciBjbGFzc05hbWUgPSBbIlZpZXciLCBkaW1lbnNpb24sICJkIiwgZHR5cGVdLmpvaW4oIiIpOwogICAgaWYoZGltZW5zaW9uIDwgMCkgewogICAgICBjbGFzc05hbWUgPSAiVmlld19OaWwiICsgZHR5cGU7CiAgICB9CiAgICB2YXIgdXNlR2V0dGVycyA9IChkdHlwZSA9PT0gImdlbmVyaWMiKTsKCiAgICBpZihkaW1lbnNpb24gPT09IC0xKSB7CiAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciB0cml2aWFsIGFycmF5cwogICAgICB2YXIgY29kZSA9CiAgICAgICAgImZ1bmN0aW9uICIrY2xhc3NOYW1lKyIoYSl7dGhpcy5kYXRhPWE7fTtcCnZhciBwcm90bz0iK2NsYXNzTmFtZSsiLnByb3RvdHlwZTtcCnByb3RvLmR0eXBlPSciK2R0eXBlKyInO1wKcHJvdG8uaW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gLTF9O1wKcHJvdG8uc2l6ZT0wO1wKcHJvdG8uZGltZW5zaW9uPS0xO1wKcHJvdG8uc2hhcGU9cHJvdG8uc3RyaWRlPXByb3RvLm9yZGVyPVtdO1wKcHJvdG8ubG89cHJvdG8uaGk9cHJvdG8udHJhbnNwb3NlPXByb3RvLnN0ZXA9XApmdW5jdGlvbigpe3JldHVybiBuZXcgIitjbGFzc05hbWUrIih0aGlzLmRhdGEpO307XApwcm90by5nZXQ9cHJvdG8uc2V0PWZ1bmN0aW9uKCl7fTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIrY2xhc3NOYW1lKyIoYSl7cmV0dXJuIG5ldyAiK2NsYXNzTmFtZSsiKGEpO30iOwogICAgICB2YXIgcHJvY2VkdXJlID0gbmV3IEZ1bmN0aW9uKGNvZGUpOwogICAgICByZXR1cm4gcHJvY2VkdXJlKCkKICAgIH0gZWxzZSBpZihkaW1lbnNpb24gPT09IDApIHsKICAgICAgLy9TcGVjaWFsIGNhc2UgZm9yIDBkIGFycmF5cwogICAgICB2YXIgY29kZSA9CiAgICAgICAgImZ1bmN0aW9uICIrY2xhc3NOYW1lKyIoYSxkKSB7XAp0aGlzLmRhdGEgPSBhO1wKdGhpcy5vZmZzZXQgPSBkXAp9O1wKdmFyIHByb3RvPSIrY2xhc3NOYW1lKyIucHJvdG90eXBlO1wKcHJvdG8uZHR5cGU9JyIrZHR5cGUrIic7XApwcm90by5pbmRleD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9mZnNldH07XApwcm90by5kaW1lbnNpb249MDtcCnByb3RvLnNpemU9MTtcCnByb3RvLnNoYXBlPVwKcHJvdG8uc3RyaWRlPVwKcHJvdG8ub3JkZXI9W107XApwcm90by5sbz1cCnByb3RvLmhpPVwKcHJvdG8udHJhbnNwb3NlPVwKcHJvdG8uc3RlcD1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX2NvcHkoKSB7XApyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIodGhpcy5kYXRhLHRoaXMub2Zmc2V0KVwKfTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24gIitjbGFzc05hbWUrIl9waWNrKCl7XApyZXR1cm4gVHJpdmlhbEFycmF5KHRoaXMuZGF0YSk7XAp9O1wKcHJvdG8udmFsdWVPZj1wcm90by5nZXQ9ZnVuY3Rpb24gIitjbGFzc05hbWUrIl9nZXQoKXtcCnJldHVybiAiKyh1c2VHZXR0ZXJzID8gInRoaXMuZGF0YS5nZXQodGhpcy5vZmZzZXQpIiA6ICJ0aGlzLmRhdGFbdGhpcy5vZmZzZXRdIikrCiAgIn07XApwcm90by5zZXQ9ZnVuY3Rpb24gIitjbGFzc05hbWUrIl9zZXQodil7XApyZXR1cm4gIisodXNlR2V0dGVycyA/ICJ0aGlzLmRhdGEuc2V0KHRoaXMub2Zmc2V0LHYpIiA6ICJ0aGlzLmRhdGFbdGhpcy5vZmZzZXRdPXYiKSsiXAp9O1wKcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdF8iK2NsYXNzTmFtZSsiKGEsYixjLGQpe3JldHVybiBuZXcgIitjbGFzc05hbWUrIihhLGQpfSI7CiAgICAgIHZhciBwcm9jZWR1cmUgPSBuZXcgRnVuY3Rpb24oIlRyaXZpYWxBcnJheSIsIGNvZGUpOwogICAgICByZXR1cm4gcHJvY2VkdXJlKENBQ0hFRF9DT05TVFJVQ1RPUlNbZHR5cGVdWzBdKQogICAgfQoKICAgIHZhciBjb2RlID0gWyIndXNlIHN0cmljdCciXTsKCiAgICAvL0NyZWF0ZSBjb25zdHJ1Y3RvciBmb3IgdmlldwogICAgdmFyIGluZGljZXMgPSBpb3RhXzEoZGltZW5zaW9uKTsKICAgIHZhciBhcmdzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gImkiK2kgfSk7CiAgICB2YXIgaW5kZXhfc3RyID0gInRoaXMub2Zmc2V0KyIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgICByZXR1cm4gInRoaXMuc3RyaWRlWyIgKyBpICsgIl0qaSIgKyBpCiAgICAgICAgfSkuam9pbigiKyIpOwogICAgdmFyIHNoYXBlQXJnID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAiYiIraQogICAgICB9KS5qb2luKCIsIik7CiAgICB2YXIgc3RyaWRlQXJnID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAiYyIraQogICAgICB9KS5qb2luKCIsIik7CiAgICBjb2RlLnB1c2goCiAgICAgICJmdW5jdGlvbiAiK2NsYXNzTmFtZSsiKGEsIiArIHNoYXBlQXJnICsgIiwiICsgc3RyaWRlQXJnICsgIixkKXt0aGlzLmRhdGE9YSIsCiAgICAgICAgInRoaXMuc2hhcGU9WyIgKyBzaGFwZUFyZyArICJdIiwKICAgICAgICAidGhpcy5zdHJpZGU9WyIgKyBzdHJpZGVBcmcgKyAiXSIsCiAgICAgICAgInRoaXMub2Zmc2V0PWR8MH0iLAogICAgICAidmFyIHByb3RvPSIrY2xhc3NOYW1lKyIucHJvdG90eXBlIiwKICAgICAgInByb3RvLmR0eXBlPSciK2R0eXBlKyInIiwKICAgICAgInByb3RvLmRpbWVuc2lvbj0iK2RpbWVuc2lvbik7CgogICAgLy92aWV3LnNpemU6CiAgICBjb2RlLnB1c2goIk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywnc2l6ZScse2dldDpmdW5jdGlvbiAiK2NsYXNzTmFtZSsiX3NpemUoKXtcCnJldHVybiAiK2luZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuICJ0aGlzLnNoYXBlWyIraSsiXSIgfSkuam9pbigiKiIpLAogICJ9fSkiKTsKCiAgICAvL3ZpZXcub3JkZXI6CiAgICBpZihkaW1lbnNpb24gPT09IDEpIHsKICAgICAgY29kZS5wdXNoKCJwcm90by5vcmRlcj1bMF0iKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvZGUucHVzaCgiT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCdvcmRlcicse2dldDoiKTsKICAgICAgaWYoZGltZW5zaW9uIDwgNCkgewogICAgICAgIGNvZGUucHVzaCgiZnVuY3Rpb24gIitjbGFzc05hbWUrIl9vcmRlcigpeyIpOwogICAgICAgIGlmKGRpbWVuc2lvbiA9PT0gMikgewogICAgICAgICAgY29kZS5wdXNoKCJyZXR1cm4gKE1hdGguYWJzKHRoaXMuc3RyaWRlWzBdKT5NYXRoLmFicyh0aGlzLnN0cmlkZVsxXSkpP1sxLDBdOlswLDFdfX0pIik7CiAgICAgICAgfSBlbHNlIGlmKGRpbWVuc2lvbiA9PT0gMykgewogICAgICAgICAgY29kZS5wdXNoKAogICJ2YXIgczA9TWF0aC5hYnModGhpcy5zdHJpZGVbMF0pLHMxPU1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSxzMj1NYXRoLmFicyh0aGlzLnN0cmlkZVsyXSk7XAppZihzMD5zMSl7XAppZihzMT5zMil7XApyZXR1cm4gWzIsMSwwXTtcCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMSwyLDBdO1wKfWVsc2V7XApyZXR1cm4gWzEsMCwyXTtcCn1cCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMiwwLDFdO1wKfWVsc2UgaWYoczI+czEpe1wKcmV0dXJuIFswLDEsMl07XAp9ZWxzZXtcCnJldHVybiBbMCwyLDFdO1wKfX19KSIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RlLnB1c2goIk9SREVSfSkiKTsKICAgICAgfQogICAgfQoKICAgIC8vdmlldy5zZXQoaTAsIC4uLiwgdik6CiAgICBjb2RlLnB1c2goCiAgInByb3RvLnNldD1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX3NldCgiK2FyZ3Muam9pbigiLCIpKyIsdil7Iik7CiAgICBpZih1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5zZXQoIitpbmRleF9zdHIrIix2KX0iKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YVsiK2luZGV4X3N0cisiXT12fSIpOwogICAgfQoKICAgIC8vdmlldy5nZXQoaTAsIC4uLik6CiAgICBjb2RlLnB1c2goInByb3RvLmdldD1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX2dldCgiK2FyZ3Muam9pbigiLCIpKyIpeyIpOwogICAgaWYodXNlR2V0dGVycykgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGEuZ2V0KCIraW5kZXhfc3RyKyIpfSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhWyIraW5kZXhfc3RyKyJdfSIpOwogICAgfQoKICAgIC8vdmlldy5pbmRleDoKICAgIGNvZGUucHVzaCgKICAgICAgInByb3RvLmluZGV4PWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfaW5kZXgoIiwgYXJncy5qb2luKCksICIpe3JldHVybiAiK2luZGV4X3N0cisifSIpOwoKICAgIC8vdmlldy5oaSgpOgogICAgY29kZS5wdXNoKCJwcm90by5oaT1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX2hpKCIrYXJncy5qb2luKCIsIikrIil7cmV0dXJuIG5ldyAiK2NsYXNzTmFtZSsiKHRoaXMuZGF0YSwiKwogICAgICBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuIFsiKHR5cGVvZiBpIixpLCIhPT0nbnVtYmVyJ3x8aSIsaSwiPDApP3RoaXMuc2hhcGVbIiwgaSwgIl06aSIsIGksInwwIl0uam9pbigiIikKICAgICAgfSkuam9pbigiLCIpKyIsIisKICAgICAgaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAidGhpcy5zdHJpZGVbIitpICsgIl0iCiAgICAgIH0pLmpvaW4oIiwiKSsiLHRoaXMub2Zmc2V0KX0iKTsKCiAgICAvL3ZpZXcubG8oKToKICAgIHZhciBhX3ZhcnMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiAiYSIraSsiPXRoaXMuc2hhcGVbIitpKyJdIiB9KTsKICAgIHZhciBjX3ZhcnMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiAiYyIraSsiPXRoaXMuc3RyaWRlWyIraSsiXSIgfSk7CiAgICBjb2RlLnB1c2goInByb3RvLmxvPWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfbG8oIithcmdzLmpvaW4oIiwiKSsiKXt2YXIgYj10aGlzLm9mZnNldCxkPTAsIithX3ZhcnMuam9pbigiLCIpKyIsIitjX3ZhcnMuam9pbigiLCIpKTsKICAgIGZvcih2YXIgaT0wOyBpPGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgKICAiaWYodHlwZW9mIGkiK2krIj09PSdudW1iZXInJiZpIitpKyI+PTApe1wKZD1pIitpKyJ8MDtcCmIrPWMiK2krIipkO1wKYSIraSsiLT1kfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIodGhpcy5kYXRhLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gImEiK2kKICAgICAgfSkuam9pbigiLCIpKyIsIisKICAgICAgaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAiYyIraQogICAgICB9KS5qb2luKCIsIikrIixiKX0iKTsKCiAgICAvL3ZpZXcuc3RlcCgpOgogICAgY29kZS5wdXNoKCJwcm90by5zdGVwPWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfc3RlcCgiK2FyZ3Muam9pbigiLCIpKyIpe3ZhciAiKwogICAgICBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJhIitpKyI9dGhpcy5zaGFwZVsiK2krIl0iCiAgICAgIH0pLmpvaW4oIiwiKSsiLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gImIiK2krIj10aGlzLnN0cmlkZVsiK2krIl0iCiAgICAgIH0pLmpvaW4oIiwiKSsiLGM9dGhpcy5vZmZzZXQsZD0wLGNlaWw9TWF0aC5jZWlsIik7CiAgICBmb3IodmFyIGk9MDsgaTxkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goCiAgImlmKHR5cGVvZiBpIitpKyI9PT0nbnVtYmVyJyl7XApkPWkiK2krInwwO1wKaWYoZDwwKXtcCmMrPWIiK2krIiooYSIraSsiLTEpO1wKYSIraSsiPWNlaWwoLWEiK2krIi9kKVwKfWVsc2V7XAphIitpKyI9Y2VpbChhIitpKyIvZClcCn1cCmIiK2krIio9ZFwKfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIodGhpcy5kYXRhLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gImEiICsgaQogICAgICB9KS5qb2luKCIsIikrIiwiKwogICAgICBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJiIiArIGkKICAgICAgfSkuam9pbigiLCIpKyIsYyl9Iik7CgogICAgLy92aWV3LnRyYW5zcG9zZSgpOgogICAgdmFyIHRTaGFwZSA9IG5ldyBBcnJheShkaW1lbnNpb24pOwogICAgdmFyIHRTdHJpZGUgPSBuZXcgQXJyYXkoZGltZW5zaW9uKTsKICAgIGZvcih2YXIgaT0wOyBpPGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIHRTaGFwZVtpXSA9ICJhW2kiK2krIl0iOwogICAgICB0U3RyaWRlW2ldID0gImJbaSIraSsiXSI7CiAgICB9CiAgICBjb2RlLnB1c2goInByb3RvLnRyYW5zcG9zZT1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX3RyYW5zcG9zZSgiK2FyZ3MrIil7IisKICAgICAgYXJncy5tYXAoZnVuY3Rpb24obixpZHgpIHsgcmV0dXJuIG4gKyAiPSgiICsgbiArICI9PT11bmRlZmluZWQ/IiArIGlkeCArICI6IiArIG4gKyAifDApIn0pLmpvaW4oIjsiKSwKICAgICAgInZhciBhPXRoaXMuc2hhcGUsYj10aGlzLnN0cmlkZTtyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIodGhpcy5kYXRhLCIrdFNoYXBlLmpvaW4oIiwiKSsiLCIrdFN0cmlkZS5qb2luKCIsIikrIix0aGlzLm9mZnNldCl9Iik7CgogICAgLy92aWV3LnBpY2soKToKICAgIGNvZGUucHVzaCgicHJvdG8ucGljaz1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX3BpY2soIithcmdzKyIpe3ZhciBhPVtdLGI9W10sYz10aGlzLm9mZnNldCIpOwogICAgZm9yKHZhciBpPTA7IGk8ZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKCJpZih0eXBlb2YgaSIraSsiPT09J251bWJlcicmJmkiK2krIj49MCl7Yz0oYyt0aGlzLnN0cmlkZVsiK2krIl0qaSIraSsiKXwwfWVsc2V7YS5wdXNoKHRoaXMuc2hhcGVbIitpKyJdKTtiLnB1c2godGhpcy5zdHJpZGVbIitpKyJdKX0iKTsKICAgIH0KICAgIGNvZGUucHVzaCgidmFyIGN0b3I9Q1RPUl9MSVNUW2EubGVuZ3RoKzFdO3JldHVybiBjdG9yKHRoaXMuZGF0YSxhLGIsYyl9Iik7CgogICAgLy9BZGQgcmV0dXJuIHN0YXRlbWVudAogICAgY29kZS5wdXNoKCJyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIrY2xhc3NOYW1lKyIoZGF0YSxzaGFwZSxzdHJpZGUsb2Zmc2V0KXtyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIoZGF0YSwiKwogICAgICBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJzaGFwZVsiK2krIl0iCiAgICAgIH0pLmpvaW4oIiwiKSsiLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gInN0cmlkZVsiK2krIl0iCiAgICAgIH0pLmpvaW4oIiwiKSsiLG9mZnNldCl9Iik7CgogICAgLy9Db21waWxlIHByb2NlZHVyZQogICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiQ1RPUl9MSVNUIiwgIk9SREVSIiwgY29kZS5qb2luKCJcbiIpKTsKICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV0sIG9yZGVyKQogIH0KCiAgZnVuY3Rpb24gYXJyYXlEVHlwZShkYXRhKSB7CiAgICBpZihpc0J1ZmZlcl8xKGRhdGEpKSB7CiAgICAgIHJldHVybiAiYnVmZmVyIgogICAgfQogICAgaWYoaGFzVHlwZWRBcnJheXMpIHsKICAgICAgc3dpdGNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSkgewogICAgICAgIGNhc2UgIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImZsb2F0NjQiCiAgICAgICAgY2FzZSAiW29iamVjdCBGbG9hdDMyQXJyYXldIjoKICAgICAgICAgIHJldHVybiAiZmxvYXQzMiIKICAgICAgICBjYXNlICJbb2JqZWN0IEludDhBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQ4IgogICAgICAgIGNhc2UgIltvYmplY3QgSW50MTZBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQxNiIKICAgICAgICBjYXNlICJbb2JqZWN0IEludDMyQXJyYXldIjoKICAgICAgICAgIHJldHVybiAiaW50MzIiCiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQ4IgogICAgICAgIGNhc2UgIltvYmplY3QgVWludDE2QXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDE2IgogICAgICAgIGNhc2UgIltvYmplY3QgVWludDMyQXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDMyIgogICAgICAgIGNhc2UgIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDhfY2xhbXBlZCIKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ0ludDY0QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiYmlnaW50NjQiCiAgICAgICAgY2FzZSAiW29iamVjdCBCaWdVaW50NjRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJiaWd1aW50NjQiCiAgICAgIH0KICAgIH0KICAgIGlmKEFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgcmV0dXJuICJhcnJheSIKICAgIH0KICAgIHJldHVybiAiZ2VuZXJpYyIKICB9CgogIHZhciBDQUNIRURfQ09OU1RSVUNUT1JTID0gewogICAgImZsb2F0MzIiOltdLAogICAgImZsb2F0NjQiOltdLAogICAgImludDgiOltdLAogICAgImludDE2IjpbXSwKICAgICJpbnQzMiI6W10sCiAgICAidWludDgiOltdLAogICAgInVpbnQxNiI6W10sCiAgICAidWludDMyIjpbXSwKICAgICJhcnJheSI6W10sCiAgICAidWludDhfY2xhbXBlZCI6W10sCiAgICAiYmlnaW50NjQiOiBbXSwKICAgICJiaWd1aW50NjQiOiBbXSwKICAgICJidWZmZXIiOltdLAogICAgImdlbmVyaWMiOltdCiAgfQoKICA7CiAgZnVuY3Rpb24gd3JhcHBlZE5EQXJyYXlDdG9yKGRhdGEsIHNoYXBlLCBzdHJpZGUsIG9mZnNldCkgewogICAgaWYoZGF0YSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHZhciBjdG9yID0gQ0FDSEVEX0NPTlNUUlVDVE9SUy5hcnJheVswXTsKICAgICAgcmV0dXJuIGN0b3IoW10pCiAgICB9IGVsc2UgaWYodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgIGRhdGEgPSBbZGF0YV07CiAgICB9CiAgICBpZihzaGFwZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHNoYXBlID0gWyBkYXRhLmxlbmd0aCBdOwogICAgfQogICAgdmFyIGQgPSBzaGFwZS5sZW5ndGg7CiAgICBpZihzdHJpZGUgPT09IHVuZGVmaW5lZCkgewogICAgICBzdHJpZGUgPSBuZXcgQXJyYXkoZCk7CiAgICAgIGZvcih2YXIgaT1kLTEsIHN6PTE7IGk+PTA7IC0taSkgewogICAgICAgIHN0cmlkZVtpXSA9IHN6OwogICAgICAgIHN6ICo9IHNoYXBlW2ldOwogICAgICB9CiAgICB9CiAgICBpZihvZmZzZXQgPT09IHVuZGVmaW5lZCkgewogICAgICBvZmZzZXQgPSAwOwogICAgICBmb3IodmFyIGk9MDsgaTxkOyArK2kpIHsKICAgICAgICBpZihzdHJpZGVbaV0gPCAwKSB7CiAgICAgICAgICBvZmZzZXQgLT0gKHNoYXBlW2ldLTEpKnN0cmlkZVtpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBkdHlwZSA9IGFycmF5RFR5cGUoZGF0YSk7CiAgICB2YXIgY3Rvcl9saXN0ID0gQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV07CiAgICB3aGlsZShjdG9yX2xpc3QubGVuZ3RoIDw9IGQrMSkgewogICAgICBjdG9yX2xpc3QucHVzaChjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGN0b3JfbGlzdC5sZW5ndGgtMSkpOwogICAgfQogICAgdmFyIGN0b3IgPSBjdG9yX2xpc3RbZCsxXTsKICAgIHJldHVybiBjdG9yKGRhdGEsIHNoYXBlLCBzdHJpZGUsIG9mZnNldCkKICB9CgogIHZhciBuZGFycmF5ID0gd3JhcHBlZE5EQXJyYXlDdG9yOwoKICBjbGFzcyBNYXJ0aW5pIHsKICAgIGNvbnN0cnVjdG9yKGdyaWRTaXplID0gMjU3KSB7CiAgICAgIHRoaXMuZ3JpZFNpemUgPSBncmlkU2l6ZTsKICAgICAgY29uc3QgdGlsZVNpemUgPSBncmlkU2l6ZSAtIDE7CiAgICAgIGlmICh0aWxlU2l6ZSAmIHRpbGVTaXplIC0gMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBncmlkIHNpemUgdG8gYmUgMl5uKzEsIGdvdCAke2dyaWRTaXplfS5gKTsKICAgICAgdGhpcy5udW1UcmlhbmdsZXMgPSB0aWxlU2l6ZSAqIHRpbGVTaXplICogMiAtIDI7CiAgICAgIHRoaXMubnVtUGFyZW50VHJpYW5nbGVzID0gdGhpcy5udW1UcmlhbmdsZXMgLSB0aWxlU2l6ZSAqIHRpbGVTaXplOwogICAgICB0aGlzLmluZGljZXMgPSBuZXcgVWludDMyQXJyYXkodGhpcy5ncmlkU2l6ZSAqIHRoaXMuZ3JpZFNpemUpOyAvLyBjb29yZGluYXRlcyBmb3IgYWxsIHBvc3NpYmxlIHRyaWFuZ2xlcyBpbiBhbiBSVElOIHRpbGUKCiAgICAgIHRoaXMuY29vcmRzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubnVtVHJpYW5nbGVzICogNCk7IC8vIGdldCB0cmlhbmdsZSBjb29yZGluYXRlcyBmcm9tIGl0cyBpbmRleCBpbiBhbiBpbXBsaWNpdCBiaW5hcnkgdHJlZQoKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bVRyaWFuZ2xlczsgaSsrKSB7CiAgICAgICAgbGV0IGlkID0gaSArIDI7CiAgICAgICAgbGV0IGF4ID0gMCwKICAgICAgICAgICAgYXkgPSAwLAogICAgICAgICAgICBieCA9IDAsCiAgICAgICAgICAgIGJ5ID0gMCwKICAgICAgICAgICAgY3ggPSAwLAogICAgICAgICAgICBjeSA9IDA7CgogICAgICAgIGlmIChpZCAmIDEpIHsKICAgICAgICAgIGJ4ID0gYnkgPSBjeCA9IHRpbGVTaXplOyAvLyBib3R0b20tbGVmdCB0cmlhbmdsZQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBheCA9IGF5ID0gY3kgPSB0aWxlU2l6ZTsgLy8gdG9wLXJpZ2h0IHRyaWFuZ2xlCiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoKGlkID4+PSAxKSA+IDEpIHsKICAgICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CgogICAgICAgICAgaWYgKGlkICYgMSkgewogICAgICAgICAgICAvLyBsZWZ0IGhhbGYKICAgICAgICAgICAgYnggPSBheDsKICAgICAgICAgICAgYnkgPSBheTsKICAgICAgICAgICAgYXggPSBjeDsKICAgICAgICAgICAgYXkgPSBjeTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIHJpZ2h0IGhhbGYKICAgICAgICAgICAgYXggPSBieDsKICAgICAgICAgICAgYXkgPSBieTsKICAgICAgICAgICAgYnggPSBjeDsKICAgICAgICAgICAgYnkgPSBjeTsKICAgICAgICAgIH0KCiAgICAgICAgICBjeCA9IG14OwogICAgICAgICAgY3kgPSBteTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMF0gPSBheDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMV0gPSBheTsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMl0gPSBieDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgM10gPSBieTsKICAgICAgfQogICAgfQoKICAgIGNyZWF0ZVRpbGUodGVycmFpbikgewogICAgICByZXR1cm4gbmV3IFRpbGUodGVycmFpbiwgdGhpcyk7CiAgICB9CgogIH0KCiAgY2xhc3MgVGlsZSB7CiAgICBjb25zdHJ1Y3Rvcih0ZXJyYWluLCBtYXJ0aW5pKSB7CiAgICAgIGNvbnN0IHNpemUgPSBtYXJ0aW5pLmdyaWRTaXplOwogICAgICBpZiAodGVycmFpbi5sZW5ndGggIT09IHNpemUgKiBzaXplKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRlcnJhaW4gZGF0YSBvZiBsZW5ndGggJHtzaXplICogc2l6ZX0gKCR7c2l6ZX0geCAke3NpemV9KSwgZ290ICR7dGVycmFpbi5sZW5ndGh9LmApOwogICAgICB0aGlzLnRlcnJhaW4gPSB0ZXJyYWluOwogICAgICB0aGlzLm1hcnRpbmkgPSBtYXJ0aW5pOwogICAgICB0aGlzLmVycm9ycyA9IG5ldyBGbG9hdDMyQXJyYXkodGVycmFpbi5sZW5ndGgpOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQoKICAgIHVwZGF0ZSgpIHsKICAgICAgY29uc3QgewogICAgICAgIG51bVRyaWFuZ2xlcywKICAgICAgICBudW1QYXJlbnRUcmlhbmdsZXMsCiAgICAgICAgY29vcmRzLAogICAgICAgIGdyaWRTaXplOiBzaXplCiAgICAgIH0gPSB0aGlzLm1hcnRpbmk7CiAgICAgIGNvbnN0IHsKICAgICAgICB0ZXJyYWluLAogICAgICAgIGVycm9ycwogICAgICB9ID0gdGhpczsgLy8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IGxldmVsCgogICAgICBmb3IgKGxldCBpID0gbnVtVHJpYW5nbGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBjb25zdCBrID0gaSAqIDQ7CiAgICAgICAgY29uc3QgYXggPSBjb29yZHNbayArIDBdOwogICAgICAgIGNvbnN0IGF5ID0gY29vcmRzW2sgKyAxXTsKICAgICAgICBjb25zdCBieCA9IGNvb3Jkc1trICsgMl07CiAgICAgICAgY29uc3QgYnkgPSBjb29yZHNbayArIDNdOwogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGN4ID0gbXggKyBteSAtIGF5OwogICAgICAgIGNvbnN0IGN5ID0gbXkgKyBheCAtIG14OyAvLyBjYWxjdWxhdGUgZXJyb3IgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbG9uZyBlZGdlIG9mIHRoZSB0cmlhbmdsZQoKICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRIZWlnaHQgPSAodGVycmFpbltheSAqIHNpemUgKyBheF0gKyB0ZXJyYWluW2J5ICogc2l6ZSArIGJ4XSkgLyAyOwogICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gbXkgKiBzaXplICsgbXg7CiAgICAgICAgY29uc3QgbWlkZGxlRXJyb3IgPSBNYXRoLmFicyhpbnRlcnBvbGF0ZWRIZWlnaHQgLSB0ZXJyYWluW21pZGRsZUluZGV4XSk7CiAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIG1pZGRsZUVycm9yKTsKCiAgICAgICAgaWYgKGkgPCBudW1QYXJlbnRUcmlhbmdsZXMpIHsKICAgICAgICAgIC8vIGJpZ2dlciB0cmlhbmdsZXM7IGFjY3VtdWxhdGUgZXJyb3Igd2l0aCBjaGlsZHJlbgogICAgICAgICAgY29uc3QgbGVmdENoaWxkSW5kZXggPSAoYXkgKyBjeSA+PiAxKSAqIHNpemUgKyAoYXggKyBjeCA+PiAxKTsKICAgICAgICAgIGNvbnN0IHJpZ2h0Q2hpbGRJbmRleCA9IChieSArIGN5ID4+IDEpICogc2l6ZSArIChieCArIGN4ID4+IDEpOwogICAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIGVycm9yc1tsZWZ0Q2hpbGRJbmRleF0sIGVycm9yc1tyaWdodENoaWxkSW5kZXhdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBnZXRNZXNoKG1heEVycm9yID0gMCwgbWF4TGVuZ3RoID0gbnVsbCkgewogICAgICBjb25zdCB7CiAgICAgICAgZ3JpZFNpemU6IHNpemUsCiAgICAgICAgaW5kaWNlcwogICAgICB9ID0gdGhpcy5tYXJ0aW5pOwogICAgICBjb25zdCB7CiAgICAgICAgZXJyb3JzCiAgICAgIH0gPSB0aGlzOwogICAgICBsZXQgbnVtVmVydGljZXMgPSAwOwogICAgICBsZXQgbnVtVHJpYW5nbGVzID0gMDsKICAgICAgY29uc3QgbWF4ID0gc2l6ZSAtIDE7IC8vIFRoZSBtYXhMZW5ndGggcGFyYW1ldGVyIHdpbGwgY2F1c2UgdHJpYW5nbGVzIHRvIGJlIGdlbmVyYXRlZCB1bnRpbCB0aGUgbGVncyBhcmUgYmVsb3cgdGhpcyBsZW5ndGgKICAgICAgLy8gSXQgaXMgbWVhbnQgdG8gc3VwcG9ydCBjYXNlcyB3aGVyZSBhIGNlcnRhaW4gbWVzaCBkZW5zaXR5IGlzIHJlcXVpcmVkIHRvIGRvIHNwaGVyaWNhbCBtYXRoIG9uIGRpZ2l0YWwgZ2xvYmVzCgogICAgICBjb25zdCBtYXhTY2FsZSA9IG1heExlbmd0aCB8fCBzaXplOyAvLyB1c2UgYW4gaW5kZXggZ3JpZCB0byBrZWVwIHRyYWNrIG9mIHZlcnRpY2VzIHRoYXQgd2VyZSBhbHJlYWR5IHVzZWQgdG8gYXZvaWQgZHVwbGljYXRpb24KCiAgICAgIGluZGljZXMuZmlsbCgwKTsgLy8gcmV0cmlldmUgbWVzaCBpbiB0d28gc3RhZ2VzIHRoYXQgYm90aCB0cmF2ZXJzZSB0aGUgZXJyb3IgbWFwOgogICAgICAvLyAtIGNvdW50RWxlbWVudHM6IGZpbmQgdXNlZCB2ZXJ0aWNlcyAoYW5kIGFzc2lnbiBlYWNoIGFuIGluZGV4KSwgYW5kIGNvdW50IHRyaWFuZ2xlcyAoZm9yIG1pbmltdW0gYWxsb2NhdGlvbikKICAgICAgLy8gLSBwcm9jZXNzVHJpYW5nbGU6IGZpbGwgdGhlIGFsbG9jYXRlZCB2ZXJ0aWNlcyAmIHRyaWFuZ2xlcyB0eXBlZCBhcnJheXMKCiAgICAgIGZ1bmN0aW9uIGNvdW50RWxlbWVudHMoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CgogICAgICAgIGlmIChsZWdMZW5ndGggPiAxICYmIGVycm9yc1tteSAqIHNpemUgKyBteF0gPiBtYXhFcnJvciB8fCBsZWdMZW5ndGggPiBtYXhTY2FsZSkgewogICAgICAgICAgY291bnRFbGVtZW50cyhjeCwgY3ksIGF4LCBheSwgbXgsIG15KTsKICAgICAgICAgIGNvdW50RWxlbWVudHMoYngsIGJ5LCBjeCwgY3ksIG14LCBteSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluZGljZXNbYXkgKiBzaXplICsgYXhdID0gaW5kaWNlc1theSAqIHNpemUgKyBheF0gfHwgKytudW1WZXJ0aWNlczsKICAgICAgICAgIGluZGljZXNbYnkgKiBzaXplICsgYnhdID0gaW5kaWNlc1tieSAqIHNpemUgKyBieF0gfHwgKytudW1WZXJ0aWNlczsKICAgICAgICAgIGluZGljZXNbY3kgKiBzaXplICsgY3hdID0gaW5kaWNlc1tjeSAqIHNpemUgKyBjeF0gfHwgKytudW1WZXJ0aWNlczsKICAgICAgICAgIG51bVRyaWFuZ2xlcysrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgY291bnRFbGVtZW50cygwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgY291bnRFbGVtZW50cyhtYXgsIG1heCwgMCwgMCwgMCwgbWF4KTsKICAgICAgY29uc3QgdmVydGljZXMgPSBuZXcgVWludDE2QXJyYXkobnVtVmVydGljZXMgKiAyKTsKICAgICAgY29uc3QgdHJpYW5nbGVzID0gbmV3IFVpbnQzMkFycmF5KG51bVRyaWFuZ2xlcyAqIDMpOwogICAgICBsZXQgdHJpSW5kZXggPSAwOwoKICAgICAgZnVuY3Rpb24gcHJvY2Vzc1RyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3kpIHsKICAgICAgICBjb25zdCBteCA9IGF4ICsgYnggPj4gMTsKICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICBjb25zdCBsZWdMZW5ndGggPSBNYXRoLmFicyhheCAtIGN4KSArIE1hdGguYWJzKGF5IC0gY3kpOwoKICAgICAgICBpZiAobGVnTGVuZ3RoID4gMSAmJiBlcnJvcnNbbXkgKiBzaXplICsgbXhdID4gbWF4RXJyb3IgfHwgbGVnTGVuZ3RoID4gbWF4U2NhbGUpIHsKICAgICAgICAgIC8vIHRyaWFuZ2xlIGRvZXNuJ3QgYXBwcm94aW1hdGUgdGhlIHN1cmZhY2Ugd2VsbCBlbm91Z2g7IGRyaWxsIGRvd24gZnVydGhlcgogICAgICAgICAgcHJvY2Vzc1RyaWFuZ2xlKGN4LCBjeSwgYXgsIGF5LCBteCwgbXkpOwogICAgICAgICAgcHJvY2Vzc1RyaWFuZ2xlKGJ4LCBieSwgY3gsIGN5LCBteCwgbXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBhZGQgYSB0cmlhbmdsZQogICAgICAgICAgY29uc3QgYSA9IGluZGljZXNbYXkgKiBzaXplICsgYXhdIC0gMTsKICAgICAgICAgIGNvbnN0IGIgPSBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSAtIDE7CiAgICAgICAgICBjb25zdCBjID0gaW5kaWNlc1tjeSAqIHNpemUgKyBjeF0gLSAxOwogICAgICAgICAgdmVydGljZXNbMiAqIGFdID0gYXg7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYSArIDFdID0gYXk7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYl0gPSBieDsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBiICsgMV0gPSBieTsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBjXSA9IGN4OwogICAgICAgICAgdmVydGljZXNbMiAqIGMgKyAxXSA9IGN5OwogICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYTsKICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGI7CiAgICAgICAgICB0cmlhbmdsZXNbdHJpSW5kZXgrK10gPSBjOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcHJvY2Vzc1RyaWFuZ2xlKDAsIDAsIG1heCwgbWF4LCBtYXgsIDApOwogICAgICBwcm9jZXNzVHJpYW5nbGUobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVydGljZXMsCiAgICAgICAgdHJpYW5nbGVzCiAgICAgIH07CiAgICB9CgogIH0KCiAgZnVuY3Rpb24gY3JlYXRlQ29tbW9uanNNb2R1bGUoZm4pIHsKICAgIHZhciBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07CiAgCXJldHVybiBmbihtb2R1bGUsIG1vZHVsZS5leHBvcnRzKSwgbW9kdWxlLmV4cG9ydHM7CiAgfQoKICAvKioKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KICAgKgogICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICAgKi8KCiAgY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewogIHZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7CgogICAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTsKICAgIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTsKICAgIHZhciB1bmRlZmluZWQkMTsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuCiAgICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgPyBTeW1ib2wgOiB7fTsKICAgIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgIkBAaXRlcmF0b3IiOwogICAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgIkBAYXN5bmNJdGVyYXRvciI7CiAgICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8ICJAQHRvU3RyaW5nVGFnIjsKCiAgICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgewogICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgcmV0dXJuIG9ialtrZXldOwogICAgfQogICAgdHJ5IHsKICAgICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy4KICAgICAgZGVmaW5lKHt9LCAiIik7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgZGVmaW5lID0gZnVuY3Rpb24ob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkgewogICAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci4KICAgICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7CiAgICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7CiAgICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pOwoKICAgICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LAogICAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuCiAgICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTsKCiAgICAgIHJldHVybiBnZW5lcmF0b3I7CiAgICB9CiAgICBleHBvcnRzLndyYXAgPSB3cmFwOwoKICAgIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvbgogICAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkCiAgICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmUKICAgIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2UKICAgIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWQKICAgIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmcKICAgIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlCiAgICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGUKICAgIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2gKICAgIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS4KICAgIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykgewogICAgICB0cnkgewogICAgICAgIHJldHVybiB7IHR5cGU6ICJub3JtYWwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIHJldHVybiB7IHR5cGU6ICJ0aHJvdyIsIGFyZzogZXJyIH07CiAgICAgIH0KICAgIH0KCiAgICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9ICJzdXNwZW5kZWRTdGFydCI7CiAgICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9ICJzdXNwZW5kZWRZaWVsZCI7CiAgICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSAiZXhlY3V0aW5nIjsKICAgIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9ICJjb21wbGV0ZWQiOwoKICAgIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKICAgIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC4KICAgIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307CgogICAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kCiAgICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3IKICAgIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyCiAgICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLgogICAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge30KICAgIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge30KCiAgICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0CiAgICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LgogICAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307CiAgICBkZWZpbmUoSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sLCBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSk7CgogICAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mOwogICAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpOwogICAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmCiAgICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmCiAgICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkgewogICAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZAogICAgICAvLyBvZiB0aGUgcG9seWZpbGwuCiAgICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7CiAgICB9CgogICAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID0KICAgICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpOwogICAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7CiAgICBkZWZpbmUoR3AsICJjb25zdHJ1Y3RvciIsIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTsKICAgIGRlZmluZShHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSwgImNvbnN0cnVjdG9yIiwgR2VuZXJhdG9yRnVuY3Rpb24pOwogICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoCiAgICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLAogICAgICB0b1N0cmluZ1RhZ1N5bWJvbCwKICAgICAgIkdlbmVyYXRvckZ1bmN0aW9uIgogICAgKTsKCiAgICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZQogICAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC4KICAgIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHsKICAgICAgWyJuZXh0IiwgInRocm93IiwgInJldHVybiJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7CiAgICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbihhcmcpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHsKICAgICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSAiZnVuY3Rpb24iICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjsKICAgICAgcmV0dXJuIGN0b3IKICAgICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8CiAgICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuCiAgICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuCiAgICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSAiR2VuZXJhdG9yRnVuY3Rpb24iCiAgICAgICAgOiBmYWxzZTsKICAgIH07CgogICAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7CiAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHsKICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlOwogICAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yRnVuY3Rpb24iKTsKICAgICAgfQogICAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7CiAgICAgIHJldHVybiBnZW5GdW47CiAgICB9OwoKICAgIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0bwogICAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3QKICAgIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgIl9fYXdhaXQiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzCiAgICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLgogICAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykgewogICAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTsKICAgIH07CgogICAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7CiAgICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7CiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSAidGhyb3ciKSB7CiAgICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnOwogICAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlOwogICAgICAgICAgaWYgKHZhbHVlICYmCiAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiAmJgogICAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCAiX19hd2FpdCIpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgICBpbnZva2UoIm5leHQiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgaW52b2tlKCJ0aHJvdyIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7CiAgICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzCiAgICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZQogICAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4KICAgICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkOwogICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikgewogICAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFjawogICAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuCiAgICAgICAgICAgIHJldHVybiBpbnZva2UoInRocm93IiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBwcmV2aW91c1Byb21pc2U7CgogICAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPQogICAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbAogICAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsCiAgICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmCiAgICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0bwogICAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsCiAgICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkbwogICAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eQogICAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHMKICAgICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5CiAgICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZQogICAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHkKICAgICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS4KICAgICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKAogICAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZywKICAgICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXIKICAgICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLgogICAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZwogICAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7CiAgICAgIH0KCiAgICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsCiAgICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLgogICAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlOwogICAgfQoKICAgIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7CiAgICBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9KTsKICAgIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7CgogICAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZgogICAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mCiAgICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci4KICAgIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHsKICAgICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTsKCiAgICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoCiAgICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksCiAgICAgICAgUHJvbWlzZUltcGwKICAgICAgKTsKCiAgICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbikKICAgICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLgogICAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7CiAgICAgICAgICB9KTsKICAgIH07CgogICAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7CiAgICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7CgogICAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7CiAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7CiAgICAgICAgICBpZiAobWV0aG9kID09PSAidGhyb3ciKSB7CiAgICAgICAgICAgIHRocm93IGFyZzsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOgogICAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZQogICAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kOwogICAgICAgIGNvbnRleHQuYXJnID0gYXJnOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTsKICAgICAgICAgIGlmIChkZWxlZ2F0ZSkgewogICAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTsKICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7CiAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTsKICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09ICJuZXh0IikgewogICAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3MKICAgICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnOwoKICAgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09ICJ0aHJvdyIpIHsKICAgICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7CiAgICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDsKICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7CgogICAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gInJldHVybiIpIHsKICAgICAgICAgICAgY29udGV4dC5hYnJ1cHQoInJldHVybiIsIGNvbnRleHQuYXJnKTsKICAgICAgICAgIH0KCiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nOwoKICAgICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTsKICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gIm5vcm1hbCIpIHsKICAgICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PQogICAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uCiAgICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lCiAgICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZAogICAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDsKCiAgICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsCiAgICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lCiAgICAgICAgICAgIH07CgogICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gInRocm93IikgewogICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkOwogICAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlCiAgICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuCiAgICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gInRocm93IjsKICAgICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGUKICAgIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGUKICAgIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLAogICAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuCiAgICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7CiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07CiAgICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93CiAgICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC4KICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CiAgICAgICAgICAvLyBOb3RlOiBbInJldHVybiJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS4KICAgICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvclsicmV0dXJuIl0pIHsKICAgICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYQogICAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuCiAgICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gInJldHVybiI7CiAgICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpOwoKICAgICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSAidGhyb3ciKSB7CiAgICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb20KICAgICAgICAgICAgICAvLyAicmV0dXJuIiB0byAidGhyb3ciLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LgogICAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOwogICAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKAogICAgICAgICAgICAiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZCIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0KCiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7CgogICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJ0aHJvdyI7CiAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnOwogICAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsOwogICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsOwogICAgICB9CgogICAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7CgogICAgICBpZiAoISBpbmZvKSB7CiAgICAgICAgY29udGV4dC5tZXRob2QgPSAidGhyb3ciOwogICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKTsKICAgICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDsKICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgICAgfQoKICAgICAgaWYgKGluZm8uZG9uZSkgewogICAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5CiAgICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS4KICAgICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTsKCiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLgogICAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7CgogICAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyAidGhyb3ciIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGUKICAgICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmCiAgICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzICJuZXh0IiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuCiAgICAgICAgLy8gImNvbnN1bWVkIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhcwogICAgICAgIC8vICJyZXR1cm4iLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZQogICAgICAgIC8vIG91dGVyIGdlbmVyYXRvci4KICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09ICJyZXR1cm4iKSB7CiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuCiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH0KCiAgICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoCiAgICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuCiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsOwogICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgIH0KCiAgICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZQogICAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLgogICAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTsKCiAgICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCAiR2VuZXJhdG9yIik7CgogICAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGUKICAgIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCiAgICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvcgogICAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uCiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy4KICAgIGRlZmluZShHcCwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0pOwoKICAgIGRlZmluZShHcCwgInRvU3RyaW5nIiwgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiAiW29iamVjdCBHZW5lcmF0b3JdIjsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7CiAgICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07CgogICAgICBpZiAoMSBpbiBsb2NzKSB7CiAgICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdOwogICAgICB9CgogICAgICBpZiAoMiBpbiBsb2NzKSB7CiAgICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07CiAgICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdOwogICAgICB9CgogICAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkgewogICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTsKICAgICAgcmVjb3JkLnR5cGUgPSAibm9ybWFsIjsKICAgICAgZGVsZXRlIHJlY29yZC5hcmc7CiAgICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7CiAgICB9CgogICAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkgewogICAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2gKICAgICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbQogICAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuCiAgICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogInJvb3QiIH1dOwogICAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7CiAgICAgIHRoaXMucmVzZXQodHJ1ZSk7CiAgICB9CgogICAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgIHZhciBrZXlzID0gW107CiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKICAgICAgICBrZXlzLnB1c2goa2V5KTsKICAgICAgfQogICAgICBrZXlzLnJldmVyc2UoKTsKCiAgICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwCiAgICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuCiAgICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkgewogICAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkgewogICAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7CiAgICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkgewogICAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5OwogICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWUKICAgICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpcwogICAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLgogICAgICAgIG5leHQuZG9uZSA9IHRydWU7CiAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgIH07CiAgICB9OwoKICAgIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkgewogICAgICBpZiAoaXRlcmFibGUpIHsKICAgICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07CiAgICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7CiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHJldHVybiBpdGVyYWJsZTsKICAgICAgICB9CgogICAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkgewogICAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHsKICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7CiAgICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07CiAgICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgICB9OwoKICAgICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLgogICAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07CiAgICB9CiAgICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlczsKCiAgICBmdW5jdGlvbiBkb25lUmVzdWx0KCkgewogICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkJDEsIGRvbmU6IHRydWUgfTsKICAgIH0KCiAgICBDb250ZXh0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IENvbnRleHQsCgogICAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkgewogICAgICAgIHRoaXMucHJldiA9IDA7CiAgICAgICAgdGhpcy5uZXh0ID0gMDsKICAgICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwncwogICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCQxOwogICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsOwoKICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZCQxOwoKICAgICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTsKCiAgICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7CiAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHsKICAgICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczoKICAgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSAidCIgJiYKICAgICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmCiAgICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7CiAgICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kb25lID0gdHJ1ZTsKCiAgICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTsKICAgICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uOwogICAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMucnZhbDsKICAgICAgfSwKCiAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHsKICAgICAgICBpZiAodGhpcy5kb25lKSB7CiAgICAgICAgICB0aHJvdyBleGNlcHRpb247CiAgICAgICAgfQoKICAgICAgICB2YXIgY29udGV4dCA9IHRoaXM7CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7CiAgICAgICAgICByZWNvcmQudHlwZSA9ICJ0aHJvdyI7CiAgICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uOwogICAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jOwoKICAgICAgICAgIGlmIChjYXVnaHQpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jaywKICAgICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS4KICAgICAgICAgICAgY29udGV4dC5tZXRob2QgPSAibmV4dCI7CiAgICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuICEhIGNhdWdodDsKICAgICAgICB9CgogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwoKICAgICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09ICJyb290IikgewogICAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZQogICAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG8KICAgICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi4KICAgICAgICAgICAgcmV0dXJuIGhhbmRsZSgiZW5kIik7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAgICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksICJjYXRjaExvYyIpOwogICAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCAiZmluYWxseUxvYyIpOwoKICAgICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykgewogICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiYKICAgICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgImZpbmFsbHlMb2MiKSAmJgogICAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHsKICAgICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChmaW5hbGx5RW50cnkgJiYKICAgICAgICAgICAgKHR5cGUgPT09ICJicmVhayIgfHwKICAgICAgICAgICAgIHR5cGUgPT09ICJjb250aW51ZSIpICYmCiAgICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmCiAgICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykgewogICAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYQogICAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLgogICAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9OwogICAgICAgIHJlY29yZC50eXBlID0gdHlwZTsKICAgICAgICByZWNvcmQuYXJnID0gYXJnOwoKICAgICAgICBpZiAoZmluYWxseUVudHJ5KSB7CiAgICAgICAgICB0aGlzLm1ldGhvZCA9ICJuZXh0IjsKICAgICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jOwogICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpOwogICAgICB9LAoKICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHsKICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgICAgIHRocm93IHJlY29yZC5hcmc7CiAgICAgICAgfQoKICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJicmVhayIgfHwKICAgICAgICAgICAgcmVjb3JkLnR5cGUgPT09ICJjb250aW51ZSIpIHsKICAgICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7CiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gInJldHVybiIpIHsKICAgICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZzsKICAgICAgICAgIHRoaXMubWV0aG9kID0gInJldHVybiI7CiAgICAgICAgICB0aGlzLm5leHQgPSAiZW5kIjsKICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSAibm9ybWFsIiAmJiBhZnRlckxvYykgewogICAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDsKICAgICAgfSwKCiAgICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykgewogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTsKICAgICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7CiAgICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpOwogICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgImNhdGNoIjogZnVuY3Rpb24odHJ5TG9jKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldOwogICAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7CiAgICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uOwogICAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09ICJ0aHJvdyIpIHsKICAgICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZzsKICAgICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhyb3duOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uCiAgICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLgogICAgICAgIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iik7CiAgICAgIH0sCgogICAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykgewogICAgICAgIHRoaXMuZGVsZWdhdGUgPSB7CiAgICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSwKICAgICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsCiAgICAgICAgICBuZXh0TG9jOiBuZXh0TG9jCiAgICAgICAgfTsKCiAgICAgICAgaWYgKHRoaXMubWV0aG9kID09PSAibmV4dCIpIHsKICAgICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0CiAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuCiAgICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZCQxOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7CiAgICAgIH0KICAgIH07CgogICAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZQogICAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlCiAgICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmUKICAgIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuCiAgICByZXR1cm4gZXhwb3J0czsKCiAgfSgKICAgIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzCiAgICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eQogICAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgIG1vZHVsZS5leHBvcnRzIAogICkpOwoKICB0cnkgewogICAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTsKICB9IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkgewogICAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmUKICAgIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdAogICAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCBpbiBtb2Rlcm4gZW5naW5lcwogICAgLy8gd2UgY2FuIGV4cGxpY2l0bHkgYWNjZXNzIGdsb2JhbFRoaXMuIEluIG9sZGVyIGVuZ2luZXMgd2UgY2FuIGVzY2FwZQogICAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsCiAgICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2UKICAgIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmCiAgICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYQogICAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlCiAgICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS4KICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gIm9iamVjdCIpIHsKICAgICAgZ2xvYmFsVGhpcy5yZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lOwogICAgfSBlbHNlIHsKICAgICAgRnVuY3Rpb24oInIiLCAicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHJ1bnRpbWUpOwogICAgfQogIH0KICB9KTsKCiAgdmFyIG1hcnRpbmkgPSBudWxsOwoKICBmdW5jdGlvbiBkZWNvZGVUZXJyYWluKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIHZhciBfbWFydGluaTsKCiAgICB2YXIgaW1hZ2VEYXRhID0gcGFyYW1ldGVycy5pbWFnZURhdGEsCiAgICAgICAgX3BhcmFtZXRlcnMkdGlsZVNpemUgPSBwYXJhbWV0ZXJzLnRpbGVTaXplLAogICAgICAgIHRpbGVTaXplID0gX3BhcmFtZXRlcnMkdGlsZVNpemUgPT09IHZvaWQgMCA/IDI1NiA6IF9wYXJhbWV0ZXJzJHRpbGVTaXplLAogICAgICAgIGVycm9yTGV2ZWwgPSBwYXJhbWV0ZXJzLmVycm9yTGV2ZWwsCiAgICAgICAgaW50ZXJ2YWwgPSBwYXJhbWV0ZXJzLmludGVydmFsLAogICAgICAgIG9mZnNldCA9IHBhcmFtZXRlcnMub2Zmc2V0OwogICAgdmFyIHBpeGVscyA9IG5kYXJyYXkobmV3IFVpbnQ4QXJyYXkoaW1hZ2VEYXRhKSwgW3RpbGVTaXplLCB0aWxlU2l6ZSwgNF0sIFs0LCA0ICogdGlsZVNpemUsIDFdLCAwKTsgLy8gVGlsZSBzaXplIG11c3QgYmUgbWFpbnRhaW5lZCB0aHJvdWdoIHRoZSBsaWZlIG9mIHRoZSB3b3JrZXIKCiAgICAoX21hcnRpbmkgPSBtYXJ0aW5pKSAhPT0gbnVsbCAmJiBfbWFydGluaSAhPT0gdm9pZCAwID8gX21hcnRpbmkgOiBtYXJ0aW5pID0gbmV3IE1hcnRpbmkodGlsZVNpemUgKyAxKTsKICAgIHZhciB0ZXJyYWluID0gbWFwYm94VGVycmFpblRvR3JpZChwaXhlbHMsIGludGVydmFsLCBvZmZzZXQpOwogICAgdmFyIHRpbGUgPSBtYXJ0aW5pLmNyZWF0ZVRpbGUodGVycmFpbik7IC8vIGdldCBhIG1lc2ggKHZlcnRpY2VzIGFuZCB0cmlhbmdsZXMgaW5kaWNlcykgZm9yIGEgMTBtIGVycm9yCgogICAgdmFyIG1lc2ggPSB0aWxlLmdldE1lc2goZXJyb3JMZXZlbCwgcGFyYW1ldGVycy5tYXhMZW5ndGgpOwogICAgcmV0dXJuIGNyZWF0ZVF1YW50aXplZE1lc2hEYXRhKHRpbGUsIG1lc2gsIHRpbGVTaXplKTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKG1zZykgewogICAgdmFyIF9tc2ckZGF0YSA9IG1zZy5kYXRhLAogICAgICAgIGlkID0gX21zZyRkYXRhLmlkLAogICAgICAgIHBheWxvYWQgPSBfbXNnJGRhdGEucGF5bG9hZDsKICAgIGlmIChpZCA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgb2JqZWN0cyA9IFtdOwogICAgdmFyIHJlcyA9IG51bGw7CgogICAgdHJ5IHsKICAgICAgcmVzID0gZGVjb2RlVGVycmFpbihwYXlsb2FkKTsKICAgICAgb2JqZWN0cy5wdXNoKHJlcy5pbmRpY2VzLmJ1ZmZlcik7CiAgICAgIG9iamVjdHMucHVzaChyZXMucXVhbnRpemVkVmVydGljZXMuYnVmZmVyKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGlkLAogICAgICAgIHBheWxvYWQ6IHJlcwogICAgICB9LCBvYmplY3RzKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBpZDogaWQsCiAgICAgICAgZXJyOiBlcnIudG9TdHJpbmcoKQogICAgICB9KTsKICAgIH0gZmluYWxseSB7CiAgICAgIHJlcyA9IG51bGw7CiAgICAgIG9iamVjdHMgPSBudWxsOwogICAgfQogIH07CgogIGV4cG9ydHMuZGVjb2RlVGVycmFpbiA9IGRlY29kZVRlcnJhaW47CgogIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7CgogIHJldHVybiBleHBvcnRzOwoKfSkoe30pOwoK', null, false);
704
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAndXNlIHN0cmljdCc7CgogIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOwogIH0KICBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsKICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyWyJAQGl0ZXJhdG9yIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsKICAgIGlmICghbykgcmV0dXJuOwogICAgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7CiAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7CiAgICBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsKICAgIGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7CiAgICBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOwogIH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgewogICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07CiAgICByZXR1cm4gYXJyMjsKICB9CiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICAvLyBXZSBzaG91bGQgc2F2ZSB0aGVzZQogIC8vY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcygyNTYsIDI1Nik7CiAgLy9jb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKCiAgZnVuY3Rpb24gbWFwYm94VGVycmFpblRvR3JpZChwbmcsIGludGVydmFsLCBvZmZzZXQpIHsKICAgIHZhciBfaW50ZXJ2YWwsIF9vZmZzZXQ7CiAgICAvLyBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBvbiB0aGUgR1BVIHVzaW5nIFJFR0w/CiAgICAvLyBidXQgdGhhdCB3b3VsZCByZXF1aXJlIEdQVSAtPiBDUFUgLT4gR1BVCiAgICB2YXIgZ3JpZFNpemUgPSBwbmcuc2hhcGVbMF0gKyAxOwogICAgdmFyIHRlcnJhaW4gPSBuZXcgRmxvYXQzMkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUpOwogICAgdmFyIHRpbGVTaXplID0gcG5nLnNoYXBlWzBdOwogICAgaW50ZXJ2YWwgPSAoX2ludGVydmFsID0gaW50ZXJ2YWwpICE9PSBudWxsICYmIF9pbnRlcnZhbCAhPT0gdm9pZCAwID8gX2ludGVydmFsIDogMC4xOwogICAgb2Zmc2V0ID0gKF9vZmZzZXQgPSBvZmZzZXQpICE9PSBudWxsICYmIF9vZmZzZXQgIT09IHZvaWQgMCA/IF9vZmZzZXQgOiAtMTAwMDA7CgogICAgLy8gZGVjb2RlIHRlcnJhaW4gdmFsdWVzCiAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHRpbGVTaXplOyB5KyspIHsKICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aWxlU2l6ZTsgeCsrKSB7CiAgICAgICAgdmFyIHljID0geTsKICAgICAgICB2YXIgciA9IHBuZy5nZXQoeCwgeWMsIDApOwogICAgICAgIHZhciBnID0gcG5nLmdldCh4LCB5YywgMSk7CiAgICAgICAgdmFyIGIgPSBwbmcuZ2V0KHgsIHljLCAyKTsKICAgICAgICB0ZXJyYWluW3kgKiBncmlkU2l6ZSArIHhdID0gciAqIDI1NiAqIDI1NiAqIGludGVydmFsICsgZyAqIDI1Ni4wICogaW50ZXJ2YWwgKyBiICogaW50ZXJ2YWwgKyBvZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIC8vIGJhY2tmaWxsIHJpZ2h0IGFuZCBib3R0b20gYm9yZGVycwogICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IGdyaWRTaXplIC0gMTsgX3grKykgewogICAgICB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMSkgKyBfeF0gPSB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMikgKyBfeF07CiAgICB9CiAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgZ3JpZFNpemU7IF95KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIF95ICsgZ3JpZFNpemUgLSAxXSA9IHRlcnJhaW5bZ3JpZFNpemUgKiBfeSArIGdyaWRTaXplIC0gMl07CiAgICB9CiAgICByZXR1cm4gdGVycmFpbjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpIHsKICAgIHZhciB4dmFscyA9IFtdOwogICAgdmFyIHl2YWxzID0gW107CiAgICB2YXIgaGVpZ2h0TWV0ZXJzID0gW107CiAgICB2YXIgbm9ydGhJbmRpY2VzID0gW107CiAgICB2YXIgc291dGhJbmRpY2VzID0gW107CiAgICB2YXIgZWFzdEluZGljZXMgPSBbXTsKICAgIHZhciB3ZXN0SW5kaWNlcyA9IFtdOwogICAgdmFyIG1pbmltdW1IZWlnaHQgPSBJbmZpbml0eTsKICAgIHZhciBtYXhpbXVtSGVpZ2h0ID0gLUluZmluaXR5OwogICAgdmFyIHNjYWxhciA9IDMyNzY4LjAgLyB0aWxlU2l6ZTsKICAgIGZvciAodmFyIGl4ID0gMDsgaXggPCBtZXNoLnZlcnRpY2VzLmxlbmd0aCAvIDI7IGl4KyspIHsKICAgICAgdmFyIHZlcnRleEl4ID0gaXg7CiAgICAgIHZhciBweCA9IG1lc2gudmVydGljZXNbaXggKiAyXTsKICAgICAgdmFyIHB5ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDIgKyAxXTsKICAgICAgdmFyIGhlaWdodCA9IHRpbGUudGVycmFpbltweSAqICh0aWxlU2l6ZSArIDEpICsgcHhdOwogICAgICBpZiAoaGVpZ2h0ID4gbWF4aW11bUhlaWdodCkgbWF4aW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1IZWlnaHQpIG1pbmltdW1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGhlaWdodE1ldGVycy5wdXNoKGhlaWdodCk7CiAgICAgIGlmIChweSA9PSAwKSBub3J0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweSA9PSB0aWxlU2l6ZSkgc291dGhJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHggPT0gMCkgd2VzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSB0aWxlU2l6ZSkgZWFzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIHZhciB4diA9IHB4ICogc2NhbGFyOwogICAgICB2YXIgeXYgPSAodGlsZVNpemUgLSBweSkgKiBzY2FsYXI7CiAgICAgIHh2YWxzLnB1c2goeHYpOwogICAgICB5dmFscy5wdXNoKHl2KTsKICAgIH0KICAgIHZhciBoZWlnaHRSYW5nZSA9IG1heGltdW1IZWlnaHQgLSBtaW5pbXVtSGVpZ2h0OwogICAgdmFyIGhlaWdodHMgPSBoZWlnaHRNZXRlcnMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgIGlmIChoZWlnaHRSYW5nZSA8IDEpIHJldHVybiAwOwogICAgICByZXR1cm4gKGQgLSBtaW5pbXVtSGVpZ2h0KSAqICgzMjc2Ny4wIC8gaGVpZ2h0UmFuZ2UpOwogICAgfSk7CiAgICB2YXIgdHJpYW5nbGVzID0gbmV3IFVpbnQxNkFycmF5KG1lc2gudHJpYW5nbGVzKTsKICAgIHZhciBxdWFudGl6ZWRWZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSggLy92ZXJ0cwogICAgW10uY29uY2F0KHh2YWxzLCB5dmFscywgX3RvQ29uc3VtYWJsZUFycmF5KGhlaWdodHMpKSk7CgogICAgLy8gU0UgTlcgTkUKICAgIC8vIE5FIE5XIFNFCgogICAgcmV0dXJuIHsKICAgICAgbWluaW11bUhlaWdodDogbWluaW11bUhlaWdodCwKICAgICAgbWF4aW11bUhlaWdodDogbWF4aW11bUhlaWdodCwKICAgICAgcXVhbnRpemVkVmVydGljZXM6IHF1YW50aXplZFZlcnRpY2VzLAogICAgICBpbmRpY2VzOiB0cmlhbmdsZXMsCiAgICAgIHdlc3RJbmRpY2VzOiB3ZXN0SW5kaWNlcywKICAgICAgc291dGhJbmRpY2VzOiBzb3V0aEluZGljZXMsCiAgICAgIGVhc3RJbmRpY2VzOiBlYXN0SW5kaWNlcywKICAgICAgbm9ydGhJbmRpY2VzOiBub3J0aEluZGljZXMKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpb3RhKG4pIHsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewogICAgICByZXN1bHRbaV0gPSBpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIGlvdGFfMSA9IGlvdGE7CgogIC8qIQogICAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIKICAgKgogICAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+CiAgICogQGxpY2Vuc2UgIE1JVAogICAqLwogIC8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3NpbmcKICAvLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5CiAgdmFyIGlzQnVmZmVyXzEgPSBmdW5jdGlvbiAob2JqKSB7CiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKTsKICB9OwogIGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikgewogICAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaik7CiAgfQoKICAvLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LgogIGZ1bmN0aW9uIGlzU2xvd0J1ZmZlcihvYmopIHsKICAgIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKTsKICB9CgogIHZhciBoYXNUeXBlZEFycmF5cyA9IHR5cGVvZiBGbG9hdDY0QXJyYXkgIT09ICJ1bmRlZmluZWQiOwogIGZ1bmN0aW9uIGNvbXBhcmUxc3QoYSwgYikgewogICAgcmV0dXJuIGFbMF0gLSBiWzBdOwogIH0KICBmdW5jdGlvbiBvcmRlcigpIHsKICAgIHZhciBzdHJpZGUgPSB0aGlzLnN0cmlkZTsKICAgIHZhciB0ZXJtcyA9IG5ldyBBcnJheShzdHJpZGUubGVuZ3RoKTsKICAgIHZhciBpOwogICAgZm9yIChpID0gMDsgaSA8IHRlcm1zLmxlbmd0aDsgKytpKSB7CiAgICAgIHRlcm1zW2ldID0gW01hdGguYWJzKHN0cmlkZVtpXSksIGldOwogICAgfQogICAgdGVybXMuc29ydChjb21wYXJlMXN0KTsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkodGVybXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gdGVybXNbaV1bMV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGRpbWVuc2lvbikgewogICAgdmFyIGNsYXNzTmFtZSA9IFsiVmlldyIsIGRpbWVuc2lvbiwgImQiLCBkdHlwZV0uam9pbigiIik7CiAgICBpZiAoZGltZW5zaW9uIDwgMCkgewogICAgICBjbGFzc05hbWUgPSAiVmlld19OaWwiICsgZHR5cGU7CiAgICB9CiAgICB2YXIgdXNlR2V0dGVycyA9IGR0eXBlID09PSAiZ2VuZXJpYyI7CiAgICBpZiAoZGltZW5zaW9uID09PSAtMSkgewogICAgICAvL1NwZWNpYWwgY2FzZSBmb3IgdHJpdmlhbCBhcnJheXMKICAgICAgdmFyIGNvZGUgPSAiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICIoYSl7dGhpcy5kYXRhPWE7fTtcCnZhciBwcm90bz0iICsgY2xhc3NOYW1lICsgIi5wcm90b3R5cGU7XApwcm90by5kdHlwZT0nIiArIGR0eXBlICsgIic7XApwcm90by5pbmRleD1mdW5jdGlvbigpe3JldHVybiAtMX07XApwcm90by5zaXplPTA7XApwcm90by5kaW1lbnNpb249LTE7XApwcm90by5zaGFwZT1wcm90by5zdHJpZGU9cHJvdG8ub3JkZXI9W107XApwcm90by5sbz1wcm90by5oaT1wcm90by50cmFuc3Bvc2U9cHJvdG8uc3RlcD1cCmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEpO307XApwcm90by5nZXQ9cHJvdG8uc2V0PWZ1bmN0aW9uKCl7fTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGEpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIoYSk7fSI7CiAgICAgIHZhciBwcm9jZWR1cmUgPSBuZXcgRnVuY3Rpb24oY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoKTsKICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uID09PSAwKSB7CiAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciAwZCBhcnJheXMKICAgICAgdmFyIGNvZGUgPSAiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICIoYSxkKSB7XAp0aGlzLmRhdGEgPSBhO1wKdGhpcy5vZmZzZXQgPSBkXAp9O1wKdmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZTtcCnByb3RvLmR0eXBlPSciICsgZHR5cGUgKyAiJztcCnByb3RvLmluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0fTtcCnByb3RvLmRpbWVuc2lvbj0wO1wKcHJvdG8uc2l6ZT0xO1wKcHJvdG8uc2hhcGU9XApwcm90by5zdHJpZGU9XApwcm90by5vcmRlcj1bXTtcCnByb3RvLmxvPVwKcHJvdG8uaGk9XApwcm90by50cmFuc3Bvc2U9XApwcm90by5zdGVwPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2NvcHkoKSB7XApyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSx0aGlzLm9mZnNldClcCn07XApwcm90by5waWNrPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3BpY2soKXtcCnJldHVybiBUcml2aWFsQXJyYXkodGhpcy5kYXRhKTtcCn07XApwcm90by52YWx1ZU9mPXByb3RvLmdldD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9nZXQoKXtcCnJldHVybiAiICsgKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLmdldCh0aGlzLm9mZnNldCkiIDogInRoaXMuZGF0YVt0aGlzLm9mZnNldF0iKSArICJ9O1wKcHJvdG8uc2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NldCh2KXtcCnJldHVybiAiICsgKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLnNldCh0aGlzLm9mZnNldCx2KSIgOiAidGhpcy5kYXRhW3RoaXMub2Zmc2V0XT12IikgKyAiXAp9O1wKcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdF8iICsgY2xhc3NOYW1lICsgIihhLGIsYyxkKXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKGEsZCl9IjsKICAgICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiVHJpdmlhbEFycmF5IiwgY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV1bMF0pOwogICAgfQogICAgdmFyIGNvZGUgPSBbIid1c2Ugc3RyaWN0JyJdOwoKICAgIC8vQ3JlYXRlIGNvbnN0cnVjdG9yIGZvciB2aWV3CiAgICB2YXIgaW5kaWNlcyA9IGlvdGFfMShkaW1lbnNpb24pOwogICAgdmFyIGFyZ3MgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImkiICsgaTsKICAgIH0pOwogICAgdmFyIGluZGV4X3N0ciA9ICJ0aGlzLm9mZnNldCsiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiICsgaSArICJdKmkiICsgaTsKICAgIH0pLmpvaW4oIisiKTsKICAgIHZhciBzaGFwZUFyZyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpOwogICAgfSkuam9pbigiLCIpOwogICAgdmFyIHN0cmlkZUFyZyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYyIgKyBpOwogICAgfSkuam9pbigiLCIpOwogICAgY29kZS5wdXNoKCJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhLCIgKyBzaGFwZUFyZyArICIsIiArIHN0cmlkZUFyZyArICIsZCl7dGhpcy5kYXRhPWEiLCAidGhpcy5zaGFwZT1bIiArIHNoYXBlQXJnICsgIl0iLCAidGhpcy5zdHJpZGU9WyIgKyBzdHJpZGVBcmcgKyAiXSIsICJ0aGlzLm9mZnNldD1kfDB9IiwgInZhciBwcm90bz0iICsgY2xhc3NOYW1lICsgIi5wcm90b3R5cGUiLCAicHJvdG8uZHR5cGU9JyIgKyBkdHlwZSArICInIiwgInByb3RvLmRpbWVuc2lvbj0iICsgZGltZW5zaW9uKTsKCiAgICAvL3ZpZXcuc2l6ZToKICAgIGNvZGUucHVzaCgiT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCdzaXplJyx7Z2V0OmZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NpemUoKXtcCnJldHVybiAiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnNoYXBlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiKiIpLCAifX0pIik7CgogICAgLy92aWV3Lm9yZGVyOgogICAgaWYgKGRpbWVuc2lvbiA9PT0gMSkgewogICAgICBjb2RlLnB1c2goInByb3RvLm9yZGVyPVswXSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sJ29yZGVyJyx7Z2V0OiIpOwogICAgICBpZiAoZGltZW5zaW9uIDwgNCkgewogICAgICAgIGNvZGUucHVzaCgiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfb3JkZXIoKXsiKTsKICAgICAgICBpZiAoZGltZW5zaW9uID09PSAyKSB7CiAgICAgICAgICBjb2RlLnB1c2goInJldHVybiAoTWF0aC5hYnModGhpcy5zdHJpZGVbMF0pPk1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSk/WzEsMF06WzAsMV19fSkiKTsKICAgICAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PT0gMykgewogICAgICAgICAgY29kZS5wdXNoKCJ2YXIgczA9TWF0aC5hYnModGhpcy5zdHJpZGVbMF0pLHMxPU1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSxzMj1NYXRoLmFicyh0aGlzLnN0cmlkZVsyXSk7XAppZihzMD5zMSl7XAppZihzMT5zMil7XApyZXR1cm4gWzIsMSwwXTtcCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMSwyLDBdO1wKfWVsc2V7XApyZXR1cm4gWzEsMCwyXTtcCn1cCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMiwwLDFdO1wKfWVsc2UgaWYoczI+czEpe1wKcmV0dXJuIFswLDEsMl07XAp9ZWxzZXtcCnJldHVybiBbMCwyLDFdO1wKfX19KSIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RlLnB1c2goIk9SREVSfSkiKTsKICAgICAgfQogICAgfQoKICAgIC8vdmlldy5zZXQoaTAsIC4uLiwgdik6CiAgICBjb2RlLnB1c2goInByb3RvLnNldD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9zZXQoIiArIGFyZ3Muam9pbigiLCIpICsgIix2KXsiKTsKICAgIGlmICh1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5zZXQoIiArIGluZGV4X3N0ciArICIsdil9Iik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGFbIiArIGluZGV4X3N0ciArICJdPXZ9Iik7CiAgICB9CgogICAgLy92aWV3LmdldChpMCwgLi4uKToKICAgIGNvZGUucHVzaCgicHJvdG8uZ2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2dldCgiICsgYXJncy5qb2luKCIsIikgKyAiKXsiKTsKICAgIGlmICh1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5nZXQoIiArIGluZGV4X3N0ciArICIpfSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhWyIgKyBpbmRleF9zdHIgKyAiXX0iKTsKICAgIH0KCiAgICAvL3ZpZXcuaW5kZXg6CiAgICBjb2RlLnB1c2goInByb3RvLmluZGV4PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2luZGV4KCIsIGFyZ3Muam9pbigpLCAiKXtyZXR1cm4gIiArIGluZGV4X3N0ciArICJ9Iik7CgogICAgLy92aWV3LmhpKCk6CiAgICBjb2RlLnB1c2goInByb3RvLmhpPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2hpKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gWyIodHlwZW9mIGkiLCBpLCAiIT09J251bWJlcid8fGkiLCBpLCAiPDApP3RoaXMuc2hhcGVbIiwgaSwgIl06aSIsIGksICJ8MCJdLmpvaW4oIiIpOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsdGhpcy5vZmZzZXQpfSIpOwoKICAgIC8vdmlldy5sbygpOgogICAgdmFyIGFfdmFycyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYSIgKyBpICsgIj10aGlzLnNoYXBlWyIgKyBpICsgIl0iOwogICAgfSk7CiAgICB2YXIgY192YXJzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJjIiArIGkgKyAiPXRoaXMuc3RyaWRlWyIgKyBpICsgIl0iOwogICAgfSk7CiAgICBjb2RlLnB1c2goInByb3RvLmxvPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2xvKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3ZhciBiPXRoaXMub2Zmc2V0LGQ9MCwiICsgYV92YXJzLmpvaW4oIiwiKSArICIsIiArIGNfdmFycy5qb2luKCIsIikpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goImlmKHR5cGVvZiBpIiArIGkgKyAiPT09J251bWJlcicmJmkiICsgaSArICI+PTApe1wKZD1pIiArIGkgKyAifDA7XApiKz1jIiArIGkgKyAiKmQ7XAphIiArIGkgKyAiLT1kfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGk7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImMiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsYil9Iik7CgogICAgLy92aWV3LnN0ZXAoKToKICAgIGNvZGUucHVzaCgicHJvdG8uc3RlcD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9zdGVwKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3ZhciAiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGkgKyAiPXRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImIiICsgaSArICI9dGhpcy5zdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLGM9dGhpcy5vZmZzZXQsZD0wLGNlaWw9TWF0aC5jZWlsIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgiaWYodHlwZW9mIGkiICsgaSArICI9PT0nbnVtYmVyJyl7XApkPWkiICsgaSArICJ8MDtcCmlmKGQ8MCl7XApjKz1iIiArIGkgKyAiKihhIiArIGkgKyAiLTEpO1wKYSIgKyBpICsgIj1jZWlsKC1hIiArIGkgKyAiL2QpXAp9ZWxzZXtcCmEiICsgaSArICI9Y2VpbChhIiArIGkgKyAiL2QpXAp9XApiIiArIGkgKyAiKj1kXAp9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIixjKX0iKTsKCiAgICAvL3ZpZXcudHJhbnNwb3NlKCk6CiAgICB2YXIgdFNoYXBlID0gbmV3IEFycmF5KGRpbWVuc2lvbik7CiAgICB2YXIgdFN0cmlkZSA9IG5ldyBBcnJheShkaW1lbnNpb24pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICB0U2hhcGVbaV0gPSAiYVtpIiArIGkgKyAiXSI7CiAgICAgIHRTdHJpZGVbaV0gPSAiYltpIiArIGkgKyAiXSI7CiAgICB9CiAgICBjb2RlLnB1c2goInByb3RvLnRyYW5zcG9zZT1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl90cmFuc3Bvc2UoIiArIGFyZ3MgKyAiKXsiICsgYXJncy5tYXAoZnVuY3Rpb24gKG4sIGlkeCkgewogICAgICByZXR1cm4gbiArICI9KCIgKyBuICsgIj09PXVuZGVmaW5lZD8iICsgaWR4ICsgIjoiICsgbiArICJ8MCkiOwogICAgfSkuam9pbigiOyIpLCAidmFyIGE9dGhpcy5zaGFwZSxiPXRoaXMuc3RyaWRlO3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyB0U2hhcGUuam9pbigiLCIpICsgIiwiICsgdFN0cmlkZS5qb2luKCIsIikgKyAiLHRoaXMub2Zmc2V0KX0iKTsKCiAgICAvL3ZpZXcucGljaygpOgogICAgY29kZS5wdXNoKCJwcm90by5waWNrPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3BpY2soIiArIGFyZ3MgKyAiKXt2YXIgYT1bXSxiPVtdLGM9dGhpcy5vZmZzZXQiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKCJpZih0eXBlb2YgaSIgKyBpICsgIj09PSdudW1iZXInJiZpIiArIGkgKyAiPj0wKXtjPShjK3RoaXMuc3RyaWRlWyIgKyBpICsgIl0qaSIgKyBpICsgIil8MH1lbHNle2EucHVzaCh0aGlzLnNoYXBlWyIgKyBpICsgIl0pO2IucHVzaCh0aGlzLnN0cmlkZVsiICsgaSArICJdKX0iKTsKICAgIH0KICAgIGNvZGUucHVzaCgidmFyIGN0b3I9Q1RPUl9MSVNUW2EubGVuZ3RoKzFdO3JldHVybiBjdG9yKHRoaXMuZGF0YSxhLGIsYyl9Iik7CgogICAgLy9BZGQgcmV0dXJuIHN0YXRlbWVudAogICAgY29kZS5wdXNoKCJyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGRhdGEsc2hhcGUsc3RyaWRlLG9mZnNldCl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIihkYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInNoYXBlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJzdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLG9mZnNldCl9Iik7CgogICAgLy9Db21waWxlIHByb2NlZHVyZQogICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiQ1RPUl9MSVNUIiwgIk9SREVSIiwgY29kZS5qb2luKCJcbiIpKTsKICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV0sIG9yZGVyKTsKICB9CiAgZnVuY3Rpb24gYXJyYXlEVHlwZShkYXRhKSB7CiAgICBpZiAoaXNCdWZmZXJfMShkYXRhKSkgewogICAgICByZXR1cm4gImJ1ZmZlciI7CiAgICB9CiAgICBpZiAoaGFzVHlwZWRBcnJheXMpIHsKICAgICAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSkpIHsKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0NjRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDY0IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDMyIjsKICAgICAgICBjYXNlICJbb2JqZWN0IEludDhBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQ4IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEludDE2QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiaW50MTYiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQzMiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQ4IjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQxNkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQxNiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50MzIiOwogICAgICAgIGNhc2UgIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDhfY2xhbXBlZCI7CiAgICAgICAgY2FzZSAiW29iamVjdCBCaWdJbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ2ludDY0IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ3VpbnQ2NCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgIHJldHVybiAiYXJyYXkiOwogICAgfQogICAgcmV0dXJuICJnZW5lcmljIjsKICB9CiAgdmFyIENBQ0hFRF9DT05TVFJVQ1RPUlMgPSB7CiAgICAiZmxvYXQzMiI6IFtdLAogICAgImZsb2F0NjQiOiBbXSwKICAgICJpbnQ4IjogW10sCiAgICAiaW50MTYiOiBbXSwKICAgICJpbnQzMiI6IFtdLAogICAgInVpbnQ4IjogW10sCiAgICAidWludDE2IjogW10sCiAgICAidWludDMyIjogW10sCiAgICAiYXJyYXkiOiBbXSwKICAgICJ1aW50OF9jbGFtcGVkIjogW10sCiAgICAiYmlnaW50NjQiOiBbXSwKICAgICJiaWd1aW50NjQiOiBbXSwKICAgICJidWZmZXIiOiBbXSwKICAgICJnZW5lcmljIjogW10KICB9OwogIGZ1bmN0aW9uIHdyYXBwZWROREFycmF5Q3RvcihkYXRhLCBzaGFwZSwgc3RyaWRlLCBvZmZzZXQpIHsKICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIGN0b3IgPSBDQUNIRURfQ09OU1RSVUNUT1JTLmFycmF5WzBdOwogICAgICByZXR1cm4gY3RvcihbXSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAibnVtYmVyIikgewogICAgICBkYXRhID0gW2RhdGFdOwogICAgfQogICAgaWYgKHNoYXBlID09PSB1bmRlZmluZWQpIHsKICAgICAgc2hhcGUgPSBbZGF0YS5sZW5ndGhdOwogICAgfQogICAgdmFyIGQgPSBzaGFwZS5sZW5ndGg7CiAgICBpZiAoc3RyaWRlID09PSB1bmRlZmluZWQpIHsKICAgICAgc3RyaWRlID0gbmV3IEFycmF5KGQpOwogICAgICBmb3IgKHZhciBpID0gZCAtIDEsIHN6ID0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBzdHJpZGVbaV0gPSBzejsKICAgICAgICBzeiAqPSBzaGFwZVtpXTsKICAgICAgfQogICAgfQogICAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIG9mZnNldCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZDsgKytpKSB7CiAgICAgICAgaWYgKHN0cmlkZVtpXSA8IDApIHsKICAgICAgICAgIG9mZnNldCAtPSAoc2hhcGVbaV0gLSAxKSAqIHN0cmlkZVtpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBkdHlwZSA9IGFycmF5RFR5cGUoZGF0YSk7CiAgICB2YXIgY3Rvcl9saXN0ID0gQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV07CiAgICB3aGlsZSAoY3Rvcl9saXN0Lmxlbmd0aCA8PSBkICsgMSkgewogICAgICBjdG9yX2xpc3QucHVzaChjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGN0b3JfbGlzdC5sZW5ndGggLSAxKSk7CiAgICB9CiAgICB2YXIgY3RvciA9IGN0b3JfbGlzdFtkICsgMV07CiAgICByZXR1cm4gY3RvcihkYXRhLCBzaGFwZSwgc3RyaWRlLCBvZmZzZXQpOwogIH0KICB2YXIgbmRhcnJheSA9IHdyYXBwZWROREFycmF5Q3RvcjsKCiAgY2xhc3MgTWFydGluaSB7CiAgICBjb25zdHJ1Y3RvcihncmlkU2l6ZSA9IDI1NykgewogICAgICB0aGlzLmdyaWRTaXplID0gZ3JpZFNpemU7CiAgICAgIGNvbnN0IHRpbGVTaXplID0gZ3JpZFNpemUgLSAxOwogICAgICBpZiAodGlsZVNpemUgJiB0aWxlU2l6ZSAtIDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZ3JpZCBzaXplIHRvIGJlIDJebisxLCBnb3QgJHtncmlkU2l6ZX0uYCk7CiAgICAgIHRoaXMubnVtVHJpYW5nbGVzID0gdGlsZVNpemUgKiB0aWxlU2l6ZSAqIDIgLSAyOwogICAgICB0aGlzLm51bVBhcmVudFRyaWFuZ2xlcyA9IHRoaXMubnVtVHJpYW5nbGVzIC0gdGlsZVNpemUgKiB0aWxlU2l6ZTsKICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuZ3JpZFNpemUgKiB0aGlzLmdyaWRTaXplKTsKCiAgICAgIC8vIGNvb3JkaW5hdGVzIGZvciBhbGwgcG9zc2libGUgdHJpYW5nbGVzIGluIGFuIFJUSU4gdGlsZQogICAgICB0aGlzLmNvb3JkcyA9IG5ldyBVaW50MTZBcnJheSh0aGlzLm51bVRyaWFuZ2xlcyAqIDQpOwoKICAgICAgLy8gZ2V0IHRyaWFuZ2xlIGNvb3JkaW5hdGVzIGZyb20gaXRzIGluZGV4IGluIGFuIGltcGxpY2l0IGJpbmFyeSB0cmVlCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1UcmlhbmdsZXM7IGkrKykgewogICAgICAgIGxldCBpZCA9IGkgKyAyOwogICAgICAgIGxldCBheCA9IDAsCiAgICAgICAgICBheSA9IDAsCiAgICAgICAgICBieCA9IDAsCiAgICAgICAgICBieSA9IDAsCiAgICAgICAgICBjeCA9IDAsCiAgICAgICAgICBjeSA9IDA7CiAgICAgICAgaWYgKGlkICYgMSkgewogICAgICAgICAgYnggPSBieSA9IGN4ID0gdGlsZVNpemU7IC8vIGJvdHRvbS1sZWZ0IHRyaWFuZ2xlCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGF4ID0gYXkgPSBjeSA9IHRpbGVTaXplOyAvLyB0b3AtcmlnaHQgdHJpYW5nbGUKICAgICAgICB9CgogICAgICAgIHdoaWxlICgoaWQgPj49IDEpID4gMSkgewogICAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICAgIGlmIChpZCAmIDEpIHsKICAgICAgICAgICAgLy8gbGVmdCBoYWxmCiAgICAgICAgICAgIGJ4ID0gYXg7CiAgICAgICAgICAgIGJ5ID0gYXk7CiAgICAgICAgICAgIGF4ID0gY3g7CiAgICAgICAgICAgIGF5ID0gY3k7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyByaWdodCBoYWxmCiAgICAgICAgICAgIGF4ID0gYng7CiAgICAgICAgICAgIGF5ID0gYnk7CiAgICAgICAgICAgIGJ4ID0gY3g7CiAgICAgICAgICAgIGJ5ID0gY3k7CiAgICAgICAgICB9CiAgICAgICAgICBjeCA9IG14OwogICAgICAgICAgY3kgPSBteTsKICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IGkgKiA0OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAwXSA9IGF4OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAxXSA9IGF5OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAyXSA9IGJ4OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAzXSA9IGJ5OwogICAgICB9CiAgICB9CiAgICBjcmVhdGVUaWxlKHRlcnJhaW4pIHsKICAgICAgcmV0dXJuIG5ldyBUaWxlKHRlcnJhaW4sIHRoaXMpOwogICAgfQogIH0KICBjbGFzcyBUaWxlIHsKICAgIGNvbnN0cnVjdG9yKHRlcnJhaW4sIG1hcnRpbmkpIHsKICAgICAgY29uc3Qgc2l6ZSA9IG1hcnRpbmkuZ3JpZFNpemU7CiAgICAgIGlmICh0ZXJyYWluLmxlbmd0aCAhPT0gc2l6ZSAqIHNpemUpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGVycmFpbiBkYXRhIG9mIGxlbmd0aCAke3NpemUgKiBzaXplfSAoJHtzaXplfSB4ICR7c2l6ZX0pLCBnb3QgJHt0ZXJyYWluLmxlbmd0aH0uYCk7CiAgICAgIHRoaXMudGVycmFpbiA9IHRlcnJhaW47CiAgICAgIHRoaXMubWFydGluaSA9IG1hcnRpbmk7CiAgICAgIHRoaXMuZXJyb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0ZXJyYWluLmxlbmd0aCk7CiAgICAgIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBudW1UcmlhbmdsZXMsCiAgICAgICAgbnVtUGFyZW50VHJpYW5nbGVzLAogICAgICAgIGNvb3JkcywKICAgICAgICBncmlkU2l6ZTogc2l6ZQogICAgICB9ID0gdGhpcy5tYXJ0aW5pOwogICAgICBjb25zdCB7CiAgICAgICAgdGVycmFpbiwKICAgICAgICBlcnJvcnMKICAgICAgfSA9IHRoaXM7CgogICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHBvc3NpYmxlIHRyaWFuZ2xlcywgc3RhcnRpbmcgZnJvbSB0aGUgc21hbGxlc3QgbGV2ZWwKICAgICAgZm9yIChsZXQgaSA9IG51bVRyaWFuZ2xlcyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgY29uc3QgayA9IGkgKiA0OwogICAgICAgIGNvbnN0IGF4ID0gY29vcmRzW2sgKyAwXTsKICAgICAgICBjb25zdCBheSA9IGNvb3Jkc1trICsgMV07CiAgICAgICAgY29uc3QgYnggPSBjb29yZHNbayArIDJdOwogICAgICAgIGNvbnN0IGJ5ID0gY29vcmRzW2sgKyAzXTsKICAgICAgICBjb25zdCBteCA9IGF4ICsgYnggPj4gMTsKICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICBjb25zdCBjeCA9IG14ICsgbXkgLSBheTsKICAgICAgICBjb25zdCBjeSA9IG15ICsgYXggLSBteDsKCiAgICAgICAgLy8gY2FsY3VsYXRlIGVycm9yIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxvbmcgZWRnZSBvZiB0aGUgdHJpYW5nbGUKICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRIZWlnaHQgPSAodGVycmFpbltheSAqIHNpemUgKyBheF0gKyB0ZXJyYWluW2J5ICogc2l6ZSArIGJ4XSkgLyAyOwogICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gbXkgKiBzaXplICsgbXg7CiAgICAgICAgY29uc3QgbWlkZGxlRXJyb3IgPSBNYXRoLmFicyhpbnRlcnBvbGF0ZWRIZWlnaHQgLSB0ZXJyYWluW21pZGRsZUluZGV4XSk7CiAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIG1pZGRsZUVycm9yKTsKICAgICAgICBpZiAoaSA8IG51bVBhcmVudFRyaWFuZ2xlcykgewogICAgICAgICAgLy8gYmlnZ2VyIHRyaWFuZ2xlczsgYWNjdW11bGF0ZSBlcnJvciB3aXRoIGNoaWxkcmVuCiAgICAgICAgICBjb25zdCBsZWZ0Q2hpbGRJbmRleCA9IChheSArIGN5ID4+IDEpICogc2l6ZSArIChheCArIGN4ID4+IDEpOwogICAgICAgICAgY29uc3QgcmlnaHRDaGlsZEluZGV4ID0gKGJ5ICsgY3kgPj4gMSkgKiBzaXplICsgKGJ4ICsgY3ggPj4gMSk7CiAgICAgICAgICBlcnJvcnNbbWlkZGxlSW5kZXhdID0gTWF0aC5tYXgoZXJyb3JzW21pZGRsZUluZGV4XSwgZXJyb3JzW2xlZnRDaGlsZEluZGV4XSwgZXJyb3JzW3JpZ2h0Q2hpbGRJbmRleF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0TWVzaChtYXhFcnJvciA9IDAsIG1heExlbmd0aCA9IG51bGwpIHsKICAgICAgY29uc3QgewogICAgICAgIGdyaWRTaXplOiBzaXplLAogICAgICAgIGluZGljZXMKICAgICAgfSA9IHRoaXMubWFydGluaTsKICAgICAgY29uc3QgewogICAgICAgIGVycm9ycwogICAgICB9ID0gdGhpczsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDsKICAgICAgbGV0IG51bVRyaWFuZ2xlcyA9IDA7CiAgICAgIGNvbnN0IG1heCA9IHNpemUgLSAxOwoKICAgICAgLy8gVGhlIG1heExlbmd0aCBwYXJhbWV0ZXIgd2lsbCBjYXVzZSB0cmlhbmdsZXMgdG8gYmUgZ2VuZXJhdGVkIHVudGlsIHRoZSBsZWdzIGFyZSBiZWxvdyB0aGlzIGxlbmd0aAogICAgICAvLyBJdCBpcyBtZWFudCB0byBzdXBwb3J0IGNhc2VzIHdoZXJlIGEgY2VydGFpbiBtZXNoIGRlbnNpdHkgaXMgcmVxdWlyZWQgdG8gZG8gc3BoZXJpY2FsIG1hdGggb24gZGlnaXRhbCBnbG9iZXMKICAgICAgY29uc3QgbWF4U2NhbGUgPSBtYXhMZW5ndGggfHwgc2l6ZTsKCiAgICAgIC8vIHVzZSBhbiBpbmRleCBncmlkIHRvIGtlZXAgdHJhY2sgb2YgdmVydGljZXMgdGhhdCB3ZXJlIGFscmVhZHkgdXNlZCB0byBhdm9pZCBkdXBsaWNhdGlvbgogICAgICBpbmRpY2VzLmZpbGwoMCk7CgogICAgICAvLyByZXRyaWV2ZSBtZXNoIGluIHR3byBzdGFnZXMgdGhhdCBib3RoIHRyYXZlcnNlIHRoZSBlcnJvciBtYXA6CiAgICAgIC8vIC0gY291bnRFbGVtZW50czogZmluZCB1c2VkIHZlcnRpY2VzIChhbmQgYXNzaWduIGVhY2ggYW4gaW5kZXgpLCBhbmQgY291bnQgdHJpYW5nbGVzIChmb3IgbWluaW11bSBhbGxvY2F0aW9uKQogICAgICAvLyAtIHByb2Nlc3NUcmlhbmdsZTogZmlsbCB0aGUgYWxsb2NhdGVkIHZlcnRpY2VzICYgdHJpYW5nbGVzIHR5cGVkIGFycmF5cwoKICAgICAgZnVuY3Rpb24gY291bnRFbGVtZW50cyhheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7CiAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgY29uc3QgbGVnTGVuZ3RoID0gTWF0aC5hYnMoYXggLSBjeCkgKyBNYXRoLmFicyhheSAtIGN5KTsKICAgICAgICBpZiAobGVnTGVuZ3RoID4gMSAmJiBlcnJvcnNbbXkgKiBzaXplICsgbXhdID4gbWF4RXJyb3IgfHwgbGVnTGVuZ3RoID4gbWF4U2NhbGUpIHsKICAgICAgICAgIGNvdW50RWxlbWVudHMoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICBjb3VudEVsZW1lbnRzKGJ4LCBieSwgY3gsIGN5LCBteCwgbXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSA9IGluZGljZXNbYXkgKiBzaXplICsgYXhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBudW1UcmlhbmdsZXMrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgY291bnRFbGVtZW50cygwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgY291bnRFbGVtZW50cyhtYXgsIG1heCwgMCwgMCwgMCwgbWF4KTsKICAgICAgY29uc3QgdmVydGljZXMgPSBuZXcgVWludDE2QXJyYXkobnVtVmVydGljZXMgKiAyKTsKICAgICAgY29uc3QgdHJpYW5nbGVzID0gbmV3IFVpbnQzMkFycmF5KG51bVRyaWFuZ2xlcyAqIDMpOwogICAgICBsZXQgdHJpSW5kZXggPSAwOwogICAgICBmdW5jdGlvbiBwcm9jZXNzVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CiAgICAgICAgaWYgKGxlZ0xlbmd0aCA+IDEgJiYgZXJyb3JzW215ICogc2l6ZSArIG14XSA+IG1heEVycm9yIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICAvLyB0cmlhbmdsZSBkb2Vzbid0IGFwcHJveGltYXRlIHRoZSBzdXJmYWNlIHdlbGwgZW5vdWdoOyBkcmlsbCBkb3duIGZ1cnRoZXIKICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShjeCwgY3ksIGF4LCBheSwgbXgsIG15KTsKICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShieCwgYnksIGN4LCBjeSwgbXgsIG15KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gYWRkIGEgdHJpYW5nbGUKICAgICAgICAgIGNvbnN0IGEgPSBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSAtIDE7CiAgICAgICAgICBjb25zdCBiID0gaW5kaWNlc1tieSAqIHNpemUgKyBieF0gLSAxOwogICAgICAgICAgY29uc3QgYyA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIC0gMTsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBhXSA9IGF4OwogICAgICAgICAgdmVydGljZXNbMiAqIGEgKyAxXSA9IGF5OwogICAgICAgICAgdmVydGljZXNbMiAqIGJdID0gYng7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYiArIDFdID0gYnk7CiAgICAgICAgICB2ZXJ0aWNlc1syICogY10gPSBjeDsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBjICsgMV0gPSBjeTsKICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGE7CiAgICAgICAgICB0cmlhbmdsZXNbdHJpSW5kZXgrK10gPSBiOwogICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvY2Vzc1RyaWFuZ2xlKDAsIDAsIG1heCwgbWF4LCBtYXgsIDApOwogICAgICBwcm9jZXNzVHJpYW5nbGUobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVydGljZXMsCiAgICAgICAgdHJpYW5nbGVzCiAgICAgIH07CiAgICB9CiAgfQoKICAvLyBodHRwczovL2dpdGh1Yi5jb20vQ2VzaXVtR1MvY2VzaXVtL2Jsb2IvMS43Ni9Tb3VyY2UvV29ya2Vyc0VTNi9jcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaC5qcwoKICB2YXIgbWFydGluaSA9IG51bGw7CiAgZnVuY3Rpb24gZGVjb2RlVGVycmFpbihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICB2YXIgX21hcnRpbmk7CiAgICB2YXIgaW1hZ2VEYXRhID0gcGFyYW1ldGVycy5pbWFnZURhdGEsCiAgICAgIF9wYXJhbWV0ZXJzJHRpbGVTaXplID0gcGFyYW1ldGVycy50aWxlU2l6ZSwKICAgICAgdGlsZVNpemUgPSBfcGFyYW1ldGVycyR0aWxlU2l6ZSA9PT0gdm9pZCAwID8gMjU2IDogX3BhcmFtZXRlcnMkdGlsZVNpemUsCiAgICAgIGVycm9yTGV2ZWwgPSBwYXJhbWV0ZXJzLmVycm9yTGV2ZWwsCiAgICAgIGludGVydmFsID0gcGFyYW1ldGVycy5pbnRlcnZhbCwKICAgICAgb2Zmc2V0ID0gcGFyYW1ldGVycy5vZmZzZXQ7CiAgICB2YXIgcGl4ZWxzID0gbmRhcnJheShuZXcgVWludDhBcnJheShpbWFnZURhdGEpLCBbdGlsZVNpemUsIHRpbGVTaXplLCA0XSwgWzQsIDQgKiB0aWxlU2l6ZSwgMV0sIDApOwoKICAgIC8vIFRpbGUgc2l6ZSBtdXN0IGJlIG1haW50YWluZWQgdGhyb3VnaCB0aGUgbGlmZSBvZiB0aGUgd29ya2VyCiAgICAoX21hcnRpbmkgPSBtYXJ0aW5pKSAhPT0gbnVsbCAmJiBfbWFydGluaSAhPT0gdm9pZCAwID8gX21hcnRpbmkgOiBtYXJ0aW5pID0gbmV3IE1hcnRpbmkodGlsZVNpemUgKyAxKTsKICAgIHZhciB0ZXJyYWluID0gbWFwYm94VGVycmFpblRvR3JpZChwaXhlbHMsIGludGVydmFsLCBvZmZzZXQpOwogICAgdmFyIHRpbGUgPSBtYXJ0aW5pLmNyZWF0ZVRpbGUodGVycmFpbik7CgogICAgLy8gZ2V0IGEgbWVzaCAodmVydGljZXMgYW5kIHRyaWFuZ2xlcyBpbmRpY2VzKSBmb3IgYSAxMG0gZXJyb3IKICAgIHZhciBtZXNoID0gdGlsZS5nZXRNZXNoKGVycm9yTGV2ZWwsIHBhcmFtZXRlcnMubWF4TGVuZ3RoKTsKICAgIHJldHVybiBjcmVhdGVRdWFudGl6ZWRNZXNoRGF0YSh0aWxlLCBtZXNoLCB0aWxlU2l6ZSk7CiAgfQogIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKG1zZykgewogICAgdmFyIF9tc2ckZGF0YSA9IG1zZy5kYXRhLAogICAgICBpZCA9IF9tc2ckZGF0YS5pZCwKICAgICAgcGF5bG9hZCA9IF9tc2ckZGF0YS5wYXlsb2FkOwogICAgaWYgKGlkID09IG51bGwpIHJldHVybjsKICAgIHZhciBvYmplY3RzID0gW107CiAgICB2YXIgcmVzID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIHJlcyA9IGRlY29kZVRlcnJhaW4ocGF5bG9hZCk7CiAgICAgIG9iamVjdHMucHVzaChyZXMuaW5kaWNlcy5idWZmZXIpOwogICAgICBvYmplY3RzLnB1c2gocmVzLnF1YW50aXplZFZlcnRpY2VzLmJ1ZmZlcik7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGlkOiBpZCwKICAgICAgICBwYXlsb2FkOiByZXMKICAgICAgfSwgb2JqZWN0cyk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGlkLAogICAgICAgIGVycjogZXJyLnRvU3RyaW5nKCkKICAgICAgfSk7CiAgICB9IGZpbmFsbHkgewogICAgICByZXMgPSBudWxsOwogICAgICBvYmplY3RzID0gbnVsbDsKICAgIH0KICB9OwoKICBleHBvcnRzLmRlY29kZVRlcnJhaW4gPSBkZWNvZGVUZXJyYWluOwoKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKICByZXR1cm4gZXhwb3J0czsKCn0pKHt9KTsKCg==', null, false);
481
705
  /* eslint-enable */
482
706
 
483
707
  var resolves = {};
484
708
  var rejects = {};
485
709
  var globalMsgId = 0; // Activate calculation in the worker, returning a promise
486
-
487
710
  function sendMessage(_x, _x2, _x3) {
488
711
  return _sendMessage.apply(this, arguments);
489
712
  } // Handle incoming calculation result
490
-
491
-
492
713
  function _sendMessage() {
493
- _sendMessage = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(worker, payload, transferableObjects) {
714
+ _sendMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(worker, payload, transferableObjects) {
494
715
  var msgId, msg;
495
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
496
- while (1) {
497
- switch (_context2.prev = _context2.next) {
498
- case 0:
499
- msgId = globalMsgId++;
500
- msg = {
501
- id: msgId,
502
- payload: payload
503
- };
504
- return _context2.abrupt("return", new Promise(function (resolve, reject) {
505
- // save callbacks for later
506
- resolves[msgId] = resolve;
507
- rejects[msgId] = reject;
508
- worker.postMessage(msg, transferableObjects);
509
- }));
510
-
511
- case 3:
512
- case "end":
513
- return _context2.stop();
514
- }
716
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
717
+ while (1) switch (_context2.prev = _context2.next) {
718
+ case 0:
719
+ msgId = globalMsgId++;
720
+ msg = {
721
+ id: msgId,
722
+ payload: payload
723
+ };
724
+ return _context2.abrupt("return", new Promise(function (resolve, reject) {
725
+ // save callbacks for later
726
+ resolves[msgId] = resolve;
727
+ rejects[msgId] = reject;
728
+ worker.postMessage(msg, transferableObjects);
729
+ }));
730
+ case 3:
731
+ case "end":
732
+ return _context2.stop();
515
733
  }
516
734
  }, _callee2);
517
735
  }));
518
736
  return _sendMessage.apply(this, arguments);
519
737
  }
520
-
521
738
  function handleMessage(msg) {
522
739
  var _msg$data = msg.data,
523
- id = _msg$data.id,
524
- err = _msg$data.err,
525
- payload = _msg$data.payload;
526
-
740
+ id = _msg$data.id,
741
+ err = _msg$data.err,
742
+ payload = _msg$data.payload;
527
743
  if (payload) {
528
744
  var resolve = resolves[id];
529
-
530
745
  if (resolve) {
531
746
  resolve(payload);
532
747
  }
533
748
  } else {
534
749
  // error condition
535
750
  var reject = rejects[id];
536
-
537
751
  if (reject) {
538
752
  if (err) {
539
753
  reject(err);
@@ -541,70 +755,59 @@ function handleMessage(msg) {
541
755
  reject("Got nothing");
542
756
  }
543
757
  }
544
- } // purge used callbacks
545
-
758
+ }
546
759
 
760
+ // purge used callbacks
547
761
  delete resolves[id];
548
762
  delete rejects[id];
549
763
  }
550
-
551
764
  var WorkerFarm = /*#__PURE__*/function () {
552
765
  function WorkerFarm() {
553
766
  _classCallCheck(this, WorkerFarm);
554
-
555
- _defineProperty(this, "worker", void 0);
556
-
557
767
  this.worker = new WorkerFactory();
558
768
  this.worker.onmessage = handleMessage;
559
769
  }
560
-
561
770
  _createClass(WorkerFarm, [{
562
771
  key: "scheduleTask",
563
772
  value: function () {
564
- var _scheduleTask = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(params, transferableObjects) {
565
- return regeneratorRuntime.wrap(function _callee$(_context) {
566
- while (1) {
567
- switch (_context.prev = _context.next) {
568
- case 0:
569
- _context.next = 2;
570
- return sendMessage(this.worker, params, transferableObjects);
571
-
572
- case 2:
573
- return _context.abrupt("return", _context.sent);
574
-
575
- case 3:
576
- case "end":
577
- return _context.stop();
578
- }
773
+ var _scheduleTask = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, transferableObjects) {
774
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
775
+ while (1) switch (_context.prev = _context.next) {
776
+ case 0:
777
+ _context.next = 2;
778
+ return sendMessage(this.worker, params, transferableObjects);
779
+ case 2:
780
+ return _context.abrupt("return", _context.sent);
781
+ case 3:
782
+ case "end":
783
+ return _context.stop();
579
784
  }
580
785
  }, _callee, this);
581
786
  }));
582
-
583
787
  function scheduleTask(_x4, _x5) {
584
788
  return _scheduleTask.apply(this, arguments);
585
789
  }
586
-
587
790
  return scheduleTask;
588
791
  }()
589
792
  }]);
590
-
591
793
  return WorkerFarm;
592
794
  }();
593
795
 
594
796
  // We should save these
595
797
  //const canvas = new OffscreenCanvas(256, 256);
596
798
  //const ctx = canvas.getContext("2d");
799
+
597
800
  function mapboxTerrainToGrid(png, interval, offset) {
598
801
  var _interval, _offset;
599
-
600
802
  // maybe we should do this on the GPU using REGL?
601
803
  // but that would require GPU -> CPU -> GPU
602
804
  var gridSize = png.shape[0] + 1;
603
805
  var terrain = new Float32Array(gridSize * gridSize);
604
806
  var tileSize = png.shape[0];
605
807
  interval = (_interval = interval) !== null && _interval !== void 0 ? _interval : 0.1;
606
- offset = (_offset = offset) !== null && _offset !== void 0 ? _offset : -10000; // decode terrain values
808
+ offset = (_offset = offset) !== null && _offset !== void 0 ? _offset : -10000;
607
809
 
810
+ // decode terrain values
608
811
  for (var y = 0; y < tileSize; y++) {
609
812
  for (var x = 0; x < tileSize; x++) {
610
813
  var yc = y;
@@ -613,20 +816,16 @@ function mapboxTerrainToGrid(png, interval, offset) {
613
816
  var b = png.get(x, yc, 2);
614
817
  terrain[y * gridSize + x] = r * 256 * 256 * interval + g * 256.0 * interval + b * interval + offset;
615
818
  }
616
- } // backfill right and bottom borders
617
-
618
-
819
+ }
820
+ // backfill right and bottom borders
619
821
  for (var _x = 0; _x < gridSize - 1; _x++) {
620
822
  terrain[gridSize * (gridSize - 1) + _x] = terrain[gridSize * (gridSize - 2) + _x];
621
823
  }
622
-
623
824
  for (var _y = 0; _y < gridSize; _y++) {
624
825
  terrain[gridSize * _y + gridSize - 1] = terrain[gridSize * _y + gridSize - 2];
625
826
  }
626
-
627
827
  return terrain;
628
828
  }
629
-
630
829
  function _emptyMesh(n) {
631
830
  n = Math.max(n, 2);
632
831
  var nTriangles = Math.pow(n - 1, 2) * 2;
@@ -638,12 +837,9 @@ function _emptyMesh(n) {
638
837
  var eastIndices = [];
639
838
  var northIndices = [];
640
839
  var tix = 0;
641
-
642
840
  for (var i = 0; i < nVertices; i++) {
643
841
  var rx = i % n; //* 32767) / (n - 1);
644
-
645
842
  var ry = Math.floor(i / n); //* 32767) / (n - 1);
646
-
647
843
  var ix = n * rx + ry;
648
844
  quantizedVertices[ix] = rx * 32768 / (n - 1);
649
845
  quantizedVertices[nVertices + ix] = ry * 32768 / (n - 1);
@@ -651,17 +847,16 @@ function _emptyMesh(n) {
651
847
  if (ry == 0) westIndices.push(ix);
652
848
  if (rx == 0) southIndices.push(ix);
653
849
  if (rx == n - 1) eastIndices.push(ix);
654
- if (ry == n - 1) northIndices.push(ix); // Add triangles
850
+ if (ry == n - 1) northIndices.push(ix);
655
851
 
852
+ // Add triangles
656
853
  var rix = i - ry * n;
657
-
658
854
  if (rix != n - 1) {
659
855
  indices[tix * 3] = i;
660
856
  indices[tix * 3 + 1] = i + n + 1;
661
857
  indices[tix * 3 + 2] = i + 1;
662
858
  tix++;
663
859
  }
664
-
665
860
  if (rix != 0) {
666
861
  indices[tix * 3] = i - 1;
667
862
  indices[tix * 3 + 1] = i + n - 1;
@@ -669,7 +864,6 @@ function _emptyMesh(n) {
669
864
  tix++;
670
865
  }
671
866
  }
672
-
673
867
  return {
674
868
  minimumHeight: 0,
675
869
  maximumHeight: 0,
@@ -681,7 +875,6 @@ function _emptyMesh(n) {
681
875
  northIndices: northIndices
682
876
  };
683
877
  }
684
-
685
878
  var _meshCache = [];
686
879
  function emptyMesh(n) {
687
880
  // A memoized function to return empty meshes
@@ -689,12 +882,10 @@ function emptyMesh(n) {
689
882
  return _meshCache[n];
690
883
  } else {
691
884
  var result = _emptyMesh(n);
692
-
693
885
  _meshCache[n] = result;
694
886
  return result;
695
887
  }
696
888
  }
697
-
698
889
  function createQuantizedMeshData(tile, mesh, tileSize) {
699
890
  var xvals = [];
700
891
  var yvals = [];
@@ -706,7 +897,6 @@ function createQuantizedMeshData(tile, mesh, tileSize) {
706
897
  var minimumHeight = Infinity;
707
898
  var maximumHeight = -Infinity;
708
899
  var scalar = 32768.0 / tileSize;
709
-
710
900
  for (var ix = 0; ix < mesh.vertices.length / 2; ix++) {
711
901
  var vertexIx = ix;
712
902
  var px = mesh.vertices[ix * 2];
@@ -724,7 +914,6 @@ function createQuantizedMeshData(tile, mesh, tileSize) {
724
914
  xvals.push(xv);
725
915
  yvals.push(yv);
726
916
  }
727
-
728
917
  var heightRange = maximumHeight - minimumHeight;
729
918
  var heights = heightMeters.map(function (d) {
730
919
  if (heightRange < 1) return 0;
@@ -732,7 +921,9 @@ function createQuantizedMeshData(tile, mesh, tileSize) {
732
921
  });
733
922
  var triangles = new Uint16Array(mesh.triangles);
734
923
  var quantizedVertices = new Uint16Array( //verts
735
- [].concat(xvals, yvals, _toConsumableArray(heights))); // SE NW NE
924
+ [].concat(xvals, yvals, _toConsumableArray(heights)));
925
+
926
+ // SE NW NE
736
927
  // NE NW SE
737
928
 
738
929
  return {
@@ -747,409 +938,36 @@ function createQuantizedMeshData(tile, mesh, tileSize) {
747
938
  };
748
939
  }
749
940
 
750
- function iota(n) {
751
- var result = new Array(n);
752
- for(var i=0; i<n; ++i) {
753
- result[i] = i;
754
- }
755
- return result
756
- }
757
-
758
- var iota_1 = iota;
759
-
760
- /*!
761
- * Determine if an object is a Buffer
762
- *
763
- * @author Feross Aboukhadijeh <https://feross.org>
764
- * @license MIT
765
- */
766
- // The _isBuffer check is for Safari 5-7 support, because it's missing
767
- // Object.prototype.constructor. Remove this eventually
768
- var isBuffer_1 = function (obj) {
769
- return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
770
- };
771
-
772
- function isBuffer (obj) {
773
- return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
774
- }
775
-
776
- // For Node v0.10 support. Remove this eventually.
777
- function isSlowBuffer (obj) {
778
- return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
779
- }
780
-
781
- var hasTypedArrays = ((typeof Float64Array) !== "undefined");
782
-
783
- function compare1st(a, b) {
784
- return a[0] - b[0]
785
- }
786
-
787
- function order() {
788
- var stride = this.stride;
789
- var terms = new Array(stride.length);
790
- var i;
791
- for(i=0; i<terms.length; ++i) {
792
- terms[i] = [Math.abs(stride[i]), i];
793
- }
794
- terms.sort(compare1st);
795
- var result = new Array(terms.length);
796
- for(i=0; i<result.length; ++i) {
797
- result[i] = terms[i][1];
798
- }
799
- return result
800
- }
801
-
802
- function compileConstructor(dtype, dimension) {
803
- var className = ["View", dimension, "d", dtype].join("");
804
- if(dimension < 0) {
805
- className = "View_Nil" + dtype;
806
- }
807
- var useGetters = (dtype === "generic");
808
-
809
- if(dimension === -1) {
810
- //Special case for trivial arrays
811
- var code =
812
- "function "+className+"(a){this.data=a;};\
813
- var proto="+className+".prototype;\
814
- proto.dtype='"+dtype+"';\
815
- proto.index=function(){return -1};\
816
- proto.size=0;\
817
- proto.dimension=-1;\
818
- proto.shape=proto.stride=proto.order=[];\
819
- proto.lo=proto.hi=proto.transpose=proto.step=\
820
- function(){return new "+className+"(this.data);};\
821
- proto.get=proto.set=function(){};\
822
- proto.pick=function(){return null};\
823
- return function construct_"+className+"(a){return new "+className+"(a);}";
824
- var procedure = new Function(code);
825
- return procedure()
826
- } else if(dimension === 0) {
827
- //Special case for 0d arrays
828
- var code =
829
- "function "+className+"(a,d) {\
830
- this.data = a;\
831
- this.offset = d\
832
- };\
833
- var proto="+className+".prototype;\
834
- proto.dtype='"+dtype+"';\
835
- proto.index=function(){return this.offset};\
836
- proto.dimension=0;\
837
- proto.size=1;\
838
- proto.shape=\
839
- proto.stride=\
840
- proto.order=[];\
841
- proto.lo=\
842
- proto.hi=\
843
- proto.transpose=\
844
- proto.step=function "+className+"_copy() {\
845
- return new "+className+"(this.data,this.offset)\
846
- };\
847
- proto.pick=function "+className+"_pick(){\
848
- return TrivialArray(this.data);\
849
- };\
850
- proto.valueOf=proto.get=function "+className+"_get(){\
851
- return "+(useGetters ? "this.data.get(this.offset)" : "this.data[this.offset]")+
852
- "};\
853
- proto.set=function "+className+"_set(v){\
854
- return "+(useGetters ? "this.data.set(this.offset,v)" : "this.data[this.offset]=v")+"\
855
- };\
856
- return function construct_"+className+"(a,b,c,d){return new "+className+"(a,d)}";
857
- var procedure = new Function("TrivialArray", code);
858
- return procedure(CACHED_CONSTRUCTORS[dtype][0])
859
- }
860
-
861
- var code = ["'use strict'"];
862
-
863
- //Create constructor for view
864
- var indices = iota_1(dimension);
865
- var args = indices.map(function(i) { return "i"+i });
866
- var index_str = "this.offset+" + indices.map(function(i) {
867
- return "this.stride[" + i + "]*i" + i
868
- }).join("+");
869
- var shapeArg = indices.map(function(i) {
870
- return "b"+i
871
- }).join(",");
872
- var strideArg = indices.map(function(i) {
873
- return "c"+i
874
- }).join(",");
875
- code.push(
876
- "function "+className+"(a," + shapeArg + "," + strideArg + ",d){this.data=a",
877
- "this.shape=[" + shapeArg + "]",
878
- "this.stride=[" + strideArg + "]",
879
- "this.offset=d|0}",
880
- "var proto="+className+".prototype",
881
- "proto.dtype='"+dtype+"'",
882
- "proto.dimension="+dimension);
941
+ class Martini {
942
+ constructor(gridSize = 257) {
943
+ this.gridSize = gridSize;
944
+ const tileSize = gridSize - 1;
945
+ if (tileSize & tileSize - 1) throw new Error(`Expected grid size to be 2^n+1, got ${gridSize}.`);
946
+ this.numTriangles = tileSize * tileSize * 2 - 2;
947
+ this.numParentTriangles = this.numTriangles - tileSize * tileSize;
948
+ this.indices = new Uint32Array(this.gridSize * this.gridSize);
883
949
 
884
- //view.size:
885
- code.push("Object.defineProperty(proto,'size',{get:function "+className+"_size(){\
886
- return "+indices.map(function(i) { return "this.shape["+i+"]" }).join("*"),
887
- "}})");
950
+ // coordinates for all possible triangles in an RTIN tile
951
+ this.coords = new Uint16Array(this.numTriangles * 4);
888
952
 
889
- //view.order:
890
- if(dimension === 1) {
891
- code.push("proto.order=[0]");
892
- } else {
893
- code.push("Object.defineProperty(proto,'order',{get:");
894
- if(dimension < 4) {
895
- code.push("function "+className+"_order(){");
896
- if(dimension === 2) {
897
- code.push("return (Math.abs(this.stride[0])>Math.abs(this.stride[1]))?[1,0]:[0,1]}})");
898
- } else if(dimension === 3) {
899
- code.push(
900
- "var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);\
901
- if(s0>s1){\
902
- if(s1>s2){\
903
- return [2,1,0];\
904
- }else if(s0>s2){\
905
- return [1,2,0];\
906
- }else{\
907
- return [1,0,2];\
908
- }\
909
- }else if(s0>s2){\
910
- return [2,0,1];\
911
- }else if(s2>s1){\
912
- return [0,1,2];\
913
- }else{\
914
- return [0,2,1];\
915
- }}})");
916
- }
917
- } else {
918
- code.push("ORDER})");
919
- }
920
- }
921
-
922
- //view.set(i0, ..., v):
923
- code.push(
924
- "proto.set=function "+className+"_set("+args.join(",")+",v){");
925
- if(useGetters) {
926
- code.push("return this.data.set("+index_str+",v)}");
927
- } else {
928
- code.push("return this.data["+index_str+"]=v}");
929
- }
930
-
931
- //view.get(i0, ...):
932
- code.push("proto.get=function "+className+"_get("+args.join(",")+"){");
933
- if(useGetters) {
934
- code.push("return this.data.get("+index_str+")}");
935
- } else {
936
- code.push("return this.data["+index_str+"]}");
937
- }
938
-
939
- //view.index:
940
- code.push(
941
- "proto.index=function "+className+"_index(", args.join(), "){return "+index_str+"}");
942
-
943
- //view.hi():
944
- code.push("proto.hi=function "+className+"_hi("+args.join(",")+"){return new "+className+"(this.data,"+
945
- indices.map(function(i) {
946
- return ["(typeof i",i,"!=='number'||i",i,"<0)?this.shape[", i, "]:i", i,"|0"].join("")
947
- }).join(",")+","+
948
- indices.map(function(i) {
949
- return "this.stride["+i + "]"
950
- }).join(",")+",this.offset)}");
951
-
952
- //view.lo():
953
- var a_vars = indices.map(function(i) { return "a"+i+"=this.shape["+i+"]" });
954
- var c_vars = indices.map(function(i) { return "c"+i+"=this.stride["+i+"]" });
955
- code.push("proto.lo=function "+className+"_lo("+args.join(",")+"){var b=this.offset,d=0,"+a_vars.join(",")+","+c_vars.join(","));
956
- for(var i=0; i<dimension; ++i) {
957
- code.push(
958
- "if(typeof i"+i+"==='number'&&i"+i+">=0){\
959
- d=i"+i+"|0;\
960
- b+=c"+i+"*d;\
961
- a"+i+"-=d}");
962
- }
963
- code.push("return new "+className+"(this.data,"+
964
- indices.map(function(i) {
965
- return "a"+i
966
- }).join(",")+","+
967
- indices.map(function(i) {
968
- return "c"+i
969
- }).join(",")+",b)}");
970
-
971
- //view.step():
972
- code.push("proto.step=function "+className+"_step("+args.join(",")+"){var "+
973
- indices.map(function(i) {
974
- return "a"+i+"=this.shape["+i+"]"
975
- }).join(",")+","+
976
- indices.map(function(i) {
977
- return "b"+i+"=this.stride["+i+"]"
978
- }).join(",")+",c=this.offset,d=0,ceil=Math.ceil");
979
- for(var i=0; i<dimension; ++i) {
980
- code.push(
981
- "if(typeof i"+i+"==='number'){\
982
- d=i"+i+"|0;\
983
- if(d<0){\
984
- c+=b"+i+"*(a"+i+"-1);\
985
- a"+i+"=ceil(-a"+i+"/d)\
986
- }else{\
987
- a"+i+"=ceil(a"+i+"/d)\
988
- }\
989
- b"+i+"*=d\
990
- }");
991
- }
992
- code.push("return new "+className+"(this.data,"+
993
- indices.map(function(i) {
994
- return "a" + i
995
- }).join(",")+","+
996
- indices.map(function(i) {
997
- return "b" + i
998
- }).join(",")+",c)}");
999
-
1000
- //view.transpose():
1001
- var tShape = new Array(dimension);
1002
- var tStride = new Array(dimension);
1003
- for(var i=0; i<dimension; ++i) {
1004
- tShape[i] = "a[i"+i+"]";
1005
- tStride[i] = "b[i"+i+"]";
1006
- }
1007
- code.push("proto.transpose=function "+className+"_transpose("+args+"){"+
1008
- args.map(function(n,idx) { return n + "=(" + n + "===undefined?" + idx + ":" + n + "|0)"}).join(";"),
1009
- "var a=this.shape,b=this.stride;return new "+className+"(this.data,"+tShape.join(",")+","+tStride.join(",")+",this.offset)}");
1010
-
1011
- //view.pick():
1012
- code.push("proto.pick=function "+className+"_pick("+args+"){var a=[],b=[],c=this.offset");
1013
- for(var i=0; i<dimension; ++i) {
1014
- code.push("if(typeof i"+i+"==='number'&&i"+i+">=0){c=(c+this.stride["+i+"]*i"+i+")|0}else{a.push(this.shape["+i+"]);b.push(this.stride["+i+"])}");
1015
- }
1016
- code.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}");
1017
-
1018
- //Add return statement
1019
- code.push("return function construct_"+className+"(data,shape,stride,offset){return new "+className+"(data,"+
1020
- indices.map(function(i) {
1021
- return "shape["+i+"]"
1022
- }).join(",")+","+
1023
- indices.map(function(i) {
1024
- return "stride["+i+"]"
1025
- }).join(",")+",offset)}");
1026
-
1027
- //Compile procedure
1028
- var procedure = new Function("CTOR_LIST", "ORDER", code.join("\n"));
1029
- return procedure(CACHED_CONSTRUCTORS[dtype], order)
1030
- }
1031
-
1032
- function arrayDType(data) {
1033
- if(isBuffer_1(data)) {
1034
- return "buffer"
1035
- }
1036
- if(hasTypedArrays) {
1037
- switch(Object.prototype.toString.call(data)) {
1038
- case "[object Float64Array]":
1039
- return "float64"
1040
- case "[object Float32Array]":
1041
- return "float32"
1042
- case "[object Int8Array]":
1043
- return "int8"
1044
- case "[object Int16Array]":
1045
- return "int16"
1046
- case "[object Int32Array]":
1047
- return "int32"
1048
- case "[object Uint8Array]":
1049
- return "uint8"
1050
- case "[object Uint16Array]":
1051
- return "uint16"
1052
- case "[object Uint32Array]":
1053
- return "uint32"
1054
- case "[object Uint8ClampedArray]":
1055
- return "uint8_clamped"
1056
- case "[object BigInt64Array]":
1057
- return "bigint64"
1058
- case "[object BigUint64Array]":
1059
- return "biguint64"
1060
- }
1061
- }
1062
- if(Array.isArray(data)) {
1063
- return "array"
1064
- }
1065
- return "generic"
1066
- }
1067
-
1068
- var CACHED_CONSTRUCTORS = {
1069
- "float32":[],
1070
- "float64":[],
1071
- "int8":[],
1072
- "int16":[],
1073
- "int32":[],
1074
- "uint8":[],
1075
- "uint16":[],
1076
- "uint32":[],
1077
- "array":[],
1078
- "uint8_clamped":[],
1079
- "bigint64": [],
1080
- "biguint64": [],
1081
- "buffer":[],
1082
- "generic":[]
1083
- }
1084
-
1085
- ;
1086
- function wrappedNDArrayCtor(data, shape, stride, offset) {
1087
- if(data === undefined) {
1088
- var ctor = CACHED_CONSTRUCTORS.array[0];
1089
- return ctor([])
1090
- } else if(typeof data === "number") {
1091
- data = [data];
1092
- }
1093
- if(shape === undefined) {
1094
- shape = [ data.length ];
1095
- }
1096
- var d = shape.length;
1097
- if(stride === undefined) {
1098
- stride = new Array(d);
1099
- for(var i=d-1, sz=1; i>=0; --i) {
1100
- stride[i] = sz;
1101
- sz *= shape[i];
1102
- }
1103
- }
1104
- if(offset === undefined) {
1105
- offset = 0;
1106
- for(var i=0; i<d; ++i) {
1107
- if(stride[i] < 0) {
1108
- offset -= (shape[i]-1)*stride[i];
1109
- }
1110
- }
1111
- }
1112
- var dtype = arrayDType(data);
1113
- var ctor_list = CACHED_CONSTRUCTORS[dtype];
1114
- while(ctor_list.length <= d+1) {
1115
- ctor_list.push(compileConstructor(dtype, ctor_list.length-1));
1116
- }
1117
- var ctor = ctor_list[d+1];
1118
- return ctor(data, shape, stride, offset)
1119
- }
1120
-
1121
- var ndarray = wrappedNDArrayCtor;
1122
-
1123
- class Martini {
1124
- constructor(gridSize = 257) {
1125
- this.gridSize = gridSize;
1126
- const tileSize = gridSize - 1;
1127
- if (tileSize & tileSize - 1) throw new Error(`Expected grid size to be 2^n+1, got ${gridSize}.`);
1128
- this.numTriangles = tileSize * tileSize * 2 - 2;
1129
- this.numParentTriangles = this.numTriangles - tileSize * tileSize;
1130
- this.indices = new Uint32Array(this.gridSize * this.gridSize); // coordinates for all possible triangles in an RTIN tile
1131
-
1132
- this.coords = new Uint16Array(this.numTriangles * 4); // get triangle coordinates from its index in an implicit binary tree
1133
-
1134
- for (let i = 0; i < this.numTriangles; i++) {
1135
- let id = i + 2;
1136
- let ax = 0,
1137
- ay = 0,
1138
- bx = 0,
1139
- by = 0,
1140
- cx = 0,
1141
- cy = 0;
1142
-
1143
- if (id & 1) {
1144
- bx = by = cx = tileSize; // bottom-left triangle
1145
- } else {
1146
- ax = ay = cy = tileSize; // top-right triangle
953
+ // get triangle coordinates from its index in an implicit binary tree
954
+ for (let i = 0; i < this.numTriangles; i++) {
955
+ let id = i + 2;
956
+ let ax = 0,
957
+ ay = 0,
958
+ bx = 0,
959
+ by = 0,
960
+ cx = 0,
961
+ cy = 0;
962
+ if (id & 1) {
963
+ bx = by = cx = tileSize; // bottom-left triangle
964
+ } else {
965
+ ax = ay = cy = tileSize; // top-right triangle
1147
966
  }
1148
967
 
1149
968
  while ((id >>= 1) > 1) {
1150
969
  const mx = ax + bx >> 1;
1151
970
  const my = ay + by >> 1;
1152
-
1153
971
  if (id & 1) {
1154
972
  // left half
1155
973
  bx = ax;
@@ -1163,11 +981,9 @@ class Martini {
1163
981
  bx = cx;
1164
982
  by = cy;
1165
983
  }
1166
-
1167
984
  cx = mx;
1168
985
  cy = my;
1169
986
  }
1170
-
1171
987
  const k = i * 4;
1172
988
  this.coords[k + 0] = ax;
1173
989
  this.coords[k + 1] = ay;
@@ -1175,13 +991,10 @@ class Martini {
1175
991
  this.coords[k + 3] = by;
1176
992
  }
1177
993
  }
1178
-
1179
994
  createTile(terrain) {
1180
995
  return new Tile(terrain, this);
1181
996
  }
1182
-
1183
997
  }
1184
-
1185
998
  class Tile {
1186
999
  constructor(terrain, martini) {
1187
1000
  const size = martini.gridSize;
@@ -1191,7 +1004,6 @@ class Tile {
1191
1004
  this.errors = new Float32Array(terrain.length);
1192
1005
  this.update();
1193
1006
  }
1194
-
1195
1007
  update() {
1196
1008
  const {
1197
1009
  numTriangles,
@@ -1202,8 +1014,9 @@ class Tile {
1202
1014
  const {
1203
1015
  terrain,
1204
1016
  errors
1205
- } = this; // iterate over all possible triangles, starting from the smallest level
1017
+ } = this;
1206
1018
 
1019
+ // iterate over all possible triangles, starting from the smallest level
1207
1020
  for (let i = numTriangles - 1; i >= 0; i--) {
1208
1021
  const k = i * 4;
1209
1022
  const ax = coords[k + 0];
@@ -1213,13 +1026,13 @@ class Tile {
1213
1026
  const mx = ax + bx >> 1;
1214
1027
  const my = ay + by >> 1;
1215
1028
  const cx = mx + my - ay;
1216
- const cy = my + ax - mx; // calculate error in the middle of the long edge of the triangle
1029
+ const cy = my + ax - mx;
1217
1030
 
1031
+ // calculate error in the middle of the long edge of the triangle
1218
1032
  const interpolatedHeight = (terrain[ay * size + ax] + terrain[by * size + bx]) / 2;
1219
1033
  const middleIndex = my * size + mx;
1220
1034
  const middleError = Math.abs(interpolatedHeight - terrain[middleIndex]);
1221
1035
  errors[middleIndex] = Math.max(errors[middleIndex], middleError);
1222
-
1223
1036
  if (i < numParentTriangles) {
1224
1037
  // bigger triangles; accumulate error with children
1225
1038
  const leftChildIndex = (ay + cy >> 1) * size + (ax + cx >> 1);
@@ -1228,7 +1041,6 @@ class Tile {
1228
1041
  }
1229
1042
  }
1230
1043
  }
1231
-
1232
1044
  getMesh(maxError = 0, maxLength = null) {
1233
1045
  const {
1234
1046
  gridSize: size,
@@ -1239,12 +1051,16 @@ class Tile {
1239
1051
  } = this;
1240
1052
  let numVertices = 0;
1241
1053
  let numTriangles = 0;
1242
- const max = size - 1; // The maxLength parameter will cause triangles to be generated until the legs are below this length
1054
+ const max = size - 1;
1055
+
1056
+ // The maxLength parameter will cause triangles to be generated until the legs are below this length
1243
1057
  // It is meant to support cases where a certain mesh density is required to do spherical math on digital globes
1058
+ const maxScale = maxLength || size;
1244
1059
 
1245
- const maxScale = maxLength || size; // use an index grid to keep track of vertices that were already used to avoid duplication
1060
+ // use an index grid to keep track of vertices that were already used to avoid duplication
1061
+ indices.fill(0);
1246
1062
 
1247
- indices.fill(0); // retrieve mesh in two stages that both traverse the error map:
1063
+ // retrieve mesh in two stages that both traverse the error map:
1248
1064
  // - countElements: find used vertices (and assign each an index), and count triangles (for minimum allocation)
1249
1065
  // - processTriangle: fill the allocated vertices & triangles typed arrays
1250
1066
 
@@ -1252,7 +1068,6 @@ class Tile {
1252
1068
  const mx = ax + bx >> 1;
1253
1069
  const my = ay + by >> 1;
1254
1070
  const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
1255
-
1256
1071
  if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
1257
1072
  countElements(cx, cy, ax, ay, mx, my);
1258
1073
  countElements(bx, by, cx, cy, mx, my);
@@ -1263,18 +1078,15 @@ class Tile {
1263
1078
  numTriangles++;
1264
1079
  }
1265
1080
  }
1266
-
1267
1081
  countElements(0, 0, max, max, max, 0);
1268
1082
  countElements(max, max, 0, 0, 0, max);
1269
1083
  const vertices = new Uint16Array(numVertices * 2);
1270
1084
  const triangles = new Uint32Array(numTriangles * 3);
1271
1085
  let triIndex = 0;
1272
-
1273
1086
  function processTriangle(ax, ay, bx, by, cx, cy) {
1274
1087
  const mx = ax + bx >> 1;
1275
1088
  const my = ay + by >> 1;
1276
1089
  const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
1277
-
1278
1090
  if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
1279
1091
  // triangle doesn't approximate the surface well enough; drill down further
1280
1092
  processTriangle(cx, cy, ax, ay, mx, my);
@@ -1295,7 +1107,6 @@ class Tile {
1295
1107
  triangles[triIndex++] = c;
1296
1108
  }
1297
1109
  }
1298
-
1299
1110
  processTriangle(0, 0, max, max, max, 0);
1300
1111
  processTriangle(max, max, 0, 0, 0, max);
1301
1112
  return {
@@ -1303,799 +1114,37 @@ class Tile {
1303
1114
  triangles
1304
1115
  };
1305
1116
  }
1306
-
1307
1117
  }
1308
1118
 
1309
- function createCommonjsModule(fn) {
1310
- var module = { exports: {} };
1311
- return fn(module, module.exports), module.exports;
1312
- }
1313
-
1314
- /**
1315
- * Copyright (c) 2014-present, Facebook, Inc.
1316
- *
1317
- * This source code is licensed under the MIT license found in the
1318
- * LICENSE file in the root directory of this source tree.
1319
- */
1320
-
1321
- createCommonjsModule(function (module) {
1322
- var runtime = (function (exports) {
1323
-
1324
- var Op = Object.prototype;
1325
- var hasOwn = Op.hasOwnProperty;
1326
- var undefined$1; // More compressible than void 0.
1327
- var $Symbol = typeof Symbol === "function" ? Symbol : {};
1328
- var iteratorSymbol = $Symbol.iterator || "@@iterator";
1329
- var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
1330
- var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
1331
-
1332
- function define(obj, key, value) {
1333
- Object.defineProperty(obj, key, {
1334
- value: value,
1335
- enumerable: true,
1336
- configurable: true,
1337
- writable: true
1338
- });
1339
- return obj[key];
1340
- }
1341
- try {
1342
- // IE 8 has a broken Object.defineProperty that only works on DOM objects.
1343
- define({}, "");
1344
- } catch (err) {
1345
- define = function(obj, key, value) {
1346
- return obj[key] = value;
1347
- };
1348
- }
1349
-
1350
- function wrap(innerFn, outerFn, self, tryLocsList) {
1351
- // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
1352
- var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
1353
- var generator = Object.create(protoGenerator.prototype);
1354
- var context = new Context(tryLocsList || []);
1355
-
1356
- // The ._invoke method unifies the implementations of the .next,
1357
- // .throw, and .return methods.
1358
- generator._invoke = makeInvokeMethod(innerFn, self, context);
1359
-
1360
- return generator;
1361
- }
1362
- exports.wrap = wrap;
1363
-
1364
- // Try/catch helper to minimize deoptimizations. Returns a completion
1365
- // record like context.tryEntries[i].completion. This interface could
1366
- // have been (and was previously) designed to take a closure to be
1367
- // invoked without arguments, but in all the cases we care about we
1368
- // already have an existing method we want to call, so there's no need
1369
- // to create a new function object. We can even get away with assuming
1370
- // the method takes exactly one argument, since that happens to be true
1371
- // in every case, so we don't have to touch the arguments object. The
1372
- // only additional allocation required is the completion record, which
1373
- // has a stable shape and so hopefully should be cheap to allocate.
1374
- function tryCatch(fn, obj, arg) {
1375
- try {
1376
- return { type: "normal", arg: fn.call(obj, arg) };
1377
- } catch (err) {
1378
- return { type: "throw", arg: err };
1379
- }
1380
- }
1381
-
1382
- var GenStateSuspendedStart = "suspendedStart";
1383
- var GenStateSuspendedYield = "suspendedYield";
1384
- var GenStateExecuting = "executing";
1385
- var GenStateCompleted = "completed";
1386
-
1387
- // Returning this object from the innerFn has the same effect as
1388
- // breaking out of the dispatch switch statement.
1389
- var ContinueSentinel = {};
1390
-
1391
- // Dummy constructor functions that we use as the .constructor and
1392
- // .constructor.prototype properties for functions that return Generator
1393
- // objects. For full spec compliance, you may wish to configure your
1394
- // minifier not to mangle the names of these two functions.
1395
- function Generator() {}
1396
- function GeneratorFunction() {}
1397
- function GeneratorFunctionPrototype() {}
1398
-
1399
- // This is a polyfill for %IteratorPrototype% for environments that
1400
- // don't natively support it.
1401
- var IteratorPrototype = {};
1402
- define(IteratorPrototype, iteratorSymbol, function () {
1403
- return this;
1404
- });
1405
-
1406
- var getProto = Object.getPrototypeOf;
1407
- var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
1408
- if (NativeIteratorPrototype &&
1409
- NativeIteratorPrototype !== Op &&
1410
- hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
1411
- // This environment has a native %IteratorPrototype%; use it instead
1412
- // of the polyfill.
1413
- IteratorPrototype = NativeIteratorPrototype;
1414
- }
1415
-
1416
- var Gp = GeneratorFunctionPrototype.prototype =
1417
- Generator.prototype = Object.create(IteratorPrototype);
1418
- GeneratorFunction.prototype = GeneratorFunctionPrototype;
1419
- define(Gp, "constructor", GeneratorFunctionPrototype);
1420
- define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
1421
- GeneratorFunction.displayName = define(
1422
- GeneratorFunctionPrototype,
1423
- toStringTagSymbol,
1424
- "GeneratorFunction"
1425
- );
1426
-
1427
- // Helper for defining the .next, .throw, and .return methods of the
1428
- // Iterator interface in terms of a single ._invoke method.
1429
- function defineIteratorMethods(prototype) {
1430
- ["next", "throw", "return"].forEach(function(method) {
1431
- define(prototype, method, function(arg) {
1432
- return this._invoke(method, arg);
1433
- });
1434
- });
1435
- }
1436
-
1437
- exports.isGeneratorFunction = function(genFun) {
1438
- var ctor = typeof genFun === "function" && genFun.constructor;
1439
- return ctor
1440
- ? ctor === GeneratorFunction ||
1441
- // For the native GeneratorFunction constructor, the best we can
1442
- // do is to check its .name property.
1443
- (ctor.displayName || ctor.name) === "GeneratorFunction"
1444
- : false;
1445
- };
1446
-
1447
- exports.mark = function(genFun) {
1448
- if (Object.setPrototypeOf) {
1449
- Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
1450
- } else {
1451
- genFun.__proto__ = GeneratorFunctionPrototype;
1452
- define(genFun, toStringTagSymbol, "GeneratorFunction");
1453
- }
1454
- genFun.prototype = Object.create(Gp);
1455
- return genFun;
1456
- };
1457
-
1458
- // Within the body of any async function, `await x` is transformed to
1459
- // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
1460
- // `hasOwn.call(value, "__await")` to determine if the yielded value is
1461
- // meant to be awaited.
1462
- exports.awrap = function(arg) {
1463
- return { __await: arg };
1464
- };
1465
-
1466
- function AsyncIterator(generator, PromiseImpl) {
1467
- function invoke(method, arg, resolve, reject) {
1468
- var record = tryCatch(generator[method], generator, arg);
1469
- if (record.type === "throw") {
1470
- reject(record.arg);
1471
- } else {
1472
- var result = record.arg;
1473
- var value = result.value;
1474
- if (value &&
1475
- typeof value === "object" &&
1476
- hasOwn.call(value, "__await")) {
1477
- return PromiseImpl.resolve(value.__await).then(function(value) {
1478
- invoke("next", value, resolve, reject);
1479
- }, function(err) {
1480
- invoke("throw", err, resolve, reject);
1481
- });
1482
- }
1483
-
1484
- return PromiseImpl.resolve(value).then(function(unwrapped) {
1485
- // When a yielded Promise is resolved, its final value becomes
1486
- // the .value of the Promise<{value,done}> result for the
1487
- // current iteration.
1488
- result.value = unwrapped;
1489
- resolve(result);
1490
- }, function(error) {
1491
- // If a rejected Promise was yielded, throw the rejection back
1492
- // into the async generator function so it can be handled there.
1493
- return invoke("throw", error, resolve, reject);
1494
- });
1495
- }
1496
- }
1497
-
1498
- var previousPromise;
1499
-
1500
- function enqueue(method, arg) {
1501
- function callInvokeWithMethodAndArg() {
1502
- return new PromiseImpl(function(resolve, reject) {
1503
- invoke(method, arg, resolve, reject);
1504
- });
1505
- }
1506
-
1507
- return previousPromise =
1508
- // If enqueue has been called before, then we want to wait until
1509
- // all previous Promises have been resolved before calling invoke,
1510
- // so that results are always delivered in the correct order. If
1511
- // enqueue has not been called before, then it is important to
1512
- // call invoke immediately, without waiting on a callback to fire,
1513
- // so that the async generator function has the opportunity to do
1514
- // any necessary setup in a predictable way. This predictability
1515
- // is why the Promise constructor synchronously invokes its
1516
- // executor callback, and why async functions synchronously
1517
- // execute code before the first await. Since we implement simple
1518
- // async functions in terms of async generators, it is especially
1519
- // important to get this right, even though it requires care.
1520
- previousPromise ? previousPromise.then(
1521
- callInvokeWithMethodAndArg,
1522
- // Avoid propagating failures to Promises returned by later
1523
- // invocations of the iterator.
1524
- callInvokeWithMethodAndArg
1525
- ) : callInvokeWithMethodAndArg();
1526
- }
1527
-
1528
- // Define the unified helper method that is used to implement .next,
1529
- // .throw, and .return (see defineIteratorMethods).
1530
- this._invoke = enqueue;
1531
- }
1532
-
1533
- defineIteratorMethods(AsyncIterator.prototype);
1534
- define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
1535
- return this;
1536
- });
1537
- exports.AsyncIterator = AsyncIterator;
1538
-
1539
- // Note that simple async functions are implemented on top of
1540
- // AsyncIterator objects; they just return a Promise for the value of
1541
- // the final result produced by the iterator.
1542
- exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {
1543
- if (PromiseImpl === void 0) PromiseImpl = Promise;
1544
-
1545
- var iter = new AsyncIterator(
1546
- wrap(innerFn, outerFn, self, tryLocsList),
1547
- PromiseImpl
1548
- );
1549
-
1550
- return exports.isGeneratorFunction(outerFn)
1551
- ? iter // If outerFn is a generator, return the full iterator.
1552
- : iter.next().then(function(result) {
1553
- return result.done ? result.value : iter.next();
1554
- });
1555
- };
1556
-
1557
- function makeInvokeMethod(innerFn, self, context) {
1558
- var state = GenStateSuspendedStart;
1559
-
1560
- return function invoke(method, arg) {
1561
- if (state === GenStateExecuting) {
1562
- throw new Error("Generator is already running");
1563
- }
1564
-
1565
- if (state === GenStateCompleted) {
1566
- if (method === "throw") {
1567
- throw arg;
1568
- }
1569
-
1570
- // Be forgiving, per 25.3.3.3.3 of the spec:
1571
- // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
1572
- return doneResult();
1573
- }
1574
-
1575
- context.method = method;
1576
- context.arg = arg;
1577
-
1578
- while (true) {
1579
- var delegate = context.delegate;
1580
- if (delegate) {
1581
- var delegateResult = maybeInvokeDelegate(delegate, context);
1582
- if (delegateResult) {
1583
- if (delegateResult === ContinueSentinel) continue;
1584
- return delegateResult;
1585
- }
1586
- }
1587
-
1588
- if (context.method === "next") {
1589
- // Setting context._sent for legacy support of Babel's
1590
- // function.sent implementation.
1591
- context.sent = context._sent = context.arg;
1592
-
1593
- } else if (context.method === "throw") {
1594
- if (state === GenStateSuspendedStart) {
1595
- state = GenStateCompleted;
1596
- throw context.arg;
1597
- }
1598
-
1599
- context.dispatchException(context.arg);
1600
-
1601
- } else if (context.method === "return") {
1602
- context.abrupt("return", context.arg);
1603
- }
1604
-
1605
- state = GenStateExecuting;
1606
-
1607
- var record = tryCatch(innerFn, self, context);
1608
- if (record.type === "normal") {
1609
- // If an exception is thrown from innerFn, we leave state ===
1610
- // GenStateExecuting and loop back for another invocation.
1611
- state = context.done
1612
- ? GenStateCompleted
1613
- : GenStateSuspendedYield;
1614
-
1615
- if (record.arg === ContinueSentinel) {
1616
- continue;
1617
- }
1618
-
1619
- return {
1620
- value: record.arg,
1621
- done: context.done
1622
- };
1623
-
1624
- } else if (record.type === "throw") {
1625
- state = GenStateCompleted;
1626
- // Dispatch the exception by looping back around to the
1627
- // context.dispatchException(context.arg) call above.
1628
- context.method = "throw";
1629
- context.arg = record.arg;
1630
- }
1631
- }
1632
- };
1633
- }
1634
-
1635
- // Call delegate.iterator[context.method](context.arg) and handle the
1636
- // result, either by returning a { value, done } result from the
1637
- // delegate iterator, or by modifying context.method and context.arg,
1638
- // setting context.delegate to null, and returning the ContinueSentinel.
1639
- function maybeInvokeDelegate(delegate, context) {
1640
- var method = delegate.iterator[context.method];
1641
- if (method === undefined$1) {
1642
- // A .throw or .return when the delegate iterator has no .throw
1643
- // method always terminates the yield* loop.
1644
- context.delegate = null;
1645
-
1646
- if (context.method === "throw") {
1647
- // Note: ["return"] must be used for ES3 parsing compatibility.
1648
- if (delegate.iterator["return"]) {
1649
- // If the delegate iterator has a return method, give it a
1650
- // chance to clean up.
1651
- context.method = "return";
1652
- context.arg = undefined$1;
1653
- maybeInvokeDelegate(delegate, context);
1654
-
1655
- if (context.method === "throw") {
1656
- // If maybeInvokeDelegate(context) changed context.method from
1657
- // "return" to "throw", let that override the TypeError below.
1658
- return ContinueSentinel;
1659
- }
1660
- }
1661
-
1662
- context.method = "throw";
1663
- context.arg = new TypeError(
1664
- "The iterator does not provide a 'throw' method");
1665
- }
1666
-
1667
- return ContinueSentinel;
1668
- }
1669
-
1670
- var record = tryCatch(method, delegate.iterator, context.arg);
1671
-
1672
- if (record.type === "throw") {
1673
- context.method = "throw";
1674
- context.arg = record.arg;
1675
- context.delegate = null;
1676
- return ContinueSentinel;
1677
- }
1678
-
1679
- var info = record.arg;
1680
-
1681
- if (! info) {
1682
- context.method = "throw";
1683
- context.arg = new TypeError("iterator result is not an object");
1684
- context.delegate = null;
1685
- return ContinueSentinel;
1686
- }
1687
-
1688
- if (info.done) {
1689
- // Assign the result of the finished delegate to the temporary
1690
- // variable specified by delegate.resultName (see delegateYield).
1691
- context[delegate.resultName] = info.value;
1692
-
1693
- // Resume execution at the desired location (see delegateYield).
1694
- context.next = delegate.nextLoc;
1695
-
1696
- // If context.method was "throw" but the delegate handled the
1697
- // exception, let the outer generator proceed normally. If
1698
- // context.method was "next", forget context.arg since it has been
1699
- // "consumed" by the delegate iterator. If context.method was
1700
- // "return", allow the original .return call to continue in the
1701
- // outer generator.
1702
- if (context.method !== "return") {
1703
- context.method = "next";
1704
- context.arg = undefined$1;
1705
- }
1706
-
1707
- } else {
1708
- // Re-yield the result returned by the delegate method.
1709
- return info;
1710
- }
1711
-
1712
- // The delegate iterator is finished, so forget it and continue with
1713
- // the outer generator.
1714
- context.delegate = null;
1715
- return ContinueSentinel;
1716
- }
1717
-
1718
- // Define Generator.prototype.{next,throw,return} in terms of the
1719
- // unified ._invoke helper method.
1720
- defineIteratorMethods(Gp);
1721
-
1722
- define(Gp, toStringTagSymbol, "Generator");
1723
-
1724
- // A Generator should always return itself as the iterator object when the
1725
- // @@iterator function is called on it. Some browsers' implementations of the
1726
- // iterator prototype chain incorrectly implement this, causing the Generator
1727
- // object to not be returned from this call. This ensures that doesn't happen.
1728
- // See https://github.com/facebook/regenerator/issues/274 for more details.
1729
- define(Gp, iteratorSymbol, function() {
1730
- return this;
1731
- });
1732
-
1733
- define(Gp, "toString", function() {
1734
- return "[object Generator]";
1735
- });
1736
-
1737
- function pushTryEntry(locs) {
1738
- var entry = { tryLoc: locs[0] };
1739
-
1740
- if (1 in locs) {
1741
- entry.catchLoc = locs[1];
1742
- }
1743
-
1744
- if (2 in locs) {
1745
- entry.finallyLoc = locs[2];
1746
- entry.afterLoc = locs[3];
1747
- }
1748
-
1749
- this.tryEntries.push(entry);
1750
- }
1751
-
1752
- function resetTryEntry(entry) {
1753
- var record = entry.completion || {};
1754
- record.type = "normal";
1755
- delete record.arg;
1756
- entry.completion = record;
1757
- }
1758
-
1759
- function Context(tryLocsList) {
1760
- // The root entry object (effectively a try statement without a catch
1761
- // or a finally block) gives us a place to store values thrown from
1762
- // locations where there is no enclosing try statement.
1763
- this.tryEntries = [{ tryLoc: "root" }];
1764
- tryLocsList.forEach(pushTryEntry, this);
1765
- this.reset(true);
1766
- }
1767
-
1768
- exports.keys = function(object) {
1769
- var keys = [];
1770
- for (var key in object) {
1771
- keys.push(key);
1772
- }
1773
- keys.reverse();
1774
-
1775
- // Rather than returning an object with a next method, we keep
1776
- // things simple and return the next function itself.
1777
- return function next() {
1778
- while (keys.length) {
1779
- var key = keys.pop();
1780
- if (key in object) {
1781
- next.value = key;
1782
- next.done = false;
1783
- return next;
1784
- }
1785
- }
1786
-
1787
- // To avoid creating an additional object, we just hang the .value
1788
- // and .done properties off the next function object itself. This
1789
- // also ensures that the minifier will not anonymize the function.
1790
- next.done = true;
1791
- return next;
1792
- };
1793
- };
1794
-
1795
- function values(iterable) {
1796
- if (iterable) {
1797
- var iteratorMethod = iterable[iteratorSymbol];
1798
- if (iteratorMethod) {
1799
- return iteratorMethod.call(iterable);
1800
- }
1801
-
1802
- if (typeof iterable.next === "function") {
1803
- return iterable;
1804
- }
1805
-
1806
- if (!isNaN(iterable.length)) {
1807
- var i = -1, next = function next() {
1808
- while (++i < iterable.length) {
1809
- if (hasOwn.call(iterable, i)) {
1810
- next.value = iterable[i];
1811
- next.done = false;
1812
- return next;
1813
- }
1814
- }
1815
-
1816
- next.value = undefined$1;
1817
- next.done = true;
1818
-
1819
- return next;
1820
- };
1821
-
1822
- return next.next = next;
1823
- }
1824
- }
1825
-
1826
- // Return an iterator with no values.
1827
- return { next: doneResult };
1828
- }
1829
- exports.values = values;
1830
-
1831
- function doneResult() {
1832
- return { value: undefined$1, done: true };
1833
- }
1834
-
1835
- Context.prototype = {
1836
- constructor: Context,
1837
-
1838
- reset: function(skipTempReset) {
1839
- this.prev = 0;
1840
- this.next = 0;
1841
- // Resetting context._sent for legacy support of Babel's
1842
- // function.sent implementation.
1843
- this.sent = this._sent = undefined$1;
1844
- this.done = false;
1845
- this.delegate = null;
1846
-
1847
- this.method = "next";
1848
- this.arg = undefined$1;
1849
-
1850
- this.tryEntries.forEach(resetTryEntry);
1851
-
1852
- if (!skipTempReset) {
1853
- for (var name in this) {
1854
- // Not sure about the optimal order of these conditions:
1855
- if (name.charAt(0) === "t" &&
1856
- hasOwn.call(this, name) &&
1857
- !isNaN(+name.slice(1))) {
1858
- this[name] = undefined$1;
1859
- }
1860
- }
1861
- }
1862
- },
1863
-
1864
- stop: function() {
1865
- this.done = true;
1866
-
1867
- var rootEntry = this.tryEntries[0];
1868
- var rootRecord = rootEntry.completion;
1869
- if (rootRecord.type === "throw") {
1870
- throw rootRecord.arg;
1871
- }
1872
-
1873
- return this.rval;
1874
- },
1875
-
1876
- dispatchException: function(exception) {
1877
- if (this.done) {
1878
- throw exception;
1879
- }
1880
-
1881
- var context = this;
1882
- function handle(loc, caught) {
1883
- record.type = "throw";
1884
- record.arg = exception;
1885
- context.next = loc;
1886
-
1887
- if (caught) {
1888
- // If the dispatched exception was caught by a catch block,
1889
- // then let that catch block handle the exception normally.
1890
- context.method = "next";
1891
- context.arg = undefined$1;
1892
- }
1893
-
1894
- return !! caught;
1895
- }
1896
-
1897
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
1898
- var entry = this.tryEntries[i];
1899
- var record = entry.completion;
1900
-
1901
- if (entry.tryLoc === "root") {
1902
- // Exception thrown outside of any try block that could handle
1903
- // it, so set the completion value of the entire function to
1904
- // throw the exception.
1905
- return handle("end");
1906
- }
1907
-
1908
- if (entry.tryLoc <= this.prev) {
1909
- var hasCatch = hasOwn.call(entry, "catchLoc");
1910
- var hasFinally = hasOwn.call(entry, "finallyLoc");
1911
-
1912
- if (hasCatch && hasFinally) {
1913
- if (this.prev < entry.catchLoc) {
1914
- return handle(entry.catchLoc, true);
1915
- } else if (this.prev < entry.finallyLoc) {
1916
- return handle(entry.finallyLoc);
1917
- }
1918
-
1919
- } else if (hasCatch) {
1920
- if (this.prev < entry.catchLoc) {
1921
- return handle(entry.catchLoc, true);
1922
- }
1923
-
1924
- } else if (hasFinally) {
1925
- if (this.prev < entry.finallyLoc) {
1926
- return handle(entry.finallyLoc);
1927
- }
1928
-
1929
- } else {
1930
- throw new Error("try statement without catch or finally");
1931
- }
1932
- }
1933
- }
1934
- },
1935
-
1936
- abrupt: function(type, arg) {
1937
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
1938
- var entry = this.tryEntries[i];
1939
- if (entry.tryLoc <= this.prev &&
1940
- hasOwn.call(entry, "finallyLoc") &&
1941
- this.prev < entry.finallyLoc) {
1942
- var finallyEntry = entry;
1943
- break;
1944
- }
1945
- }
1946
-
1947
- if (finallyEntry &&
1948
- (type === "break" ||
1949
- type === "continue") &&
1950
- finallyEntry.tryLoc <= arg &&
1951
- arg <= finallyEntry.finallyLoc) {
1952
- // Ignore the finally entry if control is not jumping to a
1953
- // location outside the try/catch block.
1954
- finallyEntry = null;
1955
- }
1956
-
1957
- var record = finallyEntry ? finallyEntry.completion : {};
1958
- record.type = type;
1959
- record.arg = arg;
1960
-
1961
- if (finallyEntry) {
1962
- this.method = "next";
1963
- this.next = finallyEntry.finallyLoc;
1964
- return ContinueSentinel;
1965
- }
1966
-
1967
- return this.complete(record);
1968
- },
1969
-
1970
- complete: function(record, afterLoc) {
1971
- if (record.type === "throw") {
1972
- throw record.arg;
1973
- }
1974
-
1975
- if (record.type === "break" ||
1976
- record.type === "continue") {
1977
- this.next = record.arg;
1978
- } else if (record.type === "return") {
1979
- this.rval = this.arg = record.arg;
1980
- this.method = "return";
1981
- this.next = "end";
1982
- } else if (record.type === "normal" && afterLoc) {
1983
- this.next = afterLoc;
1984
- }
1985
-
1986
- return ContinueSentinel;
1987
- },
1988
-
1989
- finish: function(finallyLoc) {
1990
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
1991
- var entry = this.tryEntries[i];
1992
- if (entry.finallyLoc === finallyLoc) {
1993
- this.complete(entry.completion, entry.afterLoc);
1994
- resetTryEntry(entry);
1995
- return ContinueSentinel;
1996
- }
1997
- }
1998
- },
1999
-
2000
- "catch": function(tryLoc) {
2001
- for (var i = this.tryEntries.length - 1; i >= 0; --i) {
2002
- var entry = this.tryEntries[i];
2003
- if (entry.tryLoc === tryLoc) {
2004
- var record = entry.completion;
2005
- if (record.type === "throw") {
2006
- var thrown = record.arg;
2007
- resetTryEntry(entry);
2008
- }
2009
- return thrown;
2010
- }
2011
- }
2012
-
2013
- // The context.catch method must only be called with a location
2014
- // argument that corresponds to a known catch block.
2015
- throw new Error("illegal catch attempt");
2016
- },
2017
-
2018
- delegateYield: function(iterable, resultName, nextLoc) {
2019
- this.delegate = {
2020
- iterator: values(iterable),
2021
- resultName: resultName,
2022
- nextLoc: nextLoc
2023
- };
2024
-
2025
- if (this.method === "next") {
2026
- // Deliberately forget the last sent value so that we don't
2027
- // accidentally pass it on to the delegate.
2028
- this.arg = undefined$1;
2029
- }
2030
-
2031
- return ContinueSentinel;
2032
- }
2033
- };
2034
-
2035
- // Regardless of whether this script is executing as a CommonJS module
2036
- // or not, return the runtime object so that we can declare the variable
2037
- // regeneratorRuntime in the outer scope, which allows this module to be
2038
- // injected easily by `bin/regenerator --include-runtime script.js`.
2039
- return exports;
2040
-
2041
- }(
2042
- // If this script is executing as a CommonJS module, use module.exports
2043
- // as the regeneratorRuntime namespace. Otherwise create a new empty
2044
- // object. Either way, the resulting object will be used to initialize
2045
- // the regeneratorRuntime variable at the top of this file.
2046
- module.exports
2047
- ));
2048
-
2049
- try {
2050
- regeneratorRuntime = runtime;
2051
- } catch (accidentalStrictMode) {
2052
- // This module should not be running in strict mode, so the above
2053
- // assignment should always work unless something is misconfigured. Just
2054
- // in case runtime.js accidentally runs in strict mode, in modern engines
2055
- // we can explicitly access globalThis. In older engines we can escape
2056
- // strict mode using a global Function call. This could conceivably fail
2057
- // if a Content Security Policy forbids using Function, but in that case
2058
- // the proper solution is to fix the accidental strict mode problem. If
2059
- // you've misconfigured your bundler to force strict mode and applied a
2060
- // CSP to forbid Function, and you're not willing to fix either of those
2061
- // problems, please detail your unique predicament in a GitHub issue.
2062
- if (typeof globalThis === "object") {
2063
- globalThis.regeneratorRuntime = runtime;
2064
- } else {
2065
- Function("r", "regeneratorRuntime = r")(runtime);
2066
- }
2067
- }
2068
- });
1119
+ // https://github.com/CesiumGS/cesium/blob/1.76/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js
2069
1120
 
2070
1121
  var martini = null;
2071
-
2072
1122
  function decodeTerrain(parameters, transferableObjects) {
2073
1123
  var _martini;
2074
-
2075
1124
  var imageData = parameters.imageData,
2076
- _parameters$tileSize = parameters.tileSize,
2077
- tileSize = _parameters$tileSize === void 0 ? 256 : _parameters$tileSize,
2078
- errorLevel = parameters.errorLevel,
2079
- interval = parameters.interval,
2080
- offset = parameters.offset;
2081
- var pixels = ndarray(new Uint8Array(imageData), [tileSize, tileSize, 4], [4, 4 * tileSize, 1], 0); // Tile size must be maintained through the life of the worker
2082
-
1125
+ _parameters$tileSize = parameters.tileSize,
1126
+ tileSize = _parameters$tileSize === void 0 ? 256 : _parameters$tileSize,
1127
+ errorLevel = parameters.errorLevel,
1128
+ interval = parameters.interval,
1129
+ offset = parameters.offset;
1130
+ var pixels = ndarray(new Uint8Array(imageData), [tileSize, tileSize, 4], [4, 4 * tileSize, 1], 0);
1131
+
1132
+ // Tile size must be maintained through the life of the worker
2083
1133
  (_martini = martini) !== null && _martini !== void 0 ? _martini : martini = new Martini(tileSize + 1);
2084
1134
  var terrain = mapboxTerrainToGrid(pixels, interval, offset);
2085
- var tile = martini.createTile(terrain); // get a mesh (vertices and triangles indices) for a 10m error
1135
+ var tile = martini.createTile(terrain);
2086
1136
 
1137
+ // get a mesh (vertices and triangles indices) for a 10m error
2087
1138
  var mesh = tile.getMesh(errorLevel, parameters.maxLength);
2088
1139
  return createQuantizedMeshData(tile, mesh, tileSize);
2089
1140
  }
2090
-
2091
1141
  self.onmessage = function (msg) {
2092
1142
  var _msg$data = msg.data,
2093
- id = _msg$data.id,
2094
- payload = _msg$data.payload;
1143
+ id = _msg$data.id,
1144
+ payload = _msg$data.payload;
2095
1145
  if (id == null) return;
2096
1146
  var objects = [];
2097
1147
  var res = null;
2098
-
2099
1148
  try {
2100
1149
  res = decodeTerrain(payload);
2101
1150
  objects.push(res.indices.buffer);
@@ -2115,89 +1164,50 @@ self.onmessage = function (msg) {
2115
1164
  }
2116
1165
  };
2117
1166
 
1167
+ // https://github.com/CesiumGS/cesium/blob/1.68/Source/Scene/MapboxImageryProvider.js#L42
2118
1168
  var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
2119
1169
  _inherits(StretchedTilingScheme, _WebMercatorTilingSch);
2120
-
2121
1170
  var _super = _createSuper(StretchedTilingScheme);
2122
-
2123
1171
  function StretchedTilingScheme() {
2124
1172
  _classCallCheck(this, StretchedTilingScheme);
2125
-
2126
1173
  return _super.apply(this, arguments);
2127
1174
  }
2128
-
2129
1175
  _createClass(StretchedTilingScheme, [{
2130
1176
  key: "tileXYToRectangle",
2131
1177
  value: function tileXYToRectangle(x, y, level, res) {
2132
1178
  var result = _get(_getPrototypeOf(StretchedTilingScheme.prototype), "tileXYToRectangle", this).call(this, x, y, level);
2133
-
2134
1179
  if (y == 0) {
2135
1180
  //console.log("Top row", res, y, level);
2136
1181
  result.north = Math.PI / 2;
2137
1182
  }
2138
-
2139
1183
  if (y + 1 == Math.pow(2, level)) {
2140
1184
  result.south = -Math.PI / 2;
2141
1185
  }
2142
-
2143
1186
  return result;
2144
1187
  }
2145
1188
  }]);
2146
-
2147
1189
  return StretchedTilingScheme;
2148
- }(cesium.WebMercatorTilingScheme);
2149
-
1190
+ }(WebMercatorTilingScheme);
2150
1191
  var MartiniTerrainProvider = /*#__PURE__*/function () {
2151
1192
  // @ts-ignore
2152
1193
  function MartiniTerrainProvider() {
2153
1194
  var _opts$interval, _opts$offset, _opts$maxWorkers, _opts$minZoomLevel, _opts$fillPoles, _opts$detailScalar, _opts$minimumErrorLev, _opts$ellipsoid;
2154
-
2155
1195
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
2156
-
2157
1196
  _classCallCheck(this, MartiniTerrainProvider);
2158
-
2159
1197
  _defineProperty(this, "hasWaterMask", false);
2160
-
2161
1198
  _defineProperty(this, "hasVertexNormals", false);
2162
-
2163
- _defineProperty(this, "credit", new cesium.Credit("Mapbox"));
2164
-
2165
- _defineProperty(this, "ready", void 0);
2166
-
2167
- _defineProperty(this, "readyPromise", void 0);
2168
-
1199
+ _defineProperty(this, "credit", new Credit("Mapbox"));
2169
1200
  _defineProperty(this, "availability", null);
2170
-
2171
- _defineProperty(this, "errorEvent", new cesium.Event());
2172
-
2173
- _defineProperty(this, "tilingScheme", void 0);
2174
-
2175
- _defineProperty(this, "ellipsoid", void 0);
2176
-
1201
+ _defineProperty(this, "errorEvent", new Event());
2177
1202
  _defineProperty(this, "workerFarm", null);
2178
-
2179
1203
  _defineProperty(this, "inProgressWorkers", 0);
2180
-
2181
1204
  _defineProperty(this, "levelOfDetailScalar", null);
2182
-
2183
1205
  _defineProperty(this, "maxWorkers", 5);
2184
-
2185
1206
  _defineProperty(this, "minError", 0.1);
2186
-
2187
- _defineProperty(this, "minZoomLevel", void 0);
2188
-
2189
1207
  _defineProperty(this, "fillPoles", true);
2190
-
2191
1208
  _defineProperty(this, "_errorAtMinZoom", 1000);
2192
-
2193
1209
  _defineProperty(this, "resource", null);
2194
-
2195
- _defineProperty(this, "interval", void 0);
2196
-
2197
- _defineProperty(this, "offset", void 0);
2198
-
2199
1210
  _defineProperty(this, "RADIUS_SCALAR", 1.0);
2200
-
2201
1211
  //this.martini = new Martini(257);
2202
1212
  this.resource = opts.resource;
2203
1213
  this.interval = (_opts$interval = opts.interval) !== null && _opts$interval !== void 0 ? _opts$interval : 0.1;
@@ -2205,23 +1215,20 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2205
1215
  this.maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
2206
1216
  this.minZoomLevel = (_opts$minZoomLevel = opts.minZoomLevel) !== null && _opts$minZoomLevel !== void 0 ? _opts$minZoomLevel : 3;
2207
1217
  this.fillPoles = (_opts$fillPoles = opts.fillPoles) !== null && _opts$fillPoles !== void 0 ? _opts$fillPoles : true;
2208
- this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 4.0) + cesium.Math.EPSILON5;
1218
+ console.log("fillPoles", this.fillPoles);
1219
+ this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 4.0) + Math$1.EPSILON5;
2209
1220
  this.ready = true;
2210
1221
  this.readyPromise = Promise.resolve(true);
2211
1222
  this.minError = (_opts$minimumErrorLev = opts.minimumErrorLevel) !== null && _opts$minimumErrorLev !== void 0 ? _opts$minimumErrorLev : 0.1;
2212
1223
  this.errorEvent.addEventListener(console.log, this);
2213
- this.ellipsoid = (_opts$ellipsoid = opts.ellipsoid) !== null && _opts$ellipsoid !== void 0 ? _opts$ellipsoid : cesium.Ellipsoid.WGS84;
2214
-
1224
+ this.ellipsoid = (_opts$ellipsoid = opts.ellipsoid) !== null && _opts$ellipsoid !== void 0 ? _opts$ellipsoid : Ellipsoid.WGS84;
2215
1225
  if (this.maxWorkers > 0) {
2216
1226
  this.workerFarm = new WorkerFarm();
2217
1227
  }
2218
-
2219
- var scheme = cesium.WebMercatorTilingScheme;
2220
-
1228
+ var scheme = WebMercatorTilingScheme;
2221
1229
  if (this.fillPoles) {
2222
1230
  scheme = StretchedTilingScheme;
2223
1231
  }
2224
-
2225
1232
  this.tilingScheme = new scheme({
2226
1233
  numberOfLevelZeroTilesX: 1,
2227
1234
  numberOfLevelZeroTilesY: 1,
@@ -2229,19 +1236,20 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2229
1236
  });
2230
1237
  this._errorAtMinZoom = this.errorAtZoom(this.minZoomLevel);
2231
1238
  }
2232
-
2233
1239
  _createClass(MartiniTerrainProvider, [{
2234
1240
  key: "requestTileGeometry",
2235
1241
  value: function requestTileGeometry(x, y, z, request) {
2236
1242
  var _this = this;
2237
-
2238
1243
  // Look for tiles both below the zoom level and below the error threshold for the zoom level at the equator...
1244
+
2239
1245
  if (z < this.minZoomLevel || this.scaledErrorForTile(x, y, z) > this._errorAtMinZoom) {
2240
1246
  // If we are below the minimum zoom level, we return empty heightmaps
2241
1247
  // to avoid unnecessary requests for low-resolution data.
2242
1248
  return Promise.resolve(this.emptyMesh(x, y, z));
2243
1249
  }
2244
1250
 
1251
+ // Note: we still load a TON of tiles near the poles. We might need to do some overzooming here...
1252
+
2245
1253
  if (this.inProgressWorkers > this.maxWorkers) return undefined;
2246
1254
  this.inProgressWorkers += 1;
2247
1255
  return this.processTile(x, y, z)["finally"](function () {
@@ -2251,81 +1259,67 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2251
1259
  }, {
2252
1260
  key: "processTile",
2253
1261
  value: function () {
2254
- var _processTile = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(x, y, z) {
1262
+ var _processTile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(x, y, z) {
2255
1263
  var _this$resource, tileSize, getTilePixels, px, pixelData, tileRect, err, maxLength, params, res;
2256
-
2257
- return regeneratorRuntime.wrap(function _callee$(_context) {
2258
- while (1) {
2259
- switch (_context.prev = _context.next) {
2260
- case 0:
2261
- _context.prev = 0;
2262
- _this$resource = this.resource, tileSize = _this$resource.tileSize, getTilePixels = _this$resource.getTilePixels;
2263
- _context.next = 4;
2264
- return getTilePixels({
2265
- x: x,
2266
- y: y,
2267
- z: z
2268
- });
2269
-
2270
- case 4:
2271
- px = _context.sent;
2272
- pixelData = px.data;
2273
- tileRect = this.tilingScheme.tileXYToRectangle(x, y, z); ///const center = Rectangle.center(tileRect);
2274
-
2275
- err = this.errorAtZoom(z);
2276
- maxLength = this.maxVertexDistance(tileRect);
2277
- params = {
2278
- imageData: pixelData,
2279
- maxLength: maxLength,
2280
- x: x,
2281
- y: y,
2282
- z: z,
2283
- errorLevel: err,
2284
- ellipsoidRadius: this.ellipsoid.maximumRadius,
2285
- tileSize: tileSize,
2286
- interval: this.interval,
2287
- offset: this.offset
2288
- };
2289
-
2290
- if (!(this.workerFarm != null)) {
2291
- _context.next = 16;
2292
- break;
2293
- }
2294
-
2295
- _context.next = 13;
2296
- return this.workerFarm.scheduleTask(params, [pixelData.buffer]);
2297
-
2298
- case 13:
2299
- res = _context.sent;
2300
- _context.next = 17;
1264
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1265
+ while (1) switch (_context.prev = _context.next) {
1266
+ case 0:
1267
+ _context.prev = 0;
1268
+ _this$resource = this.resource, tileSize = _this$resource.tileSize, getTilePixels = _this$resource.getTilePixels;
1269
+ _context.next = 4;
1270
+ return getTilePixels({
1271
+ x: x,
1272
+ y: y,
1273
+ z: z
1274
+ });
1275
+ case 4:
1276
+ px = _context.sent;
1277
+ pixelData = px.data;
1278
+ tileRect = this.tilingScheme.tileXYToRectangle(x, y, z); ///const center = Rectangle.center(tileRect);
1279
+ err = this.errorAtZoom(z);
1280
+ maxLength = this.maxVertexDistance(tileRect);
1281
+ params = {
1282
+ imageData: pixelData,
1283
+ maxLength: maxLength,
1284
+ x: x,
1285
+ y: y,
1286
+ z: z,
1287
+ errorLevel: err,
1288
+ ellipsoidRadius: this.ellipsoid.maximumRadius,
1289
+ tileSize: tileSize,
1290
+ interval: this.interval,
1291
+ offset: this.offset
1292
+ };
1293
+ if (!(this.workerFarm != null)) {
1294
+ _context.next = 16;
2301
1295
  break;
2302
-
2303
- case 16:
2304
- res = decodeTerrain(params);
2305
-
2306
- case 17:
2307
- pixelData = undefined;
2308
- px = undefined;
2309
- return _context.abrupt("return", this.createQuantizedMeshData(tileRect, err, res));
2310
-
2311
- case 22:
2312
- _context.prev = 22;
2313
- _context.t0 = _context["catch"](0);
2314
- console.log(_context.t0);
2315
- return _context.abrupt("return", this.emptyMesh(x, y, z));
2316
-
2317
- case 26:
2318
- case "end":
2319
- return _context.stop();
2320
- }
1296
+ }
1297
+ _context.next = 13;
1298
+ return this.workerFarm.scheduleTask(params, [pixelData.buffer]);
1299
+ case 13:
1300
+ res = _context.sent;
1301
+ _context.next = 17;
1302
+ break;
1303
+ case 16:
1304
+ res = decodeTerrain(params);
1305
+ case 17:
1306
+ pixelData = undefined;
1307
+ px = undefined;
1308
+ return _context.abrupt("return", this.createQuantizedMeshData(tileRect, err, res));
1309
+ case 22:
1310
+ _context.prev = 22;
1311
+ _context.t0 = _context["catch"](0);
1312
+ console.log(_context.t0);
1313
+ return _context.abrupt("return", this.emptyMesh(x, y, z));
1314
+ case 26:
1315
+ case "end":
1316
+ return _context.stop();
2321
1317
  }
2322
1318
  }, _callee, this, [[0, 22]]);
2323
1319
  }));
2324
-
2325
1320
  function processTile(_x, _x2, _x3) {
2326
1321
  return _processTile.apply(this, arguments);
2327
1322
  }
2328
-
2329
1323
  return processTile;
2330
1324
  }()
2331
1325
  }, {
@@ -2337,8 +1331,8 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2337
1331
  key: "scaledErrorForTile",
2338
1332
  value: function scaledErrorForTile(x, y, z) {
2339
1333
  var tileRect = this.tilingScheme.tileXYToRectangle(x, y, z);
2340
- var center = cesium.Rectangle.center(tileRect);
2341
- return this.errorAtZoom(z) / (1 - Math.sin(center.latitude));
1334
+ var center = Rectangle.center(tileRect);
1335
+ return this.errorAtZoom(z) / Math.pow(1 - Math.sin(center.latitude), 2);
2342
1336
  }
2343
1337
  }, {
2344
1338
  key: "maxVertexDistance",
@@ -2349,11 +1343,10 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2349
1343
  key: "emptyMesh",
2350
1344
  value: function emptyMesh$1(x, y, z) {
2351
1345
  var tileRect = this.tilingScheme.tileXYToRectangle(x, y, z);
2352
- var center = cesium.Rectangle.center(tileRect);
2353
- var v = Math.max(Math.ceil(50 * Math.pow(1 - Math.abs(Math.sin(center.latitude)), 0.5)), 8);
2354
-
1346
+ var center = Rectangle.center(tileRect);
1347
+ var latScalar = Math.min(Math.abs(Math.sin(center.latitude)), 0.995);
1348
+ var v = Math.max(Math.ceil(200 / (z + 1) * Math.pow(1 - latScalar, 0.25)), 4);
2355
1349
  var output = emptyMesh(v);
2356
-
2357
1350
  var err = this.errorAtZoom(z);
2358
1351
  return this.createQuantizedMeshData(tileRect, err, output);
2359
1352
  }
@@ -2361,34 +1354,37 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2361
1354
  key: "createQuantizedMeshData",
2362
1355
  value: function createQuantizedMeshData(tileRect, errorLevel, workerOutput) {
2363
1356
  var minimumHeight = workerOutput.minimumHeight,
2364
- maximumHeight = workerOutput.maximumHeight,
2365
- quantizedVertices = workerOutput.quantizedVertices,
2366
- indices = workerOutput.indices,
2367
- westIndices = workerOutput.westIndices,
2368
- southIndices = workerOutput.southIndices,
2369
- eastIndices = workerOutput.eastIndices,
2370
- northIndices = workerOutput.northIndices;
1357
+ maximumHeight = workerOutput.maximumHeight,
1358
+ quantizedVertices = workerOutput.quantizedVertices,
1359
+ indices = workerOutput.indices,
1360
+ westIndices = workerOutput.westIndices,
1361
+ southIndices = workerOutput.southIndices,
1362
+ eastIndices = workerOutput.eastIndices,
1363
+ northIndices = workerOutput.northIndices;
2371
1364
  var err = errorLevel;
2372
1365
  var skirtHeight = err * 20;
2373
- var center = cesium.Rectangle.center(tileRect); // Calculating occlusion height is kind of messy currently, but it definitely works
1366
+ var center = Rectangle.center(tileRect);
2374
1367
 
1368
+ // Calculating occlusion height is kind of messy currently, but it definitely works
2375
1369
  var halfAngle = tileRect.width / 2;
2376
1370
  var dr = Math.cos(halfAngle); // half tile width since our ref point is at the center
2377
1371
 
2378
1372
  var occlusionHeight = dr * this.ellipsoid.maximumRadius + maximumHeight;
2379
-
2380
1373
  if (halfAngle > Math.PI / 4) {
2381
1374
  occlusionHeight = (1 + halfAngle) * this.ellipsoid.maximumRadius;
2382
1375
  }
2383
-
2384
- var occlusionPoint = new cesium.Cartographic(center.longitude, center.latitude, occlusionHeight // Scaling factor of two just to be sure.
1376
+ var occlusionPoint = new Cartographic(center.longitude, center.latitude, occlusionHeight
1377
+ // Scaling factor of two just to be sure.
2385
1378
  );
2386
- var horizonOcclusionPoint = this.ellipsoid.transformPositionToScaledSpace(cesium.Cartographic.toCartesian(occlusionPoint));
2387
- var orientedBoundingBox = cesium.OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, this.tilingScheme.ellipsoid);
2388
- var boundingSphere = cesium.BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox); // SE NW NE
1379
+
1380
+ var horizonOcclusionPoint = this.ellipsoid.transformPositionToScaledSpace(Cartographic.toCartesian(occlusionPoint));
1381
+ var orientedBoundingBox = OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, this.tilingScheme.ellipsoid);
1382
+ var boundingSphere = BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox);
1383
+
1384
+ // SE NW NE
2389
1385
  // NE NW SE
2390
1386
 
2391
- var result = new cesium.QuantizedMeshTerrainData({
1387
+ var result = new QuantizedMeshTerrainData({
2392
1388
  minimumHeight: minimumHeight,
2393
1389
  maximumHeight: maximumHeight,
2394
1390
  quantizedVertices: quantizedVertices,
@@ -2411,9 +1407,10 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2411
1407
  }, {
2412
1408
  key: "getLevelMaximumGeometricError",
2413
1409
  value: function getLevelMaximumGeometricError(level) {
2414
- var levelZeroMaximumGeometricError = cesium.TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this.tilingScheme.ellipsoid, 65, this.tilingScheme.getNumberOfXTilesAtLevel(0)); // Scalar to control overzooming
2415
- // also seems to control zooming for imagery layers
1410
+ var levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this.tilingScheme.ellipsoid, 65, this.tilingScheme.getNumberOfXTilesAtLevel(0));
2416
1411
 
1412
+ // Scalar to control overzooming
1413
+ // also seems to control zooming for imagery layers
2417
1414
  var scalar = this.resource.tileSize / 256;
2418
1415
  return levelZeroMaximumGeometricError / scalar / (1 << level);
2419
1416
  }
@@ -2427,31 +1424,21 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
2427
1424
  });
2428
1425
  }
2429
1426
  }]);
2430
-
2431
1427
  return MartiniTerrainProvider;
2432
1428
  }();
2433
-
2434
1429
  var MapboxTerrainProvider = /*#__PURE__*/function (_MartiniTerrainProvid) {
2435
1430
  _inherits(MapboxTerrainProvider, _MartiniTerrainProvid);
2436
-
2437
1431
  var _super2 = _createSuper(MapboxTerrainProvider);
2438
-
2439
1432
  function MapboxTerrainProvider() {
2440
1433
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
2441
-
2442
1434
  _classCallCheck(this, MapboxTerrainProvider);
2443
-
2444
1435
  var resource = new MapboxTerrainResource(opts);
2445
1436
  return _super2.call(this, _objectSpread2(_objectSpread2({}, opts), {}, {
2446
1437
  resource: resource
2447
1438
  }));
2448
1439
  }
2449
-
2450
- return MapboxTerrainProvider;
1440
+ return _createClass(MapboxTerrainProvider);
2451
1441
  }(MartiniTerrainProvider);
2452
1442
 
2453
- exports.DefaultHeightmapResource = DefaultHeightmapResource;
2454
- exports.MapboxTerrainResource = MapboxTerrainResource;
2455
- exports.MartiniTerrainProvider = MartiniTerrainProvider;
2456
- exports["default"] = MapboxTerrainProvider;
1443
+ export { DefaultHeightmapResource, MapboxTerrainResource, MartiniTerrainProvider, MapboxTerrainProvider as default };
2457
1444
  //# sourceMappingURL=index.js.map