@macrostrat/cesium-martini 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,1455 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cesium = require('cesium');
6
+ var ndarray = require('ndarray');
7
+
8
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
9
+
10
+ var ndarray__default = /*#__PURE__*/_interopDefaultLegacy(ndarray);
11
+
12
+ function ownKeys(e, r) {
13
+ var t = Object.keys(e);
14
+ if (Object.getOwnPropertySymbols) {
15
+ var o = Object.getOwnPropertySymbols(e);
16
+ r && (o = o.filter(function (r) {
17
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
18
+ })), t.push.apply(t, o);
19
+ }
20
+ return t;
21
+ }
22
+ function _objectSpread2(e) {
23
+ for (var r = 1; r < arguments.length; r++) {
24
+ var t = null != arguments[r] ? arguments[r] : {};
25
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
26
+ _defineProperty(e, r, t[r]);
27
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
28
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
29
+ });
30
+ }
31
+ return e;
32
+ }
33
+ function _regeneratorRuntime() {
34
+ _regeneratorRuntime = function () {
35
+ return e;
36
+ };
37
+ var t,
38
+ e = {},
39
+ r = Object.prototype,
40
+ n = r.hasOwnProperty,
41
+ o = Object.defineProperty || function (t, e, r) {
42
+ t[e] = r.value;
43
+ },
44
+ i = "function" == typeof Symbol ? Symbol : {},
45
+ a = i.iterator || "@@iterator",
46
+ c = i.asyncIterator || "@@asyncIterator",
47
+ u = i.toStringTag || "@@toStringTag";
48
+ function define(t, e, r) {
49
+ return Object.defineProperty(t, e, {
50
+ value: r,
51
+ enumerable: !0,
52
+ configurable: !0,
53
+ writable: !0
54
+ }), t[e];
55
+ }
56
+ try {
57
+ define({}, "");
58
+ } catch (t) {
59
+ define = function (t, e, r) {
60
+ return t[e] = r;
61
+ };
62
+ }
63
+ function wrap(t, e, r, n) {
64
+ var i = e && e.prototype instanceof Generator ? e : Generator,
65
+ a = Object.create(i.prototype),
66
+ c = new Context(n || []);
67
+ return o(a, "_invoke", {
68
+ value: makeInvokeMethod(t, r, c)
69
+ }), a;
70
+ }
71
+ function tryCatch(t, e, r) {
72
+ try {
73
+ return {
74
+ type: "normal",
75
+ arg: t.call(e, r)
76
+ };
77
+ } catch (t) {
78
+ return {
79
+ type: "throw",
80
+ arg: t
81
+ };
82
+ }
83
+ }
84
+ e.wrap = wrap;
85
+ var h = "suspendedStart",
86
+ l = "suspendedYield",
87
+ f = "executing",
88
+ s = "completed",
89
+ y = {};
90
+ function Generator() {}
91
+ function GeneratorFunction() {}
92
+ function GeneratorFunctionPrototype() {}
93
+ var p = {};
94
+ define(p, a, function () {
95
+ return this;
96
+ });
97
+ var d = Object.getPrototypeOf,
98
+ v = d && d(d(values([])));
99
+ v && v !== r && n.call(v, a) && (p = v);
100
+ var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p);
101
+ function defineIteratorMethods(t) {
102
+ ["next", "throw", "return"].forEach(function (e) {
103
+ define(t, e, function (t) {
104
+ return this._invoke(e, t);
105
+ });
106
+ });
107
+ }
108
+ function AsyncIterator(t, e) {
109
+ function invoke(r, o, i, a) {
110
+ var c = tryCatch(t[r], t, o);
111
+ if ("throw" !== c.type) {
112
+ var u = c.arg,
113
+ h = u.value;
114
+ return h && "object" == typeof h && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) {
115
+ invoke("next", t, i, a);
116
+ }, function (t) {
117
+ invoke("throw", t, i, a);
118
+ }) : e.resolve(h).then(function (t) {
119
+ u.value = t, i(u);
120
+ }, function (t) {
121
+ return invoke("throw", t, i, a);
122
+ });
123
+ }
124
+ a(c.arg);
125
+ }
126
+ var r;
127
+ o(this, "_invoke", {
128
+ value: function (t, n) {
129
+ function callInvokeWithMethodAndArg() {
130
+ return new e(function (e, r) {
131
+ invoke(t, n, e, r);
132
+ });
133
+ }
134
+ return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
135
+ }
136
+ });
137
+ }
138
+ function makeInvokeMethod(e, r, n) {
139
+ var o = h;
140
+ return function (i, a) {
141
+ if (o === f) throw new Error("Generator is already running");
142
+ if (o === s) {
143
+ if ("throw" === i) throw a;
144
+ return {
145
+ value: t,
146
+ done: !0
147
+ };
148
+ }
149
+ for (n.method = i, n.arg = a;;) {
150
+ var c = n.delegate;
151
+ if (c) {
152
+ var u = maybeInvokeDelegate(c, n);
153
+ if (u) {
154
+ if (u === y) continue;
155
+ return u;
156
+ }
157
+ }
158
+ if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) {
159
+ if (o === h) throw o = s, n.arg;
160
+ n.dispatchException(n.arg);
161
+ } else "return" === n.method && n.abrupt("return", n.arg);
162
+ o = f;
163
+ var p = tryCatch(e, r, n);
164
+ if ("normal" === p.type) {
165
+ if (o = n.done ? s : l, p.arg === y) continue;
166
+ return {
167
+ value: p.arg,
168
+ done: n.done
169
+ };
170
+ }
171
+ "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg);
172
+ }
173
+ };
174
+ }
175
+ function maybeInvokeDelegate(e, r) {
176
+ var n = r.method,
177
+ o = e.iterator[n];
178
+ if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y;
179
+ var i = tryCatch(o, e.iterator, r.arg);
180
+ if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y;
181
+ var a = i.arg;
182
+ return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y);
183
+ }
184
+ function pushTryEntry(t) {
185
+ var e = {
186
+ tryLoc: t[0]
187
+ };
188
+ 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e);
189
+ }
190
+ function resetTryEntry(t) {
191
+ var e = t.completion || {};
192
+ e.type = "normal", delete e.arg, t.completion = e;
193
+ }
194
+ function Context(t) {
195
+ this.tryEntries = [{
196
+ tryLoc: "root"
197
+ }], t.forEach(pushTryEntry, this), this.reset(!0);
198
+ }
199
+ function values(e) {
200
+ if (e || "" === e) {
201
+ var r = e[a];
202
+ if (r) return r.call(e);
203
+ if ("function" == typeof e.next) return e;
204
+ if (!isNaN(e.length)) {
205
+ var o = -1,
206
+ i = function next() {
207
+ for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next;
208
+ return next.value = t, next.done = !0, next;
209
+ };
210
+ return i.next = i;
211
+ }
212
+ }
213
+ throw new TypeError(typeof e + " is not iterable");
214
+ }
215
+ return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", {
216
+ value: GeneratorFunctionPrototype,
217
+ configurable: !0
218
+ }), o(GeneratorFunctionPrototype, "constructor", {
219
+ value: GeneratorFunction,
220
+ configurable: !0
221
+ }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) {
222
+ var e = "function" == typeof t && t.constructor;
223
+ return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name));
224
+ }, e.mark = function (t) {
225
+ return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t;
226
+ }, e.awrap = function (t) {
227
+ return {
228
+ __await: t
229
+ };
230
+ }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () {
231
+ return this;
232
+ }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) {
233
+ void 0 === i && (i = Promise);
234
+ var a = new AsyncIterator(wrap(t, r, n, o), i);
235
+ return e.isGeneratorFunction(r) ? a : a.next().then(function (t) {
236
+ return t.done ? t.value : a.next();
237
+ });
238
+ }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () {
239
+ return this;
240
+ }), define(g, "toString", function () {
241
+ return "[object Generator]";
242
+ }), e.keys = function (t) {
243
+ var e = Object(t),
244
+ r = [];
245
+ for (var n in e) r.push(n);
246
+ return r.reverse(), function next() {
247
+ for (; r.length;) {
248
+ var t = r.pop();
249
+ if (t in e) return next.value = t, next.done = !1, next;
250
+ }
251
+ return next.done = !0, next;
252
+ };
253
+ }, e.values = values, Context.prototype = {
254
+ constructor: Context,
255
+ reset: function (e) {
256
+ if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t);
257
+ },
258
+ stop: function () {
259
+ this.done = !0;
260
+ var t = this.tryEntries[0].completion;
261
+ if ("throw" === t.type) throw t.arg;
262
+ return this.rval;
263
+ },
264
+ dispatchException: function (e) {
265
+ if (this.done) throw e;
266
+ var r = this;
267
+ function handle(n, o) {
268
+ return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o;
269
+ }
270
+ for (var o = this.tryEntries.length - 1; o >= 0; --o) {
271
+ var i = this.tryEntries[o],
272
+ a = i.completion;
273
+ if ("root" === i.tryLoc) return handle("end");
274
+ if (i.tryLoc <= this.prev) {
275
+ var c = n.call(i, "catchLoc"),
276
+ u = n.call(i, "finallyLoc");
277
+ if (c && u) {
278
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
279
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
280
+ } else if (c) {
281
+ if (this.prev < i.catchLoc) return handle(i.catchLoc, !0);
282
+ } else {
283
+ if (!u) throw new Error("try statement without catch or finally");
284
+ if (this.prev < i.finallyLoc) return handle(i.finallyLoc);
285
+ }
286
+ }
287
+ }
288
+ },
289
+ abrupt: function (t, e) {
290
+ for (var r = this.tryEntries.length - 1; r >= 0; --r) {
291
+ var o = this.tryEntries[r];
292
+ if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) {
293
+ var i = o;
294
+ break;
295
+ }
296
+ }
297
+ i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null);
298
+ var a = i ? i.completion : {};
299
+ return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a);
300
+ },
301
+ complete: function (t, e) {
302
+ if ("throw" === t.type) throw t.arg;
303
+ return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y;
304
+ },
305
+ finish: function (t) {
306
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
307
+ var r = this.tryEntries[e];
308
+ if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y;
309
+ }
310
+ },
311
+ catch: function (t) {
312
+ for (var e = this.tryEntries.length - 1; e >= 0; --e) {
313
+ var r = this.tryEntries[e];
314
+ if (r.tryLoc === t) {
315
+ var n = r.completion;
316
+ if ("throw" === n.type) {
317
+ var o = n.arg;
318
+ resetTryEntry(r);
319
+ }
320
+ return o;
321
+ }
322
+ }
323
+ throw new Error("illegal catch attempt");
324
+ },
325
+ delegateYield: function (e, r, n) {
326
+ return this.delegate = {
327
+ iterator: values(e),
328
+ resultName: r,
329
+ nextLoc: n
330
+ }, "next" === this.method && (this.arg = t), y;
331
+ }
332
+ }, e;
333
+ }
334
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
335
+ try {
336
+ var info = gen[key](arg);
337
+ var value = info.value;
338
+ } catch (error) {
339
+ reject(error);
340
+ return;
341
+ }
342
+ if (info.done) {
343
+ resolve(value);
344
+ } else {
345
+ Promise.resolve(value).then(_next, _throw);
346
+ }
347
+ }
348
+ function _asyncToGenerator(fn) {
349
+ return function () {
350
+ var self = this,
351
+ args = arguments;
352
+ return new Promise(function (resolve, reject) {
353
+ var gen = fn.apply(self, args);
354
+ function _next(value) {
355
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
356
+ }
357
+ function _throw(err) {
358
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
359
+ }
360
+ _next(undefined);
361
+ });
362
+ };
363
+ }
364
+ function _classCallCheck(instance, Constructor) {
365
+ if (!(instance instanceof Constructor)) {
366
+ throw new TypeError("Cannot call a class as a function");
367
+ }
368
+ }
369
+ function _defineProperties(target, props) {
370
+ for (var i = 0; i < props.length; i++) {
371
+ var descriptor = props[i];
372
+ descriptor.enumerable = descriptor.enumerable || false;
373
+ descriptor.configurable = true;
374
+ if ("value" in descriptor) descriptor.writable = true;
375
+ Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor);
376
+ }
377
+ }
378
+ function _createClass(Constructor, protoProps, staticProps) {
379
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
380
+ if (staticProps) _defineProperties(Constructor, staticProps);
381
+ Object.defineProperty(Constructor, "prototype", {
382
+ writable: false
383
+ });
384
+ return Constructor;
385
+ }
386
+ function _defineProperty(obj, key, value) {
387
+ key = _toPropertyKey(key);
388
+ if (key in obj) {
389
+ Object.defineProperty(obj, key, {
390
+ value: value,
391
+ enumerable: true,
392
+ configurable: true,
393
+ writable: true
394
+ });
395
+ } else {
396
+ obj[key] = value;
397
+ }
398
+ return obj;
399
+ }
400
+ function _inherits(subClass, superClass) {
401
+ if (typeof superClass !== "function" && superClass !== null) {
402
+ throw new TypeError("Super expression must either be null or a function");
403
+ }
404
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
405
+ constructor: {
406
+ value: subClass,
407
+ writable: true,
408
+ configurable: true
409
+ }
410
+ });
411
+ Object.defineProperty(subClass, "prototype", {
412
+ writable: false
413
+ });
414
+ if (superClass) _setPrototypeOf(subClass, superClass);
415
+ }
416
+ function _getPrototypeOf(o) {
417
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
418
+ return o.__proto__ || Object.getPrototypeOf(o);
419
+ };
420
+ return _getPrototypeOf(o);
421
+ }
422
+ function _setPrototypeOf(o, p) {
423
+ _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
424
+ o.__proto__ = p;
425
+ return o;
426
+ };
427
+ return _setPrototypeOf(o, p);
428
+ }
429
+ function _isNativeReflectConstruct() {
430
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
431
+ if (Reflect.construct.sham) return false;
432
+ if (typeof Proxy === "function") return true;
433
+ try {
434
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
435
+ return true;
436
+ } catch (e) {
437
+ return false;
438
+ }
439
+ }
440
+ function _assertThisInitialized(self) {
441
+ if (self === void 0) {
442
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
443
+ }
444
+ return self;
445
+ }
446
+ function _possibleConstructorReturn(self, call) {
447
+ if (call && (typeof call === "object" || typeof call === "function")) {
448
+ return call;
449
+ } else if (call !== void 0) {
450
+ throw new TypeError("Derived constructors may only return object or undefined");
451
+ }
452
+ return _assertThisInitialized(self);
453
+ }
454
+ function _createSuper(Derived) {
455
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
456
+ return function _createSuperInternal() {
457
+ var Super = _getPrototypeOf(Derived),
458
+ result;
459
+ if (hasNativeReflectConstruct) {
460
+ var NewTarget = _getPrototypeOf(this).constructor;
461
+ result = Reflect.construct(Super, arguments, NewTarget);
462
+ } else {
463
+ result = Super.apply(this, arguments);
464
+ }
465
+ return _possibleConstructorReturn(this, result);
466
+ };
467
+ }
468
+ function _superPropBase(object, property) {
469
+ while (!Object.prototype.hasOwnProperty.call(object, property)) {
470
+ object = _getPrototypeOf(object);
471
+ if (object === null) break;
472
+ }
473
+ return object;
474
+ }
475
+ function _get() {
476
+ if (typeof Reflect !== "undefined" && Reflect.get) {
477
+ _get = Reflect.get.bind();
478
+ } else {
479
+ _get = function _get(target, property, receiver) {
480
+ var base = _superPropBase(target, property);
481
+ if (!base) return;
482
+ var desc = Object.getOwnPropertyDescriptor(base, property);
483
+ if (desc.get) {
484
+ return desc.get.call(arguments.length < 3 ? target : receiver);
485
+ }
486
+ return desc.value;
487
+ };
488
+ }
489
+ return _get.apply(this, arguments);
490
+ }
491
+ function _toConsumableArray(arr) {
492
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
493
+ }
494
+ function _arrayWithoutHoles(arr) {
495
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
496
+ }
497
+ function _iterableToArray(iter) {
498
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
499
+ }
500
+ function _unsupportedIterableToArray(o, minLen) {
501
+ if (!o) return;
502
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
503
+ var n = Object.prototype.toString.call(o).slice(8, -1);
504
+ if (n === "Object" && o.constructor) n = o.constructor.name;
505
+ if (n === "Map" || n === "Set") return Array.from(o);
506
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
507
+ }
508
+ function _arrayLikeToArray(arr, len) {
509
+ if (len == null || len > arr.length) len = arr.length;
510
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
511
+ return arr2;
512
+ }
513
+ function _nonIterableSpread() {
514
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
515
+ }
516
+ function _toPrimitive(input, hint) {
517
+ if (typeof input !== "object" || input === null) return input;
518
+ var prim = input[Symbol.toPrimitive];
519
+ if (prim !== undefined) {
520
+ var res = prim.call(input, hint || "default");
521
+ if (typeof res !== "object") return res;
522
+ throw new TypeError("@@toPrimitive must return a primitive value.");
523
+ }
524
+ return (hint === "string" ? String : Number)(input);
525
+ }
526
+ function _toPropertyKey(arg) {
527
+ var key = _toPrimitive(arg, "string");
528
+ return typeof key === "symbol" ? key : String(key);
529
+ }
530
+
531
+ var loadImage = function loadImage(url) {
532
+ return new Promise(function (resolve, reject) {
533
+ var img = new Image();
534
+ img.addEventListener("load", function () {
535
+ return resolve(img);
536
+ });
537
+ img.addEventListener("error", function (err) {
538
+ return reject(err);
539
+ });
540
+ img.crossOrigin = "anonymous";
541
+ img.src = url;
542
+ });
543
+ };
544
+ var DefaultHeightmapResource = /*#__PURE__*/function () {
545
+ function DefaultHeightmapResource() {
546
+ var _this = this,
547
+ _opts$skipOddLevels,
548
+ _opts$tileSize,
549
+ _opts$maxZoom;
550
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
551
+ _classCallCheck(this, DefaultHeightmapResource);
552
+ _defineProperty(this, "resource", null);
553
+ _defineProperty(this, "tileSize", 256);
554
+ _defineProperty(this, "skipOddLevels", false);
555
+ _defineProperty(this, "getTilePixels", /*#__PURE__*/function () {
556
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(coords) {
557
+ var url, img;
558
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
559
+ while (1) switch (_context.prev = _context.next) {
560
+ case 0:
561
+ url = _this.buildTileURL(coords);
562
+ _context.next = 3;
563
+ return loadImage(url);
564
+ case 3:
565
+ img = _context.sent;
566
+ return _context.abrupt("return", _this.getPixels(img));
567
+ case 5:
568
+ case "end":
569
+ return _context.stop();
570
+ }
571
+ }, _callee);
572
+ }));
573
+ return function (_x) {
574
+ return _ref.apply(this, arguments);
575
+ };
576
+ }());
577
+ if (opts.url) {
578
+ this.resource = cesium.Resource.createIfNeeded(opts.url);
579
+ }
580
+ this.skipOddLevels = (_opts$skipOddLevels = opts.skipOddLevels) !== null && _opts$skipOddLevels !== void 0 ? _opts$skipOddLevels : false;
581
+ this.tileSize = (_opts$tileSize = opts.tileSize) !== null && _opts$tileSize !== void 0 ? _opts$tileSize : 256;
582
+ this.maxZoom = (_opts$maxZoom = opts.maxZoom) !== null && _opts$maxZoom !== void 0 ? _opts$maxZoom : 15;
583
+ this.contextQueue = [];
584
+ }
585
+ _createClass(DefaultHeightmapResource, [{
586
+ key: "getCanvas",
587
+ value: function getCanvas() {
588
+ var ctx = this.contextQueue.pop();
589
+ if (ctx == null) {
590
+ var canvas = document.createElement("canvas");
591
+ canvas.width = this.tileSize;
592
+ canvas.height = this.tileSize;
593
+ var context = canvas.getContext("2d");
594
+ ctx = {
595
+ canvas: canvas,
596
+ context: context
597
+ };
598
+ }
599
+ return ctx;
600
+ }
601
+ }, {
602
+ key: "getPixels",
603
+ value: function getPixels(img) {
604
+ var canvasRef = this.getCanvas();
605
+ var context = canvasRef.context;
606
+ //context.scale(1, -1);
607
+ // Chrome appears to vertically flip the image for reasons that are unclear
608
+ // We can make it work in Chrome by drawing the image upside-down at this step.
609
+ context.drawImage(img, 0, 0, this.tileSize, this.tileSize);
610
+ var pixels = context.getImageData(0, 0, this.tileSize, this.tileSize);
611
+ context.clearRect(0, 0, this.tileSize, this.tileSize);
612
+ this.contextQueue.push(canvasRef);
613
+ return pixels;
614
+ }
615
+ }, {
616
+ key: "buildTileURL",
617
+ value: function buildTileURL(tileCoords) {
618
+ var _this$resource;
619
+ // reverseY for TMS tiling (https://gist.github.com/tmcw/4954720)
620
+ // See tiling schemes here: https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/
621
+ var z = tileCoords.z,
622
+ y = tileCoords.y;
623
+ return (_this$resource = this.resource) === null || _this$resource === void 0 ? void 0 : _this$resource.getDerivedResource({
624
+ templateValues: _objectSpread2(_objectSpread2({}, tileCoords), {}, {
625
+ reverseY: Math.pow(2, z) - y - 1
626
+ }),
627
+ preserveQueryParameters: true
628
+ }).getUrlComponent(true);
629
+ }
630
+ }, {
631
+ key: "getTileDataAvailable",
632
+ value: function getTileDataAvailable(_ref2) {
633
+ var z = _ref2.z;
634
+ if (z == this.maxZoom) return true;
635
+ if (z % 2 == 1 && this.skipOddLevels) return false;
636
+ if (z > this.maxZoom) return false;
637
+ return true;
638
+ }
639
+ }]);
640
+ return DefaultHeightmapResource;
641
+ }();
642
+
643
+ var ImageFormat = /*#__PURE__*/function (ImageFormat) {
644
+ ImageFormat["WEBP"] = "webp";
645
+ ImageFormat["PNG"] = "png";
646
+ ImageFormat["PNGRAW"] = "pngraw";
647
+ return ImageFormat;
648
+ }({});
649
+ var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
650
+ _inherits(MapboxTerrainResource, _DefaultHeightmapReso);
651
+ var _super = _createSuper(MapboxTerrainResource);
652
+ function MapboxTerrainResource() {
653
+ var _opts$highResolution, _opts$imageFormat;
654
+ var _this;
655
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
656
+ _classCallCheck(this, MapboxTerrainResource);
657
+ _this = _super.call(this, opts);
658
+ _defineProperty(_assertThisInitialized(_this), "resource", null);
659
+ var highResolution = (_opts$highResolution = opts.highResolution) !== null && _opts$highResolution !== void 0 ? _opts$highResolution : false;
660
+ var format = (_opts$imageFormat = opts.imageFormat) !== null && _opts$imageFormat !== void 0 ? _opts$imageFormat : ImageFormat.WEBP;
661
+
662
+ // overrides based on highResolution flag
663
+ if (highResolution) {
664
+ if (opts.maxZoom === undefined) {
665
+ _this.maxZoom = 14;
666
+ }
667
+ if (opts.tileSize === undefined) {
668
+ _this.tileSize = 512;
669
+ }
670
+ }
671
+ _this.resource = cesium.Resource.createIfNeeded("https://api.mapbox.com/v4/mapbox.terrain-rgb/{z}/{x}/{y}".concat(highResolution ? "@2x" : "", ".").concat(format));
672
+ if (opts.accessToken) {
673
+ _this.resource.setQueryParameters({
674
+ access_token: opts.accessToken
675
+ });
676
+ }
677
+ return _this;
678
+ }
679
+ return _createClass(MapboxTerrainResource);
680
+ }(DefaultHeightmapResource);
681
+
682
+ function decodeBase64(base64, enableUnicode) {
683
+ var binaryString = atob(base64);
684
+ if (enableUnicode) {
685
+ var binaryView = new Uint8Array(binaryString.length);
686
+ for (var i = 0, n = binaryString.length; i < n; ++i) {
687
+ binaryView[i] = binaryString.charCodeAt(i);
688
+ }
689
+ return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));
690
+ }
691
+ return binaryString;
692
+ }
693
+
694
+ function createURL(base64, sourcemapArg, enableUnicodeArg) {
695
+ var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
696
+ var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
697
+ var source = decodeBase64(base64, enableUnicode);
698
+ var start = source.indexOf('\n', 10) + 1;
699
+ var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
700
+ var blob = new Blob([body], { type: 'application/javascript' });
701
+ return URL.createObjectURL(blob);
702
+ }
703
+
704
+ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
705
+ var url;
706
+ return function WorkerFactory(options) {
707
+ url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
708
+ return new Worker(url, options);
709
+ };
710
+ }
711
+
712
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHsKICAndXNlIHN0cmljdCc7CgogIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOwogIH0KICBmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHsKICAgIGlmICh0eXBlb2YgU3ltYm9sICE9PSAidW5kZWZpbmVkIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyWyJAQGl0ZXJhdG9yIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsKICAgIGlmICghbykgcmV0dXJuOwogICAgaWYgKHR5cGVvZiBvID09PSAic3RyaW5nIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7CiAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7CiAgICBpZiAobiA9PT0gIk9iamVjdCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsKICAgIGlmIChuID09PSAiTWFwIiB8fCBuID09PSAiU2V0IikgcmV0dXJuIEFycmF5LmZyb20obyk7CiAgICBpZiAobiA9PT0gIkFyZ3VtZW50cyIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pOwogIH0KICBmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgewogICAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7CiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07CiAgICByZXR1cm4gYXJyMjsKICB9CiAgZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkgewogICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIik7CiAgfQoKICAvLyBXZSBzaG91bGQgc2F2ZSB0aGVzZQogIC8vY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcygyNTYsIDI1Nik7CiAgLy9jb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsKCiAgZnVuY3Rpb24gbWFwYm94VGVycmFpblRvR3JpZChwbmcsIGludGVydmFsLCBvZmZzZXQpIHsKICAgIHZhciBfaW50ZXJ2YWwsIF9vZmZzZXQ7CiAgICAvLyBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBvbiB0aGUgR1BVIHVzaW5nIFJFR0w/CiAgICAvLyBidXQgdGhhdCB3b3VsZCByZXF1aXJlIEdQVSAtPiBDUFUgLT4gR1BVCiAgICB2YXIgZ3JpZFNpemUgPSBwbmcuc2hhcGVbMF0gKyAxOwogICAgdmFyIHRlcnJhaW4gPSBuZXcgRmxvYXQzMkFycmF5KGdyaWRTaXplICogZ3JpZFNpemUpOwogICAgdmFyIHRpbGVTaXplID0gcG5nLnNoYXBlWzBdOwogICAgaW50ZXJ2YWwgPSAoX2ludGVydmFsID0gaW50ZXJ2YWwpICE9PSBudWxsICYmIF9pbnRlcnZhbCAhPT0gdm9pZCAwID8gX2ludGVydmFsIDogMC4xOwogICAgb2Zmc2V0ID0gKF9vZmZzZXQgPSBvZmZzZXQpICE9PSBudWxsICYmIF9vZmZzZXQgIT09IHZvaWQgMCA/IF9vZmZzZXQgOiAtMTAwMDA7CgogICAgLy8gZGVjb2RlIHRlcnJhaW4gdmFsdWVzCiAgICBmb3IgKHZhciB5ID0gMDsgeSA8IHRpbGVTaXplOyB5KyspIHsKICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aWxlU2l6ZTsgeCsrKSB7CiAgICAgICAgdmFyIHljID0geTsKICAgICAgICB2YXIgciA9IHBuZy5nZXQoeCwgeWMsIDApOwogICAgICAgIHZhciBnID0gcG5nLmdldCh4LCB5YywgMSk7CiAgICAgICAgdmFyIGIgPSBwbmcuZ2V0KHgsIHljLCAyKTsKICAgICAgICB0ZXJyYWluW3kgKiBncmlkU2l6ZSArIHhdID0gciAqIDI1NiAqIDI1NiAqIGludGVydmFsICsgZyAqIDI1Ni4wICogaW50ZXJ2YWwgKyBiICogaW50ZXJ2YWwgKyBvZmZzZXQ7CiAgICAgIH0KICAgIH0KICAgIC8vIGJhY2tmaWxsIHJpZ2h0IGFuZCBib3R0b20gYm9yZGVycwogICAgZm9yICh2YXIgX3ggPSAwOyBfeCA8IGdyaWRTaXplIC0gMTsgX3grKykgewogICAgICB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMSkgKyBfeF0gPSB0ZXJyYWluW2dyaWRTaXplICogKGdyaWRTaXplIC0gMikgKyBfeF07CiAgICB9CiAgICBmb3IgKHZhciBfeSA9IDA7IF95IDwgZ3JpZFNpemU7IF95KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIF95ICsgZ3JpZFNpemUgLSAxXSA9IHRlcnJhaW5bZ3JpZFNpemUgKiBfeSArIGdyaWRTaXplIC0gMl07CiAgICB9CiAgICByZXR1cm4gdGVycmFpbjsKICB9CiAgZnVuY3Rpb24gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUpIHsKICAgIHZhciB4dmFscyA9IFtdOwogICAgdmFyIHl2YWxzID0gW107CiAgICB2YXIgaGVpZ2h0TWV0ZXJzID0gW107CiAgICB2YXIgbm9ydGhJbmRpY2VzID0gW107CiAgICB2YXIgc291dGhJbmRpY2VzID0gW107CiAgICB2YXIgZWFzdEluZGljZXMgPSBbXTsKICAgIHZhciB3ZXN0SW5kaWNlcyA9IFtdOwogICAgdmFyIG1pbmltdW1IZWlnaHQgPSBJbmZpbml0eTsKICAgIHZhciBtYXhpbXVtSGVpZ2h0ID0gLUluZmluaXR5OwogICAgdmFyIHNjYWxhciA9IDMyNzY4LjAgLyB0aWxlU2l6ZTsKICAgIGZvciAodmFyIGl4ID0gMDsgaXggPCBtZXNoLnZlcnRpY2VzLmxlbmd0aCAvIDI7IGl4KyspIHsKICAgICAgdmFyIHZlcnRleEl4ID0gaXg7CiAgICAgIHZhciBweCA9IG1lc2gudmVydGljZXNbaXggKiAyXTsKICAgICAgdmFyIHB5ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDIgKyAxXTsKICAgICAgdmFyIGhlaWdodCA9IHRpbGUudGVycmFpbltweSAqICh0aWxlU2l6ZSArIDEpICsgcHhdOwogICAgICBpZiAoaGVpZ2h0ID4gbWF4aW11bUhlaWdodCkgbWF4aW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1IZWlnaHQpIG1pbmltdW1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGhlaWdodE1ldGVycy5wdXNoKGhlaWdodCk7CiAgICAgIGlmIChweSA9PSAwKSBub3J0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweSA9PSB0aWxlU2l6ZSkgc291dGhJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHggPT0gMCkgd2VzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSB0aWxlU2l6ZSkgZWFzdEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIHZhciB4diA9IHB4ICogc2NhbGFyOwogICAgICB2YXIgeXYgPSAodGlsZVNpemUgLSBweSkgKiBzY2FsYXI7CiAgICAgIHh2YWxzLnB1c2goeHYpOwogICAgICB5dmFscy5wdXNoKHl2KTsKICAgIH0KICAgIHZhciBoZWlnaHRSYW5nZSA9IG1heGltdW1IZWlnaHQgLSBtaW5pbXVtSGVpZ2h0OwogICAgdmFyIGhlaWdodHMgPSBoZWlnaHRNZXRlcnMubWFwKGZ1bmN0aW9uIChkKSB7CiAgICAgIGlmIChoZWlnaHRSYW5nZSA8IDEpIHJldHVybiAwOwogICAgICByZXR1cm4gKGQgLSBtaW5pbXVtSGVpZ2h0KSAqICgzMjc2Ny4wIC8gaGVpZ2h0UmFuZ2UpOwogICAgfSk7CiAgICB2YXIgdHJpYW5nbGVzID0gbmV3IFVpbnQxNkFycmF5KG1lc2gudHJpYW5nbGVzKTsKICAgIHZhciBxdWFudGl6ZWRWZXJ0aWNlcyA9IG5ldyBVaW50MTZBcnJheSggLy92ZXJ0cwogICAgW10uY29uY2F0KHh2YWxzLCB5dmFscywgX3RvQ29uc3VtYWJsZUFycmF5KGhlaWdodHMpKSk7CgogICAgLy8gU0UgTlcgTkUKICAgIC8vIE5FIE5XIFNFCgogICAgcmV0dXJuIHsKICAgICAgbWluaW11bUhlaWdodDogbWluaW11bUhlaWdodCwKICAgICAgbWF4aW11bUhlaWdodDogbWF4aW11bUhlaWdodCwKICAgICAgcXVhbnRpemVkVmVydGljZXM6IHF1YW50aXplZFZlcnRpY2VzLAogICAgICBpbmRpY2VzOiB0cmlhbmdsZXMsCiAgICAgIHdlc3RJbmRpY2VzOiB3ZXN0SW5kaWNlcywKICAgICAgc291dGhJbmRpY2VzOiBzb3V0aEluZGljZXMsCiAgICAgIGVhc3RJbmRpY2VzOiBlYXN0SW5kaWNlcywKICAgICAgbm9ydGhJbmRpY2VzOiBub3J0aEluZGljZXMKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpb3RhKG4pIHsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkobik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewogICAgICByZXN1bHRbaV0gPSBpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgdmFyIGlvdGFfMSA9IGlvdGE7CgogIC8qIQogICAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXIKICAgKgogICAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+CiAgICogQGxpY2Vuc2UgIE1JVAogICAqLwogIC8vIFRoZSBfaXNCdWZmZXIgY2hlY2sgaXMgZm9yIFNhZmFyaSA1LTcgc3VwcG9ydCwgYmVjYXVzZSBpdCdzIG1pc3NpbmcKICAvLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5CiAgdmFyIGlzQnVmZmVyXzEgPSBmdW5jdGlvbiAob2JqKSB7CiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgKGlzQnVmZmVyKG9iaikgfHwgaXNTbG93QnVmZmVyKG9iaikgfHwgISFvYmouX2lzQnVmZmVyKTsKICB9OwogIGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikgewogICAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaik7CiAgfQoKICAvLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LgogIGZ1bmN0aW9uIGlzU2xvd0J1ZmZlcihvYmopIHsKICAgIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKTsKICB9CgogIHZhciBoYXNUeXBlZEFycmF5cyA9IHR5cGVvZiBGbG9hdDY0QXJyYXkgIT09ICJ1bmRlZmluZWQiOwogIGZ1bmN0aW9uIGNvbXBhcmUxc3QoYSwgYikgewogICAgcmV0dXJuIGFbMF0gLSBiWzBdOwogIH0KICBmdW5jdGlvbiBvcmRlcigpIHsKICAgIHZhciBzdHJpZGUgPSB0aGlzLnN0cmlkZTsKICAgIHZhciB0ZXJtcyA9IG5ldyBBcnJheShzdHJpZGUubGVuZ3RoKTsKICAgIHZhciBpOwogICAgZm9yIChpID0gMDsgaSA8IHRlcm1zLmxlbmd0aDsgKytpKSB7CiAgICAgIHRlcm1zW2ldID0gW01hdGguYWJzKHN0cmlkZVtpXSksIGldOwogICAgfQogICAgdGVybXMuc29ydChjb21wYXJlMXN0KTsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkodGVybXMubGVuZ3RoKTsKICAgIGZvciAoaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gdGVybXNbaV1bMV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGRpbWVuc2lvbikgewogICAgdmFyIGNsYXNzTmFtZSA9IFsiVmlldyIsIGRpbWVuc2lvbiwgImQiLCBkdHlwZV0uam9pbigiIik7CiAgICBpZiAoZGltZW5zaW9uIDwgMCkgewogICAgICBjbGFzc05hbWUgPSAiVmlld19OaWwiICsgZHR5cGU7CiAgICB9CiAgICB2YXIgdXNlR2V0dGVycyA9IGR0eXBlID09PSAiZ2VuZXJpYyI7CiAgICBpZiAoZGltZW5zaW9uID09PSAtMSkgewogICAgICAvL1NwZWNpYWwgY2FzZSBmb3IgdHJpdmlhbCBhcnJheXMKICAgICAgdmFyIGNvZGUgPSAiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICIoYSl7dGhpcy5kYXRhPWE7fTtcCnZhciBwcm90bz0iICsgY2xhc3NOYW1lICsgIi5wcm90b3R5cGU7XApwcm90by5kdHlwZT0nIiArIGR0eXBlICsgIic7XApwcm90by5pbmRleD1mdW5jdGlvbigpe3JldHVybiAtMX07XApwcm90by5zaXplPTA7XApwcm90by5kaW1lbnNpb249LTE7XApwcm90by5zaGFwZT1wcm90by5zdHJpZGU9cHJvdG8ub3JkZXI9W107XApwcm90by5sbz1wcm90by5oaT1wcm90by50cmFuc3Bvc2U9cHJvdG8uc3RlcD1cCmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIih0aGlzLmRhdGEpO307XApwcm90by5nZXQ9cHJvdG8uc2V0PWZ1bmN0aW9uKCl7fTtcCnByb3RvLnBpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGEpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIoYSk7fSI7CiAgICAgIHZhciBwcm9jZWR1cmUgPSBuZXcgRnVuY3Rpb24oY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoKTsKICAgIH0gZWxzZSBpZiAoZGltZW5zaW9uID09PSAwKSB7CiAgICAgIC8vU3BlY2lhbCBjYXNlIGZvciAwZCBhcnJheXMKICAgICAgdmFyIGNvZGUgPSAiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICIoYSxkKSB7XAp0aGlzLmRhdGEgPSBhO1wKdGhpcy5vZmZzZXQgPSBkXAp9O1wKdmFyIHByb3RvPSIgKyBjbGFzc05hbWUgKyAiLnByb3RvdHlwZTtcCnByb3RvLmR0eXBlPSciICsgZHR5cGUgKyAiJztcCnByb3RvLmluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0fTtcCnByb3RvLmRpbWVuc2lvbj0wO1wKcHJvdG8uc2l6ZT0xO1wKcHJvdG8uc2hhcGU9XApwcm90by5zdHJpZGU9XApwcm90by5vcmRlcj1bXTtcCnByb3RvLmxvPVwKcHJvdG8uaGk9XApwcm90by50cmFuc3Bvc2U9XApwcm90by5zdGVwPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2NvcHkoKSB7XApyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSx0aGlzLm9mZnNldClcCn07XApwcm90by5waWNrPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3BpY2soKXtcCnJldHVybiBUcml2aWFsQXJyYXkodGhpcy5kYXRhKTtcCn07XApwcm90by52YWx1ZU9mPXByb3RvLmdldD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9nZXQoKXtcCnJldHVybiAiICsgKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLmdldCh0aGlzLm9mZnNldCkiIDogInRoaXMuZGF0YVt0aGlzLm9mZnNldF0iKSArICJ9O1wKcHJvdG8uc2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NldCh2KXtcCnJldHVybiAiICsgKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLnNldCh0aGlzLm9mZnNldCx2KSIgOiAidGhpcy5kYXRhW3RoaXMub2Zmc2V0XT12IikgKyAiXAp9O1wKcmV0dXJuIGZ1bmN0aW9uIGNvbnN0cnVjdF8iICsgY2xhc3NOYW1lICsgIihhLGIsYyxkKXtyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKGEsZCl9IjsKICAgICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiVHJpdmlhbEFycmF5IiwgY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV1bMF0pOwogICAgfQogICAgdmFyIGNvZGUgPSBbIid1c2Ugc3RyaWN0JyJdOwoKICAgIC8vQ3JlYXRlIGNvbnN0cnVjdG9yIGZvciB2aWV3CiAgICB2YXIgaW5kaWNlcyA9IGlvdGFfMShkaW1lbnNpb24pOwogICAgdmFyIGFyZ3MgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImkiICsgaTsKICAgIH0pOwogICAgdmFyIGluZGV4X3N0ciA9ICJ0aGlzLm9mZnNldCsiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiICsgaSArICJdKmkiICsgaTsKICAgIH0pLmpvaW4oIisiKTsKICAgIHZhciBzaGFwZUFyZyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpOwogICAgfSkuam9pbigiLCIpOwogICAgdmFyIHN0cmlkZUFyZyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYyIgKyBpOwogICAgfSkuam9pbigiLCIpOwogICAgY29kZS5wdXNoKCJmdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIihhLCIgKyBzaGFwZUFyZyArICIsIiArIHN0cmlkZUFyZyArICIsZCl7dGhpcy5kYXRhPWEiLCAidGhpcy5zaGFwZT1bIiArIHNoYXBlQXJnICsgIl0iLCAidGhpcy5zdHJpZGU9WyIgKyBzdHJpZGVBcmcgKyAiXSIsICJ0aGlzLm9mZnNldD1kfDB9IiwgInZhciBwcm90bz0iICsgY2xhc3NOYW1lICsgIi5wcm90b3R5cGUiLCAicHJvdG8uZHR5cGU9JyIgKyBkdHlwZSArICInIiwgInByb3RvLmRpbWVuc2lvbj0iICsgZGltZW5zaW9uKTsKCiAgICAvL3ZpZXcuc2l6ZToKICAgIGNvZGUucHVzaCgiT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCdzaXplJyx7Z2V0OmZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3NpemUoKXtcCnJldHVybiAiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnNoYXBlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiKiIpLCAifX0pIik7CgogICAgLy92aWV3Lm9yZGVyOgogICAgaWYgKGRpbWVuc2lvbiA9PT0gMSkgewogICAgICBjb2RlLnB1c2goInByb3RvLm9yZGVyPVswXSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sJ29yZGVyJyx7Z2V0OiIpOwogICAgICBpZiAoZGltZW5zaW9uIDwgNCkgewogICAgICAgIGNvZGUucHVzaCgiZnVuY3Rpb24gIiArIGNsYXNzTmFtZSArICJfb3JkZXIoKXsiKTsKICAgICAgICBpZiAoZGltZW5zaW9uID09PSAyKSB7CiAgICAgICAgICBjb2RlLnB1c2goInJldHVybiAoTWF0aC5hYnModGhpcy5zdHJpZGVbMF0pPk1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSk/WzEsMF06WzAsMV19fSkiKTsKICAgICAgICB9IGVsc2UgaWYgKGRpbWVuc2lvbiA9PT0gMykgewogICAgICAgICAgY29kZS5wdXNoKCJ2YXIgczA9TWF0aC5hYnModGhpcy5zdHJpZGVbMF0pLHMxPU1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSxzMj1NYXRoLmFicyh0aGlzLnN0cmlkZVsyXSk7XAppZihzMD5zMSl7XAppZihzMT5zMil7XApyZXR1cm4gWzIsMSwwXTtcCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMSwyLDBdO1wKfWVsc2V7XApyZXR1cm4gWzEsMCwyXTtcCn1cCn1lbHNlIGlmKHMwPnMyKXtcCnJldHVybiBbMiwwLDFdO1wKfWVsc2UgaWYoczI+czEpe1wKcmV0dXJuIFswLDEsMl07XAp9ZWxzZXtcCnJldHVybiBbMCwyLDFdO1wKfX19KSIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjb2RlLnB1c2goIk9SREVSfSkiKTsKICAgICAgfQogICAgfQoKICAgIC8vdmlldy5zZXQoaTAsIC4uLiwgdik6CiAgICBjb2RlLnB1c2goInByb3RvLnNldD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9zZXQoIiArIGFyZ3Muam9pbigiLCIpICsgIix2KXsiKTsKICAgIGlmICh1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5zZXQoIiArIGluZGV4X3N0ciArICIsdil9Iik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGFbIiArIGluZGV4X3N0ciArICJdPXZ9Iik7CiAgICB9CgogICAgLy92aWV3LmdldChpMCwgLi4uKToKICAgIGNvZGUucHVzaCgicHJvdG8uZ2V0PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2dldCgiICsgYXJncy5qb2luKCIsIikgKyAiKXsiKTsKICAgIGlmICh1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5nZXQoIiArIGluZGV4X3N0ciArICIpfSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhWyIgKyBpbmRleF9zdHIgKyAiXX0iKTsKICAgIH0KCiAgICAvL3ZpZXcuaW5kZXg6CiAgICBjb2RlLnB1c2goInByb3RvLmluZGV4PWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2luZGV4KCIsIGFyZ3Muam9pbigpLCAiKXtyZXR1cm4gIiArIGluZGV4X3N0ciArICJ9Iik7CgogICAgLy92aWV3LmhpKCk6CiAgICBjb2RlLnB1c2goInByb3RvLmhpPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2hpKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gWyIodHlwZW9mIGkiLCBpLCAiIT09J251bWJlcid8fGkiLCBpLCAiPDApP3RoaXMuc2hhcGVbIiwgaSwgIl06aSIsIGksICJ8MCJdLmpvaW4oIiIpOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiICsgaSArICJdIjsKICAgIH0pLmpvaW4oIiwiKSArICIsdGhpcy5vZmZzZXQpfSIpOwoKICAgIC8vdmlldy5sbygpOgogICAgdmFyIGFfdmFycyA9IGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYSIgKyBpICsgIj10aGlzLnNoYXBlWyIgKyBpICsgIl0iOwogICAgfSk7CiAgICB2YXIgY192YXJzID0gaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJjIiArIGkgKyAiPXRoaXMuc3RyaWRlWyIgKyBpICsgIl0iOwogICAgfSk7CiAgICBjb2RlLnB1c2goInByb3RvLmxvPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX2xvKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3ZhciBiPXRoaXMub2Zmc2V0LGQ9MCwiICsgYV92YXJzLmpvaW4oIiwiKSArICIsIiArIGNfdmFycy5qb2luKCIsIikpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goImlmKHR5cGVvZiBpIiArIGkgKyAiPT09J251bWJlcicmJmkiICsgaSArICI+PTApe1wKZD1pIiArIGkgKyAifDA7XApiKz1jIiArIGkgKyAiKmQ7XAphIiArIGkgKyAiLT1kfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJyZXR1cm4gbmV3ICIgKyBjbGFzc05hbWUgKyAiKHRoaXMuZGF0YSwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGk7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImMiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsYil9Iik7CgogICAgLy92aWV3LnN0ZXAoKToKICAgIGNvZGUucHVzaCgicHJvdG8uc3RlcD1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl9zdGVwKCIgKyBhcmdzLmpvaW4oIiwiKSArICIpe3ZhciAiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJhIiArIGkgKyAiPXRoaXMuc2hhcGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImIiICsgaSArICI9dGhpcy5zdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLGM9dGhpcy5vZmZzZXQsZD0wLGNlaWw9TWF0aC5jZWlsIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgiaWYodHlwZW9mIGkiICsgaSArICI9PT0nbnVtYmVyJyl7XApkPWkiICsgaSArICJ8MDtcCmlmKGQ8MCl7XApjKz1iIiArIGkgKyAiKihhIiArIGkgKyAiLTEpO1wKYSIgKyBpICsgIj1jZWlsKC1hIiArIGkgKyAiL2QpXAp9ZWxzZXtcCmEiICsgaSArICI9Y2VpbChhIiArIGkgKyAiL2QpXAp9XApiIiArIGkgKyAiKj1kXAp9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gImEiICsgaTsKICAgIH0pLmpvaW4oIiwiKSArICIsIiArIGluZGljZXMubWFwKGZ1bmN0aW9uIChpKSB7CiAgICAgIHJldHVybiAiYiIgKyBpOwogICAgfSkuam9pbigiLCIpICsgIixjKX0iKTsKCiAgICAvL3ZpZXcudHJhbnNwb3NlKCk6CiAgICB2YXIgdFNoYXBlID0gbmV3IEFycmF5KGRpbWVuc2lvbik7CiAgICB2YXIgdFN0cmlkZSA9IG5ldyBBcnJheShkaW1lbnNpb24pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaW1lbnNpb247ICsraSkgewogICAgICB0U2hhcGVbaV0gPSAiYVtpIiArIGkgKyAiXSI7CiAgICAgIHRTdHJpZGVbaV0gPSAiYltpIiArIGkgKyAiXSI7CiAgICB9CiAgICBjb2RlLnB1c2goInByb3RvLnRyYW5zcG9zZT1mdW5jdGlvbiAiICsgY2xhc3NOYW1lICsgIl90cmFuc3Bvc2UoIiArIGFyZ3MgKyAiKXsiICsgYXJncy5tYXAoZnVuY3Rpb24gKG4sIGlkeCkgewogICAgICByZXR1cm4gbiArICI9KCIgKyBuICsgIj09PXVuZGVmaW5lZD8iICsgaWR4ICsgIjoiICsgbiArICJ8MCkiOwogICAgfSkuam9pbigiOyIpLCAidmFyIGE9dGhpcy5zaGFwZSxiPXRoaXMuc3RyaWRlO3JldHVybiBuZXcgIiArIGNsYXNzTmFtZSArICIodGhpcy5kYXRhLCIgKyB0U2hhcGUuam9pbigiLCIpICsgIiwiICsgdFN0cmlkZS5qb2luKCIsIikgKyAiLHRoaXMub2Zmc2V0KX0iKTsKCiAgICAvL3ZpZXcucGljaygpOgogICAgY29kZS5wdXNoKCJwcm90by5waWNrPWZ1bmN0aW9uICIgKyBjbGFzc05hbWUgKyAiX3BpY2soIiArIGFyZ3MgKyAiKXt2YXIgYT1bXSxiPVtdLGM9dGhpcy5vZmZzZXQiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKCJpZih0eXBlb2YgaSIgKyBpICsgIj09PSdudW1iZXInJiZpIiArIGkgKyAiPj0wKXtjPShjK3RoaXMuc3RyaWRlWyIgKyBpICsgIl0qaSIgKyBpICsgIil8MH1lbHNle2EucHVzaCh0aGlzLnNoYXBlWyIgKyBpICsgIl0pO2IucHVzaCh0aGlzLnN0cmlkZVsiICsgaSArICJdKX0iKTsKICAgIH0KICAgIGNvZGUucHVzaCgidmFyIGN0b3I9Q1RPUl9MSVNUW2EubGVuZ3RoKzFdO3JldHVybiBjdG9yKHRoaXMuZGF0YSxhLGIsYyl9Iik7CgogICAgLy9BZGQgcmV0dXJuIHN0YXRlbWVudAogICAgY29kZS5wdXNoKCJyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIgKyBjbGFzc05hbWUgKyAiKGRhdGEsc2hhcGUsc3RyaWRlLG9mZnNldCl7cmV0dXJuIG5ldyAiICsgY2xhc3NOYW1lICsgIihkYXRhLCIgKyBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaSkgewogICAgICByZXR1cm4gInNoYXBlWyIgKyBpICsgIl0iOwogICAgfSkuam9pbigiLCIpICsgIiwiICsgaW5kaWNlcy5tYXAoZnVuY3Rpb24gKGkpIHsKICAgICAgcmV0dXJuICJzdHJpZGVbIiArIGkgKyAiXSI7CiAgICB9KS5qb2luKCIsIikgKyAiLG9mZnNldCl9Iik7CgogICAgLy9Db21waWxlIHByb2NlZHVyZQogICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiQ1RPUl9MSVNUIiwgIk9SREVSIiwgY29kZS5qb2luKCJcbiIpKTsKICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV0sIG9yZGVyKTsKICB9CiAgZnVuY3Rpb24gYXJyYXlEVHlwZShkYXRhKSB7CiAgICBpZiAoaXNCdWZmZXJfMShkYXRhKSkgewogICAgICByZXR1cm4gImJ1ZmZlciI7CiAgICB9CiAgICBpZiAoaGFzVHlwZWRBcnJheXMpIHsKICAgICAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0YSkpIHsKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0NjRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDY0IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDMyIjsKICAgICAgICBjYXNlICJbb2JqZWN0IEludDhBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQ4IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEludDE2QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiaW50MTYiOwogICAgICAgIGNhc2UgIltvYmplY3QgSW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQzMiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQ4IjsKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQxNkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gInVpbnQxNiI7CiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50MzIiOwogICAgICAgIGNhc2UgIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDhfY2xhbXBlZCI7CiAgICAgICAgY2FzZSAiW29iamVjdCBCaWdJbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ2ludDY0IjsKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ3VpbnQ2NCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7CiAgICAgIHJldHVybiAiYXJyYXkiOwogICAgfQogICAgcmV0dXJuICJnZW5lcmljIjsKICB9CiAgdmFyIENBQ0hFRF9DT05TVFJVQ1RPUlMgPSB7CiAgICAiZmxvYXQzMiI6IFtdLAogICAgImZsb2F0NjQiOiBbXSwKICAgICJpbnQ4IjogW10sCiAgICAiaW50MTYiOiBbXSwKICAgICJpbnQzMiI6IFtdLAogICAgInVpbnQ4IjogW10sCiAgICAidWludDE2IjogW10sCiAgICAidWludDMyIjogW10sCiAgICAiYXJyYXkiOiBbXSwKICAgICJ1aW50OF9jbGFtcGVkIjogW10sCiAgICAiYmlnaW50NjQiOiBbXSwKICAgICJiaWd1aW50NjQiOiBbXSwKICAgICJidWZmZXIiOiBbXSwKICAgICJnZW5lcmljIjogW10KICB9OwogIGZ1bmN0aW9uIHdyYXBwZWROREFycmF5Q3RvcihkYXRhLCBzaGFwZSwgc3RyaWRlLCBvZmZzZXQpIHsKICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIGN0b3IgPSBDQUNIRURfQ09OU1RSVUNUT1JTLmFycmF5WzBdOwogICAgICByZXR1cm4gY3RvcihbXSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAibnVtYmVyIikgewogICAgICBkYXRhID0gW2RhdGFdOwogICAgfQogICAgaWYgKHNoYXBlID09PSB1bmRlZmluZWQpIHsKICAgICAgc2hhcGUgPSBbZGF0YS5sZW5ndGhdOwogICAgfQogICAgdmFyIGQgPSBzaGFwZS5sZW5ndGg7CiAgICBpZiAoc3RyaWRlID09PSB1bmRlZmluZWQpIHsKICAgICAgc3RyaWRlID0gbmV3IEFycmF5KGQpOwogICAgICBmb3IgKHZhciBpID0gZCAtIDEsIHN6ID0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICBzdHJpZGVbaV0gPSBzejsKICAgICAgICBzeiAqPSBzaGFwZVtpXTsKICAgICAgfQogICAgfQogICAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIG9mZnNldCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZDsgKytpKSB7CiAgICAgICAgaWYgKHN0cmlkZVtpXSA8IDApIHsKICAgICAgICAgIG9mZnNldCAtPSAoc2hhcGVbaV0gLSAxKSAqIHN0cmlkZVtpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBkdHlwZSA9IGFycmF5RFR5cGUoZGF0YSk7CiAgICB2YXIgY3Rvcl9saXN0ID0gQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV07CiAgICB3aGlsZSAoY3Rvcl9saXN0Lmxlbmd0aCA8PSBkICsgMSkgewogICAgICBjdG9yX2xpc3QucHVzaChjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGN0b3JfbGlzdC5sZW5ndGggLSAxKSk7CiAgICB9CiAgICB2YXIgY3RvciA9IGN0b3JfbGlzdFtkICsgMV07CiAgICByZXR1cm4gY3RvcihkYXRhLCBzaGFwZSwgc3RyaWRlLCBvZmZzZXQpOwogIH0KICB2YXIgbmRhcnJheSA9IHdyYXBwZWROREFycmF5Q3RvcjsKCiAgY2xhc3MgTWFydGluaSB7CiAgICBjb25zdHJ1Y3RvcihncmlkU2l6ZSA9IDI1NykgewogICAgICB0aGlzLmdyaWRTaXplID0gZ3JpZFNpemU7CiAgICAgIGNvbnN0IHRpbGVTaXplID0gZ3JpZFNpemUgLSAxOwogICAgICBpZiAodGlsZVNpemUgJiB0aWxlU2l6ZSAtIDEpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZ3JpZCBzaXplIHRvIGJlIDJebisxLCBnb3QgJHtncmlkU2l6ZX0uYCk7CiAgICAgIHRoaXMubnVtVHJpYW5nbGVzID0gdGlsZVNpemUgKiB0aWxlU2l6ZSAqIDIgLSAyOwogICAgICB0aGlzLm51bVBhcmVudFRyaWFuZ2xlcyA9IHRoaXMubnVtVHJpYW5nbGVzIC0gdGlsZVNpemUgKiB0aWxlU2l6ZTsKICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuZ3JpZFNpemUgKiB0aGlzLmdyaWRTaXplKTsKCiAgICAgIC8vIGNvb3JkaW5hdGVzIGZvciBhbGwgcG9zc2libGUgdHJpYW5nbGVzIGluIGFuIFJUSU4gdGlsZQogICAgICB0aGlzLmNvb3JkcyA9IG5ldyBVaW50MTZBcnJheSh0aGlzLm51bVRyaWFuZ2xlcyAqIDQpOwoKICAgICAgLy8gZ2V0IHRyaWFuZ2xlIGNvb3JkaW5hdGVzIGZyb20gaXRzIGluZGV4IGluIGFuIGltcGxpY2l0IGJpbmFyeSB0cmVlCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5udW1UcmlhbmdsZXM7IGkrKykgewogICAgICAgIGxldCBpZCA9IGkgKyAyOwogICAgICAgIGxldCBheCA9IDAsCiAgICAgICAgICBheSA9IDAsCiAgICAgICAgICBieCA9IDAsCiAgICAgICAgICBieSA9IDAsCiAgICAgICAgICBjeCA9IDAsCiAgICAgICAgICBjeSA9IDA7CiAgICAgICAgaWYgKGlkICYgMSkgewogICAgICAgICAgYnggPSBieSA9IGN4ID0gdGlsZVNpemU7IC8vIGJvdHRvbS1sZWZ0IHRyaWFuZ2xlCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGF4ID0gYXkgPSBjeSA9IHRpbGVTaXplOyAvLyB0b3AtcmlnaHQgdHJpYW5nbGUKICAgICAgICB9CgogICAgICAgIHdoaWxlICgoaWQgPj49IDEpID4gMSkgewogICAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICAgIGlmIChpZCAmIDEpIHsKICAgICAgICAgICAgLy8gbGVmdCBoYWxmCiAgICAgICAgICAgIGJ4ID0gYXg7CiAgICAgICAgICAgIGJ5ID0gYXk7CiAgICAgICAgICAgIGF4ID0gY3g7CiAgICAgICAgICAgIGF5ID0gY3k7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyByaWdodCBoYWxmCiAgICAgICAgICAgIGF4ID0gYng7CiAgICAgICAgICAgIGF5ID0gYnk7CiAgICAgICAgICAgIGJ4ID0gY3g7CiAgICAgICAgICAgIGJ5ID0gY3k7CiAgICAgICAgICB9CiAgICAgICAgICBjeCA9IG14OwogICAgICAgICAgY3kgPSBteTsKICAgICAgICB9CiAgICAgICAgY29uc3QgayA9IGkgKiA0OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAwXSA9IGF4OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAxXSA9IGF5OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAyXSA9IGJ4OwogICAgICAgIHRoaXMuY29vcmRzW2sgKyAzXSA9IGJ5OwogICAgICB9CiAgICB9CiAgICBjcmVhdGVUaWxlKHRlcnJhaW4pIHsKICAgICAgcmV0dXJuIG5ldyBUaWxlKHRlcnJhaW4sIHRoaXMpOwogICAgfQogIH0KICBjbGFzcyBUaWxlIHsKICAgIGNvbnN0cnVjdG9yKHRlcnJhaW4sIG1hcnRpbmkpIHsKICAgICAgY29uc3Qgc2l6ZSA9IG1hcnRpbmkuZ3JpZFNpemU7CiAgICAgIGlmICh0ZXJyYWluLmxlbmd0aCAhPT0gc2l6ZSAqIHNpemUpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgdGVycmFpbiBkYXRhIG9mIGxlbmd0aCAke3NpemUgKiBzaXplfSAoJHtzaXplfSB4ICR7c2l6ZX0pLCBnb3QgJHt0ZXJyYWluLmxlbmd0aH0uYCk7CiAgICAgIHRoaXMudGVycmFpbiA9IHRlcnJhaW47CiAgICAgIHRoaXMubWFydGluaSA9IG1hcnRpbmk7CiAgICAgIHRoaXMuZXJyb3JzID0gbmV3IEZsb2F0MzJBcnJheSh0ZXJyYWluLmxlbmd0aCk7CiAgICAgIHRoaXMudXBkYXRlKCk7CiAgICB9CiAgICB1cGRhdGUoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBudW1UcmlhbmdsZXMsCiAgICAgICAgbnVtUGFyZW50VHJpYW5nbGVzLAogICAgICAgIGNvb3JkcywKICAgICAgICBncmlkU2l6ZTogc2l6ZQogICAgICB9ID0gdGhpcy5tYXJ0aW5pOwogICAgICBjb25zdCB7CiAgICAgICAgdGVycmFpbiwKICAgICAgICBlcnJvcnMKICAgICAgfSA9IHRoaXM7CgogICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHBvc3NpYmxlIHRyaWFuZ2xlcywgc3RhcnRpbmcgZnJvbSB0aGUgc21hbGxlc3QgbGV2ZWwKICAgICAgZm9yIChsZXQgaSA9IG51bVRyaWFuZ2xlcyAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgY29uc3QgayA9IGkgKiA0OwogICAgICAgIGNvbnN0IGF4ID0gY29vcmRzW2sgKyAwXTsKICAgICAgICBjb25zdCBheSA9IGNvb3Jkc1trICsgMV07CiAgICAgICAgY29uc3QgYnggPSBjb29yZHNbayArIDJdOwogICAgICAgIGNvbnN0IGJ5ID0gY29vcmRzW2sgKyAzXTsKICAgICAgICBjb25zdCBteCA9IGF4ICsgYnggPj4gMTsKICAgICAgICBjb25zdCBteSA9IGF5ICsgYnkgPj4gMTsKICAgICAgICBjb25zdCBjeCA9IG14ICsgbXkgLSBheTsKICAgICAgICBjb25zdCBjeSA9IG15ICsgYXggLSBteDsKCiAgICAgICAgLy8gY2FsY3VsYXRlIGVycm9yIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxvbmcgZWRnZSBvZiB0aGUgdHJpYW5nbGUKICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRIZWlnaHQgPSAodGVycmFpbltheSAqIHNpemUgKyBheF0gKyB0ZXJyYWluW2J5ICogc2l6ZSArIGJ4XSkgLyAyOwogICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gbXkgKiBzaXplICsgbXg7CiAgICAgICAgY29uc3QgbWlkZGxlRXJyb3IgPSBNYXRoLmFicyhpbnRlcnBvbGF0ZWRIZWlnaHQgLSB0ZXJyYWluW21pZGRsZUluZGV4XSk7CiAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIG1pZGRsZUVycm9yKTsKICAgICAgICBpZiAoaSA8IG51bVBhcmVudFRyaWFuZ2xlcykgewogICAgICAgICAgLy8gYmlnZ2VyIHRyaWFuZ2xlczsgYWNjdW11bGF0ZSBlcnJvciB3aXRoIGNoaWxkcmVuCiAgICAgICAgICBjb25zdCBsZWZ0Q2hpbGRJbmRleCA9IChheSArIGN5ID4+IDEpICogc2l6ZSArIChheCArIGN4ID4+IDEpOwogICAgICAgICAgY29uc3QgcmlnaHRDaGlsZEluZGV4ID0gKGJ5ICsgY3kgPj4gMSkgKiBzaXplICsgKGJ4ICsgY3ggPj4gMSk7CiAgICAgICAgICBlcnJvcnNbbWlkZGxlSW5kZXhdID0gTWF0aC5tYXgoZXJyb3JzW21pZGRsZUluZGV4XSwgZXJyb3JzW2xlZnRDaGlsZEluZGV4XSwgZXJyb3JzW3JpZ2h0Q2hpbGRJbmRleF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZ2V0TWVzaChtYXhFcnJvciA9IDAsIG1heExlbmd0aCA9IG51bGwpIHsKICAgICAgY29uc3QgewogICAgICAgIGdyaWRTaXplOiBzaXplLAogICAgICAgIGluZGljZXMKICAgICAgfSA9IHRoaXMubWFydGluaTsKICAgICAgY29uc3QgewogICAgICAgIGVycm9ycwogICAgICB9ID0gdGhpczsKICAgICAgbGV0IG51bVZlcnRpY2VzID0gMDsKICAgICAgbGV0IG51bVRyaWFuZ2xlcyA9IDA7CiAgICAgIGNvbnN0IG1heCA9IHNpemUgLSAxOwoKICAgICAgLy8gVGhlIG1heExlbmd0aCBwYXJhbWV0ZXIgd2lsbCBjYXVzZSB0cmlhbmdsZXMgdG8gYmUgZ2VuZXJhdGVkIHVudGlsIHRoZSBsZWdzIGFyZSBiZWxvdyB0aGlzIGxlbmd0aAogICAgICAvLyBJdCBpcyBtZWFudCB0byBzdXBwb3J0IGNhc2VzIHdoZXJlIGEgY2VydGFpbiBtZXNoIGRlbnNpdHkgaXMgcmVxdWlyZWQgdG8gZG8gc3BoZXJpY2FsIG1hdGggb24gZGlnaXRhbCBnbG9iZXMKICAgICAgY29uc3QgbWF4U2NhbGUgPSBtYXhMZW5ndGggfHwgc2l6ZTsKCiAgICAgIC8vIHVzZSBhbiBpbmRleCBncmlkIHRvIGtlZXAgdHJhY2sgb2YgdmVydGljZXMgdGhhdCB3ZXJlIGFscmVhZHkgdXNlZCB0byBhdm9pZCBkdXBsaWNhdGlvbgogICAgICBpbmRpY2VzLmZpbGwoMCk7CgogICAgICAvLyByZXRyaWV2ZSBtZXNoIGluIHR3byBzdGFnZXMgdGhhdCBib3RoIHRyYXZlcnNlIHRoZSBlcnJvciBtYXA6CiAgICAgIC8vIC0gY291bnRFbGVtZW50czogZmluZCB1c2VkIHZlcnRpY2VzIChhbmQgYXNzaWduIGVhY2ggYW4gaW5kZXgpLCBhbmQgY291bnQgdHJpYW5nbGVzIChmb3IgbWluaW11bSBhbGxvY2F0aW9uKQogICAgICAvLyAtIHByb2Nlc3NUcmlhbmdsZTogZmlsbCB0aGUgYWxsb2NhdGVkIHZlcnRpY2VzICYgdHJpYW5nbGVzIHR5cGVkIGFycmF5cwoKICAgICAgZnVuY3Rpb24gY291bnRFbGVtZW50cyhheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7CiAgICAgICAgY29uc3QgbXggPSBheCArIGJ4ID4+IDE7CiAgICAgICAgY29uc3QgbXkgPSBheSArIGJ5ID4+IDE7CiAgICAgICAgY29uc3QgbGVnTGVuZ3RoID0gTWF0aC5hYnMoYXggLSBjeCkgKyBNYXRoLmFicyhheSAtIGN5KTsKICAgICAgICBpZiAobGVnTGVuZ3RoID4gMSAmJiBlcnJvcnNbbXkgKiBzaXplICsgbXhdID4gbWF4RXJyb3IgfHwgbGVnTGVuZ3RoID4gbWF4U2NhbGUpIHsKICAgICAgICAgIGNvdW50RWxlbWVudHMoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICBjb3VudEVsZW1lbnRzKGJ4LCBieSwgY3gsIGN5LCBteCwgbXkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSA9IGluZGljZXNbYXkgKiBzaXplICsgYXhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICBudW1UcmlhbmdsZXMrKzsKICAgICAgICB9CiAgICAgIH0KICAgICAgY291bnRFbGVtZW50cygwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgY291bnRFbGVtZW50cyhtYXgsIG1heCwgMCwgMCwgMCwgbWF4KTsKICAgICAgY29uc3QgdmVydGljZXMgPSBuZXcgVWludDE2QXJyYXkobnVtVmVydGljZXMgKiAyKTsKICAgICAgY29uc3QgdHJpYW5nbGVzID0gbmV3IFVpbnQzMkFycmF5KG51bVRyaWFuZ2xlcyAqIDMpOwogICAgICBsZXQgdHJpSW5kZXggPSAwOwogICAgICBmdW5jdGlvbiBwcm9jZXNzVHJpYW5nbGUoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgIGNvbnN0IG14ID0gYXggKyBieCA+PiAxOwogICAgICAgIGNvbnN0IG15ID0gYXkgKyBieSA+PiAxOwogICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CiAgICAgICAgaWYgKGxlZ0xlbmd0aCA+IDEgJiYgZXJyb3JzW215ICogc2l6ZSArIG14XSA+IG1heEVycm9yIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICAvLyB0cmlhbmdsZSBkb2Vzbid0IGFwcHJveGltYXRlIHRoZSBzdXJmYWNlIHdlbGwgZW5vdWdoOyBkcmlsbCBkb3duIGZ1cnRoZXIKICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShjeCwgY3ksIGF4LCBheSwgbXgsIG15KTsKICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShieCwgYnksIGN4LCBjeSwgbXgsIG15KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gYWRkIGEgdHJpYW5nbGUKICAgICAgICAgIGNvbnN0IGEgPSBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSAtIDE7CiAgICAgICAgICBjb25zdCBiID0gaW5kaWNlc1tieSAqIHNpemUgKyBieF0gLSAxOwogICAgICAgICAgY29uc3QgYyA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIC0gMTsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBhXSA9IGF4OwogICAgICAgICAgdmVydGljZXNbMiAqIGEgKyAxXSA9IGF5OwogICAgICAgICAgdmVydGljZXNbMiAqIGJdID0gYng7CiAgICAgICAgICB2ZXJ0aWNlc1syICogYiArIDFdID0gYnk7CiAgICAgICAgICB2ZXJ0aWNlc1syICogY10gPSBjeDsKICAgICAgICAgIHZlcnRpY2VzWzIgKiBjICsgMV0gPSBjeTsKICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGE7CiAgICAgICAgICB0cmlhbmdsZXNbdHJpSW5kZXgrK10gPSBiOwogICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcHJvY2Vzc1RyaWFuZ2xlKDAsIDAsIG1heCwgbWF4LCBtYXgsIDApOwogICAgICBwcm9jZXNzVHJpYW5nbGUobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdmVydGljZXMsCiAgICAgICAgdHJpYW5nbGVzCiAgICAgIH07CiAgICB9CiAgfQoKICAvLyBodHRwczovL2dpdGh1Yi5jb20vQ2VzaXVtR1MvY2VzaXVtL2Jsb2IvMS43Ni9Tb3VyY2UvV29ya2Vyc0VTNi9jcmVhdGVWZXJ0aWNlc0Zyb21RdWFudGl6ZWRUZXJyYWluTWVzaC5qcwoKICB2YXIgbWFydGluaSA9IG51bGw7CiAgZnVuY3Rpb24gZGVjb2RlVGVycmFpbihwYXJhbWV0ZXJzLCB0cmFuc2ZlcmFibGVPYmplY3RzKSB7CiAgICB2YXIgX21hcnRpbmk7CiAgICB2YXIgaW1hZ2VEYXRhID0gcGFyYW1ldGVycy5pbWFnZURhdGEsCiAgICAgIF9wYXJhbWV0ZXJzJHRpbGVTaXplID0gcGFyYW1ldGVycy50aWxlU2l6ZSwKICAgICAgdGlsZVNpemUgPSBfcGFyYW1ldGVycyR0aWxlU2l6ZSA9PT0gdm9pZCAwID8gMjU2IDogX3BhcmFtZXRlcnMkdGlsZVNpemUsCiAgICAgIGVycm9yTGV2ZWwgPSBwYXJhbWV0ZXJzLmVycm9yTGV2ZWwsCiAgICAgIGludGVydmFsID0gcGFyYW1ldGVycy5pbnRlcnZhbCwKICAgICAgb2Zmc2V0ID0gcGFyYW1ldGVycy5vZmZzZXQ7CiAgICB2YXIgcGl4ZWxzID0gbmRhcnJheShuZXcgVWludDhBcnJheShpbWFnZURhdGEpLCBbdGlsZVNpemUsIHRpbGVTaXplLCA0XSwgWzQsIDQgKiB0aWxlU2l6ZSwgMV0sIDApOwoKICAgIC8vIFRpbGUgc2l6ZSBtdXN0IGJlIG1haW50YWluZWQgdGhyb3VnaCB0aGUgbGlmZSBvZiB0aGUgd29ya2VyCiAgICAoX21hcnRpbmkgPSBtYXJ0aW5pKSAhPT0gbnVsbCAmJiBfbWFydGluaSAhPT0gdm9pZCAwID8gX21hcnRpbmkgOiBtYXJ0aW5pID0gbmV3IE1hcnRpbmkodGlsZVNpemUgKyAxKTsKICAgIHZhciB0ZXJyYWluID0gbWFwYm94VGVycmFpblRvR3JpZChwaXhlbHMsIGludGVydmFsLCBvZmZzZXQpOwogICAgdmFyIHRpbGUgPSBtYXJ0aW5pLmNyZWF0ZVRpbGUodGVycmFpbik7CgogICAgLy8gZ2V0IGEgbWVzaCAodmVydGljZXMgYW5kIHRyaWFuZ2xlcyBpbmRpY2VzKSBmb3IgYSAxMG0gZXJyb3IKICAgIHZhciBtZXNoID0gdGlsZS5nZXRNZXNoKGVycm9yTGV2ZWwsIHBhcmFtZXRlcnMubWF4TGVuZ3RoKTsKICAgIHJldHVybiBjcmVhdGVRdWFudGl6ZWRNZXNoRGF0YSh0aWxlLCBtZXNoLCB0aWxlU2l6ZSk7CiAgfQogIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKG1zZykgewogICAgdmFyIF9tc2ckZGF0YSA9IG1zZy5kYXRhLAogICAgICBpZCA9IF9tc2ckZGF0YS5pZCwKICAgICAgcGF5bG9hZCA9IF9tc2ckZGF0YS5wYXlsb2FkOwogICAgaWYgKGlkID09IG51bGwpIHJldHVybjsKICAgIHZhciBvYmplY3RzID0gW107CiAgICB2YXIgcmVzID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIHJlcyA9IGRlY29kZVRlcnJhaW4ocGF5bG9hZCk7CiAgICAgIG9iamVjdHMucHVzaChyZXMuaW5kaWNlcy5idWZmZXIpOwogICAgICBvYmplY3RzLnB1c2gocmVzLnF1YW50aXplZFZlcnRpY2VzLmJ1ZmZlcik7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGlkOiBpZCwKICAgICAgICBwYXlsb2FkOiByZXMKICAgICAgfSwgb2JqZWN0cyk7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGlkLAogICAgICAgIGVycjogZXJyLnRvU3RyaW5nKCkKICAgICAgfSk7CiAgICB9IGZpbmFsbHkgewogICAgICByZXMgPSBudWxsOwogICAgICBvYmplY3RzID0gbnVsbDsKICAgIH0KICB9OwoKICBleHBvcnRzLmRlY29kZVRlcnJhaW4gPSBkZWNvZGVUZXJyYWluOwoKICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwoKICByZXR1cm4gZXhwb3J0czsKCn0pKHt9KTsKCg==', null, false);
713
+ /* eslint-enable */
714
+
715
+ var resolves = {};
716
+ var rejects = {};
717
+ var globalMsgId = 0; // Activate calculation in the worker, returning a promise
718
+ function sendMessage(_x, _x2, _x3) {
719
+ return _sendMessage.apply(this, arguments);
720
+ } // Handle incoming calculation result
721
+ function _sendMessage() {
722
+ _sendMessage = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(worker, payload, transferableObjects) {
723
+ var msgId, msg;
724
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
725
+ while (1) switch (_context2.prev = _context2.next) {
726
+ case 0:
727
+ msgId = globalMsgId++;
728
+ msg = {
729
+ id: msgId,
730
+ payload: payload
731
+ };
732
+ return _context2.abrupt("return", new Promise(function (resolve, reject) {
733
+ // save callbacks for later
734
+ resolves[msgId] = resolve;
735
+ rejects[msgId] = reject;
736
+ worker.postMessage(msg, transferableObjects);
737
+ }));
738
+ case 3:
739
+ case "end":
740
+ return _context2.stop();
741
+ }
742
+ }, _callee2);
743
+ }));
744
+ return _sendMessage.apply(this, arguments);
745
+ }
746
+ function handleMessage(msg) {
747
+ var _msg$data = msg.data,
748
+ id = _msg$data.id,
749
+ err = _msg$data.err,
750
+ payload = _msg$data.payload;
751
+ if (payload) {
752
+ var resolve = resolves[id];
753
+ if (resolve) {
754
+ resolve(payload);
755
+ }
756
+ } else {
757
+ // error condition
758
+ var reject = rejects[id];
759
+ if (reject) {
760
+ if (err) {
761
+ reject(err);
762
+ } else {
763
+ reject("Got nothing");
764
+ }
765
+ }
766
+ }
767
+
768
+ // purge used callbacks
769
+ delete resolves[id];
770
+ delete rejects[id];
771
+ }
772
+ var WorkerFarm = /*#__PURE__*/function () {
773
+ function WorkerFarm() {
774
+ _classCallCheck(this, WorkerFarm);
775
+ this.worker = new WorkerFactory();
776
+ this.worker.onmessage = handleMessage;
777
+ }
778
+ _createClass(WorkerFarm, [{
779
+ key: "scheduleTask",
780
+ value: function () {
781
+ var _scheduleTask = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, transferableObjects) {
782
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
783
+ while (1) switch (_context.prev = _context.next) {
784
+ case 0:
785
+ _context.next = 2;
786
+ return sendMessage(this.worker, params, transferableObjects);
787
+ case 2:
788
+ return _context.abrupt("return", _context.sent);
789
+ case 3:
790
+ case "end":
791
+ return _context.stop();
792
+ }
793
+ }, _callee, this);
794
+ }));
795
+ function scheduleTask(_x4, _x5) {
796
+ return _scheduleTask.apply(this, arguments);
797
+ }
798
+ return scheduleTask;
799
+ }()
800
+ }]);
801
+ return WorkerFarm;
802
+ }();
803
+
804
+ // We should save these
805
+ //const canvas = new OffscreenCanvas(256, 256);
806
+ //const ctx = canvas.getContext("2d");
807
+
808
+ function mapboxTerrainToGrid(png, interval, offset) {
809
+ var _interval, _offset;
810
+ // maybe we should do this on the GPU using REGL?
811
+ // but that would require GPU -> CPU -> GPU
812
+ var gridSize = png.shape[0] + 1;
813
+ var terrain = new Float32Array(gridSize * gridSize);
814
+ var tileSize = png.shape[0];
815
+ interval = (_interval = interval) !== null && _interval !== void 0 ? _interval : 0.1;
816
+ offset = (_offset = offset) !== null && _offset !== void 0 ? _offset : -10000;
817
+
818
+ // decode terrain values
819
+ for (var y = 0; y < tileSize; y++) {
820
+ for (var x = 0; x < tileSize; x++) {
821
+ var yc = y;
822
+ var r = png.get(x, yc, 0);
823
+ var g = png.get(x, yc, 1);
824
+ var b = png.get(x, yc, 2);
825
+ terrain[y * gridSize + x] = r * 256 * 256 * interval + g * 256.0 * interval + b * interval + offset;
826
+ }
827
+ }
828
+ // backfill right and bottom borders
829
+ for (var _x = 0; _x < gridSize - 1; _x++) {
830
+ terrain[gridSize * (gridSize - 1) + _x] = terrain[gridSize * (gridSize - 2) + _x];
831
+ }
832
+ for (var _y = 0; _y < gridSize; _y++) {
833
+ terrain[gridSize * _y + gridSize - 1] = terrain[gridSize * _y + gridSize - 2];
834
+ }
835
+ return terrain;
836
+ }
837
+ function _emptyMesh(n) {
838
+ n = Math.max(n, 2);
839
+ var nTriangles = Math.pow(n - 1, 2) * 2;
840
+ var nVertices = Math.pow(n, 2);
841
+ var quantizedVertices = new Uint16Array(nVertices * 3);
842
+ var indices = new Uint16Array(nTriangles * 3);
843
+ var westIndices = [];
844
+ var southIndices = [];
845
+ var eastIndices = [];
846
+ var northIndices = [];
847
+ var tix = 0;
848
+ for (var i = 0; i < nVertices; i++) {
849
+ var rx = i % n; //* 32767) / (n - 1);
850
+ var ry = Math.floor(i / n); //* 32767) / (n - 1);
851
+ var ix = n * rx + ry;
852
+ quantizedVertices[ix] = rx * 32768 / (n - 1);
853
+ quantizedVertices[nVertices + ix] = ry * 32768 / (n - 1);
854
+ quantizedVertices[2 * nVertices + ix] = 0;
855
+ if (ry == 0) westIndices.push(ix);
856
+ if (rx == 0) southIndices.push(ix);
857
+ if (rx == n - 1) eastIndices.push(ix);
858
+ if (ry == n - 1) northIndices.push(ix);
859
+
860
+ // Add triangles
861
+ var rix = i - ry * n;
862
+ if (rix != n - 1) {
863
+ indices[tix * 3] = i;
864
+ indices[tix * 3 + 1] = i + n + 1;
865
+ indices[tix * 3 + 2] = i + 1;
866
+ tix++;
867
+ }
868
+ if (rix != 0) {
869
+ indices[tix * 3] = i - 1;
870
+ indices[tix * 3 + 1] = i + n - 1;
871
+ indices[tix * 3 + 2] = i + n;
872
+ tix++;
873
+ }
874
+ }
875
+ return {
876
+ minimumHeight: 0,
877
+ maximumHeight: 0,
878
+ quantizedVertices: quantizedVertices,
879
+ indices: indices,
880
+ westIndices: westIndices,
881
+ southIndices: southIndices,
882
+ eastIndices: eastIndices,
883
+ northIndices: northIndices
884
+ };
885
+ }
886
+ var _meshCache = [];
887
+ function emptyMesh(n) {
888
+ // A memoized function to return empty meshes
889
+ if (n in _meshCache) {
890
+ return _meshCache[n];
891
+ } else {
892
+ var result = _emptyMesh(n);
893
+ _meshCache[n] = result;
894
+ return result;
895
+ }
896
+ }
897
+ function createQuantizedMeshData(tile, mesh, tileSize) {
898
+ var xvals = [];
899
+ var yvals = [];
900
+ var heightMeters = [];
901
+ var northIndices = [];
902
+ var southIndices = [];
903
+ var eastIndices = [];
904
+ var westIndices = [];
905
+ var minimumHeight = Infinity;
906
+ var maximumHeight = -Infinity;
907
+ var scalar = 32768.0 / tileSize;
908
+ for (var ix = 0; ix < mesh.vertices.length / 2; ix++) {
909
+ var vertexIx = ix;
910
+ var px = mesh.vertices[ix * 2];
911
+ var py = mesh.vertices[ix * 2 + 1];
912
+ var height = tile.terrain[py * (tileSize + 1) + px];
913
+ if (height > maximumHeight) maximumHeight = height;
914
+ if (height < minimumHeight) minimumHeight = height;
915
+ heightMeters.push(height);
916
+ if (py == 0) northIndices.push(vertexIx);
917
+ if (py == tileSize) southIndices.push(vertexIx);
918
+ if (px == 0) westIndices.push(vertexIx);
919
+ if (px == tileSize) eastIndices.push(vertexIx);
920
+ var xv = px * scalar;
921
+ var yv = (tileSize - py) * scalar;
922
+ xvals.push(xv);
923
+ yvals.push(yv);
924
+ }
925
+ var heightRange = maximumHeight - minimumHeight;
926
+ var heights = heightMeters.map(function (d) {
927
+ if (heightRange < 1) return 0;
928
+ return (d - minimumHeight) * (32767.0 / heightRange);
929
+ });
930
+ var triangles = new Uint16Array(mesh.triangles);
931
+ var quantizedVertices = new Uint16Array( //verts
932
+ [].concat(xvals, yvals, _toConsumableArray(heights)));
933
+
934
+ // SE NW NE
935
+ // NE NW SE
936
+
937
+ return {
938
+ minimumHeight: minimumHeight,
939
+ maximumHeight: maximumHeight,
940
+ quantizedVertices: quantizedVertices,
941
+ indices: triangles,
942
+ westIndices: westIndices,
943
+ southIndices: southIndices,
944
+ eastIndices: eastIndices,
945
+ northIndices: northIndices
946
+ };
947
+ }
948
+
949
+ class Martini {
950
+ constructor(gridSize = 257) {
951
+ this.gridSize = gridSize;
952
+ const tileSize = gridSize - 1;
953
+ if (tileSize & tileSize - 1) throw new Error(`Expected grid size to be 2^n+1, got ${gridSize}.`);
954
+ this.numTriangles = tileSize * tileSize * 2 - 2;
955
+ this.numParentTriangles = this.numTriangles - tileSize * tileSize;
956
+ this.indices = new Uint32Array(this.gridSize * this.gridSize);
957
+
958
+ // coordinates for all possible triangles in an RTIN tile
959
+ this.coords = new Uint16Array(this.numTriangles * 4);
960
+
961
+ // get triangle coordinates from its index in an implicit binary tree
962
+ for (let i = 0; i < this.numTriangles; i++) {
963
+ let id = i + 2;
964
+ let ax = 0,
965
+ ay = 0,
966
+ bx = 0,
967
+ by = 0,
968
+ cx = 0,
969
+ cy = 0;
970
+ if (id & 1) {
971
+ bx = by = cx = tileSize; // bottom-left triangle
972
+ } else {
973
+ ax = ay = cy = tileSize; // top-right triangle
974
+ }
975
+
976
+ while ((id >>= 1) > 1) {
977
+ const mx = ax + bx >> 1;
978
+ const my = ay + by >> 1;
979
+ if (id & 1) {
980
+ // left half
981
+ bx = ax;
982
+ by = ay;
983
+ ax = cx;
984
+ ay = cy;
985
+ } else {
986
+ // right half
987
+ ax = bx;
988
+ ay = by;
989
+ bx = cx;
990
+ by = cy;
991
+ }
992
+ cx = mx;
993
+ cy = my;
994
+ }
995
+ const k = i * 4;
996
+ this.coords[k + 0] = ax;
997
+ this.coords[k + 1] = ay;
998
+ this.coords[k + 2] = bx;
999
+ this.coords[k + 3] = by;
1000
+ }
1001
+ }
1002
+ createTile(terrain) {
1003
+ return new Tile(terrain, this);
1004
+ }
1005
+ }
1006
+ class Tile {
1007
+ constructor(terrain, martini) {
1008
+ const size = martini.gridSize;
1009
+ if (terrain.length !== size * size) throw new Error(`Expected terrain data of length ${size * size} (${size} x ${size}), got ${terrain.length}.`);
1010
+ this.terrain = terrain;
1011
+ this.martini = martini;
1012
+ this.errors = new Float32Array(terrain.length);
1013
+ this.update();
1014
+ }
1015
+ update() {
1016
+ const {
1017
+ numTriangles,
1018
+ numParentTriangles,
1019
+ coords,
1020
+ gridSize: size
1021
+ } = this.martini;
1022
+ const {
1023
+ terrain,
1024
+ errors
1025
+ } = this;
1026
+
1027
+ // iterate over all possible triangles, starting from the smallest level
1028
+ for (let i = numTriangles - 1; i >= 0; i--) {
1029
+ const k = i * 4;
1030
+ const ax = coords[k + 0];
1031
+ const ay = coords[k + 1];
1032
+ const bx = coords[k + 2];
1033
+ const by = coords[k + 3];
1034
+ const mx = ax + bx >> 1;
1035
+ const my = ay + by >> 1;
1036
+ const cx = mx + my - ay;
1037
+ const cy = my + ax - mx;
1038
+
1039
+ // calculate error in the middle of the long edge of the triangle
1040
+ const interpolatedHeight = (terrain[ay * size + ax] + terrain[by * size + bx]) / 2;
1041
+ const middleIndex = my * size + mx;
1042
+ const middleError = Math.abs(interpolatedHeight - terrain[middleIndex]);
1043
+ errors[middleIndex] = Math.max(errors[middleIndex], middleError);
1044
+ if (i < numParentTriangles) {
1045
+ // bigger triangles; accumulate error with children
1046
+ const leftChildIndex = (ay + cy >> 1) * size + (ax + cx >> 1);
1047
+ const rightChildIndex = (by + cy >> 1) * size + (bx + cx >> 1);
1048
+ errors[middleIndex] = Math.max(errors[middleIndex], errors[leftChildIndex], errors[rightChildIndex]);
1049
+ }
1050
+ }
1051
+ }
1052
+ getMesh(maxError = 0, maxLength = null) {
1053
+ const {
1054
+ gridSize: size,
1055
+ indices
1056
+ } = this.martini;
1057
+ const {
1058
+ errors
1059
+ } = this;
1060
+ let numVertices = 0;
1061
+ let numTriangles = 0;
1062
+ const max = size - 1;
1063
+
1064
+ // The maxLength parameter will cause triangles to be generated until the legs are below this length
1065
+ // It is meant to support cases where a certain mesh density is required to do spherical math on digital globes
1066
+ const maxScale = maxLength || size;
1067
+
1068
+ // use an index grid to keep track of vertices that were already used to avoid duplication
1069
+ indices.fill(0);
1070
+
1071
+ // retrieve mesh in two stages that both traverse the error map:
1072
+ // - countElements: find used vertices (and assign each an index), and count triangles (for minimum allocation)
1073
+ // - processTriangle: fill the allocated vertices & triangles typed arrays
1074
+
1075
+ function countElements(ax, ay, bx, by, cx, cy) {
1076
+ const mx = ax + bx >> 1;
1077
+ const my = ay + by >> 1;
1078
+ const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
1079
+ if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
1080
+ countElements(cx, cy, ax, ay, mx, my);
1081
+ countElements(bx, by, cx, cy, mx, my);
1082
+ } else {
1083
+ indices[ay * size + ax] = indices[ay * size + ax] || ++numVertices;
1084
+ indices[by * size + bx] = indices[by * size + bx] || ++numVertices;
1085
+ indices[cy * size + cx] = indices[cy * size + cx] || ++numVertices;
1086
+ numTriangles++;
1087
+ }
1088
+ }
1089
+ countElements(0, 0, max, max, max, 0);
1090
+ countElements(max, max, 0, 0, 0, max);
1091
+ const vertices = new Uint16Array(numVertices * 2);
1092
+ const triangles = new Uint32Array(numTriangles * 3);
1093
+ let triIndex = 0;
1094
+ function processTriangle(ax, ay, bx, by, cx, cy) {
1095
+ const mx = ax + bx >> 1;
1096
+ const my = ay + by >> 1;
1097
+ const legLength = Math.abs(ax - cx) + Math.abs(ay - cy);
1098
+ if (legLength > 1 && errors[my * size + mx] > maxError || legLength > maxScale) {
1099
+ // triangle doesn't approximate the surface well enough; drill down further
1100
+ processTriangle(cx, cy, ax, ay, mx, my);
1101
+ processTriangle(bx, by, cx, cy, mx, my);
1102
+ } else {
1103
+ // add a triangle
1104
+ const a = indices[ay * size + ax] - 1;
1105
+ const b = indices[by * size + bx] - 1;
1106
+ const c = indices[cy * size + cx] - 1;
1107
+ vertices[2 * a] = ax;
1108
+ vertices[2 * a + 1] = ay;
1109
+ vertices[2 * b] = bx;
1110
+ vertices[2 * b + 1] = by;
1111
+ vertices[2 * c] = cx;
1112
+ vertices[2 * c + 1] = cy;
1113
+ triangles[triIndex++] = a;
1114
+ triangles[triIndex++] = b;
1115
+ triangles[triIndex++] = c;
1116
+ }
1117
+ }
1118
+ processTriangle(0, 0, max, max, max, 0);
1119
+ processTriangle(max, max, 0, 0, 0, max);
1120
+ return {
1121
+ vertices,
1122
+ triangles
1123
+ };
1124
+ }
1125
+ }
1126
+
1127
+ // https://github.com/CesiumGS/cesium/blob/1.76/Source/WorkersES6/createVerticesFromQuantizedTerrainMesh.js
1128
+
1129
+ var martini = null;
1130
+ function decodeTerrain(parameters, transferableObjects) {
1131
+ var _martini;
1132
+ var imageData = parameters.imageData,
1133
+ _parameters$tileSize = parameters.tileSize,
1134
+ tileSize = _parameters$tileSize === void 0 ? 256 : _parameters$tileSize,
1135
+ errorLevel = parameters.errorLevel,
1136
+ interval = parameters.interval,
1137
+ offset = parameters.offset;
1138
+ var pixels = ndarray__default["default"](new Uint8Array(imageData), [tileSize, tileSize, 4], [4, 4 * tileSize, 1], 0);
1139
+
1140
+ // Tile size must be maintained through the life of the worker
1141
+ (_martini = martini) !== null && _martini !== void 0 ? _martini : martini = new Martini(tileSize + 1);
1142
+ var terrain = mapboxTerrainToGrid(pixels, interval, offset);
1143
+ var tile = martini.createTile(terrain);
1144
+
1145
+ // get a mesh (vertices and triangles indices) for a 10m error
1146
+ var mesh = tile.getMesh(errorLevel, parameters.maxLength);
1147
+ return createQuantizedMeshData(tile, mesh, tileSize);
1148
+ }
1149
+ self.onmessage = function (msg) {
1150
+ var _msg$data = msg.data,
1151
+ id = _msg$data.id,
1152
+ payload = _msg$data.payload;
1153
+ if (id == null) return;
1154
+ var objects = [];
1155
+ var res = null;
1156
+ try {
1157
+ res = decodeTerrain(payload);
1158
+ objects.push(res.indices.buffer);
1159
+ objects.push(res.quantizedVertices.buffer);
1160
+ self.postMessage({
1161
+ id: id,
1162
+ payload: res
1163
+ }, objects);
1164
+ } catch (err) {
1165
+ self.postMessage({
1166
+ id: id,
1167
+ err: err.toString()
1168
+ });
1169
+ } finally {
1170
+ res = null;
1171
+ objects = null;
1172
+ }
1173
+ };
1174
+
1175
+ // https://github.com/CesiumGS/cesium/blob/1.68/Source/Scene/MapboxImageryProvider.js#L42
1176
+ var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
1177
+ _inherits(StretchedTilingScheme, _WebMercatorTilingSch);
1178
+ var _super = _createSuper(StretchedTilingScheme);
1179
+ function StretchedTilingScheme() {
1180
+ _classCallCheck(this, StretchedTilingScheme);
1181
+ return _super.apply(this, arguments);
1182
+ }
1183
+ _createClass(StretchedTilingScheme, [{
1184
+ key: "tileXYToRectangle",
1185
+ value: function tileXYToRectangle(x, y, level, res) {
1186
+ var result = _get(_getPrototypeOf(StretchedTilingScheme.prototype), "tileXYToRectangle", this).call(this, x, y, level);
1187
+ if (y == 0) {
1188
+ //console.log("Top row", res, y, level);
1189
+ result.north = Math.PI / 2;
1190
+ }
1191
+ if (y + 1 == Math.pow(2, level)) {
1192
+ result.south = -Math.PI / 2;
1193
+ }
1194
+ return result;
1195
+ }
1196
+ }]);
1197
+ return StretchedTilingScheme;
1198
+ }(cesium.WebMercatorTilingScheme);
1199
+ var MartiniTerrainProvider = /*#__PURE__*/function () {
1200
+ // @ts-ignore
1201
+ function MartiniTerrainProvider() {
1202
+ var _opts$interval, _opts$offset, _opts$maxWorkers, _opts$minZoomLevel, _opts$fillPoles, _opts$detailScalar, _opts$minimumErrorLev, _opts$ellipsoid;
1203
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1204
+ _classCallCheck(this, MartiniTerrainProvider);
1205
+ _defineProperty(this, "hasWaterMask", false);
1206
+ _defineProperty(this, "hasVertexNormals", false);
1207
+ _defineProperty(this, "credit", new cesium.Credit("Mapbox"));
1208
+ _defineProperty(this, "availability", null);
1209
+ _defineProperty(this, "errorEvent", new cesium.Event());
1210
+ _defineProperty(this, "workerFarm", null);
1211
+ _defineProperty(this, "inProgressWorkers", 0);
1212
+ _defineProperty(this, "levelOfDetailScalar", null);
1213
+ _defineProperty(this, "maxWorkers", 5);
1214
+ _defineProperty(this, "minError", 0.1);
1215
+ _defineProperty(this, "fillPoles", true);
1216
+ _defineProperty(this, "_errorAtMinZoom", 1000);
1217
+ _defineProperty(this, "resource", null);
1218
+ _defineProperty(this, "RADIUS_SCALAR", 1.0);
1219
+ //this.martini = new Martini(257);
1220
+ this.resource = opts.resource;
1221
+ this.interval = (_opts$interval = opts.interval) !== null && _opts$interval !== void 0 ? _opts$interval : 0.1;
1222
+ this.offset = (_opts$offset = opts.offset) !== null && _opts$offset !== void 0 ? _opts$offset : -10000;
1223
+ this.maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
1224
+ this.minZoomLevel = (_opts$minZoomLevel = opts.minZoomLevel) !== null && _opts$minZoomLevel !== void 0 ? _opts$minZoomLevel : 3;
1225
+ this.fillPoles = (_opts$fillPoles = opts.fillPoles) !== null && _opts$fillPoles !== void 0 ? _opts$fillPoles : true;
1226
+ console.log("fillPoles", this.fillPoles);
1227
+ this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 4.0) + cesium.Math.EPSILON5;
1228
+ this.ready = true;
1229
+ this.readyPromise = Promise.resolve(true);
1230
+ this.minError = (_opts$minimumErrorLev = opts.minimumErrorLevel) !== null && _opts$minimumErrorLev !== void 0 ? _opts$minimumErrorLev : 0.1;
1231
+ this.errorEvent.addEventListener(console.log, this);
1232
+ this.ellipsoid = (_opts$ellipsoid = opts.ellipsoid) !== null && _opts$ellipsoid !== void 0 ? _opts$ellipsoid : cesium.Ellipsoid.WGS84;
1233
+ if (this.maxWorkers > 0) {
1234
+ this.workerFarm = new WorkerFarm();
1235
+ }
1236
+ var scheme = cesium.WebMercatorTilingScheme;
1237
+ if (this.fillPoles) {
1238
+ scheme = StretchedTilingScheme;
1239
+ }
1240
+ this.tilingScheme = new scheme({
1241
+ numberOfLevelZeroTilesX: 1,
1242
+ numberOfLevelZeroTilesY: 1,
1243
+ ellipsoid: this.ellipsoid
1244
+ });
1245
+ this._errorAtMinZoom = this.errorAtZoom(this.minZoomLevel);
1246
+ }
1247
+ _createClass(MartiniTerrainProvider, [{
1248
+ key: "requestTileGeometry",
1249
+ value: function requestTileGeometry(x, y, z, request) {
1250
+ var _this = this;
1251
+ // Look for tiles both below the zoom level and below the error threshold for the zoom level at the equator...
1252
+
1253
+ if (z < this.minZoomLevel || this.scaledErrorForTile(x, y, z) > this._errorAtMinZoom) {
1254
+ // If we are below the minimum zoom level, we return empty heightmaps
1255
+ // to avoid unnecessary requests for low-resolution data.
1256
+ return Promise.resolve(this.emptyMesh(x, y, z));
1257
+ }
1258
+
1259
+ // Note: we still load a TON of tiles near the poles. We might need to do some overzooming here...
1260
+
1261
+ if (this.inProgressWorkers > this.maxWorkers) return undefined;
1262
+ this.inProgressWorkers += 1;
1263
+ return this.processTile(x, y, z)["finally"](function () {
1264
+ _this.inProgressWorkers -= 1;
1265
+ });
1266
+ }
1267
+ }, {
1268
+ key: "processTile",
1269
+ value: function () {
1270
+ var _processTile = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(x, y, z) {
1271
+ var _this$resource, tileSize, getTilePixels, px, pixelData, tileRect, err, maxLength, params, res;
1272
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1273
+ while (1) switch (_context.prev = _context.next) {
1274
+ case 0:
1275
+ _context.prev = 0;
1276
+ _this$resource = this.resource, tileSize = _this$resource.tileSize, getTilePixels = _this$resource.getTilePixels;
1277
+ _context.next = 4;
1278
+ return getTilePixels({
1279
+ x: x,
1280
+ y: y,
1281
+ z: z
1282
+ });
1283
+ case 4:
1284
+ px = _context.sent;
1285
+ pixelData = px.data;
1286
+ tileRect = this.tilingScheme.tileXYToRectangle(x, y, z); ///const center = Rectangle.center(tileRect);
1287
+ err = this.errorAtZoom(z);
1288
+ maxLength = this.maxVertexDistance(tileRect);
1289
+ params = {
1290
+ imageData: pixelData,
1291
+ maxLength: maxLength,
1292
+ x: x,
1293
+ y: y,
1294
+ z: z,
1295
+ errorLevel: err,
1296
+ ellipsoidRadius: this.ellipsoid.maximumRadius,
1297
+ tileSize: tileSize,
1298
+ interval: this.interval,
1299
+ offset: this.offset
1300
+ };
1301
+ if (!(this.workerFarm != null)) {
1302
+ _context.next = 16;
1303
+ break;
1304
+ }
1305
+ _context.next = 13;
1306
+ return this.workerFarm.scheduleTask(params, [pixelData.buffer]);
1307
+ case 13:
1308
+ res = _context.sent;
1309
+ _context.next = 17;
1310
+ break;
1311
+ case 16:
1312
+ res = decodeTerrain(params);
1313
+ case 17:
1314
+ pixelData = undefined;
1315
+ px = undefined;
1316
+ return _context.abrupt("return", this.createQuantizedMeshData(tileRect, err, res));
1317
+ case 22:
1318
+ _context.prev = 22;
1319
+ _context.t0 = _context["catch"](0);
1320
+ console.log(_context.t0);
1321
+ return _context.abrupt("return", this.emptyMesh(x, y, z));
1322
+ case 26:
1323
+ case "end":
1324
+ return _context.stop();
1325
+ }
1326
+ }, _callee, this, [[0, 22]]);
1327
+ }));
1328
+ function processTile(_x, _x2, _x3) {
1329
+ return _processTile.apply(this, arguments);
1330
+ }
1331
+ return processTile;
1332
+ }()
1333
+ }, {
1334
+ key: "errorAtZoom",
1335
+ value: function errorAtZoom(zoom) {
1336
+ return Math.max(this.getLevelMaximumGeometricError(zoom) / this.levelOfDetailScalar, this.minError);
1337
+ }
1338
+ }, {
1339
+ key: "scaledErrorForTile",
1340
+ value: function scaledErrorForTile(x, y, z) {
1341
+ var tileRect = this.tilingScheme.tileXYToRectangle(x, y, z);
1342
+ var center = cesium.Rectangle.center(tileRect);
1343
+ return this.errorAtZoom(z) / Math.pow(1 - Math.sin(center.latitude), 2);
1344
+ }
1345
+ }, {
1346
+ key: "maxVertexDistance",
1347
+ value: function maxVertexDistance(tileRect) {
1348
+ return Math.ceil(2 / tileRect.height);
1349
+ }
1350
+ }, {
1351
+ key: "emptyMesh",
1352
+ value: function emptyMesh$1(x, y, z) {
1353
+ var tileRect = this.tilingScheme.tileXYToRectangle(x, y, z);
1354
+ var center = cesium.Rectangle.center(tileRect);
1355
+ var latScalar = Math.min(Math.abs(Math.sin(center.latitude)), 0.995);
1356
+ var v = Math.max(Math.ceil(200 / (z + 1) * Math.pow(1 - latScalar, 0.25)), 4);
1357
+ var output = emptyMesh(v);
1358
+ var err = this.errorAtZoom(z);
1359
+ return this.createQuantizedMeshData(tileRect, err, output);
1360
+ }
1361
+ }, {
1362
+ key: "createQuantizedMeshData",
1363
+ value: function createQuantizedMeshData(tileRect, errorLevel, workerOutput) {
1364
+ var minimumHeight = workerOutput.minimumHeight,
1365
+ maximumHeight = workerOutput.maximumHeight,
1366
+ quantizedVertices = workerOutput.quantizedVertices,
1367
+ indices = workerOutput.indices,
1368
+ westIndices = workerOutput.westIndices,
1369
+ southIndices = workerOutput.southIndices,
1370
+ eastIndices = workerOutput.eastIndices,
1371
+ northIndices = workerOutput.northIndices;
1372
+ var err = errorLevel;
1373
+ var skirtHeight = err * 20;
1374
+ var center = cesium.Rectangle.center(tileRect);
1375
+
1376
+ // Calculating occlusion height is kind of messy currently, but it definitely works
1377
+ var halfAngle = tileRect.width / 2;
1378
+ var dr = Math.cos(halfAngle); // half tile width since our ref point is at the center
1379
+
1380
+ var occlusionHeight = dr * this.ellipsoid.maximumRadius + maximumHeight;
1381
+ if (halfAngle > Math.PI / 4) {
1382
+ occlusionHeight = (1 + halfAngle) * this.ellipsoid.maximumRadius;
1383
+ }
1384
+ var occlusionPoint = new cesium.Cartographic(center.longitude, center.latitude, occlusionHeight
1385
+ // Scaling factor of two just to be sure.
1386
+ );
1387
+
1388
+ var horizonOcclusionPoint = this.ellipsoid.transformPositionToScaledSpace(cesium.Cartographic.toCartesian(occlusionPoint));
1389
+ var orientedBoundingBox = cesium.OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, this.tilingScheme.ellipsoid);
1390
+ var boundingSphere = cesium.BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox);
1391
+
1392
+ // SE NW NE
1393
+ // NE NW SE
1394
+
1395
+ var result = new cesium.QuantizedMeshTerrainData({
1396
+ minimumHeight: minimumHeight,
1397
+ maximumHeight: maximumHeight,
1398
+ quantizedVertices: quantizedVertices,
1399
+ indices: indices,
1400
+ boundingSphere: boundingSphere,
1401
+ orientedBoundingBox: orientedBoundingBox,
1402
+ horizonOcclusionPoint: horizonOcclusionPoint,
1403
+ westIndices: westIndices,
1404
+ southIndices: southIndices,
1405
+ eastIndices: eastIndices,
1406
+ northIndices: northIndices,
1407
+ westSkirtHeight: skirtHeight,
1408
+ southSkirtHeight: skirtHeight,
1409
+ eastSkirtHeight: skirtHeight,
1410
+ northSkirtHeight: skirtHeight,
1411
+ childTileMask: 15
1412
+ });
1413
+ return result;
1414
+ }
1415
+ }, {
1416
+ key: "getLevelMaximumGeometricError",
1417
+ value: function getLevelMaximumGeometricError(level) {
1418
+ var levelZeroMaximumGeometricError = cesium.TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this.tilingScheme.ellipsoid, 65, this.tilingScheme.getNumberOfXTilesAtLevel(0));
1419
+
1420
+ // Scalar to control overzooming
1421
+ // also seems to control zooming for imagery layers
1422
+ var scalar = this.resource.tileSize / 256;
1423
+ return levelZeroMaximumGeometricError / scalar / (1 << level);
1424
+ }
1425
+ }, {
1426
+ key: "getTileDataAvailable",
1427
+ value: function getTileDataAvailable(x, y, z) {
1428
+ return this.resource.getTileDataAvailable({
1429
+ x: x,
1430
+ y: y,
1431
+ z: z
1432
+ });
1433
+ }
1434
+ }]);
1435
+ return MartiniTerrainProvider;
1436
+ }();
1437
+ var MapboxTerrainProvider = /*#__PURE__*/function (_MartiniTerrainProvid) {
1438
+ _inherits(MapboxTerrainProvider, _MartiniTerrainProvid);
1439
+ var _super2 = _createSuper(MapboxTerrainProvider);
1440
+ function MapboxTerrainProvider() {
1441
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1442
+ _classCallCheck(this, MapboxTerrainProvider);
1443
+ var resource = new MapboxTerrainResource(opts);
1444
+ return _super2.call(this, _objectSpread2(_objectSpread2({}, opts), {}, {
1445
+ resource: resource
1446
+ }));
1447
+ }
1448
+ return _createClass(MapboxTerrainProvider);
1449
+ }(MartiniTerrainProvider);
1450
+
1451
+ exports.DefaultHeightmapResource = DefaultHeightmapResource;
1452
+ exports.MapboxTerrainResource = MapboxTerrainResource;
1453
+ exports.MartiniTerrainProvider = MartiniTerrainProvider;
1454
+ exports["default"] = MapboxTerrainProvider;
1455
+ //# sourceMappingURL=index.cjs.map