@macrostrat/cesium-martini 1.3.0 → 1.4.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,6 +1,93 @@
1
- import { Resource, Credit, Event, Math as Math$1, Ellipsoid, Rectangle, Cartographic, OrientedBoundingBox, BoundingSphere, QuantizedMeshTerrainData, TerrainProvider, WebMercatorTilingScheme } from 'cesium';
2
- import ndarray from 'ndarray';
1
+ import { Resource, Credit, Rectangle, Cartographic, OrientedBoundingBox, BoundingSphere, QuantizedMeshTerrainData, TerrainProvider, Event, Math as Math$1, Ellipsoid, WebMercatorTilingScheme } from 'cesium';
3
2
 
3
+ function _assertThisInitialized(e) {
4
+ if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
5
+ return e;
6
+ }
7
+ function asyncGeneratorStep(n, t, e, r, o, a, c) {
8
+ try {
9
+ var i = n[a](c),
10
+ u = i.value;
11
+ } catch (n) {
12
+ return void e(n);
13
+ }
14
+ i.done ? t(u) : Promise.resolve(u).then(r, o);
15
+ }
16
+ function _asyncToGenerator(n) {
17
+ return function () {
18
+ var t = this,
19
+ e = arguments;
20
+ return new Promise(function (r, o) {
21
+ var a = n.apply(t, e);
22
+ function _next(n) {
23
+ asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
24
+ }
25
+ function _throw(n) {
26
+ asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
27
+ }
28
+ _next(void 0);
29
+ });
30
+ };
31
+ }
32
+ function _callSuper(t, o, e) {
33
+ return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));
34
+ }
35
+ function _classCallCheck(a, n) {
36
+ if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function");
37
+ }
38
+ function _defineProperties(e, r) {
39
+ for (var t = 0; t < r.length; t++) {
40
+ var o = r[t];
41
+ o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o);
42
+ }
43
+ }
44
+ function _createClass(e, r, t) {
45
+ return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", {
46
+ writable: !1
47
+ }), e;
48
+ }
49
+ function _defineProperty(e, r, t) {
50
+ return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
51
+ value: t,
52
+ enumerable: !0,
53
+ configurable: !0,
54
+ writable: !0
55
+ }) : e[r] = t, e;
56
+ }
57
+ function _get() {
58
+ return _get = "undefined" != typeof Reflect && Reflect.get ? Reflect.get.bind() : function (e, t, r) {
59
+ var p = _superPropBase(e, t);
60
+ if (p) {
61
+ var n = Object.getOwnPropertyDescriptor(p, t);
62
+ return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;
63
+ }
64
+ }, _get.apply(null, arguments);
65
+ }
66
+ function _getPrototypeOf(t) {
67
+ return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {
68
+ return t.__proto__ || Object.getPrototypeOf(t);
69
+ }, _getPrototypeOf(t);
70
+ }
71
+ function _inherits(t, e) {
72
+ if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function");
73
+ t.prototype = Object.create(e && e.prototype, {
74
+ constructor: {
75
+ value: t,
76
+ writable: !0,
77
+ configurable: !0
78
+ }
79
+ }), Object.defineProperty(t, "prototype", {
80
+ writable: !1
81
+ }), e && _setPrototypeOf(t, e);
82
+ }
83
+ function _isNativeReflectConstruct() {
84
+ try {
85
+ var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
86
+ } catch (t) {}
87
+ return (_isNativeReflectConstruct = function () {
88
+ return !!t;
89
+ })();
90
+ }
4
91
  function ownKeys(e, r) {
5
92
  var t = Object.keys(e);
6
93
  if (Object.getOwnPropertySymbols) {
@@ -22,6 +109,11 @@ function _objectSpread2(e) {
22
109
  }
23
110
  return e;
24
111
  }
112
+ function _possibleConstructorReturn(t, e) {
113
+ if (e && ("object" == typeof e || "function" == typeof e)) return e;
114
+ if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined");
115
+ return _assertThisInitialized(t);
116
+ }
25
117
  function _regeneratorRuntime() {
26
118
  _regeneratorRuntime = function () {
27
119
  return e;
@@ -130,7 +222,7 @@ function _regeneratorRuntime() {
130
222
  function makeInvokeMethod(e, r, n) {
131
223
  var o = h;
132
224
  return function (i, a) {
133
- if (o === f) throw new Error("Generator is already running");
225
+ if (o === f) throw Error("Generator is already running");
134
226
  if (o === s) {
135
227
  if ("throw" === i) throw a;
136
228
  return {
@@ -272,7 +364,7 @@ function _regeneratorRuntime() {
272
364
  } else if (c) {
273
365
  if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
274
366
  } else {
275
- if (!u) throw new Error("try statement without catch or finally");
367
+ if (!u) throw Error("try statement without catch or finally");
276
368
  if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
277
369
  }
278
370
  }
@@ -312,7 +404,7 @@ function _regeneratorRuntime() {
312
404
  return o;
313
405
  }
314
406
  }
315
- throw new Error("illegal catch attempt");
407
+ throw Error("illegal catch attempt");
316
408
  },
317
409
  delegateYield: function (e, r, n) {
318
410
  return this.delegate = {
@@ -323,201 +415,34 @@ function _regeneratorRuntime() {
323
415
  }
324
416
  }, e;
325
417
  }
326
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
327
- try {
328
- var info = gen[key](arg);
329
- var value = info.value;
330
- } catch (error) {
331
- reject(error);
332
- return;
333
- }
334
- if (info.done) {
335
- resolve(value);
336
- } else {
337
- Promise.resolve(value).then(_next, _throw);
338
- }
339
- }
340
- function _asyncToGenerator(fn) {
341
- return function () {
342
- var self = this,
343
- args = arguments;
344
- return new Promise(function (resolve, reject) {
345
- var gen = fn.apply(self, args);
346
- function _next(value) {
347
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
348
- }
349
- function _throw(err) {
350
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
351
- }
352
- _next(undefined);
353
- });
354
- };
355
- }
356
- function _classCallCheck(instance, Constructor) {
357
- if (!(instance instanceof Constructor)) {
358
- throw new TypeError("Cannot call a class as a function");
359
- }
360
- }
361
- function _defineProperties(target, props) {
362
- for (var i = 0; i < props.length; i++) {
363
- var descriptor = props[i];
364
- descriptor.enumerable = descriptor.enumerable || false;
365
- descriptor.configurable = true;
366
- if ("value" in descriptor) descriptor.writable = true;
367
- Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
368
- }
369
- }
370
- function _createClass(Constructor, protoProps, staticProps) {
371
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
372
- if (staticProps) _defineProperties(Constructor, staticProps);
373
- Object.defineProperty(Constructor, "prototype", {
374
- writable: false
375
- });
376
- return Constructor;
377
- }
378
- function _defineProperty(obj, key, value) {
379
- key = _toPropertyKey(key);
380
- if (key in obj) {
381
- Object.defineProperty(obj, key, {
382
- value: value,
383
- enumerable: true,
384
- configurable: true,
385
- writable: true
386
- });
387
- } else {
388
- obj[key] = value;
389
- }
390
- return obj;
391
- }
392
- function _inherits(subClass, superClass) {
393
- if (typeof superClass !== "function" && superClass !== null) {
394
- throw new TypeError("Super expression must either be null or a function");
395
- }
396
- subClass.prototype = Object.create(superClass && superClass.prototype, {
397
- constructor: {
398
- value: subClass,
399
- writable: true,
400
- configurable: true
401
- }
402
- });
403
- Object.defineProperty(subClass, "prototype", {
404
- writable: false
405
- });
406
- if (superClass) _setPrototypeOf(subClass, superClass);
407
- }
408
- function _getPrototypeOf(o) {
409
- _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
410
- return o.__proto__ || Object.getPrototypeOf(o);
411
- };
412
- return _getPrototypeOf(o);
413
- }
414
- function _setPrototypeOf(o, p) {
415
- _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
416
- o.__proto__ = p;
417
- return o;
418
- };
419
- return _setPrototypeOf(o, p);
420
- }
421
- function _isNativeReflectConstruct() {
422
- if (typeof Reflect === "undefined" || !Reflect.construct) return false;
423
- if (Reflect.construct.sham) return false;
424
- if (typeof Proxy === "function") return true;
425
- try {
426
- Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
427
- return true;
428
- } catch (e) {
429
- return false;
430
- }
431
- }
432
- function _assertThisInitialized(self) {
433
- if (self === void 0) {
434
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
435
- }
436
- return self;
437
- }
438
- function _possibleConstructorReturn(self, call) {
439
- if (call && (typeof call === "object" || typeof call === "function")) {
440
- return call;
441
- } else if (call !== void 0) {
442
- throw new TypeError("Derived constructors may only return object or undefined");
443
- }
444
- return _assertThisInitialized(self);
445
- }
446
- function _createSuper(Derived) {
447
- var hasNativeReflectConstruct = _isNativeReflectConstruct();
448
- return function _createSuperInternal() {
449
- var Super = _getPrototypeOf(Derived),
450
- result;
451
- if (hasNativeReflectConstruct) {
452
- var NewTarget = _getPrototypeOf(this).constructor;
453
- result = Reflect.construct(Super, arguments, NewTarget);
454
- } else {
455
- result = Super.apply(this, arguments);
456
- }
457
- return _possibleConstructorReturn(this, result);
458
- };
459
- }
460
- function _superPropBase(object, property) {
461
- while (!Object.prototype.hasOwnProperty.call(object, property)) {
462
- object = _getPrototypeOf(object);
463
- if (object === null) break;
464
- }
465
- return object;
466
- }
467
- function _get() {
468
- if (typeof Reflect !== "undefined" && Reflect.get) {
469
- _get = Reflect.get.bind();
470
- } else {
471
- _get = function _get(target, property, receiver) {
472
- var base = _superPropBase(target, property);
473
- if (!base) return;
474
- var desc = Object.getOwnPropertyDescriptor(base, property);
475
- if (desc.get) {
476
- return desc.get.call(arguments.length < 3 ? target : receiver);
477
- }
478
- return desc.value;
479
- };
480
- }
481
- return _get.apply(this, arguments);
482
- }
483
- function _toConsumableArray(arr) {
484
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
485
- }
486
- function _arrayWithoutHoles(arr) {
487
- if (Array.isArray(arr)) return _arrayLikeToArray(arr);
488
- }
489
- function _iterableToArray(iter) {
490
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
418
+ function _setPrototypeOf(t, e) {
419
+ return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {
420
+ return t.__proto__ = e, t;
421
+ }, _setPrototypeOf(t, e);
491
422
  }
492
- function _unsupportedIterableToArray(o, minLen) {
493
- if (!o) return;
494
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
495
- var n = Object.prototype.toString.call(o).slice(8, -1);
496
- if (n === "Object" && o.constructor) n = o.constructor.name;
497
- if (n === "Map" || n === "Set") return Array.from(o);
498
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
499
- }
500
- function _arrayLikeToArray(arr, len) {
501
- if (len == null || len > arr.length) len = arr.length;
502
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
503
- return arr2;
423
+ function _superPropBase(t, o) {
424
+ for (; !{}.hasOwnProperty.call(t, o) && null !== (t = _getPrototypeOf(t)););
425
+ return t;
504
426
  }
505
- function _nonIterableSpread() {
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.");
427
+ function _superPropGet(t, o, e, r) {
428
+ var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e);
429
+ return 2 & r && "function" == typeof p ? function (t) {
430
+ return p.apply(e, t);
431
+ } : p;
507
432
  }
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;
433
+ function _toPrimitive(t, r) {
434
+ if ("object" != typeof t || !t) return t;
435
+ var e = t[Symbol.toPrimitive];
436
+ if (void 0 !== e) {
437
+ var i = e.call(t, r || "default");
438
+ if ("object" != typeof i) return i;
514
439
  throw new TypeError("@@toPrimitive must return a primitive value.");
515
440
  }
516
- return (hint === "string" ? String : Number)(input);
441
+ return ("string" === r ? String : Number)(t);
517
442
  }
518
- function _toPropertyKey(arg) {
519
- var key = _toPrimitive(arg, "string");
520
- return typeof key === "symbol" ? key : String(key);
443
+ function _toPropertyKey(t) {
444
+ var i = _toPrimitive(t, "string");
445
+ return "symbol" == typeof i ? i : i + "";
521
446
  }
522
447
 
523
448
  var loadImage = function loadImage(url) {
@@ -545,7 +470,7 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
545
470
  _defineProperty(this, "tileSize", 256);
546
471
  _defineProperty(this, "skipOddLevels", false);
547
472
  _defineProperty(this, "getTilePixels", /*#__PURE__*/function () {
548
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(coords) {
473
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(coords) {
549
474
  var url, img;
550
475
  return _regeneratorRuntime().wrap(function _callee$(_context) {
551
476
  while (1) switch (_context.prev = _context.next) {
@@ -574,7 +499,7 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
574
499
  this.maxZoom = (_opts$maxZoom = opts.maxZoom) !== null && _opts$maxZoom !== void 0 ? _opts$maxZoom : 15;
575
500
  this.contextQueue = [];
576
501
  }
577
- _createClass(DefaultHeightmapResource, [{
502
+ return _createClass(DefaultHeightmapResource, [{
578
503
  key: "getCanvas",
579
504
  value: function getCanvas() {
580
505
  var ctx = this.contextQueue.pop();
@@ -629,7 +554,6 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
629
554
  return true;
630
555
  }
631
556
  }]);
632
- return DefaultHeightmapResource;
633
557
  }();
634
558
 
635
559
  var ImageFormat = /*#__PURE__*/function (ImageFormat) {
@@ -639,15 +563,14 @@ var ImageFormat = /*#__PURE__*/function (ImageFormat) {
639
563
  return ImageFormat;
640
564
  }({});
641
565
  var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
642
- _inherits(MapboxTerrainResource, _DefaultHeightmapReso);
643
- var _super = _createSuper(MapboxTerrainResource);
644
566
  function MapboxTerrainResource() {
645
567
  var _opts$highResolution, _opts$imageFormat;
646
568
  var _this;
647
569
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
648
570
  _classCallCheck(this, MapboxTerrainResource);
649
- _this = _super.call(this, opts);
650
- _defineProperty(_assertThisInitialized(_this), "resource", null);
571
+ _this = _callSuper(this, MapboxTerrainResource, [opts]);
572
+ _defineProperty(_this, "resource", null);
573
+ _defineProperty(_this, "credit", new Credit("Mapbox"));
651
574
  var highResolution = (_opts$highResolution = opts.highResolution) !== null && _opts$highResolution !== void 0 ? _opts$highResolution : false;
652
575
  var format = (_opts$imageFormat = opts.imageFormat) !== null && _opts$imageFormat !== void 0 ? _opts$imageFormat : ImageFormat.WEBP;
653
576
 
@@ -668,42 +591,71 @@ var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
668
591
  }
669
592
  return _this;
670
593
  }
594
+ _inherits(MapboxTerrainResource, _DefaultHeightmapReso);
671
595
  return _createClass(MapboxTerrainResource);
672
596
  }(DefaultHeightmapResource);
673
597
 
674
- function decodeBase64(base64, enableUnicode) {
675
- var binaryString = atob(base64);
676
- if (enableUnicode) {
677
- var binaryView = new Uint8Array(binaryString.length);
678
- for (var i = 0, n = binaryString.length; i < n; ++i) {
679
- binaryView[i] = binaryString.charCodeAt(i);
680
- }
681
- return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));
682
- }
683
- return binaryString;
684
- }
598
+ function _emptyMesh(n) {
599
+ n = Math.max(n, 2);
600
+ var nTriangles = Math.pow(n - 1, 2) * 2;
601
+ var nVertices = Math.pow(n, 2);
602
+ var quantizedVertices = new Uint16Array(nVertices * 3);
603
+ var indices = new Uint16Array(nTriangles * 3);
604
+ var westIndices = [];
605
+ var southIndices = [];
606
+ var eastIndices = [];
607
+ var northIndices = [];
608
+ var tix = 0;
609
+ for (var i = 0; i < nVertices; i++) {
610
+ var rx = i % n; //* 32767) / (n - 1);
611
+ var ry = Math.floor(i / n); //* 32767) / (n - 1);
612
+ var ix = n * rx + ry;
613
+ quantizedVertices[ix] = rx * 32768 / (n - 1);
614
+ quantizedVertices[nVertices + ix] = ry * 32768 / (n - 1);
615
+ quantizedVertices[2 * nVertices + ix] = 0;
616
+ if (ry == 0) westIndices.push(ix);
617
+ if (rx == 0) southIndices.push(ix);
618
+ if (rx == n - 1) eastIndices.push(ix);
619
+ if (ry == n - 1) northIndices.push(ix);
685
620
 
686
- function createURL(base64, sourcemapArg, enableUnicodeArg) {
687
- var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
688
- var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
689
- var source = decodeBase64(base64, enableUnicode);
690
- var start = source.indexOf('\n', 10) + 1;
691
- var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
692
- var blob = new Blob([body], { type: 'application/javascript' });
693
- return URL.createObjectURL(blob);
621
+ // Add triangles
622
+ var rix = i - ry * n;
623
+ if (rix != n - 1) {
624
+ indices[tix * 3] = i;
625
+ indices[tix * 3 + 1] = i + n + 1;
626
+ indices[tix * 3 + 2] = i + 1;
627
+ tix++;
628
+ }
629
+ if (rix != 0) {
630
+ indices[tix * 3] = i - 1;
631
+ indices[tix * 3 + 1] = i + n - 1;
632
+ indices[tix * 3 + 2] = i + n;
633
+ tix++;
634
+ }
635
+ }
636
+ return {
637
+ minimumHeight: 0,
638
+ maximumHeight: 0,
639
+ quantizedVertices: quantizedVertices,
640
+ indices: indices,
641
+ westIndices: westIndices,
642
+ southIndices: southIndices,
643
+ eastIndices: eastIndices,
644
+ northIndices: northIndices
645
+ };
694
646
  }
695
-
696
- function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
697
- var url;
698
- return function WorkerFactory(options) {
699
- url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
700
- return new Worker(url, options);
701
- };
647
+ var _meshCache = [];
648
+ function emptyMesh(n) {
649
+ // A memoized function to return empty meshes
650
+ if (n in _meshCache) {
651
+ return _meshCache[n];
652
+ } else {
653
+ var result = _emptyMesh(n);
654
+ _meshCache[n] = result;
655
+ return result;
656
+ }
702
657
  }
703
658
 
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);
705
- /* eslint-enable */
706
-
707
659
  var resolves = {};
708
660
  var rejects = {};
709
661
  var globalMsgId = 0; // Activate calculation in the worker, returning a promise
@@ -711,7 +663,7 @@ function sendMessage(_x, _x2, _x3) {
711
663
  return _sendMessage.apply(this, arguments);
712
664
  } // Handle incoming calculation result
713
665
  function _sendMessage() {
714
- _sendMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(worker, payload, transferableObjects) {
666
+ _sendMessage = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(worker, payload, transferableObjects) {
715
667
  var msgId, msg;
716
668
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
717
669
  while (1) switch (_context2.prev = _context2.next) {
@@ -762,15 +714,15 @@ function handleMessage(msg) {
762
714
  delete rejects[id];
763
715
  }
764
716
  var WorkerFarm = /*#__PURE__*/function () {
765
- function WorkerFarm() {
717
+ function WorkerFarm(opts) {
766
718
  _classCallCheck(this, WorkerFarm);
767
- this.worker = new WorkerFactory();
719
+ this.worker = opts.worker;
768
720
  this.worker.onmessage = handleMessage;
769
721
  }
770
- _createClass(WorkerFarm, [{
722
+ return _createClass(WorkerFarm, [{
771
723
  key: "scheduleTask",
772
724
  value: function () {
773
- var _scheduleTask = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, transferableObjects) {
725
+ var _scheduleTask = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, transferableObjects) {
774
726
  return _regeneratorRuntime().wrap(function _callee$(_context) {
775
727
  while (1) switch (_context.prev = _context.next) {
776
728
  case 0:
@@ -790,392 +742,63 @@ var WorkerFarm = /*#__PURE__*/function () {
790
742
  return scheduleTask;
791
743
  }()
792
744
  }]);
793
- return WorkerFarm;
794
745
  }();
795
746
 
796
- // We should save these
797
- //const canvas = new OffscreenCanvas(256, 256);
798
- //const ctx = canvas.getContext("2d");
799
-
800
- function mapboxTerrainToGrid(png, interval, offset) {
801
- var _interval, _offset;
802
- // maybe we should do this on the GPU using REGL?
803
- // but that would require GPU -> CPU -> GPU
804
- var gridSize = png.shape[0] + 1;
805
- var terrain = new Float32Array(gridSize * gridSize);
806
- var tileSize = png.shape[0];
807
- interval = (_interval = interval) !== null && _interval !== void 0 ? _interval : 0.1;
808
- offset = (_offset = offset) !== null && _offset !== void 0 ? _offset : -10000;
809
-
810
- // decode terrain values
811
- for (var y = 0; y < tileSize; y++) {
812
- for (var x = 0; x < tileSize; x++) {
813
- var yc = y;
814
- var r = png.get(x, yc, 0);
815
- var g = png.get(x, yc, 1);
816
- var b = png.get(x, yc, 2);
817
- terrain[y * gridSize + x] = r * 256 * 256 * interval + g * 256.0 * interval + b * interval + offset;
818
- }
819
- }
820
- // backfill right and bottom borders
821
- for (var _x = 0; _x < gridSize - 1; _x++) {
822
- terrain[gridSize * (gridSize - 1) + _x] = terrain[gridSize * (gridSize - 2) + _x];
823
- }
824
- for (var _y = 0; _y < gridSize; _y++) {
825
- terrain[gridSize * _y + gridSize - 1] = terrain[gridSize * _y + gridSize - 2];
826
- }
827
- return terrain;
828
- }
829
- function _emptyMesh(n) {
830
- n = Math.max(n, 2);
831
- var nTriangles = Math.pow(n - 1, 2) * 2;
832
- var nVertices = Math.pow(n, 2);
833
- var quantizedVertices = new Uint16Array(nVertices * 3);
834
- var indices = new Uint16Array(nTriangles * 3);
835
- var westIndices = [];
836
- var southIndices = [];
837
- var eastIndices = [];
838
- var northIndices = [];
839
- var tix = 0;
840
- for (var i = 0; i < nVertices; i++) {
841
- var rx = i % n; //* 32767) / (n - 1);
842
- var ry = Math.floor(i / n); //* 32767) / (n - 1);
843
- var ix = n * rx + ry;
844
- quantizedVertices[ix] = rx * 32768 / (n - 1);
845
- quantizedVertices[nVertices + ix] = ry * 32768 / (n - 1);
846
- quantizedVertices[2 * nVertices + ix] = 0;
847
- if (ry == 0) westIndices.push(ix);
848
- if (rx == 0) southIndices.push(ix);
849
- if (rx == n - 1) eastIndices.push(ix);
850
- if (ry == n - 1) northIndices.push(ix);
851
-
852
- // Add triangles
853
- var rix = i - ry * n;
854
- if (rix != n - 1) {
855
- indices[tix * 3] = i;
856
- indices[tix * 3 + 1] = i + n + 1;
857
- indices[tix * 3 + 2] = i + 1;
858
- tix++;
859
- }
860
- if (rix != 0) {
861
- indices[tix * 3] = i - 1;
862
- indices[tix * 3 + 1] = i + n - 1;
863
- indices[tix * 3 + 2] = i + n;
864
- tix++;
865
- }
866
- }
867
- return {
868
- minimumHeight: 0,
869
- maximumHeight: 0,
870
- quantizedVertices: quantizedVertices,
871
- indices: indices,
872
- westIndices: westIndices,
873
- southIndices: southIndices,
874
- eastIndices: eastIndices,
875
- northIndices: northIndices
876
- };
877
- }
878
- var _meshCache = [];
879
- function emptyMesh(n) {
880
- // A memoized function to return empty meshes
881
- if (n in _meshCache) {
882
- return _meshCache[n];
883
- } else {
884
- var result = _emptyMesh(n);
885
- _meshCache[n] = result;
886
- return result;
887
- }
888
- }
889
- function createQuantizedMeshData(tile, mesh, tileSize) {
890
- var xvals = [];
891
- var yvals = [];
892
- var heightMeters = [];
893
- var northIndices = [];
894
- var southIndices = [];
895
- var eastIndices = [];
896
- var westIndices = [];
897
- var minimumHeight = Infinity;
898
- var maximumHeight = -Infinity;
899
- var scalar = 32768.0 / tileSize;
900
- for (var ix = 0; ix < mesh.vertices.length / 2; ix++) {
901
- var vertexIx = ix;
902
- var px = mesh.vertices[ix * 2];
903
- var py = mesh.vertices[ix * 2 + 1];
904
- var height = tile.terrain[py * (tileSize + 1) + px];
905
- if (height > maximumHeight) maximumHeight = height;
906
- if (height < minimumHeight) minimumHeight = height;
907
- heightMeters.push(height);
908
- if (py == 0) northIndices.push(vertexIx);
909
- if (py == tileSize) southIndices.push(vertexIx);
910
- if (px == 0) westIndices.push(vertexIx);
911
- if (px == tileSize) eastIndices.push(vertexIx);
912
- var xv = px * scalar;
913
- var yv = (tileSize - py) * scalar;
914
- xvals.push(xv);
915
- yvals.push(yv);
916
- }
917
- var heightRange = maximumHeight - minimumHeight;
918
- var heights = heightMeters.map(function (d) {
919
- if (heightRange < 1) return 0;
920
- return (d - minimumHeight) * (32767.0 / heightRange);
921
- });
922
- var triangles = new Uint16Array(mesh.triangles);
923
- var quantizedVertices = new Uint16Array( //verts
924
- [].concat(xvals, yvals, _toConsumableArray(heights)));
925
-
926
- // SE NW NE
927
- // NE NW SE
928
-
929
- return {
930
- minimumHeight: minimumHeight,
931
- maximumHeight: maximumHeight,
932
- quantizedVertices: quantizedVertices,
933
- indices: triangles,
934
- westIndices: westIndices,
935
- southIndices: southIndices,
936
- eastIndices: eastIndices,
937
- northIndices: northIndices
938
- };
939
- }
940
-
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);
949
-
950
- // coordinates for all possible triangles in an RTIN tile
951
- this.coords = new Uint16Array(this.numTriangles * 4);
952
-
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
966
- }
967
-
968
- while ((id >>= 1) > 1) {
969
- const mx = ax + bx >> 1;
970
- const my = ay + by >> 1;
971
- if (id & 1) {
972
- // left half
973
- bx = ax;
974
- by = ay;
975
- ax = cx;
976
- ay = cy;
977
- } else {
978
- // right half
979
- ax = bx;
980
- ay = by;
981
- bx = cx;
982
- by = cy;
983
- }
984
- cx = mx;
985
- cy = my;
986
- }
987
- const k = i * 4;
988
- this.coords[k + 0] = ax;
989
- this.coords[k + 1] = ay;
990
- this.coords[k + 2] = bx;
991
- this.coords[k + 3] = by;
992
- }
993
- }
994
- createTile(terrain) {
995
- return new Tile(terrain, this);
996
- }
997
- }
998
- class Tile {
999
- constructor(terrain, martini) {
1000
- const size = martini.gridSize;
1001
- if (terrain.length !== size * size) throw new Error(`Expected terrain data of length ${size * size} (${size} x ${size}), got ${terrain.length}.`);
1002
- this.terrain = terrain;
1003
- this.martini = martini;
1004
- this.errors = new Float32Array(terrain.length);
1005
- this.update();
747
+ var DefaultTerrainDecoder = /*#__PURE__*/function () {
748
+ function DefaultTerrainDecoder() {
749
+ _classCallCheck(this, DefaultTerrainDecoder);
750
+ _defineProperty(this, "inProgress", 0);
751
+ _defineProperty(this, "maxRequests", 2);
1006
752
  }
1007
- update() {
1008
- const {
1009
- numTriangles,
1010
- numParentTriangles,
1011
- coords,
1012
- gridSize: size
1013
- } = this.martini;
1014
- const {
1015
- terrain,
1016
- errors
1017
- } = this;
1018
-
1019
- // iterate over all possible triangles, starting from the smallest level
1020
- for (let i = numTriangles - 1; i >= 0; i--) {
1021
- const k = i * 4;
1022
- const ax = coords[k + 0];
1023
- const ay = coords[k + 1];
1024
- const bx = coords[k + 2];
1025
- const by = coords[k + 3];
1026
- const mx = ax + bx >> 1;
1027
- const my = ay + by >> 1;
1028
- const cx = mx + my - ay;
1029
- const cy = my + ax - mx;
1030
-
1031
- // calculate error in the middle of the long edge of the triangle
1032
- const interpolatedHeight = (terrain[ay * size + ax] + terrain[by * size + bx]) / 2;
1033
- const middleIndex = my * size + mx;
1034
- const middleError = Math.abs(interpolatedHeight - terrain[middleIndex]);
1035
- errors[middleIndex] = Math.max(errors[middleIndex], middleError);
1036
- if (i < numParentTriangles) {
1037
- // bigger triangles; accumulate error with children
1038
- const leftChildIndex = (ay + cy >> 1) * size + (ax + cx >> 1);
1039
- const rightChildIndex = (by + cy >> 1) * size + (bx + cx >> 1);
1040
- errors[middleIndex] = Math.max(errors[middleIndex], errors[leftChildIndex], errors[rightChildIndex]);
1041
- }
1042
- }
1043
- }
1044
- getMesh(maxError = 0, maxLength = null) {
1045
- const {
1046
- gridSize: size,
1047
- indices
1048
- } = this.martini;
1049
- const {
1050
- errors
1051
- } = this;
1052
- let numVertices = 0;
1053
- let numTriangles = 0;
1054
- const max = size - 1;
1055
-
1056
- // The maxLength parameter will cause triangles to be generated until the legs are below this length
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;
1059
-
1060
- // use an index grid to keep track of vertices that were already used to avoid duplication
1061
- indices.fill(0);
1062
-
1063
- // retrieve mesh in two stages that both traverse the error map:
1064
- // - countElements: find used vertices (and assign each an index), and count triangles (for minimum allocation)
1065
- // - processTriangle: fill the allocated vertices & triangles typed arrays
1066
-
1067
- function countElements(ax, ay, bx, by, cx, cy) {
1068
- const mx = ax + bx >> 1;
1069
- const my = ay + by >> 1;
1070
- const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
1071
- if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
1072
- countElements(cx, cy, ax, ay, mx, my);
1073
- countElements(bx, by, cx, cy, mx, my);
1074
- } else {
1075
- indices[ay * size + ax] = indices[ay * size + ax] || ++numVertices;
1076
- indices[by * size + bx] = indices[by * size + bx] || ++numVertices;
1077
- indices[cy * size + cx] = indices[cy * size + cx] || ++numVertices;
1078
- numTriangles++;
1079
- }
753
+ return _createClass(DefaultTerrainDecoder, [{
754
+ key: "requestTileGeometry",
755
+ value: function requestTileGeometry(coords, processFunction) {
756
+ var _this = this;
757
+ if (this.inProgress > this.maxRequests) return undefined;
758
+ this.inProgress += 1;
759
+ return processFunction(coords)["finally"](function () {
760
+ _this.inProgress -= 1;
761
+ });
1080
762
  }
1081
- countElements(0, 0, max, max, max, 0);
1082
- countElements(max, max, 0, 0, 0, max);
1083
- const vertices = new Uint16Array(numVertices * 2);
1084
- const triangles = new Uint32Array(numTriangles * 3);
1085
- let triIndex = 0;
1086
- function processTriangle(ax, ay, bx, by, cx, cy) {
1087
- const mx = ax + bx >> 1;
1088
- const my = ay + by >> 1;
1089
- const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
1090
- if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
1091
- // triangle doesn't approximate the surface well enough; drill down further
1092
- processTriangle(cx, cy, ax, ay, mx, my);
1093
- processTriangle(bx, by, cx, cy, mx, my);
1094
- } else {
1095
- // add a triangle
1096
- const a = indices[ay * size + ax] - 1;
1097
- const b = indices[by * size + bx] - 1;
1098
- const c = indices[cy * size + cx] - 1;
1099
- vertices[2 * a] = ax;
1100
- vertices[2 * a + 1] = ay;
1101
- vertices[2 * b] = bx;
1102
- vertices[2 * b + 1] = by;
1103
- vertices[2 * c] = cx;
1104
- vertices[2 * c + 1] = cy;
1105
- triangles[triIndex++] = a;
1106
- triangles[triIndex++] = b;
1107
- triangles[triIndex++] = c;
1108
- }
763
+ }, {
764
+ key: "decodeTerrain",
765
+ value: function decodeTerrain(params, data) {
766
+ return Promise.resolve(null);
1109
767
  }
1110
- processTriangle(0, 0, max, max, max, 0);
1111
- processTriangle(max, max, 0, 0, 0, max);
1112
- return {
1113
- vertices,
1114
- triangles
1115
- };
1116
- }
1117
- }
1118
-
1119
- // https://github.com/CesiumGS/cesium/blob/1.76/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js
1120
-
1121
- var martini = null;
1122
- function decodeTerrain(parameters, transferableObjects) {
1123
- var _martini;
1124
- var imageData = parameters.imageData,
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
1133
- (_martini = martini) !== null && _martini !== void 0 ? _martini : martini = new Martini(tileSize + 1);
1134
- var terrain = mapboxTerrainToGrid(pixels, interval, offset);
1135
- var tile = martini.createTile(terrain);
1136
-
1137
- // get a mesh (vertices and triangles indices) for a 10m error
1138
- var mesh = tile.getMesh(errorLevel, parameters.maxLength);
1139
- return createQuantizedMeshData(tile, mesh, tileSize);
1140
- }
1141
- self.onmessage = function (msg) {
1142
- var _msg$data = msg.data,
1143
- id = _msg$data.id,
1144
- payload = _msg$data.payload;
1145
- if (id == null) return;
1146
- var objects = [];
1147
- var res = null;
1148
- try {
1149
- res = decodeTerrain(payload);
1150
- objects.push(res.indices.buffer);
1151
- objects.push(res.quantizedVertices.buffer);
1152
- self.postMessage({
1153
- id: id,
1154
- payload: res
1155
- }, objects);
1156
- } catch (err) {
1157
- self.postMessage({
1158
- id: id,
1159
- err: err.toString()
768
+ }]);
769
+ }();
770
+ var WorkerFarmTerrainDecoder = /*#__PURE__*/function (_DefaultTerrainDecode) {
771
+ function WorkerFarmTerrainDecoder(opts) {
772
+ var _opts$maxWorkers;
773
+ var _this2;
774
+ _classCallCheck(this, WorkerFarmTerrainDecoder);
775
+ _this2 = _callSuper(this, WorkerFarmTerrainDecoder);
776
+ _this2.farm = new WorkerFarm({
777
+ worker: opts.worker
1160
778
  });
1161
- } finally {
1162
- res = null;
1163
- objects = null;
779
+ _this2.maxRequests = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
780
+ return _this2;
1164
781
  }
1165
- };
782
+ _inherits(WorkerFarmTerrainDecoder, _DefaultTerrainDecode);
783
+ return _createClass(WorkerFarmTerrainDecoder, [{
784
+ key: "decodeTerrain",
785
+ value: function decodeTerrain(params, data) {
786
+ return this.farm.scheduleTask(params, [data]);
787
+ }
788
+ }]);
789
+ }(DefaultTerrainDecoder);
1166
790
 
1167
791
  // https://github.com/CesiumGS/cesium/blob/1.68/Source/Scene/MapboxImageryProvider.js#L42
1168
792
  var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
1169
- _inherits(StretchedTilingScheme, _WebMercatorTilingSch);
1170
- var _super = _createSuper(StretchedTilingScheme);
1171
793
  function StretchedTilingScheme() {
1172
794
  _classCallCheck(this, StretchedTilingScheme);
1173
- return _super.apply(this, arguments);
795
+ return _callSuper(this, StretchedTilingScheme, arguments);
1174
796
  }
1175
- _createClass(StretchedTilingScheme, [{
797
+ _inherits(StretchedTilingScheme, _WebMercatorTilingSch);
798
+ return _createClass(StretchedTilingScheme, [{
1176
799
  key: "tileXYToRectangle",
1177
800
  value: function tileXYToRectangle(x, y, level, res) {
1178
- var result = _get(_getPrototypeOf(StretchedTilingScheme.prototype), "tileXYToRectangle", this).call(this, x, y, level);
801
+ var result = _superPropGet(StretchedTilingScheme, "tileXYToRectangle", this, 3)([x, y, level]);
1179
802
  if (y == 0) {
1180
803
  //console.log("Top row", res, y, level);
1181
804
  result.north = Math.PI / 2;
@@ -1186,12 +809,11 @@ var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
1186
809
  return result;
1187
810
  }
1188
811
  }]);
1189
- return StretchedTilingScheme;
1190
812
  }(WebMercatorTilingScheme);
1191
813
  var MartiniTerrainProvider = /*#__PURE__*/function () {
1192
814
  // @ts-ignore
1193
815
  function MartiniTerrainProvider() {
1194
- var _opts$interval, _opts$offset, _opts$maxWorkers, _opts$minZoomLevel, _opts$fillPoles, _opts$detailScalar, _opts$minimumErrorLev, _opts$ellipsoid;
816
+ var _this$resource$credit, _opts$minZoomLevel, _opts$fillPoles, _opts$detailScalar, _opts$minimumErrorLev, _opts$ellipsoid;
1195
817
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1196
818
  _classCallCheck(this, MartiniTerrainProvider);
1197
819
  _defineProperty(this, "hasWaterMask", false);
@@ -1199,32 +821,36 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1199
821
  _defineProperty(this, "credit", new Credit("Mapbox"));
1200
822
  _defineProperty(this, "availability", null);
1201
823
  _defineProperty(this, "errorEvent", new Event());
1202
- _defineProperty(this, "workerFarm", null);
1203
- _defineProperty(this, "inProgressWorkers", 0);
1204
824
  _defineProperty(this, "levelOfDetailScalar", null);
1205
- _defineProperty(this, "maxWorkers", 5);
1206
825
  _defineProperty(this, "minError", 0.1);
1207
826
  _defineProperty(this, "fillPoles", true);
1208
827
  _defineProperty(this, "_errorAtMinZoom", 1000);
1209
828
  _defineProperty(this, "resource", null);
829
+ _defineProperty(this, "decoder", null);
1210
830
  _defineProperty(this, "RADIUS_SCALAR", 1.0);
1211
831
  //this.martini = new Martini(257);
1212
832
  this.resource = opts.resource;
1213
- this.interval = (_opts$interval = opts.interval) !== null && _opts$interval !== void 0 ? _opts$interval : 0.1;
1214
- this.offset = (_opts$offset = opts.offset) !== null && _opts$offset !== void 0 ? _opts$offset : -10000;
1215
- this.maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
833
+ this.credit = (_this$resource$credit = this.resource.credit) !== null && _this$resource$credit !== void 0 ? _this$resource$credit : new Credit("Mapbox");
834
+ this.decoder = opts.decoder;
835
+ if (!this.decoder) {
836
+ var _opts$maxWorkers;
837
+ var maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
838
+ if (maxWorkers > 0) {
839
+ this.decoder = new WorkerFarmTerrainDecoder({
840
+ maxWorkers: maxWorkers
841
+ });
842
+ } else {
843
+ this.decoder = new DefaultTerrainDecoder();
844
+ }
845
+ }
1216
846
  this.minZoomLevel = (_opts$minZoomLevel = opts.minZoomLevel) !== null && _opts$minZoomLevel !== void 0 ? _opts$minZoomLevel : 3;
1217
847
  this.fillPoles = (_opts$fillPoles = opts.fillPoles) !== null && _opts$fillPoles !== void 0 ? _opts$fillPoles : true;
1218
- console.log("fillPoles", this.fillPoles);
1219
848
  this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 4.0) + Math$1.EPSILON5;
1220
849
  this.ready = true;
1221
850
  this.readyPromise = Promise.resolve(true);
1222
851
  this.minError = (_opts$minimumErrorLev = opts.minimumErrorLevel) !== null && _opts$minimumErrorLev !== void 0 ? _opts$minimumErrorLev : 0.1;
1223
852
  this.errorEvent.addEventListener(console.log, this);
1224
853
  this.ellipsoid = (_opts$ellipsoid = opts.ellipsoid) !== null && _opts$ellipsoid !== void 0 ? _opts$ellipsoid : Ellipsoid.WGS84;
1225
- if (this.maxWorkers > 0) {
1226
- this.workerFarm = new WorkerFarm();
1227
- }
1228
854
  var scheme = WebMercatorTilingScheme;
1229
855
  if (this.fillPoles) {
1230
856
  scheme = StretchedTilingScheme;
@@ -1236,43 +862,40 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1236
862
  });
1237
863
  this._errorAtMinZoom = this.errorAtZoom(this.minZoomLevel);
1238
864
  }
1239
- _createClass(MartiniTerrainProvider, [{
865
+ return _createClass(MartiniTerrainProvider, [{
1240
866
  key: "requestTileGeometry",
1241
867
  value: function requestTileGeometry(x, y, z, request) {
1242
- var _this = this;
1243
868
  // Look for tiles both below the zoom level and below the error threshold for the zoom level at the equator...
1244
-
1245
869
  if (z < this.minZoomLevel || this.scaledErrorForTile(x, y, z) > this._errorAtMinZoom) {
1246
870
  // If we are below the minimum zoom level, we return empty heightmaps
1247
871
  // to avoid unnecessary requests for low-resolution data.
1248
872
  return Promise.resolve(this.emptyMesh(x, y, z));
1249
873
  }
1250
-
1251
874
  // Note: we still load a TON of tiles near the poles. We might need to do some overzooming here...
1252
-
1253
- if (this.inProgressWorkers > this.maxWorkers) return undefined;
1254
- this.inProgressWorkers += 1;
1255
- return this.processTile(x, y, z)["finally"](function () {
1256
- _this.inProgressWorkers -= 1;
1257
- });
875
+ return this.decoder.requestTileGeometry({
876
+ x: x,
877
+ y: y,
878
+ z: z
879
+ }, this.processTile.bind(this));
1258
880
  }
1259
881
  }, {
1260
882
  key: "processTile",
1261
883
  value: function () {
1262
- var _processTile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(x, y, z) {
1263
- var _this$resource, tileSize, getTilePixels, px, pixelData, tileRect, err, maxLength, params, res;
884
+ var _processTile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
885
+ var x, y, z, _this$resource, tileSize, getTilePixels, px, pixelData, tileRect, err, maxLength, params, res;
1264
886
  return _regeneratorRuntime().wrap(function _callee$(_context) {
1265
887
  while (1) switch (_context.prev = _context.next) {
1266
888
  case 0:
1267
- _context.prev = 0;
889
+ x = _ref.x, y = _ref.y, z = _ref.z;
890
+ _context.prev = 1;
1268
891
  _this$resource = this.resource, tileSize = _this$resource.tileSize, getTilePixels = _this$resource.getTilePixels;
1269
- _context.next = 4;
892
+ _context.next = 5;
1270
893
  return getTilePixels({
1271
894
  x: x,
1272
895
  y: y,
1273
896
  z: z
1274
897
  });
1275
- case 4:
898
+ case 5:
1276
899
  px = _context.sent;
1277
900
  pixelData = px.data;
1278
901
  tileRect = this.tilingScheme.tileXYToRectangle(x, y, z); ///const center = Rectangle.center(tileRect);
@@ -1286,38 +909,27 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1286
909
  z: z,
1287
910
  errorLevel: err,
1288
911
  ellipsoidRadius: this.ellipsoid.maximumRadius,
1289
- tileSize: tileSize,
1290
- interval: this.interval,
1291
- offset: this.offset
912
+ tileSize: tileSize
1292
913
  };
1293
- if (!(this.workerFarm != null)) {
1294
- _context.next = 16;
1295
- break;
1296
- }
1297
914
  _context.next = 13;
1298
- return this.workerFarm.scheduleTask(params, [pixelData.buffer]);
915
+ return this.decoder.decodeTerrain(params, pixelData.buffer);
1299
916
  case 13:
1300
917
  res = _context.sent;
1301
- _context.next = 17;
1302
- break;
1303
- case 16:
1304
- res = decodeTerrain(params);
1305
- case 17:
1306
918
  pixelData = undefined;
1307
919
  px = undefined;
1308
920
  return _context.abrupt("return", this.createQuantizedMeshData(tileRect, err, res));
1309
- case 22:
1310
- _context.prev = 22;
1311
- _context.t0 = _context["catch"](0);
921
+ case 19:
922
+ _context.prev = 19;
923
+ _context.t0 = _context["catch"](1);
1312
924
  console.log(_context.t0);
1313
925
  return _context.abrupt("return", this.emptyMesh(x, y, z));
1314
- case 26:
926
+ case 23:
1315
927
  case "end":
1316
928
  return _context.stop();
1317
929
  }
1318
- }, _callee, this, [[0, 22]]);
930
+ }, _callee, this, [[1, 19]]);
1319
931
  }));
1320
- function processTile(_x, _x2, _x3) {
932
+ function processTile(_x) {
1321
933
  return _processTile.apply(this, arguments);
1322
934
  }
1323
935
  return processTile;
@@ -1376,7 +988,6 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1376
988
  var occlusionPoint = new Cartographic(center.longitude, center.latitude, occlusionHeight
1377
989
  // Scaling factor of two just to be sure.
1378
990
  );
1379
-
1380
991
  var horizonOcclusionPoint = this.ellipsoid.transformPositionToScaledSpace(Cartographic.toCartesian(occlusionPoint));
1381
992
  var orientedBoundingBox = OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, this.tilingScheme.ellipsoid);
1382
993
  var boundingSphere = BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox);
@@ -1424,19 +1035,56 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1424
1035
  });
1425
1036
  }
1426
1037
  }]);
1427
- return MartiniTerrainProvider;
1428
1038
  }();
1039
+
1040
+ function decodeBase64(base64, enableUnicode) {
1041
+ var binaryString = atob(base64);
1042
+ if (enableUnicode) {
1043
+ var binaryView = new Uint8Array(binaryString.length);
1044
+ for (var i = 0, n = binaryString.length; i < n; ++i) {
1045
+ binaryView[i] = binaryString.charCodeAt(i);
1046
+ }
1047
+ const decoder = new TextDecoder("utf-16le");
1048
+ return decoder.decode(new Uint16Array(binaryView.buffer));
1049
+ }
1050
+ return binaryString;
1051
+ }
1052
+
1053
+ function createURL(base64, sourcemapArg, enableUnicodeArg) {
1054
+ var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
1055
+ var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
1056
+ var source = decodeBase64(base64, enableUnicode);
1057
+ var start = source.indexOf('\n', 10) + 1;
1058
+ var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
1059
+ var blob = new Blob([body], { type: 'application/javascript' });
1060
+ return URL.createObjectURL(blob);
1061
+ }
1062
+
1063
+ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
1064
+ var url;
1065
+ return function WorkerFactory(options) {
1066
+ url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
1067
+ return new Worker(url, options);
1068
+ };
1069
+ }
1070
+
1071
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkgewogICAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpOwogICAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7CiAgfQogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkocikgewogICAgaWYgKCJ1bmRlZmluZWQiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByWyJAQGl0ZXJhdG9yIl0pIHJldHVybiBBcnJheS5mcm9tKHIpOwogIH0KICBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKICB9CiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMocikgfHwgX2l0ZXJhYmxlVG9BcnJheShyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7CiAgICBpZiAocikgewogICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIHIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKTsKICAgICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTsKICAgICAgcmV0dXJuICJPYmplY3QiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCAiTWFwIiA9PT0gdCB8fCAiU2V0IiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiAiQXJndW1lbnRzIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOwogICAgfQogIH0KCiAgLy8gV2Ugc2hvdWxkIHNhdmUgdGhlc2UKICAvL2NvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoMjU2LCAyNTYpOwogIC8vY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CgogIC8qKiBNYXBib3ggVGVycmFpbi1SR0IgZGVmYXVsdCBkZWNvZGUgZnVuY3Rpb24KICAqICAociAqIDI1NiAqIDI1NikgLyAxMCArIChnICogMjU2KSAvIDEwICsgYiAvIDEwIC0gMTAwMDAKICAqLwogIHZhciBkZWZhdWx0TWFwYm94RGVjb2RlUmdiID0gZnVuY3Rpb24gZGVmYXVsdE1hcGJveERlY29kZVJnYihyLCBnLCBiLCBhKSB7CiAgICByZXR1cm4gciAqIDY1NTMuNiArIGcgKiAyNS42ICsgYiAqIDAuMSAtIDEwMDAwOwogIH07CiAgZnVuY3Rpb24gcmdiVGVycmFpblRvR3JpZChwbmcsIGRlY29kZVJnYikgewogICAgLy8gbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgb24gdGhlIEdQVSB1c2luZyBSRUdMPwogICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBHUFUgLT4gQ1BVIC0+IEdQVQogICAgdmFyIGdyaWRTaXplID0gcG5nLnNoYXBlWzBdICsgMTsKICAgIHZhciB0ZXJyYWluID0gbmV3IEZsb2F0MzJBcnJheShncmlkU2l6ZSAqIGdyaWRTaXplKTsKICAgIHZhciB0aWxlU2l6ZSA9IHBuZy5zaGFwZVswXTsKICAgIHZhciBkZWNvZGUgPSBkZWNvZGVSZ2IgIT09IG51bGwgJiYgZGVjb2RlUmdiICE9PSB2b2lkIDAgPyBkZWNvZGVSZ2IgOiBkZWZhdWx0TWFwYm94RGVjb2RlUmdiOwoKICAgIC8vIGRlY29kZSB0ZXJyYWluIHZhbHVlcwogICAgZm9yICh2YXIgeSA9IDA7IHkgPCB0aWxlU2l6ZTsgeSsrKSB7CiAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgdGlsZVNpemU7IHgrKykgewogICAgICAgIHZhciB5YyA9IHk7CiAgICAgICAgdmFyIF9yID0gcG5nLmdldCh4LCB5YywgMCk7CiAgICAgICAgdmFyIF9nID0gcG5nLmdldCh4LCB5YywgMSk7CiAgICAgICAgdmFyIF9iID0gcG5nLmdldCh4LCB5YywgMik7CiAgICAgICAgdmFyIF9hID0gcG5nLmdldCh4LCB5YywgMyk7CiAgICAgICAgdGVycmFpblt5ICogZ3JpZFNpemUgKyB4XSA9IGRlY29kZShfciwgX2csIF9iLCBfYSk7CiAgICAgIH0KICAgIH0KICAgIC8vIGJhY2tmaWxsIHJpZ2h0IGFuZCBib3R0b20gYm9yZGVycwogICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IGdyaWRTaXplIC0gMTsgX3grKykgewogICAgICB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMSkgKyBfeF0gPSB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMikgKyBfeF07CiAgICB9CiAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgZ3JpZFNpemU7IF95KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIF95ICsgZ3JpZFNpemUgLSAxXSA9IHRlcnJhaW5bZ3JpZFNpemUgKiBfeSArIGdyaWRTaXplIC0gMl07CiAgICB9CiAgICByZXR1cm4gdGVycmFpbjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpIHsKICAgIHZhciB4dmFscyA9IFtdOwogICAgdmFyIHl2YWxzID0gW107CiAgICB2YXIgaGVpZ2h0TWV0ZXJzID0gW107CiAgICB2YXIgbm9ydGhJbmRpY2VzID0gW107CiAgICB2YXIgc291dGhJbmRpY2VzID0gW107CiAgICB2YXIgZWFzdEluZGljZXMgPSBbXTsKICAgIHZhciB3ZXN0SW5kaWNlcyA9IFtdOwogICAgdmFyIG1pbmltdW1IZWlnaHQgPSBJbmZpbml0eTsKICAgIHZhciBtYXhpbXVtSGVpZ2h0ID0gLUluZmluaXR5OwogICAgdmFyIHNjYWxhciA9IDMyNzY4LjAgLyB0aWxlU2l6ZTsKICAgIGZvciAodmFyIGl4ID0gMDsgaXggPCBtZXNoLnZlcnRpY2VzLmxlbmd0aCAvIDI7IGl4KyspIHsKICAgICAgdmFyIHZlcnRleEl4ID0gaXg7CiAgICAgIHZhciBweCA9IG1lc2gudmVydGljZXNbaXggKiAyXTsKICAgICAgdmFyIHB5ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDIgKyAxXTsKICAgICAgdmFyIGhlaWdodCA9IHRpbGUudGVycmFpbltweSAqICh0aWxlU2l6ZSArIDEpICsgcHhdOwogICAgICBpZiAoaGVpZ2h0ID4gbWF4aW11bUhlaWdodCkgbWF4aW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1IZWlnaHQpIG1pbmltdW1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGhlaWdodE1ldGVycy5wdXNoKGhlaWdodCk7CiAgICAgIGlmIChweSA9PSAwKSBub3J0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweSA9PSB0aWxlU2l6ZSkgc291dGhJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHggPT0gMCkgd2VzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSB0aWxlU2l6ZSkgZWFzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIHZhciB4diA9IHB4ICogc2NhbGFyOwogICAgICB2YXIgeXYgPSAodGlsZVNpemUgLSBweSkgKiBzY2FsYXI7CiAgICAgIHh2YWxzLnB1c2goeHYpOwogICAgICB5dmFscy5wdXNoKHl2KTsKICAgIH0KICAgIHZhciBoZWlnaHRSYW5nZSA9IG1heGltdW1IZWlnaHQgLSBtaW5pbXVtSGVpZ2h0OwogICAgdmFyIGhlaWdodHMgPSBoZWlnaHRNZXRlcnMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgIGlmIChoZWlnaHRSYW5nZSA8IDEpIHJldHVybiAwOwogICAgICByZXR1cm4gKGQgLSBtaW5pbXVtSGVpZ2h0KSAqICgzMjc2Ny4wIC8gaGVpZ2h0UmFuZ2UpOwogICAgfSk7CiAgICB2YXIgdHJpYW5nbGVzID0gbmV3IFVpbnQxNkFycmF5KG1lc2gudHJpYW5nbGVzKTsKICAgIHZhciBxdWFudGl6ZWRWZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSgvL3ZlcnRzCiAgICBbXS5jb25jYXQoeHZhbHMsIHl2YWxzLCBfdG9Db25zdW1hYmxlQXJyYXkoaGVpZ2h0cykpKTsKCiAgICAvLyBTRSBOVyBORQogICAgLy8gTkUgTlcgU0UKCiAgICByZXR1cm4gewogICAgICBtaW5pbXVtSGVpZ2h0OiBtaW5pbXVtSGVpZ2h0LAogICAgICBtYXhpbXVtSGVpZ2h0OiBtYXhpbXVtSGVpZ2h0LAogICAgICBxdWFudGl6ZWRWZXJ0aWNlczogcXVhbnRpemVkVmVydGljZXMsCiAgICAgIGluZGljZXM6IHRyaWFuZ2xlcywKICAgICAgd2VzdEluZGljZXM6IHdlc3RJbmRpY2VzLAogICAgICBzb3V0aEluZGljZXM6IHNvdXRoSW5kaWNlcywKICAgICAgZWFzdEluZGljZXM6IGVhc3RJbmRpY2VzLAogICAgICBub3J0aEluZGljZXM6IG5vcnRoSW5kaWNlcwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGlvdGEobikgewogICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShuKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHJlc3VsdFtpXSA9IGk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICB2YXIgaW90YV8xID0gaW90YTsKCiAgLyohCiAgICogRGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlcgogICAqCiAgICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz4KICAgKiBAbGljZW5zZSAgTUlUCiAgICovCiAgLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZwogIC8vIE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkKICB2YXIgaXNCdWZmZXJfMSA9IGZ1bmN0aW9uIChvYmopIHsKICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpOwogIH07CiAgZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7CiAgICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKTsKICB9CgogIC8vIEZvciBOb2RlIHYwLjEwIHN1cHBvcnQuIFJlbW92ZSB0aGlzIGV2ZW50dWFsbHkuCiAgZnVuY3Rpb24gaXNTbG93QnVmZmVyKG9iaikgewogICAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0J1ZmZlcihvYmouc2xpY2UoMCwgMCkpOwogIH0KCiAgdmFyIGhhc1R5cGVkQXJyYXlzID0gdHlwZW9mIEZsb2F0NjRBcnJheSAhPT0gInVuZGVmaW5lZCI7CiAgZnVuY3Rpb24gY29tcGFyZTFzdChhLCBiKSB7CiAgICByZXR1cm4gYVswXSAtIGJbMF07CiAgfQogIGZ1bmN0aW9uIG9yZGVyKCkgewogICAgdmFyIHN0cmlkZSA9IHRoaXMuc3RyaWRlOwogICAgdmFyIHRlcm1zID0gbmV3IEFycmF5KHN0cmlkZS5sZW5ndGgpOwogICAgdmFyIGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVybXMubGVuZ3RoOyArK2kpIHsKICAgICAgdGVybXNbaV0gPSBbTWF0aC5hYnMoc3RyaWRlW2ldKSwgaV07CiAgICB9CiAgICB0ZXJtcy5zb3J0KGNvbXBhcmUxc3QpOwogICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0ZXJtcy5sZW5ndGgpOwogICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewogICAgICByZXN1bHRbaV0gPSB0ZXJtc1tpXVsxXTsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIGNvbXBpbGVDb25zdHJ1Y3RvcihkdHlwZSwgZGltZW5zaW9uKSB7CiAgICB2YXIgY2xhc3NOYW1lID0gWyJWaWV3IiwgZGltZW5zaW9uLCAiZCIsIGR0eXBlXS5qb2luKCIiKTsKICAgIGlmIChkaW1lbnNpb24gPCAwKSB7CiAgICAgIGNsYXNzTmFtZSA9ICJWaWV3X05pbCIgKyBkdHlwZTsKICAgIH0KICAgIHZhciB1c2VHZXR0ZXJzID0gZHR5cGUgPT09ICJnZW5lcmljIjsKICAgIGlmIChkaW1lbnNpb24gPT09IC0xKSB7CiAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciB0cml2aWFsIGFycmF5cwogICAgICB2YXIgY29kZSA9ICJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhKXt0aGlzLmRhdGE9YTt9O1wKdmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZTtcCnByb3RvLmR0eXBlPSciICsgZHR5cGUgKyAiJztcCnByb3RvLmluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIC0xfTtcCnByb3RvLnNpemU9MDtcCnByb3RvLmRpbWVuc2lvbj0tMTtcCnByb3RvLnNoYXBlPXByb3RvLnN0cmlkZT1wcm90by5vcmRlcj1bXTtcCnByb3RvLmxvPXByb3RvLmhpPXByb3RvLnRyYW5zcG9zZT1wcm90by5zdGVwPVwKZnVuY3Rpb24oKXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSk7fTtcCnByb3RvLmdldD1wcm90by5zZXQ9ZnVuY3Rpb24oKXt9O1wKcHJvdG8ucGljaz1mdW5jdGlvbigpe3JldHVybiBudWxsfTtcCnJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RfIiArIGNsYXNzTmFtZSArICIoYSl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIihhKTt9IjsKICAgICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbihjb2RlKTsKICAgICAgcmV0dXJuIHByb2NlZHVyZSgpOwogICAgfSBlbHNlIGlmIChkaW1lbnNpb24gPT09IDApIHsKICAgICAgLy9TcGVjaWFsIGNhc2UgZm9yIDBkIGFycmF5cwogICAgICB2YXIgY29kZSA9ICJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhLGQpIHtcCnRoaXMuZGF0YSA9IGE7XAp0aGlzLm9mZnNldCA9IGRcCn07XAp2YXIgcHJvdG89IiArIGNsYXNzTmFtZSArICIucHJvdG90eXBlO1wKcHJvdG8uZHR5cGU9JyIgKyBkdHlwZSArICInO1wKcHJvdG8uaW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vZmZzZXR9O1wKcHJvdG8uZGltZW5zaW9uPTA7XApwcm90by5zaXplPTE7XApwcm90by5zaGFwZT1cCnByb3RvLnN0cmlkZT1cCnByb3RvLm9yZGVyPVtdO1wKcHJvdG8ubG89XApwcm90by5oaT1cCnByb3RvLnRyYW5zcG9zZT1cCnByb3RvLnN0ZXA9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfY29weSgpIHtcCnJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLHRoaXMub2Zmc2V0KVwKfTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfcGljaygpe1wKcmV0dXJuIFRyaXZpYWxBcnJheSh0aGlzLmRhdGEpO1wKfTtcCnByb3RvLnZhbHVlT2Y9cHJvdG8uZ2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2dldCgpe1wKcmV0dXJuICIgKyAodXNlR2V0dGVycyA/ICJ0aGlzLmRhdGEuZ2V0KHRoaXMub2Zmc2V0KSIgOiAidGhpcy5kYXRhW3RoaXMub2Zmc2V0XSIpICsgIn07XApwcm90by5zZXQ9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfc2V0KHYpe1wKcmV0dXJuICIgKyAodXNlR2V0dGVycyA/ICJ0aGlzLmRhdGEuc2V0KHRoaXMub2Zmc2V0LHYpIiA6ICJ0aGlzLmRhdGFbdGhpcy5vZmZzZXRdPXYiKSArICJcCn07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGEsYixjLGQpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIoYSxkKX0iOwogICAgICB2YXIgcHJvY2VkdXJlID0gbmV3IEZ1bmN0aW9uKCJUcml2aWFsQXJyYXkiLCBjb2RlKTsKICAgICAgcmV0dXJuIHByb2NlZHVyZShDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXVswXSk7CiAgICB9CiAgICB2YXIgY29kZSA9IFsiJ3VzZSBzdHJpY3QnIl07CgogICAgLy9DcmVhdGUgY29uc3RydWN0b3IgZm9yIHZpZXcKICAgIHZhciBpbmRpY2VzID0gaW90YV8xKGRpbWVuc2lvbik7CiAgICB2YXIgYXJncyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiaSIgKyBpOwogICAgfSk7CiAgICB2YXIgaW5kZXhfc3RyID0gInRoaXMub2Zmc2V0KyIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInRoaXMuc3RyaWRlWyIgKyBpICsgIl0qaSIgKyBpOwogICAgfSkuam9pbigiKyIpOwogICAgdmFyIHNoYXBlQXJnID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJiIiArIGk7CiAgICB9KS5qb2luKCIsIik7CiAgICB2YXIgc3RyaWRlQXJnID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJjIiArIGk7CiAgICB9KS5qb2luKCIsIik7CiAgICBjb2RlLnB1c2goImZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiKGEsIiArIHNoYXBlQXJnICsgIiwiICsgc3RyaWRlQXJnICsgIixkKXt0aGlzLmRhdGE9YSIsICJ0aGlzLnNoYXBlPVsiICsgc2hhcGVBcmcgKyAiXSIsICJ0aGlzLnN0cmlkZT1bIiArIHN0cmlkZUFyZyArICJdIiwgInRoaXMub2Zmc2V0PWR8MH0iLCAidmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZSIsICJwcm90by5kdHlwZT0nIiArIGR0eXBlICsgIiciLCAicHJvdG8uZGltZW5zaW9uPSIgKyBkaW1lbnNpb24pOwoKICAgIC8vdmlldy5zaXplOgogICAgY29kZS5wdXNoKCJPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sJ3NpemUnLHtnZXQ6ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfc2l6ZSgpe1wKcmV0dXJuICIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIqIiksICJ9fSkiKTsKCiAgICAvL3ZpZXcub3JkZXI6CiAgICBpZiAoZGltZW5zaW9uID09PSAxKSB7CiAgICAgIGNvZGUucHVzaCgicHJvdG8ub3JkZXI9WzBdIik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goIk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywnb3JkZXInLHtnZXQ6Iik7CiAgICAgIGlmIChkaW1lbnNpb24gPCA0KSB7CiAgICAgICAgY29kZS5wdXNoKCJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9vcmRlcigpeyIpOwogICAgICAgIGlmIChkaW1lbnNpb24gPT09IDIpIHsKICAgICAgICAgIGNvZGUucHVzaCgicmV0dXJuIChNYXRoLmFicyh0aGlzLnN0cmlkZVswXSk+TWF0aC5hYnModGhpcy5zdHJpZGVbMV0pKT9bMSwwXTpbMCwxXX19KSIpOwogICAgICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uID09PSAzKSB7CiAgICAgICAgICBjb2RlLnB1c2goInZhciBzMD1NYXRoLmFicyh0aGlzLnN0cmlkZVswXSksczE9TWF0aC5hYnModGhpcy5zdHJpZGVbMV0pLHMyPU1hdGguYWJzKHRoaXMuc3RyaWRlWzJdKTtcCmlmKHMwPnMxKXtcCmlmKHMxPnMyKXtcCnJldHVybiBbMiwxLDBdO1wKfWVsc2UgaWYoczA+czIpe1wKcmV0dXJuIFsxLDIsMF07XAp9ZWxzZXtcCnJldHVybiBbMSwwLDJdO1wKfVwKfWVsc2UgaWYoczA+czIpe1wKcmV0dXJuIFsyLDAsMV07XAp9ZWxzZSBpZihzMj5zMSl7XApyZXR1cm4gWzAsMSwyXTtcCn1lbHNle1wKcmV0dXJuIFswLDIsMV07XAp9fX0pIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvZGUucHVzaCgiT1JERVJ9KSIpOwogICAgICB9CiAgICB9CgogICAgLy92aWV3LnNldChpMCwgLi4uLCB2KToKICAgIGNvZGUucHVzaCgicHJvdG8uc2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NldCgiICsgYXJncy5qb2luKCIsIikgKyAiLHYpeyIpOwogICAgaWYgKHVzZUdldHRlcnMpIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhLnNldCgiICsgaW5kZXhfc3RyICsgIix2KX0iKTsKICAgIH0gZWxzZSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YVsiICsgaW5kZXhfc3RyICsgIl09dn0iKTsKICAgIH0KCiAgICAvL3ZpZXcuZ2V0KGkwLCAuLi4pOgogICAgY29kZS5wdXNoKCJwcm90by5nZXQ9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfZ2V0KCIgKyBhcmdzLmpvaW4oIiwiKSArICIpeyIpOwogICAgaWYgKHVzZUdldHRlcnMpIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhLmdldCgiICsgaW5kZXhfc3RyICsgIil9Iik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGFbIiArIGluZGV4X3N0ciArICJdfSIpOwogICAgfQoKICAgIC8vdmlldy5pbmRleDoKICAgIGNvZGUucHVzaCgicHJvdG8uaW5kZXg9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfaW5kZXgoIiwgYXJncy5qb2luKCksICIpe3JldHVybiAiICsgaW5kZXhfc3RyICsgIn0iKTsKCiAgICAvL3ZpZXcuaGkoKToKICAgIGNvZGUucHVzaCgicHJvdG8uaGk9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfaGkoIiArIGFyZ3Muam9pbigiLCIpICsgIil7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiBbIih0eXBlb2YgaSIsIGksICIhPT0nbnVtYmVyJ3x8aSIsIGksICI8MCk/dGhpcy5zaGFwZVsiLCBpLCAiXTppIiwgaSwgInwwIl0uam9pbigiIik7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInRoaXMuc3RyaWRlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiLCIpICsgIix0aGlzLm9mZnNldCl9Iik7CgogICAgLy92aWV3LmxvKCk6CiAgICB2YXIgYV92YXJzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGkgKyAiPXRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KTsKICAgIHZhciBjX3ZhcnMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImMiICsgaSArICI9dGhpcy5zdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KTsKICAgIGNvZGUucHVzaCgicHJvdG8ubG89ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfbG8oIiArIGFyZ3Muam9pbigiLCIpICsgIil7dmFyIGI9dGhpcy5vZmZzZXQsZD0wLCIgKyBhX3ZhcnMuam9pbigiLCIpICsgIiwiICsgY192YXJzLmpvaW4oIiwiKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgiaWYodHlwZW9mIGkiICsgaSArICI9PT0nbnVtYmVyJyYmaSIgKyBpICsgIj49MCl7XApkPWkiICsgaSArICJ8MDtcCmIrPWMiICsgaSArICIqZDtcCmEiICsgaSArICItPWR9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYyIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIixiKX0iKTsKCiAgICAvL3ZpZXcuc3RlcCgpOgogICAgY29kZS5wdXNoKCJwcm90by5zdGVwPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3N0ZXAoIiArIGFyZ3Muam9pbigiLCIpICsgIil7dmFyICIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaSArICI9dGhpcy5zaGFwZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpICsgIj10aGlzLnN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsYz10aGlzLm9mZnNldCxkPTAsY2VpbD1NYXRoLmNlaWwiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKCJpZih0eXBlb2YgaSIgKyBpICsgIj09PSdudW1iZXInKXtcCmQ9aSIgKyBpICsgInwwO1wKaWYoZDwwKXtcCmMrPWIiICsgaSArICIqKGEiICsgaSArICItMSk7XAphIiArIGkgKyAiPWNlaWwoLWEiICsgaSArICIvZClcCn1lbHNle1wKYSIgKyBpICsgIj1jZWlsKGEiICsgaSArICIvZClcCn1cCmIiICsgaSArICIqPWRcCn0iKTsKICAgIH0KICAgIGNvZGUucHVzaCgicmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYSIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJiIiArIGk7CiAgICB9KS5qb2luKCIsIikgKyAiLGMpfSIpOwoKICAgIC8vdmlldy50cmFuc3Bvc2UoKToKICAgIHZhciB0U2hhcGUgPSBuZXcgQXJyYXkoZGltZW5zaW9uKTsKICAgIHZhciB0U3RyaWRlID0gbmV3IEFycmF5KGRpbWVuc2lvbik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIHRTaGFwZVtpXSA9ICJhW2kiICsgaSArICJdIjsKICAgICAgdFN0cmlkZVtpXSA9ICJiW2kiICsgaSArICJdIjsKICAgIH0KICAgIGNvZGUucHVzaCgicHJvdG8udHJhbnNwb3NlPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3RyYW5zcG9zZSgiICsgYXJncyArICIpeyIgKyBhcmdzLm1hcChmdW5jdGlvbiAobiwgaWR4KSB7CiAgICAgIHJldHVybiBuICsgIj0oIiArIG4gKyAiPT09dW5kZWZpbmVkPyIgKyBpZHggKyAiOiIgKyBuICsgInwwKSI7CiAgICB9KS5qb2luKCI7IiksICJ2YXIgYT10aGlzLnNoYXBlLGI9dGhpcy5zdHJpZGU7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEsIiArIHRTaGFwZS5qb2luKCIsIikgKyAiLCIgKyB0U3RyaWRlLmpvaW4oIiwiKSArICIsdGhpcy5vZmZzZXQpfSIpOwoKICAgIC8vdmlldy5waWNrKCk6CiAgICBjb2RlLnB1c2goInByb3RvLnBpY2s9ZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfcGljaygiICsgYXJncyArICIpe3ZhciBhPVtdLGI9W10sYz10aGlzLm9mZnNldCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goImlmKHR5cGVvZiBpIiArIGkgKyAiPT09J251bWJlcicmJmkiICsgaSArICI+PTApe2M9KGMrdGhpcy5zdHJpZGVbIiArIGkgKyAiXSppIiArIGkgKyAiKXwwfWVsc2V7YS5wdXNoKHRoaXMuc2hhcGVbIiArIGkgKyAiXSk7Yi5wdXNoKHRoaXMuc3RyaWRlWyIgKyBpICsgIl0pfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJ2YXIgY3Rvcj1DVE9SX0xJU1RbYS5sZW5ndGgrMV07cmV0dXJuIGN0b3IodGhpcy5kYXRhLGEsYixjKX0iKTsKCiAgICAvL0FkZCByZXR1cm4gc3RhdGVtZW50CiAgICBjb2RlLnB1c2goInJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RfIiArIGNsYXNzTmFtZSArICIoZGF0YSxzaGFwZSxzdHJpZGUsb2Zmc2V0KXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKGRhdGEsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAic2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsb2Zmc2V0KX0iKTsKCiAgICAvL0NvbXBpbGUgcHJvY2VkdXJlCiAgICB2YXIgcHJvY2VkdXJlID0gbmV3IEZ1bmN0aW9uKCJDVE9SX0xJU1QiLCAiT1JERVIiLCBjb2RlLmpvaW4oIlxuIikpOwogICAgcmV0dXJuIHByb2NlZHVyZShDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXSwgb3JkZXIpOwogIH0KICBmdW5jdGlvbiBhcnJheURUeXBlKGRhdGEpIHsKICAgIGlmIChpc0J1ZmZlcl8xKGRhdGEpKSB7CiAgICAgIHJldHVybiAiYnVmZmVyIjsKICAgIH0KICAgIGlmIChoYXNUeXBlZEFycmF5cykgewogICAgICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRhKSkgewogICAgICAgIGNhc2UgIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImZsb2F0NjQiOwogICAgICAgIGNhc2UgIltvYmplY3QgRmxvYXQzMkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImZsb2F0MzIiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImludDgiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50MTZBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQxNiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBJbnQzMkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImludDMyIjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQ4QXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDgiOwogICAgICAgIGNhc2UgIltvYmplY3QgVWludDE2QXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDE2IjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQzMkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQzMiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50OF9jbGFtcGVkIjsKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ0ludDY0QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiYmlnaW50NjQiOwogICAgICAgIGNhc2UgIltvYmplY3QgQmlnVWludDY0QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiYmlndWludDY0IjsKICAgICAgfQogICAgfQogICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHsKICAgICAgcmV0dXJuICJhcnJheSI7CiAgICB9CiAgICByZXR1cm4gImdlbmVyaWMiOwogIH0KICB2YXIgQ0FDSEVEX0NPTlNUUlVDVE9SUyA9IHsKICAgICJmbG9hdDMyIjogW10sCiAgICAiZmxvYXQ2NCI6IFtdLAogICAgImludDgiOiBbXSwKICAgICJpbnQxNiI6IFtdLAogICAgImludDMyIjogW10sCiAgICAidWludDgiOiBbXSwKICAgICJ1aW50MTYiOiBbXSwKICAgICJ1aW50MzIiOiBbXSwKICAgICJhcnJheSI6IFtdLAogICAgInVpbnQ4X2NsYW1wZWQiOiBbXSwKICAgICJiaWdpbnQ2NCI6IFtdLAogICAgImJpZ3VpbnQ2NCI6IFtdLAogICAgImJ1ZmZlciI6IFtdLAogICAgImdlbmVyaWMiOiBbXQogIH07CiAgZnVuY3Rpb24gd3JhcHBlZE5EQXJyYXlDdG9yKGRhdGEsIHNoYXBlLCBzdHJpZGUsIG9mZnNldCkgewogICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkgewogICAgICB2YXIgY3RvciA9IENBQ0hFRF9DT05TVFJVQ1RPUlMuYXJyYXlbMF07CiAgICAgIHJldHVybiBjdG9yKFtdKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICJudW1iZXIiKSB7CiAgICAgIGRhdGEgPSBbZGF0YV07CiAgICB9CiAgICBpZiAoc2hhcGUgPT09IHVuZGVmaW5lZCkgewogICAgICBzaGFwZSA9IFtkYXRhLmxlbmd0aF07CiAgICB9CiAgICB2YXIgZCA9IHNoYXBlLmxlbmd0aDsKICAgIGlmIChzdHJpZGUgPT09IHVuZGVmaW5lZCkgewogICAgICBzdHJpZGUgPSBuZXcgQXJyYXkoZCk7CiAgICAgIGZvciAodmFyIGkgPSBkIC0gMSwgc3ogPSAxOyBpID49IDA7IC0taSkgewogICAgICAgIHN0cmlkZVtpXSA9IHN6OwogICAgICAgIHN6ICo9IHNoYXBlW2ldOwogICAgICB9CiAgICB9CiAgICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHsKICAgICAgb2Zmc2V0ID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkOyArK2kpIHsKICAgICAgICBpZiAoc3RyaWRlW2ldIDwgMCkgewogICAgICAgICAgb2Zmc2V0IC09IChzaGFwZVtpXSAtIDEpICogc3RyaWRlW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIGR0eXBlID0gYXJyYXlEVHlwZShkYXRhKTsKICAgIHZhciBjdG9yX2xpc3QgPSBDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXTsKICAgIHdoaWxlIChjdG9yX2xpc3QubGVuZ3RoIDw9IGQgKyAxKSB7CiAgICAgIGN0b3JfbGlzdC5wdXNoKGNvbXBpbGVDb25zdHJ1Y3RvcihkdHlwZSwgY3Rvcl9saXN0Lmxlbmd0aCAtIDEpKTsKICAgIH0KICAgIHZhciBjdG9yID0gY3Rvcl9saXN0W2QgKyAxXTsKICAgIHJldHVybiBjdG9yKGRhdGEsIHNoYXBlLCBzdHJpZGUsIG9mZnNldCk7CiAgfQogIHZhciBuZGFycmF5ID0gd3JhcHBlZE5EQXJyYXlDdG9yOwoKICBjbGFzcyBNYXJ0aW5pIHsKICAgIGNvbnN0cnVjdG9yKGdyaWRTaXplID0gMjU3KSB7CiAgICAgIHRoaXMuZ3JpZFNpemUgPSBncmlkU2l6ZTsKICAgICAgY29uc3QgdGlsZVNpemUgPSBncmlkU2l6ZSAtIDE7CiAgICAgIGlmICh0aWxlU2l6ZSAmIHRpbGVTaXplIC0gMSkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBncmlkIHNpemUgdG8gYmUgMl5uKzEsIGdvdCAke2dyaWRTaXplfS5gKTsKICAgICAgdGhpcy5udW1UcmlhbmdsZXMgPSB0aWxlU2l6ZSAqIHRpbGVTaXplICogMiAtIDI7CiAgICAgIHRoaXMubnVtUGFyZW50VHJpYW5nbGVzID0gdGhpcy5udW1UcmlhbmdsZXMgLSB0aWxlU2l6ZSAqIHRpbGVTaXplOwogICAgICB0aGlzLmluZGljZXMgPSBuZXcgVWludDMyQXJyYXkodGhpcy5ncmlkU2l6ZSAqIHRoaXMuZ3JpZFNpemUpOwoKICAgICAgLy8gY29vcmRpbmF0ZXMgZm9yIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMgaW4gYW4gUlRJTiB0aWxlCiAgICAgIHRoaXMuY29vcmRzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubnVtVHJpYW5nbGVzICogNCk7CgogICAgICAvLyBnZXQgdHJpYW5nbGUgY29vcmRpbmF0ZXMgZnJvbSBpdHMgaW5kZXggaW4gYW4gaW1wbGljaXQgYmluYXJ5IHRyZWUKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bVRyaWFuZ2xlczsgaSsrKSB7CiAgICAgICAgbGV0IGlkID0gaSArIDI7CiAgICAgICAgbGV0IGF4ID0gMCwKICAgICAgICAgIGF5ID0gMCwKICAgICAgICAgIGJ4ID0gMCwKICAgICAgICAgIGJ5ID0gMCwKICAgICAgICAgIGN4ID0gMCwKICAgICAgICAgIGN5ID0gMDsKICAgICAgICBpZiAoaWQgJiAxKSB7CiAgICAgICAgICBieCA9IGJ5ID0gY3ggPSB0aWxlU2l6ZTsgLy8gYm90dG9tLWxlZnQgdHJpYW5nbGUKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYXggPSBheSA9IGN5ID0gdGlsZVNpemU7IC8vIHRvcC1yaWdodCB0cmlhbmdsZQogICAgICAgIH0KICAgICAgICB3aGlsZSAoKGlkID4+PSAxKSA+IDEpIHsKICAgICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgICBpZiAoaWQgJiAxKSB7CiAgICAgICAgICAgIC8vIGxlZnQgaGFsZgogICAgICAgICAgICBieCA9IGF4OwogICAgICAgICAgICBieSA9IGF5OwogICAgICAgICAgICBheCA9IGN4OwogICAgICAgICAgICBheSA9IGN5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmlnaHQgaGFsZgogICAgICAgICAgICBheCA9IGJ4OwogICAgICAgICAgICBheSA9IGJ5OwogICAgICAgICAgICBieCA9IGN4OwogICAgICAgICAgICBieSA9IGN5OwogICAgICAgICAgfQogICAgICAgICAgY3ggPSBteDsKICAgICAgICAgIGN5ID0gbXk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMF0gPSBheDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMV0gPSBheTsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgMl0gPSBieDsKICAgICAgICB0aGlzLmNvb3Jkc1trICsgM10gPSBieTsKICAgICAgfQogICAgfQogICAgY3JlYXRlVGlsZSh0ZXJyYWluKSB7CiAgICAgIHJldHVybiBuZXcgVGlsZSh0ZXJyYWluLCB0aGlzKTsKICAgIH0KICB9CiAgY2xhc3MgVGlsZSB7CiAgICBjb25zdHJ1Y3Rvcih0ZXJyYWluLCBtYXJ0aW5pKSB7CiAgICAgIGNvbnN0IHNpemUgPSBtYXJ0aW5pLmdyaWRTaXplOwogICAgICBpZiAodGVycmFpbi5sZW5ndGggIT09IHNpemUgKiBzaXplKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRlcnJhaW4gZGF0YSBvZiBsZW5ndGggJHtzaXplICogc2l6ZX0gKCR7c2l6ZX0geCAke3NpemV9KSwgZ290ICR7dGVycmFpbi5sZW5ndGh9LmApOwogICAgICB0aGlzLnRlcnJhaW4gPSB0ZXJyYWluOwogICAgICB0aGlzLm1hcnRpbmkgPSBtYXJ0aW5pOwogICAgICB0aGlzLmVycm9ycyA9IG5ldyBGbG9hdDMyQXJyYXkodGVycmFpbi5sZW5ndGgpOwogICAgICB0aGlzLnVwZGF0ZSgpOwogICAgfQogICAgdXBkYXRlKCkgewogICAgICBjb25zdCB7CiAgICAgICAgbnVtVHJpYW5nbGVzLAogICAgICAgIG51bVBhcmVudFRyaWFuZ2xlcywKICAgICAgICBjb29yZHMsCiAgICAgICAgZ3JpZFNpemU6IHNpemUKICAgICAgfSA9IHRoaXMubWFydGluaTsKICAgICAgY29uc3QgewogICAgICAgIHRlcnJhaW4sCiAgICAgICAgZXJyb3JzCiAgICAgIH0gPSB0aGlzOwoKICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IGxldmVsCiAgICAgIGZvciAobGV0IGkgPSBudW1UcmlhbmdsZXMgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICBjb25zdCBheCA9IGNvb3Jkc1trICsgMF07CiAgICAgICAgY29uc3QgYXkgPSBjb29yZHNbayArIDFdOwogICAgICAgIGNvbnN0IGJ4ID0gY29vcmRzW2sgKyAyXTsKICAgICAgICBjb25zdCBieSA9IGNvb3Jkc1trICsgM107CiAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgY29uc3QgY3ggPSBteCArIG15IC0gYXk7CiAgICAgICAgY29uc3QgY3kgPSBteSArIGF4IC0gbXg7CgogICAgICAgIC8vIGNhbGN1bGF0ZSBlcnJvciBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsb25nIGVkZ2Ugb2YgdGhlIHRyaWFuZ2xlCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkSGVpZ2h0ID0gKHRlcnJhaW5bYXkgKiBzaXplICsgYXhdICsgdGVycmFpbltieSAqIHNpemUgKyBieF0pIC8gMjsKICAgICAgICBjb25zdCBtaWRkbGVJbmRleCA9IG15ICogc2l6ZSArIG14OwogICAgICAgIGNvbnN0IG1pZGRsZUVycm9yID0gTWF0aC5hYnMoaW50ZXJwb2xhdGVkSGVpZ2h0IC0gdGVycmFpblttaWRkbGVJbmRleF0pOwogICAgICAgIGVycm9yc1ttaWRkbGVJbmRleF0gPSBNYXRoLm1heChlcnJvcnNbbWlkZGxlSW5kZXhdLCBtaWRkbGVFcnJvcik7CiAgICAgICAgaWYgKGkgPCBudW1QYXJlbnRUcmlhbmdsZXMpIHsKICAgICAgICAgIC8vIGJpZ2dlciB0cmlhbmdsZXM7IGFjY3VtdWxhdGUgZXJyb3Igd2l0aCBjaGlsZHJlbgogICAgICAgICAgY29uc3QgbGVmdENoaWxkSW5kZXggPSAoYXkgKyBjeSA+PiAxKSAqIHNpemUgKyAoYXggKyBjeCA+PiAxKTsKICAgICAgICAgIGNvbnN0IHJpZ2h0Q2hpbGRJbmRleCA9IChieSArIGN5ID4+IDEpICogc2l6ZSArIChieCArIGN4ID4+IDEpOwogICAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIGVycm9yc1tsZWZ0Q2hpbGRJbmRleF0sIGVycm9yc1tyaWdodENoaWxkSW5kZXhdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGdldE1lc2gobWF4RXJyb3IgPSAwLCBtYXhMZW5ndGggPSBudWxsKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBncmlkU2l6ZTogc2l6ZSwKICAgICAgICBpbmRpY2VzCiAgICAgIH0gPSB0aGlzLm1hcnRpbmk7CiAgICAgIGNvbnN0IHsKICAgICAgICBlcnJvcnMKICAgICAgfSA9IHRoaXM7CiAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7CiAgICAgIGxldCBudW1UcmlhbmdsZXMgPSAwOwogICAgICBjb25zdCBtYXggPSBzaXplIC0gMTsKCiAgICAgIC8vIFRoZSBtYXhMZW5ndGggcGFyYW1ldGVyIHdpbGwgY2F1c2UgdHJpYW5nbGVzIHRvIGJlIGdlbmVyYXRlZCB1bnRpbCB0aGUgbGVncyBhcmUgYmVsb3cgdGhpcyBsZW5ndGgKICAgICAgLy8gSXQgaXMgbWVhbnQgdG8gc3VwcG9ydCBjYXNlcyB3aGVyZSBhIGNlcnRhaW4gbWVzaCBkZW5zaXR5IGlzIHJlcXVpcmVkIHRvIGRvIHNwaGVyaWNhbCBtYXRoIG9uIGRpZ2l0YWwgZ2xvYmVzCiAgICAgIGNvbnN0IG1heFNjYWxlID0gbWF4TGVuZ3RoIHx8IHNpemU7CgogICAgICAvLyB1c2UgYW4gaW5kZXggZ3JpZCB0byBrZWVwIHRyYWNrIG9mIHZlcnRpY2VzIHRoYXQgd2VyZSBhbHJlYWR5IHVzZWQgdG8gYXZvaWQgZHVwbGljYXRpb24KICAgICAgaW5kaWNlcy5maWxsKDApOwoKICAgICAgLy8gcmV0cmlldmUgbWVzaCBpbiB0d28gc3RhZ2VzIHRoYXQgYm90aCB0cmF2ZXJzZSB0aGUgZXJyb3IgbWFwOgogICAgICAvLyAtIGNvdW50RWxlbWVudHM6IGZpbmQgdXNlZCB2ZXJ0aWNlcyAoYW5kIGFzc2lnbiBlYWNoIGFuIGluZGV4KSwgYW5kIGNvdW50IHRyaWFuZ2xlcyAoZm9yIG1pbmltdW0gYWxsb2NhdGlvbikKICAgICAgLy8gLSBwcm9jZXNzVHJpYW5nbGU6IGZpbGwgdGhlIGFsbG9jYXRlZCB2ZXJ0aWNlcyAmIHRyaWFuZ2xlcyB0eXBlZCBhcnJheXMKCiAgICAgIGZ1bmN0aW9uIGNvdW50RWxlbWVudHMoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CiAgICAgICAgaWYgKGxlZ0xlbmd0aCA+IDEgJiYgZXJyb3JzW215ICogc2l6ZSArIG14XSA+IG1heEVycm9yIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICBjb3VudEVsZW1lbnRzKGN4LCBjeSwgYXgsIGF5LCBteCwgbXkpOwogICAgICAgICAgY291bnRFbGVtZW50cyhieCwgYnksIGN4LCBjeSwgbXgsIG15KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5kaWNlc1theSAqIHNpemUgKyBheF0gPSBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgaW5kaWNlc1tieSAqIHNpemUgKyBieF0gPSBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgaW5kaWNlc1tjeSAqIHNpemUgKyBjeF0gPSBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgbnVtVHJpYW5nbGVzKys7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNvdW50RWxlbWVudHMoMCwgMCwgbWF4LCBtYXgsIG1heCwgMCk7CiAgICAgIGNvdW50RWxlbWVudHMobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CiAgICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IFVpbnQxNkFycmF5KG51bVZlcnRpY2VzICogMik7CiAgICAgIGNvbnN0IHRyaWFuZ2xlcyA9IG5ldyBVaW50MzJBcnJheShudW1UcmlhbmdsZXMgKiAzKTsKICAgICAgbGV0IHRyaUluZGV4ID0gMDsKICAgICAgZnVuY3Rpb24gcHJvY2Vzc1RyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3kpIHsKICAgICAgICBjb25zdCBteCA9IGF4ICsgYnggPj4gMTsKICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICBjb25zdCBsZWdMZW5ndGggPSBNYXRoLmFicyhheCAtIGN4KSArIE1hdGguYWJzKGF5IC0gY3kpOwogICAgICAgIGlmIChsZWdMZW5ndGggPiAxICYmIGVycm9yc1tteSAqIHNpemUgKyBteF0gPiBtYXhFcnJvciB8fCBsZWdMZW5ndGggPiBtYXhTY2FsZSkgewogICAgICAgICAgLy8gdHJpYW5nbGUgZG9lc24ndCBhcHByb3hpbWF0ZSB0aGUgc3VyZmFjZSB3ZWxsIGVub3VnaDsgZHJpbGwgZG93biBmdXJ0aGVyCiAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUoYngsIGJ5LCBjeCwgY3ksIG14LCBteSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGFkZCBhIHRyaWFuZ2xlCiAgICAgICAgICBjb25zdCBhID0gaW5kaWNlc1theSAqIHNpemUgKyBheF0gLSAxOwogICAgICAgICAgY29uc3QgYiA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIC0gMTsKICAgICAgICAgIGNvbnN0IGMgPSBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSAtIDE7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYV0gPSBheDsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBhICsgMV0gPSBheTsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBiXSA9IGJ4OwogICAgICAgICAgdmVydGljZXNbMiAqIGIgKyAxXSA9IGJ5OwogICAgICAgICAgdmVydGljZXNbMiAqIGNdID0gY3g7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYyArIDFdID0gY3k7CiAgICAgICAgICB0cmlhbmdsZXNbdHJpSW5kZXgrK10gPSBhOwogICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYjsKICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGM7CiAgICAgICAgfQogICAgICB9CiAgICAgIHByb2Nlc3NUcmlhbmdsZSgwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgcHJvY2Vzc1RyaWFuZ2xlKG1heCwgbWF4LCAwLCAwLCAwLCBtYXgpOwogICAgICByZXR1cm4gewogICAgICAgIHZlcnRpY2VzLAogICAgICAgIHRyaWFuZ2xlcwogICAgICB9OwogICAgfQogIH0KCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0Nlc2l1bUdTL2Nlc2l1bS9ibG9iLzEuNzYvU291cmNlL1dvcmtlcnNFUzYvY3JlYXRlVmVydGljZXNGcm9tUXVhbnRpemVkVGVycmFpbk1lc2guanMKCiAgdmFyIG1hcnRpbmkgPSBudWxsOwogIGZ1bmN0aW9uIGRlY29kZVRlcnJhaW4ocGFyYW1ldGVycywgdHJhbnNmZXJhYmxlT2JqZWN0cykgewogICAgdmFyIGltYWdlRGF0YSA9IHBhcmFtZXRlcnMuaW1hZ2VEYXRhLAogICAgICBfcGFyYW1ldGVycyR0aWxlU2l6ZSA9IHBhcmFtZXRlcnMudGlsZVNpemUsCiAgICAgIHRpbGVTaXplID0gX3BhcmFtZXRlcnMkdGlsZVNpemUgPT09IHZvaWQgMCA/IDI1NiA6IF9wYXJhbWV0ZXJzJHRpbGVTaXplLAogICAgICBlcnJvckxldmVsID0gcGFyYW1ldGVycy5lcnJvckxldmVsOwogICAgdmFyIHBpeGVscyA9IG5kYXJyYXkobmV3IFVpbnQ4QXJyYXkoaW1hZ2VEYXRhKSwgW3RpbGVTaXplLCB0aWxlU2l6ZSwgNF0sIFs0LCA0ICogdGlsZVNpemUsIDFdLCAwKTsKCiAgICAvLyBUaWxlIHNpemUgbXVzdCBiZSBtYWludGFpbmVkIHRocm91Z2ggdGhlIGxpZmUgb2YgdGhlIHdvcmtlcgogICAgbWFydGluaSAhPT0gbnVsbCAmJiBtYXJ0aW5pICE9PSB2b2lkIDAgPyBtYXJ0aW5pIDogbWFydGluaSA9IG5ldyBNYXJ0aW5pKHRpbGVTaXplICsgMSk7CiAgICB2YXIgdGVycmFpbiA9IHJnYlRlcnJhaW5Ub0dyaWQocGl4ZWxzKTsKICAgIHZhciB0aWxlID0gbWFydGluaS5jcmVhdGVUaWxlKHRlcnJhaW4pOwoKICAgIC8vIGdldCBhIG1lc2ggKHZlcnRpY2VzIGFuZCB0cmlhbmdsZXMgaW5kaWNlcykgZm9yIGEgMTBtIGVycm9yCiAgICB2YXIgbWVzaCA9IHRpbGUuZ2V0TWVzaChlcnJvckxldmVsLCBwYXJhbWV0ZXJzLm1heExlbmd0aCk7CiAgICByZXR1cm4gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpOwogIH0KICBzZWxmLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChtc2cpIHsKICAgIHZhciBfbXNnJGRhdGEgPSBtc2cuZGF0YSwKICAgICAgaWQgPSBfbXNnJGRhdGEuaWQsCiAgICAgIHBheWxvYWQgPSBfbXNnJGRhdGEucGF5bG9hZDsKICAgIGlmIChpZCA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgb2JqZWN0cyA9IFtdOwogICAgdmFyIHJlcyA9IG51bGw7CiAgICB0cnkgewogICAgICByZXMgPSBkZWNvZGVUZXJyYWluKHBheWxvYWQpOwogICAgICBvYmplY3RzLnB1c2gocmVzLmluZGljZXMuYnVmZmVyKTsKICAgICAgb2JqZWN0cy5wdXNoKHJlcy5xdWFudGl6ZWRWZXJ0aWNlcy5idWZmZXIpOwogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBpZDogaWQsCiAgICAgICAgcGF5bG9hZDogcmVzCiAgICAgIH0sIG9iamVjdHMpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGlkOiBpZCwKICAgICAgICBlcnI6IGVyci50b1N0cmluZygpCiAgICAgIH0pOwogICAgfSBmaW5hbGx5IHsKICAgICAgcmVzID0gbnVsbDsKICAgICAgb2JqZWN0cyA9IG51bGw7CiAgICB9CiAgfTsKCn0pKCk7Cgo=', null, false);
1072
+ /* eslint-enable */
1073
+
1429
1074
  var MapboxTerrainProvider = /*#__PURE__*/function (_MartiniTerrainProvid) {
1430
- _inherits(MapboxTerrainProvider, _MartiniTerrainProvid);
1431
- var _super2 = _createSuper(MapboxTerrainProvider);
1432
1075
  function MapboxTerrainProvider() {
1433
1076
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1434
1077
  _classCallCheck(this, MapboxTerrainProvider);
1435
1078
  var resource = new MapboxTerrainResource(opts);
1436
- return _super2.call(this, _objectSpread2(_objectSpread2({}, opts), {}, {
1437
- resource: resource
1438
- }));
1079
+ var decoder = new WorkerFarmTerrainDecoder({
1080
+ worker: new WorkerFactory()
1081
+ });
1082
+ return _callSuper(this, MapboxTerrainProvider, [_objectSpread2(_objectSpread2({}, opts), {}, {
1083
+ resource: resource,
1084
+ decoder: decoder
1085
+ })]);
1439
1086
  }
1087
+ _inherits(MapboxTerrainProvider, _MartiniTerrainProvid);
1440
1088
  return _createClass(MapboxTerrainProvider);
1441
1089
  }(MartiniTerrainProvider);
1442
1090