@macrostrat/cesium-martini 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,13 @@
1
- import { Resource, Credit, Rectangle, Cartographic, OrientedBoundingBox, BoundingSphere, QuantizedMeshTerrainData, TerrainProvider, Event, Math as Math$1, Ellipsoid, WebMercatorTilingScheme } from 'cesium';
1
+ import { Resource, Credit, Rectangle, Cartographic, OrientedBoundingBox, BoundingSphere, QuantizedMeshTerrainData, WebMercatorTilingScheme, TerrainProvider, Event, Ellipsoid, Math as Math$1 } from 'cesium';
2
2
 
3
+ function _arrayLikeToArray(r, a) {
4
+ (null == a || a > r.length) && (a = r.length);
5
+ for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
6
+ return n;
7
+ }
8
+ function _arrayWithoutHoles(r) {
9
+ if (Array.isArray(r)) return _arrayLikeToArray(r);
10
+ }
3
11
  function _assertThisInitialized(e) {
4
12
  if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
5
13
  return e;
@@ -88,6 +96,12 @@ function _isNativeReflectConstruct() {
88
96
  return !!t;
89
97
  })();
90
98
  }
99
+ function _iterableToArray(r) {
100
+ if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
101
+ }
102
+ function _nonIterableSpread() {
103
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
104
+ }
91
105
  function ownKeys(e, r) {
92
106
  var t = Object.keys(e);
93
107
  if (Object.getOwnPropertySymbols) {
@@ -109,6 +123,26 @@ function _objectSpread2(e) {
109
123
  }
110
124
  return e;
111
125
  }
126
+ function _objectWithoutProperties(e, t) {
127
+ if (null == e) return {};
128
+ var o,
129
+ r,
130
+ i = _objectWithoutPropertiesLoose(e, t);
131
+ if (Object.getOwnPropertySymbols) {
132
+ var n = Object.getOwnPropertySymbols(e);
133
+ for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
134
+ }
135
+ return i;
136
+ }
137
+ function _objectWithoutPropertiesLoose(r, e) {
138
+ if (null == r) return {};
139
+ var t = {};
140
+ for (var n in r) if ({}.hasOwnProperty.call(r, n)) {
141
+ if (-1 !== e.indexOf(n)) continue;
142
+ t[n] = r[n];
143
+ }
144
+ return t;
145
+ }
112
146
  function _possibleConstructorReturn(t, e) {
113
147
  if (e && ("object" == typeof e || "function" == typeof e)) return e;
114
148
  if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined");
@@ -430,6 +464,9 @@ function _superPropGet(t, o, e, r) {
430
464
  return p.apply(e, t);
431
465
  } : p;
432
466
  }
467
+ function _toConsumableArray(r) {
468
+ return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
469
+ }
433
470
  function _toPrimitive(t, r) {
434
471
  if ("object" != typeof t || !t) return t;
435
472
  var e = t[Symbol.toPrimitive];
@@ -444,57 +481,43 @@ function _toPropertyKey(t) {
444
481
  var i = _toPrimitive(t, "string");
445
482
  return "symbol" == typeof i ? i : i + "";
446
483
  }
484
+ function _unsupportedIterableToArray(r, a) {
485
+ if (r) {
486
+ if ("string" == typeof r) return _arrayLikeToArray(r, a);
487
+ var t = {}.toString.call(r).slice(8, -1);
488
+ return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
489
+ }
490
+ }
447
491
 
448
- var loadImage = function loadImage(url) {
449
- return new Promise(function (resolve, reject) {
450
- var img = new Image();
451
- img.addEventListener("load", function () {
452
- return resolve(img);
453
- });
454
- img.addEventListener("error", function (err) {
455
- return reject(err);
456
- });
457
- img.crossOrigin = "anonymous";
458
- img.src = url;
459
- });
460
- };
461
492
  var DefaultHeightmapResource = /*#__PURE__*/function () {
462
493
  function DefaultHeightmapResource() {
463
- var _this = this,
464
- _opts$skipOddLevels,
465
- _opts$tileSize,
466
- _opts$maxZoom;
494
+ var _opts$tileSize, _opts$maxZoom;
467
495
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
468
496
  _classCallCheck(this, DefaultHeightmapResource);
469
497
  _defineProperty(this, "resource", null);
470
498
  _defineProperty(this, "tileSize", 256);
471
- _defineProperty(this, "skipOddLevels", false);
472
- _defineProperty(this, "getTilePixels", /*#__PURE__*/function () {
473
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(coords) {
474
- var url, img;
475
- return _regeneratorRuntime().wrap(function _callee$(_context) {
476
- while (1) switch (_context.prev = _context.next) {
477
- case 0:
478
- url = _this.buildTileURL(coords);
479
- _context.next = 3;
480
- return loadImage(url);
481
- case 3:
482
- img = _context.sent;
483
- return _context.abrupt("return", _this.getPixels(img));
484
- case 5:
485
- case "end":
486
- return _context.stop();
487
- }
488
- }, _callee);
489
- }));
490
- return function (_x) {
491
- return _ref.apply(this, arguments);
492
- };
493
- }());
494
499
  if (opts.url) {
495
- this.resource = Resource.createIfNeeded(opts.url);
500
+ this.resource = new Resource({
501
+ url: opts.url
502
+ });
503
+ }
504
+ this.skipZoomLevel = function () {
505
+ return false;
506
+ };
507
+ if (opts.skipZoomLevels) {
508
+ if (Array.isArray(opts.skipZoomLevels)) {
509
+ var _skipZoomLevels = opts.skipZoomLevels;
510
+ this.skipZoomLevel = function (z) {
511
+ return _skipZoomLevels.includes(z);
512
+ };
513
+ } else {
514
+ this.skipZoomLevel = opts.skipZoomLevels;
515
+ }
516
+ } else if (opts.skipOddLevels) {
517
+ this.skipZoomLevel = function (z) {
518
+ return z % 2 == 1;
519
+ };
496
520
  }
497
- this.skipOddLevels = (_opts$skipOddLevels = opts.skipOddLevels) !== null && _opts$skipOddLevels !== void 0 ? _opts$skipOddLevels : false;
498
521
  this.tileSize = (_opts$tileSize = opts.tileSize) !== null && _opts$tileSize !== void 0 ? _opts$tileSize : 256;
499
522
  this.maxZoom = (_opts$maxZoom = opts.maxZoom) !== null && _opts$maxZoom !== void 0 ? _opts$maxZoom : 15;
500
523
  this.contextQueue = [];
@@ -530,26 +553,48 @@ var DefaultHeightmapResource = /*#__PURE__*/function () {
530
553
  return pixels;
531
554
  }
532
555
  }, {
533
- key: "buildTileURL",
534
- value: function buildTileURL(tileCoords) {
535
- var _this$resource;
556
+ key: "getTileResource",
557
+ value: function getTileResource(tileCoords) {
536
558
  // reverseY for TMS tiling (https://gist.github.com/tmcw/4954720)
537
559
  // See tiling schemes here: https://www.maptiler.com/google-maps-coordinates-tile-bounds-projection/
538
560
  var z = tileCoords.z,
539
561
  y = tileCoords.y;
540
- return (_this$resource = this.resource) === null || _this$resource === void 0 ? void 0 : _this$resource.getDerivedResource({
562
+ return this.resource.getDerivedResource({
541
563
  templateValues: _objectSpread2(_objectSpread2({}, tileCoords), {}, {
542
564
  reverseY: Math.pow(2, z) - y - 1
543
565
  }),
544
566
  preserveQueryParameters: true
545
- }).getUrlComponent(true);
567
+ });
568
+ }
569
+ }, {
570
+ key: "getTilePixels",
571
+ value: function getTilePixels(coords) {
572
+ var _this = this;
573
+ var resource = this.getTileResource(coords);
574
+ var request = resource.fetchImage({
575
+ preferImageBitmap: false,
576
+ // @ts-ignore
577
+ retryAttempts: 3
578
+ });
579
+ if (request == null) return undefined;
580
+ return request.then(function (img) {
581
+ return (
582
+ // @ts-ignore
583
+ _this.getPixels(img)
584
+ );
585
+ });
546
586
  }
547
587
  }, {
548
588
  key: "getTileDataAvailable",
549
- value: function getTileDataAvailable(_ref2) {
550
- var z = _ref2.z;
589
+ value: function getTileDataAvailable(_ref) {
590
+ var z = _ref.z;
551
591
  if (z == this.maxZoom) return true;
552
- if (z % 2 == 1 && this.skipOddLevels) return false;
592
+ /* Weird hack:
593
+ For some reason, request render mode breaks if zoom 1 tiles are disabled.
594
+ So we have to make sure that we always report zoom 1 tiles as available.
595
+ */
596
+ if (z < 2) return true;
597
+ if (this.skipZoomLevel(z)) return false;
553
598
  if (z > this.maxZoom) return false;
554
599
  return true;
555
600
  }
@@ -573,6 +618,7 @@ var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
573
618
  _defineProperty(_this, "credit", new Credit("Mapbox"));
574
619
  var highResolution = (_opts$highResolution = opts.highResolution) !== null && _opts$highResolution !== void 0 ? _opts$highResolution : false;
575
620
  var format = (_opts$imageFormat = opts.imageFormat) !== null && _opts$imageFormat !== void 0 ? _opts$imageFormat : ImageFormat.WEBP;
621
+ var urlTemplate = opts.urlTemplate;
576
622
 
577
623
  // overrides based on highResolution flag
578
624
  if (highResolution) {
@@ -583,7 +629,10 @@ var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
583
629
  _this.tileSize = 512;
584
630
  }
585
631
  }
586
- _this.resource = Resource.createIfNeeded("https://api.mapbox.com/v4/mapbox.terrain-rgb/{z}/{x}/{y}".concat(highResolution ? "@2x" : "", ".").concat(format));
632
+ var defaultURL = "https://api.mapbox.com/v4/mapbox.terrain-rgb/{z}/{x}/{y}".concat(highResolution ? "@2x" : "", ".").concat(format);
633
+ _this.resource = new Resource({
634
+ url: urlTemplate !== null && urlTemplate !== void 0 ? urlTemplate : defaultURL
635
+ });
587
636
  if (opts.accessToken) {
588
637
  _this.resource.setQueryParameters({
589
638
  access_token: opts.accessToken
@@ -595,6 +644,76 @@ var MapboxTerrainResource = /*#__PURE__*/function (_DefaultHeightmapReso) {
595
644
  return _createClass(MapboxTerrainResource);
596
645
  }(DefaultHeightmapResource);
597
646
 
647
+ /** Mapbox Terrain-RGB default decode function
648
+ * (r * 256 * 256) / 10 + (g * 256) / 10 + b / 10 - 10000
649
+ */
650
+ var defaultMapboxDecodeRgb = function defaultMapboxDecodeRgb(r, g, b, a) {
651
+ return r * 6553.6 + g * 25.6 + b * 0.1 - 10000;
652
+ };
653
+ function rgbTerrainToGrid(png, decodeRgb) {
654
+ // maybe we should do this on the GPU using REGL?
655
+ // but that would require GPU -> CPU -> GPU
656
+ var gridSize = png.shape[0] + 1;
657
+ var terrain = new Float32Array(gridSize * gridSize);
658
+ var tileSize = png.shape[0];
659
+ var decode = decodeRgb !== null && decodeRgb !== void 0 ? decodeRgb : defaultMapboxDecodeRgb;
660
+
661
+ // decode terrain values
662
+ for (var y = 0; y < tileSize; y++) {
663
+ for (var x = 0; x < tileSize; x++) {
664
+ var yc = y;
665
+ var _r = png.get(x, yc, 0);
666
+ var _g = png.get(x, yc, 1);
667
+ var _b = png.get(x, yc, 2);
668
+ var _a = png.get(x, yc, 3);
669
+ terrain[y * gridSize + x] = decode(_r, _g, _b, _a);
670
+ }
671
+ }
672
+ // backfill right and bottom borders
673
+ for (var _x = 0; _x < gridSize - 1; _x++) {
674
+ terrain[gridSize * (gridSize - 1) + _x] = terrain[gridSize * (gridSize - 2) + _x];
675
+ }
676
+ for (var _y = 0; _y < gridSize; _y++) {
677
+ terrain[gridSize * _y + gridSize - 1] = terrain[gridSize * _y + gridSize - 2];
678
+ }
679
+ return terrain;
680
+ }
681
+ function subsetByWindow(array, window, augmented) {
682
+ var sz = Math.sqrt(array.length);
683
+ var x0 = window.x0;
684
+ var x1 = window.x1;
685
+ var y0 = window.y0;
686
+ var y1 = window.y1;
687
+ var aug = augmented ? 1 : 0;
688
+ var n = Math.floor(x1 - x0) + aug;
689
+ var m = Math.floor(y1 - y0) + aug;
690
+ var result = new Float32Array(n * m);
691
+ for (var i = 0; i < m; i++) {
692
+ for (var j = 0; j < n; j++) {
693
+ result[i * n + j] = array[(i + y0) * sz + j + x0];
694
+ }
695
+ }
696
+ return result;
697
+ }
698
+ function testMeshData() {
699
+ return {
700
+ minimumHeight: -100,
701
+ maximumHeight: 2101,
702
+ quantizedVertices: new Uint16Array([
703
+ // order is SW NW SE NE
704
+ // longitude
705
+ 0, 0, 32767, 32767,
706
+ // latitude
707
+ 0, 32767, 0, 32767,
708
+ // heights
709
+ 16384, 0, 32767, 16384]),
710
+ indices: new Uint16Array([0, 3, 1, 0, 2, 3]),
711
+ westIndices: [0, 1],
712
+ southIndices: [0, 1],
713
+ eastIndices: [2, 3],
714
+ northIndices: [1, 3]
715
+ };
716
+ }
598
717
  function _emptyMesh(n) {
599
718
  n = Math.max(n, 2);
600
719
  var nTriangles = Math.pow(n - 1, 2) * 2;
@@ -656,6 +775,68 @@ function emptyMesh(n) {
656
775
  }
657
776
  }
658
777
 
778
+ /** Terrain workers should return a quantized mesh */
779
+
780
+ function createQuantizedMeshData(tile, mesh, tileSize, terrain) {
781
+ /** Terrain is passed through so we can keep track of it
782
+ * for overscaled tiles
783
+ */
784
+
785
+ var xvals = [];
786
+ var yvals = [];
787
+ var heightMeters = [];
788
+ var northIndices = [];
789
+ var southIndices = [];
790
+ var eastIndices = [];
791
+ var westIndices = [];
792
+ var minimumHeight = Infinity;
793
+ var maximumHeight = -Infinity;
794
+ var scalar = 32768.0 / tileSize;
795
+
796
+ // There appears to be a problem with the x/y indexing when using 512x512 tiles
797
+ // This may be solved by increasing the minumumErrorLevel in the terrain provider
798
+ for (var ix = 0; ix < mesh.vertices.length / 2; ix++) {
799
+ var vertexIx = ix;
800
+ var px = mesh.vertices[ix * 2];
801
+ var py = mesh.vertices[ix * 2 + 1];
802
+ var height = tile.terrain[py * (tileSize + 1) + px];
803
+ if (height > maximumHeight) maximumHeight = height;
804
+ if (height < minimumHeight) minimumHeight = height;
805
+ heightMeters.push(height);
806
+ if (py == 0) northIndices.push(vertexIx);
807
+ if (py == tileSize) southIndices.push(vertexIx);
808
+ if (px == 0) westIndices.push(vertexIx);
809
+ if (px == tileSize) eastIndices.push(vertexIx);
810
+ var xv = px * scalar;
811
+ var yv = (tileSize - py) * scalar;
812
+ xvals.push(xv);
813
+ yvals.push(yv);
814
+ }
815
+ var heightRange = maximumHeight - minimumHeight;
816
+ var heights = heightMeters.map(function (d) {
817
+ if (heightRange < 1) return 0;
818
+ return (d - minimumHeight) * (32768.0 / heightRange);
819
+ });
820
+ var triangles = new Uint16Array(mesh.triangles);
821
+ var quantizedVertices = new Uint16Array(//verts
822
+ [].concat(xvals, yvals, _toConsumableArray(heights)));
823
+
824
+ // SE NW NE
825
+ // NE NW SE
826
+
827
+ return {
828
+ minimumHeight: minimumHeight,
829
+ maximumHeight: maximumHeight,
830
+ quantizedVertices: quantizedVertices,
831
+ indices: triangles,
832
+ westIndices: westIndices,
833
+ southIndices: southIndices,
834
+ eastIndices: eastIndices,
835
+ northIndices: northIndices,
836
+ quantizedHeights: terrain
837
+ };
838
+ }
839
+
659
840
  var resolves = {};
660
841
  var rejects = {};
661
842
  var globalMsgId = 0; // Activate calculation in the worker, returning a promise
@@ -663,17 +844,17 @@ function sendMessage(_x, _x2, _x3) {
663
844
  return _sendMessage.apply(this, arguments);
664
845
  } // Handle incoming calculation result
665
846
  function _sendMessage() {
666
- _sendMessage = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(worker, payload, transferableObjects) {
847
+ _sendMessage = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(worker, payload, transferableObjects) {
667
848
  var msgId, msg;
668
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
669
- while (1) switch (_context2.prev = _context2.next) {
849
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
850
+ while (1) switch (_context3.prev = _context3.next) {
670
851
  case 0:
671
852
  msgId = globalMsgId++;
672
853
  msg = {
673
854
  id: msgId,
674
855
  payload: payload
675
856
  };
676
- return _context2.abrupt("return", new Promise(function (resolve, reject) {
857
+ return _context3.abrupt("return", new Promise(function (resolve, reject) {
677
858
  // save callbacks for later
678
859
  resolves[msgId] = resolve;
679
860
  rejects[msgId] = reject;
@@ -681,9 +862,9 @@ function _sendMessage() {
681
862
  }));
682
863
  case 3:
683
864
  case "end":
684
- return _context2.stop();
865
+ return _context3.stop();
685
866
  }
686
- }, _callee2);
867
+ }, _callee3);
687
868
  }));
688
869
  return _sendMessage.apply(this, arguments);
689
870
  }
@@ -716,6 +897,9 @@ function handleMessage(msg) {
716
897
  var WorkerFarm = /*#__PURE__*/function () {
717
898
  function WorkerFarm(opts) {
718
899
  _classCallCheck(this, WorkerFarm);
900
+ _defineProperty(this, "inProgressWorkers", 0);
901
+ _defineProperty(this, "maxWorkers", 5);
902
+ _defineProperty(this, "processingQueue", []);
719
903
  this.worker = opts.worker;
720
904
  this.worker.onmessage = handleMessage;
721
905
  }
@@ -723,14 +907,17 @@ var WorkerFarm = /*#__PURE__*/function () {
723
907
  key: "scheduleTask",
724
908
  value: function () {
725
909
  var _scheduleTask = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, transferableObjects) {
910
+ var res;
726
911
  return _regeneratorRuntime().wrap(function _callee$(_context) {
727
912
  while (1) switch (_context.prev = _context.next) {
728
913
  case 0:
729
914
  _context.next = 2;
730
915
  return sendMessage(this.worker, params, transferableObjects);
731
916
  case 2:
732
- return _context.abrupt("return", _context.sent);
733
- case 3:
917
+ res = _context.sent;
918
+ this.releaseWorker();
919
+ return _context.abrupt("return", res);
920
+ case 5:
734
921
  case "end":
735
922
  return _context.stop();
736
923
  }
@@ -741,6 +928,45 @@ var WorkerFarm = /*#__PURE__*/function () {
741
928
  }
742
929
  return scheduleTask;
743
930
  }()
931
+ }, {
932
+ key: "holdForAvailableWorker",
933
+ value: function () {
934
+ var _holdForAvailableWorker = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
935
+ var _this = this;
936
+ var resultPromise;
937
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
938
+ while (1) switch (_context2.prev = _context2.next) {
939
+ case 0:
940
+ if (this.inProgressWorkers > this.maxWorkers) {
941
+ resultPromise = new Promise(function (resolve, reject) {
942
+ _this.processingQueue.push(resolve);
943
+ });
944
+ } else {
945
+ resultPromise = Promise.resolve(null);
946
+ }
947
+ _context2.next = 3;
948
+ return resultPromise;
949
+ case 3:
950
+ this.inProgressWorkers += 1;
951
+ case 4:
952
+ case "end":
953
+ return _context2.stop();
954
+ }
955
+ }, _callee2, this);
956
+ }));
957
+ function holdForAvailableWorker() {
958
+ return _holdForAvailableWorker.apply(this, arguments);
959
+ }
960
+ return holdForAvailableWorker;
961
+ }()
962
+ }, {
963
+ key: "releaseWorker",
964
+ value: function releaseWorker() {
965
+ this.inProgressWorkers -= 1;
966
+ if (this.processingQueue.length > 0) {
967
+ this.processingQueue.shift()();
968
+ }
969
+ }
744
970
  }]);
745
971
  }();
746
972
 
@@ -788,7 +1014,276 @@ var WorkerFarmTerrainDecoder = /*#__PURE__*/function (_DefaultTerrainDecode) {
788
1014
  }]);
789
1015
  }(DefaultTerrainDecoder);
790
1016
 
1017
+ function decodeBase64(base64, enableUnicode) {
1018
+ var binaryString = atob(base64);
1019
+ if (enableUnicode) {
1020
+ var binaryView = new Uint8Array(binaryString.length);
1021
+ for (var i = 0, n = binaryString.length; i < n; ++i) {
1022
+ binaryView[i] = binaryString.charCodeAt(i);
1023
+ }
1024
+ const decoder = new TextDecoder("utf-16le");
1025
+ return decoder.decode(new Uint16Array(binaryView.buffer));
1026
+ }
1027
+ return binaryString;
1028
+ }
1029
+
1030
+ function createURL(base64, sourcemapArg, enableUnicodeArg) {
1031
+ var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
1032
+ var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
1033
+ var source = decodeBase64(base64, enableUnicode);
1034
+ var start = source.indexOf('\n', 10) + 1;
1035
+ var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
1036
+ var blob = new Blob([body], { type: 'application/javascript' });
1037
+ return URL.createObjectURL(blob);
1038
+ }
1039
+
1040
+ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
1041
+ var url;
1042
+ return function WorkerFactory(options) {
1043
+ url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
1044
+ return new Worker(url, options);
1045
+ };
1046
+ }
1047
+
1048
+ var WorkerFactory$1 = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkgewogICAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpOwogICAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7CiAgfQogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkocikgewogICAgaWYgKCJ1bmRlZmluZWQiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByWyJAQGl0ZXJhdG9yIl0pIHJldHVybiBBcnJheS5mcm9tKHIpOwogIH0KICBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKICB9CiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMocikgfHwgX2l0ZXJhYmxlVG9BcnJheShyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7CiAgICBpZiAocikgewogICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIHIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKTsKICAgICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTsKICAgICAgcmV0dXJuICJPYmplY3QiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCAiTWFwIiA9PT0gdCB8fCAiU2V0IiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiAiQXJndW1lbnRzIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOwogICAgfQogIH0KCiAgLyoqIFRlcnJhaW4gd29ya2VycyBzaG91bGQgcmV0dXJuIGEgcXVhbnRpemVkIG1lc2ggKi8KCiAgZnVuY3Rpb24gY3JlYXRlUXVhbnRpemVkTWVzaERhdGEodGlsZSwgbWVzaCwgdGlsZVNpemUsIHRlcnJhaW4pIHsKICAgIC8qKiBUZXJyYWluIGlzIHBhc3NlZCB0aHJvdWdoIHNvIHdlIGNhbiBrZWVwIHRyYWNrIG9mIGl0CiAgICAgKiBmb3Igb3ZlcnNjYWxlZCB0aWxlcwogICAgICovCgogICAgdmFyIHh2YWxzID0gW107CiAgICB2YXIgeXZhbHMgPSBbXTsKICAgIHZhciBoZWlnaHRNZXRlcnMgPSBbXTsKICAgIHZhciBub3J0aEluZGljZXMgPSBbXTsKICAgIHZhciBzb3V0aEluZGljZXMgPSBbXTsKICAgIHZhciBlYXN0SW5kaWNlcyA9IFtdOwogICAgdmFyIHdlc3RJbmRpY2VzID0gW107CiAgICB2YXIgbWluaW11bUhlaWdodCA9IEluZmluaXR5OwogICAgdmFyIG1heGltdW1IZWlnaHQgPSAtSW5maW5pdHk7CiAgICB2YXIgc2NhbGFyID0gMzI3NjguMCAvIHRpbGVTaXplOwoKICAgIC8vIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIHgveSBpbmRleGluZyB3aGVuIHVzaW5nIDUxMng1MTIgdGlsZXMKICAgIC8vIFRoaXMgbWF5IGJlIHNvbHZlZCBieSBpbmNyZWFzaW5nIHRoZSBtaW51bXVtRXJyb3JMZXZlbCBpbiB0aGUgdGVycmFpbiBwcm92aWRlcgogICAgZm9yICh2YXIgaXggPSAwOyBpeCA8IG1lc2gudmVydGljZXMubGVuZ3RoIC8gMjsgaXgrKykgewogICAgICB2YXIgdmVydGV4SXggPSBpeDsKICAgICAgdmFyIHB4ID0gbWVzaC52ZXJ0aWNlc1tpeCAqIDJdOwogICAgICB2YXIgcHkgPSBtZXNoLnZlcnRpY2VzW2l4ICogMiArIDFdOwogICAgICB2YXIgaGVpZ2h0ID0gdGlsZS50ZXJyYWluW3B5ICogKHRpbGVTaXplICsgMSkgKyBweF07CiAgICAgIGlmIChoZWlnaHQgPiBtYXhpbXVtSGVpZ2h0KSBtYXhpbXVtSGVpZ2h0ID0gaGVpZ2h0OwogICAgICBpZiAoaGVpZ2h0IDwgbWluaW11bUhlaWdodCkgbWluaW11bUhlaWdodCA9IGhlaWdodDsKICAgICAgaGVpZ2h0TWV0ZXJzLnB1c2goaGVpZ2h0KTsKICAgICAgaWYgKHB5ID09IDApIG5vcnRoSW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgaWYgKHB5ID09IHRpbGVTaXplKSBzb3V0aEluZGljZXMucHVzaCh2ZXJ0ZXhJeCk7CiAgICAgIGlmIChweCA9PSAwKSB3ZXN0SW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgaWYgKHB4ID09IHRpbGVTaXplKSBlYXN0SW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgdmFyIHh2ID0gcHggKiBzY2FsYXI7CiAgICAgIHZhciB5diA9ICh0aWxlU2l6ZSAtIHB5KSAqIHNjYWxhcjsKICAgICAgeHZhbHMucHVzaCh4dik7CiAgICAgIHl2YWxzLnB1c2goeXYpOwogICAgfQogICAgdmFyIGhlaWdodFJhbmdlID0gbWF4aW11bUhlaWdodCAtIG1pbmltdW1IZWlnaHQ7CiAgICB2YXIgaGVpZ2h0cyA9IGhlaWdodE1ldGVycy5tYXAoZnVuY3Rpb24gKGQpIHsKICAgICAgaWYgKGhlaWdodFJhbmdlIDwgMSkgcmV0dXJuIDA7CiAgICAgIHJldHVybiAoZCAtIG1pbmltdW1IZWlnaHQpICogKDMyNzY4LjAgLyBoZWlnaHRSYW5nZSk7CiAgICB9KTsKICAgIHZhciB0cmlhbmdsZXMgPSBuZXcgVWludDE2QXJyYXkobWVzaC50cmlhbmdsZXMpOwogICAgdmFyIHF1YW50aXplZFZlcnRpY2VzID0gbmV3IFVpbnQxNkFycmF5KC8vdmVydHMKICAgIFtdLmNvbmNhdCh4dmFscywgeXZhbHMsIF90b0NvbnN1bWFibGVBcnJheShoZWlnaHRzKSkpOwoKICAgIC8vIFNFIE5XIE5FCiAgICAvLyBORSBOVyBTRQoKICAgIHJldHVybiB7CiAgICAgIG1pbmltdW1IZWlnaHQ6IG1pbmltdW1IZWlnaHQsCiAgICAgIG1heGltdW1IZWlnaHQ6IG1heGltdW1IZWlnaHQsCiAgICAgIHF1YW50aXplZFZlcnRpY2VzOiBxdWFudGl6ZWRWZXJ0aWNlcywKICAgICAgaW5kaWNlczogdHJpYW5nbGVzLAogICAgICB3ZXN0SW5kaWNlczogd2VzdEluZGljZXMsCiAgICAgIHNvdXRoSW5kaWNlczogc291dGhJbmRpY2VzLAogICAgICBlYXN0SW5kaWNlczogZWFzdEluZGljZXMsCiAgICAgIG5vcnRoSW5kaWNlczogbm9ydGhJbmRpY2VzLAogICAgICBxdWFudGl6ZWRIZWlnaHRzOiB0ZXJyYWluCiAgICB9OwogIH0KCiAgY2xhc3MgTWFydGluaSB7CiAgICAgIGNvbnN0cnVjdG9yKGdyaWRTaXplID0gMjU3KSB7CiAgICAgICAgICB0aGlzLmdyaWRTaXplID0gZ3JpZFNpemU7CiAgICAgICAgICBjb25zdCB0aWxlU2l6ZSA9IGdyaWRTaXplIC0gMTsKICAgICAgICAgIGlmICh0aWxlU2l6ZSAmICh0aWxlU2l6ZSAtIDEpKSB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgYEV4cGVjdGVkIGdyaWQgc2l6ZSB0byBiZSAyXm4rMSwgZ290ICR7Z3JpZFNpemV9LmApOwoKICAgICAgICAgIHRoaXMubnVtVHJpYW5nbGVzID0gdGlsZVNpemUgKiB0aWxlU2l6ZSAqIDIgLSAyOwogICAgICAgICAgdGhpcy5udW1QYXJlbnRUcmlhbmdsZXMgPSB0aGlzLm51bVRyaWFuZ2xlcyAtIHRpbGVTaXplICogdGlsZVNpemU7CgogICAgICAgICAgdGhpcy5pbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuZ3JpZFNpemUgKiB0aGlzLmdyaWRTaXplKTsKCiAgICAgICAgICAvLyBjb29yZGluYXRlcyBmb3IgYWxsIHBvc3NpYmxlIHRyaWFuZ2xlcyBpbiBhbiBSVElOIHRpbGUKICAgICAgICAgIHRoaXMuY29vcmRzID0gbmV3IFVpbnQxNkFycmF5KHRoaXMubnVtVHJpYW5nbGVzICogNCk7CgogICAgICAgICAgLy8gZ2V0IHRyaWFuZ2xlIGNvb3JkaW5hdGVzIGZyb20gaXRzIGluZGV4IGluIGFuIGltcGxpY2l0IGJpbmFyeSB0cmVlCiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtVHJpYW5nbGVzOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgaWQgPSBpICsgMjsKICAgICAgICAgICAgICBsZXQgYXggPSAwLCBheSA9IDAsIGJ4ID0gMCwgYnkgPSAwLCBjeCA9IDAsIGN5ID0gMDsKICAgICAgICAgICAgICBpZiAoaWQgJiAxKSB7CiAgICAgICAgICAgICAgICAgIGJ4ID0gYnkgPSBjeCA9IHRpbGVTaXplOyAvLyBib3R0b20tbGVmdCB0cmlhbmdsZQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGF4ID0gYXkgPSBjeSA9IHRpbGVTaXplOyAvLyB0b3AtcmlnaHQgdHJpYW5nbGUKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd2hpbGUgKChpZCA+Pj0gMSkgPiAxKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG14ID0gKGF4ICsgYngpID4+IDE7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG15ID0gKGF5ICsgYnkpID4+IDE7CgogICAgICAgICAgICAgICAgICBpZiAoaWQgJiAxKSB7IC8vIGxlZnQgaGFsZgogICAgICAgICAgICAgICAgICAgICAgYnggPSBheDsgYnkgPSBheTsKICAgICAgICAgICAgICAgICAgICAgIGF4ID0gY3g7IGF5ID0gY3k7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHJpZ2h0IGhhbGYKICAgICAgICAgICAgICAgICAgICAgIGF4ID0gYng7IGF5ID0gYnk7CiAgICAgICAgICAgICAgICAgICAgICBieCA9IGN4OyBieSA9IGN5OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGN4ID0gbXg7IGN5ID0gbXk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1trICsgMF0gPSBheDsKICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1trICsgMV0gPSBheTsKICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1trICsgMl0gPSBieDsKICAgICAgICAgICAgICB0aGlzLmNvb3Jkc1trICsgM10gPSBieTsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgY3JlYXRlVGlsZSh0ZXJyYWluKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFRpbGUodGVycmFpbiwgdGhpcyk7CiAgICAgIH0KICB9CgogIGNsYXNzIFRpbGUgewogICAgICBjb25zdHJ1Y3Rvcih0ZXJyYWluLCBtYXJ0aW5pKSB7CiAgICAgICAgICBjb25zdCBzaXplID0gbWFydGluaS5ncmlkU2l6ZTsKICAgICAgICAgIGlmICh0ZXJyYWluLmxlbmd0aCAhPT0gc2l6ZSAqIHNpemUpIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgICBgRXhwZWN0ZWQgdGVycmFpbiBkYXRhIG9mIGxlbmd0aCAke3NpemUgKiBzaXplfSAoJHtzaXplfSB4ICR7c2l6ZX0pLCBnb3QgJHt0ZXJyYWluLmxlbmd0aH0uYCk7CgogICAgICAgICAgdGhpcy50ZXJyYWluID0gdGVycmFpbjsKICAgICAgICAgIHRoaXMubWFydGluaSA9IG1hcnRpbmk7CiAgICAgICAgICB0aGlzLmVycm9ycyA9IG5ldyBGbG9hdDMyQXJyYXkodGVycmFpbi5sZW5ndGgpOwogICAgICAgICAgdGhpcy51cGRhdGUoKTsKICAgICAgfQoKICAgICAgdXBkYXRlKCkgewogICAgICAgICAgY29uc3Qge251bVRyaWFuZ2xlcywgbnVtUGFyZW50VHJpYW5nbGVzLCBjb29yZHMsIGdyaWRTaXplOiBzaXplfSA9IHRoaXMubWFydGluaTsKICAgICAgICAgIGNvbnN0IHt0ZXJyYWluLCBlcnJvcnN9ID0gdGhpczsKCiAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHBvc3NpYmxlIHRyaWFuZ2xlcywgc3RhcnRpbmcgZnJvbSB0aGUgc21hbGxlc3QgbGV2ZWwKICAgICAgICAgIGZvciAobGV0IGkgPSBudW1UcmlhbmdsZXMgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgIGNvbnN0IGsgPSBpICogNDsKICAgICAgICAgICAgICBjb25zdCBheCA9IGNvb3Jkc1trICsgMF07CiAgICAgICAgICAgICAgY29uc3QgYXkgPSBjb29yZHNbayArIDFdOwogICAgICAgICAgICAgIGNvbnN0IGJ4ID0gY29vcmRzW2sgKyAyXTsKICAgICAgICAgICAgICBjb25zdCBieSA9IGNvb3Jkc1trICsgM107CiAgICAgICAgICAgICAgY29uc3QgbXggPSAoYXggKyBieCkgPj4gMTsKICAgICAgICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxOwogICAgICAgICAgICAgIGNvbnN0IGN4ID0gbXggKyBteSAtIGF5OwogICAgICAgICAgICAgIGNvbnN0IGN5ID0gbXkgKyBheCAtIG14OwoKICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgZXJyb3IgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbG9uZyBlZGdlIG9mIHRoZSB0cmlhbmdsZQogICAgICAgICAgICAgIGNvbnN0IGludGVycG9sYXRlZEhlaWdodCA9ICh0ZXJyYWluW2F5ICogc2l6ZSArIGF4XSArIHRlcnJhaW5bYnkgKiBzaXplICsgYnhdKSAvIDI7CiAgICAgICAgICAgICAgY29uc3QgbWlkZGxlSW5kZXggPSBteSAqIHNpemUgKyBteDsKICAgICAgICAgICAgICBjb25zdCBtaWRkbGVFcnJvciA9IE1hdGguYWJzKGludGVycG9sYXRlZEhlaWdodCAtIHRlcnJhaW5bbWlkZGxlSW5kZXhdKTsKCiAgICAgICAgICAgICAgZXJyb3JzW21pZGRsZUluZGV4XSA9IE1hdGgubWF4KGVycm9yc1ttaWRkbGVJbmRleF0sIG1pZGRsZUVycm9yKTsKCiAgICAgICAgICAgICAgaWYgKGkgPCBudW1QYXJlbnRUcmlhbmdsZXMpIHsgLy8gYmlnZ2VyIHRyaWFuZ2xlczsgYWNjdW11bGF0ZSBlcnJvciB3aXRoIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRDaGlsZEluZGV4ID0gKChheSArIGN5KSA+PiAxKSAqIHNpemUgKyAoKGF4ICsgY3gpID4+IDEpOwogICAgICAgICAgICAgICAgICBjb25zdCByaWdodENoaWxkSW5kZXggPSAoKGJ5ICsgY3kpID4+IDEpICogc2l6ZSArICgoYnggKyBjeCkgPj4gMSk7CiAgICAgICAgICAgICAgICAgIGVycm9yc1ttaWRkbGVJbmRleF0gPSBNYXRoLm1heChlcnJvcnNbbWlkZGxlSW5kZXhdLCBlcnJvcnNbbGVmdENoaWxkSW5kZXhdLCBlcnJvcnNbcmlnaHRDaGlsZEluZGV4XSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICB9CgogICAgICBnZXRNZXNoKG1heEVycm9yID0gMCwgbWF4TGVuZ3RoID0gbnVsbCkgewogICAgICAgICAgY29uc3Qge2dyaWRTaXplOiBzaXplLCBpbmRpY2VzfSA9IHRoaXMubWFydGluaTsKICAgICAgICAgIGNvbnN0IHtlcnJvcnN9ID0gdGhpczsKICAgICAgICAgIGxldCBudW1WZXJ0aWNlcyA9IDA7CiAgICAgICAgICBsZXQgbnVtVHJpYW5nbGVzID0gMDsKICAgICAgICAgIGNvbnN0IG1heCA9IHNpemUgLSAxOwoKICAgICAgICAgIC8vIFRoZSBtYXhMZW5ndGggcGFyYW1ldGVyIHdpbGwgY2F1c2UgdHJpYW5nbGVzIHRvIGJlIGdlbmVyYXRlZCB1bnRpbCB0aGUgbGVncyBhcmUgYmVsb3cgdGhpcyBsZW5ndGgKICAgICAgICAgIC8vIEl0IGlzIG1lYW50IHRvIHN1cHBvcnQgY2FzZXMgd2hlcmUgYSBjZXJ0YWluIG1lc2ggZGVuc2l0eSBpcyByZXF1aXJlZCB0byBkbyBzcGhlcmljYWwgbWF0aCBvbiBkaWdpdGFsIGdsb2JlcwogICAgICAgICAgY29uc3QgbWF4U2NhbGUgPSBtYXhMZW5ndGggfHwgc2l6ZTsKCiAgICAgICAgICAvLyB1c2UgYW4gaW5kZXggZ3JpZCB0byBrZWVwIHRyYWNrIG9mIHZlcnRpY2VzIHRoYXQgd2VyZSBhbHJlYWR5IHVzZWQgdG8gYXZvaWQgZHVwbGljYXRpb24KICAgICAgICAgIGluZGljZXMuZmlsbCgwKTsKCiAgICAgICAgICAvLyByZXRyaWV2ZSBtZXNoIGluIHR3byBzdGFnZXMgdGhhdCBib3RoIHRyYXZlcnNlIHRoZSBlcnJvciBtYXA6CiAgICAgICAgICAvLyAtIGNvdW50RWxlbWVudHM6IGZpbmQgdXNlZCB2ZXJ0aWNlcyAoYW5kIGFzc2lnbiBlYWNoIGFuIGluZGV4KSwgYW5kIGNvdW50IHRyaWFuZ2xlcyAoZm9yIG1pbmltdW0gYWxsb2NhdGlvbikKICAgICAgICAgIC8vIC0gcHJvY2Vzc1RyaWFuZ2xlOiBmaWxsIHRoZSBhbGxvY2F0ZWQgdmVydGljZXMgJiB0cmlhbmdsZXMgdHlwZWQgYXJyYXlzCgogICAgICAgICAgZnVuY3Rpb24gY291bnRFbGVtZW50cyhheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7CiAgICAgICAgICAgICAgY29uc3QgbXggPSAoYXggKyBieCkgPj4gMTsKICAgICAgICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxOwoKICAgICAgICAgICAgICBjb25zdCBsZWdMZW5ndGggPSBNYXRoLmFicyhheCAtIGN4KSArIE1hdGguYWJzKGF5IC0gY3kpOwogICAgICAgICAgICAgIGlmICgobGVnTGVuZ3RoID4gMSAmJiBlcnJvcnNbbXkgKiBzaXplICsgbXhdID4gbWF4RXJyb3IpIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICAgICAgICAgIGNvdW50RWxlbWVudHMoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICAgICAgICAgIGNvdW50RWxlbWVudHMoYngsIGJ5LCBjeCwgY3ksIG14LCBteSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgaW5kaWNlc1theSAqIHNpemUgKyBheF0gPSBpbmRpY2VzW2F5ICogc2l6ZSArIGF4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgICAgICAgICBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICAgICAgICAgIGluZGljZXNbY3kgKiBzaXplICsgY3hdID0gaW5kaWNlc1tjeSAqIHNpemUgKyBjeF0gfHwgKytudW1WZXJ0aWNlczsKICAgICAgICAgICAgICAgICAgbnVtVHJpYW5nbGVzKys7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgY291bnRFbGVtZW50cygwLCAwLCBtYXgsIG1heCwgbWF4LCAwKTsKICAgICAgICAgIGNvdW50RWxlbWVudHMobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CgogICAgICAgICAgY29uc3QgdmVydGljZXMgPSBuZXcgVWludDE2QXJyYXkobnVtVmVydGljZXMgKiAyKTsKICAgICAgICAgIGNvbnN0IHRyaWFuZ2xlcyA9IG5ldyBVaW50MzJBcnJheShudW1UcmlhbmdsZXMgKiAzKTsKICAgICAgICAgIGxldCB0cmlJbmRleCA9IDA7CgogICAgICAgICAgZnVuY3Rpb24gcHJvY2Vzc1RyaWFuZ2xlKGF4LCBheSwgYngsIGJ5LCBjeCwgY3kpIHsKICAgICAgICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSA+PiAxOwogICAgICAgICAgICAgIGNvbnN0IG15ID0gKGF5ICsgYnkpID4+IDE7CgogICAgICAgICAgICAgIGNvbnN0IGxlZ0xlbmd0aCA9IE1hdGguYWJzKGF4IC0gY3gpICsgTWF0aC5hYnMoYXkgLSBjeSk7CiAgICAgICAgICAgICAgaWYgKChsZWdMZW5ndGggPiAxICYmIGVycm9yc1tteSAqIHNpemUgKyBteF0gPiBtYXhFcnJvcikgfHwgbGVnTGVuZ3RoID4gbWF4U2NhbGUpIHsKICAgICAgICAgICAgICAgICAgLy8gdHJpYW5nbGUgZG9lc24ndCBhcHByb3hpbWF0ZSB0aGUgc3VyZmFjZSB3ZWxsIGVub3VnaDsgZHJpbGwgZG93biBmdXJ0aGVyCiAgICAgICAgICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShjeCwgY3ksIGF4LCBheSwgbXgsIG15KTsKICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyaWFuZ2xlKGJ4LCBieSwgY3gsIGN5LCBteCwgbXkpOwoKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvLyBhZGQgYSB0cmlhbmdsZQogICAgICAgICAgICAgICAgICBjb25zdCBhID0gaW5kaWNlc1theSAqIHNpemUgKyBheF0gLSAxOwogICAgICAgICAgICAgICAgICBjb25zdCBiID0gaW5kaWNlc1tieSAqIHNpemUgKyBieF0gLSAxOwogICAgICAgICAgICAgICAgICBjb25zdCBjID0gaW5kaWNlc1tjeSAqIHNpemUgKyBjeF0gLSAxOwoKICAgICAgICAgICAgICAgICAgdmVydGljZXNbMiAqIGFdID0gYXg7CiAgICAgICAgICAgICAgICAgIHZlcnRpY2VzWzIgKiBhICsgMV0gPSBheTsKCiAgICAgICAgICAgICAgICAgIHZlcnRpY2VzWzIgKiBiXSA9IGJ4OwogICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1syICogYiArIDFdID0gYnk7CgogICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1syICogY10gPSBjeDsKICAgICAgICAgICAgICAgICAgdmVydGljZXNbMiAqIGMgKyAxXSA9IGN5OwoKICAgICAgICAgICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYTsKICAgICAgICAgICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYjsKICAgICAgICAgICAgICAgICAgdHJpYW5nbGVzW3RyaUluZGV4KytdID0gYzsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUoMCwgMCwgbWF4LCBtYXgsIG1heCwgMCk7CiAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUobWF4LCBtYXgsIDAsIDAsIDAsIG1heCk7CgogICAgICAgICAgcmV0dXJuIHt2ZXJ0aWNlcywgdHJpYW5nbGVzfTsKICAgICAgfQogIH0KCiAgLyoqIFdvcmtlciB0byB1cHNhbXBsZSB0ZXJyYWluIG1lc2hlcyAqLwogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9DZXNpdW1HUy9jZXNpdW0vYmxvYi8xLjc2L1NvdXJjZS9Xb3JrZXJzRVM2L2NyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoLmpzCgogIHZhciBtYXJ0aW5pQ2FjaGUgPSB7fTsKICBmdW5jdGlvbiBkZWNvZGVUZXJyYWluKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIHZhciBfbWFydGluaUNhY2hlJHRpbGVTaXo7CiAgICB2YXIgaGVpZ2h0RGF0YSA9IHBhcmFtZXRlcnMuaGVpZ2h0RGF0YSwKICAgICAgX3BhcmFtZXRlcnMkdGlsZVNpemUgPSBwYXJhbWV0ZXJzLnRpbGVTaXplLAogICAgICB0aWxlU2l6ZSA9IF9wYXJhbWV0ZXJzJHRpbGVTaXplID09PSB2b2lkIDAgPyAyNTYgOiBfcGFyYW1ldGVycyR0aWxlU2l6ZSwKICAgICAgZXJyb3JMZXZlbCA9IHBhcmFtZXRlcnMuZXJyb3JMZXZlbCwKICAgICAgbWF4VmVydGV4RGlzdGFuY2UgPSBwYXJhbWV0ZXJzLm1heFZlcnRleERpc3RhbmNlOwoKICAgIC8vIEhlaWdodCBkYXRhIGNhbiBiZSBlaXRoZXIgYW4gYXJyYXkgb2YgbnVtYmVycyAoZm9yIHByZS1leGlzdGluZyB0ZXJyYWluIGRhdGEpCiAgICAvLyBvciBhbiBpbWFnZSBkYXRhIGFycmF5IChmb3IgZGVjb2RpbmcgZnJvbSBhbiBpbWFnZSkKCiAgICB2YXIgdGVycmFpbiA9IGhlaWdodERhdGE7CgogICAgLy8gVGlsZSBzaXplIG11c3QgYmUgbWFpbnRhaW5lZCB0aHJvdWdoIHRoZSBsaWZlIG9mIHRoZSB3b3JrZXIKICAgIChfbWFydGluaUNhY2hlJHRpbGVTaXogPSBtYXJ0aW5pQ2FjaGVbdGlsZVNpemVdKSAhPT0gbnVsbCAmJiBfbWFydGluaUNhY2hlJHRpbGVTaXogIT09IHZvaWQgMCA/IF9tYXJ0aW5pQ2FjaGUkdGlsZVNpeiA6IG1hcnRpbmlDYWNoZVt0aWxlU2l6ZV0gPSBuZXcgTWFydGluaSh0aWxlU2l6ZSArIDEpOwogICAgdmFyIHRpbGUgPSBtYXJ0aW5pQ2FjaGVbdGlsZVNpemVdLmNyZWF0ZVRpbGUodGVycmFpbik7CgogICAgLy8gZ2V0IGEgbWVzaCAodmVydGljZXMgYW5kIHRyaWFuZ2xlcyBpbmRpY2VzKSBmb3IgYSAxMG0gZXJyb3IKICAgIHZhciBtZXNoID0gdGlsZS5nZXRNZXNoKGVycm9yTGV2ZWwsIE1hdGgubWluKG1heFZlcnRleERpc3RhbmNlLCB0aWxlU2l6ZSkpOwogICAgdmFyIHJlcyA9IGNyZWF0ZVF1YW50aXplZE1lc2hEYXRhKHRpbGUsIG1lc2gsIHRpbGVTaXplLAogICAgLy8gT25seSBpbmNsdWRlIHZlcnRleCBkYXRhIGlmIGFudGljaXBhdGUgdXBzY2FsaW5nIHRpbGUKICAgIHRlcnJhaW4gKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChyZXMuaW5kaWNlcy5idWZmZXIpOwogICAgdHJhbnNmZXJhYmxlT2JqZWN0cy5wdXNoKHJlcy5xdWFudGl6ZWRWZXJ0aWNlcy5idWZmZXIpOwogICAgaWYgKHJlcy5xdWFudGl6ZWRIZWlnaHRzKSB7CiAgICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChyZXMucXVhbnRpemVkSGVpZ2h0cy5idWZmZXIpOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9CiAgc2VsZi5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAobXNnKSB7CiAgICB2YXIgX21zZyRkYXRhID0gbXNnLmRhdGEsCiAgICAgIGlkID0gX21zZyRkYXRhLmlkLAogICAgICBwYXlsb2FkID0gX21zZyRkYXRhLnBheWxvYWQ7CiAgICBpZiAoaWQgPT0gbnVsbCkgcmV0dXJuOwogICAgdmFyIG9iamVjdHMgPSBbXTsKICAgIHZhciByZXMgPSBudWxsOwogICAgdHJ5IHsKICAgICAgcmVzID0gZGVjb2RlVGVycmFpbihwYXlsb2FkLCBvYmplY3RzKTsKICAgICAgLy8gQHRzLWlnbm9yZQogICAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgICBpZDogaWQsCiAgICAgICAgcGF5bG9hZDogcmVzCiAgICAgIH0sIG9iamVjdHMpOwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIHZhciBfZXJyJG1lc3NhZ2U7CiAgICAgIHZhciBfbXNnID0gKF9lcnIkbWVzc2FnZSA9IGVyci5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfZXJyJG1lc3NhZ2UgIT09IHZvaWQgMCA/IF9lcnIkbWVzc2FnZSA6IGVycjsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGlkLAogICAgICAgIGVycjogX21zZy50b1N0cmluZygpCiAgICAgIH0pOwogICAgfSBmaW5hbGx5IHsKICAgICAgcmVzID0gbnVsbDsKICAgICAgb2JqZWN0cyA9IG51bGw7CiAgICB9CiAgfTsKCn0pKCk7Cgo=', null, false);
1049
+ /* eslint-enable */
1050
+
1051
+ var _excluded = ["tilingScheme", "overscaleFactor"];
1052
+ function createTerrainMesh(data, meta) {
1053
+ var minimumHeight = data.minimumHeight,
1054
+ maximumHeight = data.maximumHeight,
1055
+ quantizedVertices = data.quantizedVertices,
1056
+ indices = data.indices,
1057
+ westIndices = data.westIndices,
1058
+ southIndices = data.southIndices,
1059
+ eastIndices = data.eastIndices,
1060
+ northIndices = data.northIndices,
1061
+ quantizedHeights = data.quantizedHeights;
1062
+ var errorLevel = meta.errorLevel,
1063
+ tileSize = meta.tileSize,
1064
+ maxVertexDistance = meta.maxVertexDistance,
1065
+ tileRect = meta.tileRect,
1066
+ ellipsoid = meta.ellipsoid,
1067
+ overscaleFactor = meta.overscaleFactor;
1068
+ var err = errorLevel;
1069
+ var skirtHeight = err * 20;
1070
+
1071
+ // Check if tileRect is not NaNs
1072
+ if (isNaN(tileRect.east) || isNaN(tileRect.north)) {
1073
+ throw new Error("Invalid tile rect");
1074
+ }
1075
+ var center = Rectangle.center(tileRect);
1076
+
1077
+ // Calculating occlusion height is kind of messy currently, but it definitely works
1078
+ var halfAngle = tileRect.width / 2;
1079
+ var dr = Math.cos(halfAngle); // half tile width since our ref point is at the center
1080
+
1081
+ var occlusionHeight = dr * ellipsoid.maximumRadius + maximumHeight;
1082
+ if (halfAngle > Math.PI / 4) {
1083
+ occlusionHeight = (1 + halfAngle) * ellipsoid.maximumRadius;
1084
+ }
1085
+ var occlusionPoint = new Cartographic(center.longitude, center.latitude, occlusionHeight) // Scaling factor of two just to be sure.
1086
+ ;
1087
+ var horizonOcclusionPoint = ellipsoid.transformPositionToScaledSpace(Cartographic.toCartesian(occlusionPoint));
1088
+ var orientedBoundingBox = OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, ellipsoid);
1089
+ var boundingSphere = BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox);
1090
+ return new RasterTerrainData({
1091
+ minimumHeight: minimumHeight,
1092
+ maximumHeight: maximumHeight,
1093
+ quantizedVertices: quantizedVertices,
1094
+ indices: indices,
1095
+ boundingSphere: boundingSphere,
1096
+ orientedBoundingBox: orientedBoundingBox,
1097
+ horizonOcclusionPoint: horizonOcclusionPoint,
1098
+ westIndices: westIndices,
1099
+ southIndices: southIndices,
1100
+ eastIndices: eastIndices,
1101
+ northIndices: northIndices,
1102
+ westSkirtHeight: skirtHeight,
1103
+ southSkirtHeight: skirtHeight,
1104
+ eastSkirtHeight: skirtHeight,
1105
+ northSkirtHeight: skirtHeight,
1106
+ childTileMask: 15,
1107
+ createdByUpsampling: overscaleFactor > 0,
1108
+ errorLevel: err,
1109
+ maxVertexDistance: maxVertexDistance,
1110
+ tileSize: tileSize,
1111
+ quantizedHeights: quantizedHeights
1112
+ });
1113
+ }
1114
+ function createEmptyMesh(opts) {
1115
+ var tileRect = opts.tileRect,
1116
+ tileCoord = opts.tileCoord,
1117
+ errorLevel = opts.errorLevel,
1118
+ ellipsoid = opts.ellipsoid,
1119
+ maxVertexDistance = opts.maxVertexDistance;
1120
+ var center = Rectangle.center(tileRect);
1121
+ var z = tileCoord.z;
1122
+ var latScalar = Math.min(Math.abs(Math.sin(center.latitude)), 0.995);
1123
+ var v = Math.max(Math.ceil(200 / (z + 1) * Math.pow(1 - latScalar, 0.25)), 4);
1124
+ var output = emptyMesh(v);
1125
+ // We use zero for some undefined values
1126
+ return createTerrainMesh(output, {
1127
+ tileRect: tileRect,
1128
+ ellipsoid: ellipsoid,
1129
+ errorLevel: errorLevel,
1130
+ overscaleFactor: 0,
1131
+ maxVertexDistance: maxVertexDistance,
1132
+ tileSize: output.tileSize
1133
+ });
1134
+ }
1135
+ var UpsampleTracker = /*#__PURE__*/function () {
1136
+ function UpsampleTracker() {
1137
+ _classCallCheck(this, UpsampleTracker);
1138
+ this.ne = false;
1139
+ this.nw = false;
1140
+ this.se = false;
1141
+ this.sw = false;
1142
+ }
1143
+ return _createClass(UpsampleTracker, [{
1144
+ key: "finished",
1145
+ value: function finished() {
1146
+ return this.ne && this.nw && this.se && this.sw;
1147
+ }
1148
+ }]);
1149
+ }();
1150
+ var RasterTerrainData = /*#__PURE__*/function (_QuantizedMeshTerrain) {
1151
+ function RasterTerrainData(opts) {
1152
+ var _opts$maxVertexDistan;
1153
+ var _this;
1154
+ _classCallCheck(this, RasterTerrainData);
1155
+ _this = _callSuper(this, RasterTerrainData, [opts]);
1156
+ _this.quantizedHeights = opts.quantizedHeights;
1157
+ _this.errorLevel = opts.errorLevel;
1158
+ _this.maxVertexDistance = (_opts$maxVertexDistan = opts.maxVertexDistance) !== null && _opts$maxVertexDistan !== void 0 ? _opts$maxVertexDistan : opts.tileSize;
1159
+ _this.tileSize = opts.tileSize;
1160
+ _this.upsampleTracker = new UpsampleTracker();
1161
+ return _this;
1162
+ }
1163
+ _inherits(RasterTerrainData, _QuantizedMeshTerrain);
1164
+ return _createClass(RasterTerrainData, [{
1165
+ key: "upsample",
1166
+ value: function upsample(tilingScheme, thisX, thisY, thisLevel, descendantX, descendantY, descendantLevel) {
1167
+ if (this.quantizedHeights == null) {
1168
+ return _superPropGet(RasterTerrainData, "upsample", this, 3)([tilingScheme, thisX, thisY, thisLevel, descendantX, descendantY, descendantLevel]);
1169
+ } // Something wonky about our tiling scheme, perhaps
1170
+ // 12/2215/2293 @2x
1171
+ //const url = `https://a.tiles.mapbox.com/v4/mapbox.terrain-rgb/${z}/${x}/${y}${hires}.${this.format}?access_token=${this.accessToken}`;
1172
+
1173
+ var x = descendantX;
1174
+ var y = descendantY;
1175
+ var z = descendantLevel;
1176
+
1177
+ //console.log(`Upsampling terrain data from zoom ${thisLevel} to ` + tile);
1178
+
1179
+ var dz = z - thisLevel;
1180
+ var scalar = Math.pow(2, dz);
1181
+ var ellipsoid = tilingScheme.ellipsoid;
1182
+ var err = this.errorLevel / scalar;
1183
+ var maxVertexDistance = Math.min(this.maxVertexDistance * scalar, this.tileSize);
1184
+ var upscaledX = thisX * scalar;
1185
+ var upscaledY = thisY * scalar;
1186
+ var dx = x - upscaledX;
1187
+ var dy = y - upscaledY;
1188
+ var x0 = dx * this.tileSize / scalar;
1189
+ var x1 = (dx + 1) * this.tileSize / scalar;
1190
+ var y0 = dy * this.tileSize / scalar;
1191
+ var y1 = (dy + 1) * this.tileSize / scalar;
1192
+ var window = {
1193
+ x0: x0,
1194
+ x1: x1,
1195
+ y0: y0,
1196
+ y1: y1
1197
+ };
1198
+ var res = buildOverscaledTerrainTile({
1199
+ tilingScheme: tilingScheme,
1200
+ heightData: subsetByWindow(this.quantizedHeights, window, true),
1201
+ maxVertexDistance: maxVertexDistance,
1202
+ x: x,
1203
+ y: y,
1204
+ z: z,
1205
+ errorLevel: err,
1206
+ ellipsoidRadius: ellipsoid.maximumRadius,
1207
+ tileSize: x1 - x0,
1208
+ overscaleFactor: dz
1209
+ });
1210
+ if (dz == 1) {
1211
+ // If we've got a single child tile, we can track that we've upsampled the parent.
1212
+ var quadrant = getQuadrant(dx, dy);
1213
+ this.upsampleTracker[quadrant] = true;
1214
+ }
1215
+ if (this.upsampleTracker.finished()) {
1216
+ // We've upsampled all child tiles and don't need to keep terrain data around anymore.
1217
+ this.quantizedHeights = undefined;
1218
+ }
1219
+ return res;
1220
+ }
1221
+ }]);
1222
+ }(QuantizedMeshTerrainData);
1223
+ function getQuadrant(dx, dy) {
1224
+ if (dx == 0 && dy == 0) return "sw";
1225
+ if (dx == 0 && dy == 1) return "nw";
1226
+ if (dx == 1 && dy == 0) return "se";
1227
+ if (dx == 1 && dy == 1) return "ne";
1228
+ throw new Error("Invalid quadrant");
1229
+ }
1230
+ function buildOverscaledTerrainTile(_x) {
1231
+ return _buildOverscaledTerrainTile.apply(this, arguments);
1232
+ }
1233
+ function _buildOverscaledTerrainTile() {
1234
+ _buildOverscaledTerrainTile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(opts) {
1235
+ var tilingScheme, overscaleFactor, workerOpts, x, y, z, tileRect, ellipsoid, errorLevel, maxVertexDistance, tileSize, res;
1236
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
1237
+ while (1) switch (_context.prev = _context.next) {
1238
+ case 0:
1239
+ tilingScheme = opts.tilingScheme, overscaleFactor = opts.overscaleFactor, workerOpts = _objectWithoutProperties(opts, _excluded);
1240
+ x = workerOpts.x, y = workerOpts.y, z = workerOpts.z;
1241
+ tileRect = tilingScheme.tileXYToRectangle(x, y, z);
1242
+ ellipsoid = tilingScheme.ellipsoid;
1243
+ errorLevel = workerOpts.errorLevel, maxVertexDistance = workerOpts.maxVertexDistance, tileSize = workerOpts.tileSize;
1244
+ _context.prev = 5;
1245
+ _context.next = 8;
1246
+ return upsamplerFarm.scheduleTask(workerOpts, [workerOpts.heightData.buffer]);
1247
+ case 8:
1248
+ res = _context.sent;
1249
+ return _context.abrupt("return", createTerrainMesh(res, {
1250
+ tileRect: tileRect,
1251
+ ellipsoid: ellipsoid,
1252
+ errorLevel: errorLevel,
1253
+ overscaleFactor: overscaleFactor,
1254
+ tileSize: tileSize,
1255
+ // Maximum vertex distance
1256
+ maxVertexDistance: maxVertexDistance
1257
+ }));
1258
+ case 12:
1259
+ _context.prev = 12;
1260
+ _context.t0 = _context["catch"](5);
1261
+ return _context.abrupt("return", createEmptyMesh({
1262
+ tileRect: tileRect,
1263
+ errorLevel: errorLevel,
1264
+ ellipsoid: ellipsoid,
1265
+ tileCoord: {
1266
+ x: x,
1267
+ y: y,
1268
+ z: z
1269
+ },
1270
+ tileSize: 0
1271
+ }));
1272
+ case 15:
1273
+ case "end":
1274
+ return _context.stop();
1275
+ }
1276
+ }, _callee, null, [[5, 12]]);
1277
+ }));
1278
+ return _buildOverscaledTerrainTile.apply(this, arguments);
1279
+ }
1280
+ var upsamplerFarm = new WorkerFarm({
1281
+ worker: new WorkerFactory$1(),
1282
+ maxWorkers: 5
1283
+ });
1284
+
791
1285
  // https://github.com/CesiumGS/cesium/blob/1.68/Source/Scene/MapboxImageryProvider.js#L42
1286
+
792
1287
  var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
793
1288
  function StretchedTilingScheme() {
794
1289
  _classCallCheck(this, StretchedTilingScheme);
@@ -800,7 +1295,6 @@ var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
800
1295
  value: function tileXYToRectangle(x, y, level, res) {
801
1296
  var result = _superPropGet(StretchedTilingScheme, "tileXYToRectangle", this, 3)([x, y, level]);
802
1297
  if (y == 0) {
803
- //console.log("Top row", res, y, level);
804
1298
  result.north = Math.PI / 2;
805
1299
  }
806
1300
  if (y + 1 == Math.pow(2, level)) {
@@ -813,7 +1307,7 @@ var StretchedTilingScheme = /*#__PURE__*/function (_WebMercatorTilingSch) {
813
1307
  var MartiniTerrainProvider = /*#__PURE__*/function () {
814
1308
  // @ts-ignore
815
1309
  function MartiniTerrainProvider() {
816
- var _this$resource$credit, _opts$minZoomLevel, _opts$fillPoles, _opts$detailScalar, _opts$minimumErrorLev, _opts$ellipsoid;
1310
+ var _this$resource$credit, _opts$maxWorkers, _opts$minZoomLevel, _opts$fillPoles, _opts$minimumErrorLev, _opts$ellipsoid, _opts$detailScalar, _ref, _opts$tilingScheme$el, _opts$tilingScheme;
817
1311
  var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
818
1312
  _classCallCheck(this, MartiniTerrainProvider);
819
1313
  _defineProperty(this, "hasWaterMask", false);
@@ -822,6 +1316,7 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
822
1316
  _defineProperty(this, "availability", null);
823
1317
  _defineProperty(this, "errorEvent", new Event());
824
1318
  _defineProperty(this, "levelOfDetailScalar", null);
1319
+ _defineProperty(this, "maxWorkers", 5);
825
1320
  _defineProperty(this, "minError", 0.1);
826
1321
  _defineProperty(this, "fillPoles", true);
827
1322
  _defineProperty(this, "_errorAtMinZoom", 1000);
@@ -832,9 +1327,9 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
832
1327
  this.resource = opts.resource;
833
1328
  this.credit = (_this$resource$credit = this.resource.credit) !== null && _this$resource$credit !== void 0 ? _this$resource$credit : new Credit("Mapbox");
834
1329
  this.decoder = opts.decoder;
1330
+ this.maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
835
1331
  if (!this.decoder) {
836
- var _opts$maxWorkers;
837
- var maxWorkers = (_opts$maxWorkers = opts.maxWorkers) !== null && _opts$maxWorkers !== void 0 ? _opts$maxWorkers : 5;
1332
+ var maxWorkers = this.maxWorkers;
838
1333
  if (maxWorkers > 0) {
839
1334
  this.decoder = new WorkerFarmTerrainDecoder({
840
1335
  maxWorkers: maxWorkers
@@ -845,32 +1340,40 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
845
1340
  }
846
1341
  this.minZoomLevel = (_opts$minZoomLevel = opts.minZoomLevel) !== null && _opts$minZoomLevel !== void 0 ? _opts$minZoomLevel : 3;
847
1342
  this.fillPoles = (_opts$fillPoles = opts.fillPoles) !== null && _opts$fillPoles !== void 0 ? _opts$fillPoles : true;
848
- this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 4.0) + Math$1.EPSILON5;
849
1343
  this.ready = true;
850
1344
  this.readyPromise = Promise.resolve(true);
851
1345
  this.minError = (_opts$minimumErrorLev = opts.minimumErrorLevel) !== null && _opts$minimumErrorLev !== void 0 ? _opts$minimumErrorLev : 0.1;
852
1346
  this.errorEvent.addEventListener(console.log, this);
853
1347
  this.ellipsoid = (_opts$ellipsoid = opts.ellipsoid) !== null && _opts$ellipsoid !== void 0 ? _opts$ellipsoid : Ellipsoid.WGS84;
854
- var scheme = WebMercatorTilingScheme;
855
- if (this.fillPoles) {
856
- scheme = StretchedTilingScheme;
1348
+ if (opts.tilingScheme == null) {
1349
+ var scheme = WebMercatorTilingScheme;
1350
+ if (this.fillPoles) {
1351
+ scheme = StretchedTilingScheme;
1352
+ }
1353
+ this.tilingScheme = new scheme({
1354
+ numberOfLevelZeroTilesX: 1,
1355
+ numberOfLevelZeroTilesY: 1,
1356
+ ellipsoid: this.ellipsoid
1357
+ });
1358
+ } else {
1359
+ this.tilingScheme = opts.tilingScheme;
857
1360
  }
858
- this.tilingScheme = new scheme({
859
- numberOfLevelZeroTilesX: 1,
860
- numberOfLevelZeroTilesY: 1,
861
- ellipsoid: this.ellipsoid
862
- });
1361
+ this.levelOfDetailScalar = ((_opts$detailScalar = opts.detailScalar) !== null && _opts$detailScalar !== void 0 ? _opts$detailScalar : 2.0) + Math$1.EPSILON5;
1362
+
1363
+ //this.errorEvent.addEventListener(console.log, this);
1364
+ this.ellipsoid = (_ref = (_opts$tilingScheme$el = (_opts$tilingScheme = opts.tilingScheme) === null || _opts$tilingScheme === void 0 ? void 0 : _opts$tilingScheme.ellipsoid) !== null && _opts$tilingScheme$el !== void 0 ? _opts$tilingScheme$el : opts.ellipsoid) !== null && _ref !== void 0 ? _ref : Ellipsoid.WGS84;
863
1365
  this._errorAtMinZoom = this.errorAtZoom(this.minZoomLevel);
864
1366
  }
865
1367
  return _createClass(MartiniTerrainProvider, [{
866
1368
  key: "requestTileGeometry",
867
1369
  value: function requestTileGeometry(x, y, z, request) {
868
1370
  // Look for tiles both below the zoom level and below the error threshold for the zoom level at the equator...
869
- if (z < this.minZoomLevel || this.scaledErrorForTile(x, y, z) > this._errorAtMinZoom) {
1371
+ if (this.minZoomLevel != 0 && (z < this.minZoomLevel || this.scaledErrorForTile(x, y, z) > this._errorAtMinZoom)) {
870
1372
  // If we are below the minimum zoom level, we return empty heightmaps
871
1373
  // to avoid unnecessary requests for low-resolution data.
872
1374
  return Promise.resolve(this.emptyMesh(x, y, z));
873
1375
  }
1376
+
874
1377
  // Note: we still load a TON of tiles near the poles. We might need to do some overzooming here...
875
1378
  return this.decoder.requestTileGeometry({
876
1379
  x: x,
@@ -881,53 +1384,88 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
881
1384
  }, {
882
1385
  key: "processTile",
883
1386
  value: function () {
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;
1387
+ var _processTile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref2) {
1388
+ var x, y, z, tileRect, errorLevel, maxVertexDistance, _this$resource, tileSize, getTilePixels, r1, px, pixelData, params, res, meta;
886
1389
  return _regeneratorRuntime().wrap(function _callee$(_context) {
887
1390
  while (1) switch (_context.prev = _context.next) {
888
1391
  case 0:
889
- x = _ref.x, y = _ref.y, z = _ref.z;
890
- _context.prev = 1;
1392
+ x = _ref2.x, y = _ref2.y, z = _ref2.z;
1393
+ // Something wonky about our tiling scheme, perhaps
1394
+ // 12/2215/2293 @2x
1395
+ //const url = `https://a.tiles.mapbox.com/v4/mapbox.terrain-rgb/${z}/${x}/${y}${hires}.${this.format}?access_token=${this.accessToken}`;
1396
+ tileRect = this.tilingScheme.tileXYToRectangle(x, y, z);
1397
+ errorLevel = this.errorAtZoom(z);
1398
+ maxVertexDistance = this.maxVertexDistance(tileRect);
1399
+ _context.prev = 4;
891
1400
  _this$resource = this.resource, tileSize = _this$resource.tileSize, getTilePixels = _this$resource.getTilePixels;
892
- _context.next = 5;
893
- return getTilePixels({
1401
+ r1 = getTilePixels.bind(this.resource, {
894
1402
  x: x,
895
1403
  y: y,
896
1404
  z: z
897
1405
  });
898
- case 5:
1406
+ if (!(r1 == null)) {
1407
+ _context.next = 9;
1408
+ break;
1409
+ }
1410
+ return _context.abrupt("return");
1411
+ case 9:
1412
+ _context.next = 11;
1413
+ return r1();
1414
+ case 11:
899
1415
  px = _context.sent;
900
1416
  pixelData = px.data;
901
- tileRect = this.tilingScheme.tileXYToRectangle(x, y, z); ///const center = Rectangle.center(tileRect);
902
- err = this.errorAtZoom(z);
903
- maxLength = this.maxVertexDistance(tileRect);
1417
+ if (!(pixelData == null)) {
1418
+ _context.next = 15;
1419
+ break;
1420
+ }
1421
+ return _context.abrupt("return");
1422
+ case 15:
1423
+ ///const center = Rectangle.center(tileRect);
904
1424
  params = {
905
1425
  imageData: pixelData,
906
- maxLength: maxLength,
1426
+ maxVertexDistance: maxVertexDistance,
907
1427
  x: x,
908
1428
  y: y,
909
1429
  z: z,
910
- errorLevel: err,
911
- ellipsoidRadius: this.ellipsoid.maximumRadius,
1430
+ errorLevel: errorLevel,
1431
+ ellipsoidRadius: this.tilingScheme.ellipsoid.maximumRadius,
912
1432
  tileSize: tileSize
913
1433
  };
914
- _context.next = 13;
1434
+ _context.next = 18;
915
1435
  return this.decoder.decodeTerrain(params, pixelData.buffer);
916
- case 13:
1436
+ case 18:
917
1437
  res = _context.sent;
918
- pixelData = undefined;
919
- px = undefined;
920
- return _context.abrupt("return", this.createQuantizedMeshData(tileRect, err, res));
921
- case 19:
922
- _context.prev = 19;
923
- _context.t0 = _context["catch"](1);
924
- console.log(_context.t0);
925
- return _context.abrupt("return", this.emptyMesh(x, y, z));
1438
+ meta = {
1439
+ ellipsoid: this.tilingScheme.ellipsoid,
1440
+ errorLevel: errorLevel,
1441
+ overscaleFactor: 0,
1442
+ maxVertexDistance: maxVertexDistance,
1443
+ tileRect: tileRect,
1444
+ tileSize: tileSize
1445
+ };
1446
+ /** This builds a final terrain mesh object that can optionally
1447
+ * be upscaled to a higher resolution.
1448
+ */
1449
+ return _context.abrupt("return", createTerrainMesh(res, meta));
926
1450
  case 23:
1451
+ _context.prev = 23;
1452
+ _context.t0 = _context["catch"](4);
1453
+ return _context.abrupt("return", createEmptyMesh({
1454
+ tileRect: tileRect,
1455
+ errorLevel: errorLevel,
1456
+ ellipsoid: this.tilingScheme.ellipsoid,
1457
+ tileCoord: {
1458
+ x: x,
1459
+ y: y,
1460
+ z: z
1461
+ },
1462
+ tileSize: 0
1463
+ }));
1464
+ case 26:
927
1465
  case "end":
928
1466
  return _context.stop();
929
1467
  }
930
- }, _callee, this, [[1, 19]]);
1468
+ }, _callee, this, [[4, 23]]);
931
1469
  }));
932
1470
  function processTile(_x) {
933
1471
  return _processTile.apply(this, arguments);
@@ -985,9 +1523,8 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
985
1523
  if (halfAngle > Math.PI / 4) {
986
1524
  occlusionHeight = (1 + halfAngle) * this.ellipsoid.maximumRadius;
987
1525
  }
988
- var occlusionPoint = new Cartographic(center.longitude, center.latitude, occlusionHeight
989
- // Scaling factor of two just to be sure.
990
- );
1526
+ var occlusionPoint = new Cartographic(center.longitude, center.latitude, occlusionHeight) // Scaling factor of two just to be sure.
1527
+ ;
991
1528
  var horizonOcclusionPoint = this.ellipsoid.transformPositionToScaledSpace(Cartographic.toCartesian(occlusionPoint));
992
1529
  var orientedBoundingBox = OrientedBoundingBox.fromRectangle(tileRect, minimumHeight, maximumHeight, this.tilingScheme.ellipsoid);
993
1530
  var boundingSphere = BoundingSphere.fromOrientedBoundingBox(orientedBoundingBox);
@@ -995,7 +1532,8 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
995
1532
  // SE NW NE
996
1533
  // NE NW SE
997
1534
 
998
- var result = new QuantizedMeshTerrainData({
1535
+ /** TODO: we need to create raster terrain data. */
1536
+ return new QuantizedMeshTerrainData({
999
1537
  minimumHeight: minimumHeight,
1000
1538
  maximumHeight: maximumHeight,
1001
1539
  quantizedVertices: quantizedVertices,
@@ -1013,16 +1551,21 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1013
1551
  northSkirtHeight: skirtHeight,
1014
1552
  childTileMask: 15
1015
1553
  });
1016
- return result;
1017
1554
  }
1018
1555
  }, {
1019
1556
  key: "getLevelMaximumGeometricError",
1020
1557
  value: function getLevelMaximumGeometricError(level) {
1021
1558
  var levelZeroMaximumGeometricError = TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this.tilingScheme.ellipsoid, 65, this.tilingScheme.getNumberOfXTilesAtLevel(0));
1022
1559
 
1023
- // Scalar to control overzooming
1024
- // also seems to control zooming for imagery layers
1025
- var scalar = this.resource.tileSize / 256;
1560
+ /*
1561
+ Scalar to control overzooming
1562
+ - also seems to control zooming for imagery layers
1563
+ - This scalar was causing trouble for non-256 tile sizes,
1564
+ and we've removed it for now. It could be reintroduced
1565
+ if it seems necessary
1566
+ */
1567
+ var scalar = 1; //this.resource.tileSize / 256 ;
1568
+
1026
1569
  return levelZeroMaximumGeometricError / scalar / (1 << level);
1027
1570
  }
1028
1571
  }, {
@@ -1037,38 +1580,7 @@ var MartiniTerrainProvider = /*#__PURE__*/function () {
1037
1580
  }]);
1038
1581
  }();
1039
1582
 
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);
1583
+ var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkociwgYSkgewogICAgKG51bGwgPT0gYSB8fCBhID4gci5sZW5ndGgpICYmIChhID0gci5sZW5ndGgpOwogICAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07CiAgICByZXR1cm4gbjsKICB9CiAgZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKHIpIHsKICAgIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkocik7CiAgfQogIGZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkocikgewogICAgaWYgKCJ1bmRlZmluZWQiICE9IHR5cGVvZiBTeW1ib2wgJiYgbnVsbCAhPSByW1N5bWJvbC5pdGVyYXRvcl0gfHwgbnVsbCAhPSByWyJAQGl0ZXJhdG9yIl0pIHJldHVybiBBcnJheS5mcm9tKHIpOwogIH0KICBmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7CiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKTsKICB9CiAgZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KHIpIHsKICAgIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMocikgfHwgX2l0ZXJhYmxlVG9BcnJheShyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkocikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7CiAgfQogIGZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7CiAgICBpZiAocikgewogICAgICBpZiAoInN0cmluZyIgPT0gdHlwZW9mIHIpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKTsKICAgICAgdmFyIHQgPSB7fS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsIC0xKTsKICAgICAgcmV0dXJuICJPYmplY3QiID09PSB0ICYmIHIuY29uc3RydWN0b3IgJiYgKHQgPSByLmNvbnN0cnVjdG9yLm5hbWUpLCAiTWFwIiA9PT0gdCB8fCAiU2V0IiA9PT0gdCA/IEFycmF5LmZyb20ocikgOiAiQXJndW1lbnRzIiA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IF9hcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOwogICAgfQogIH0KCiAgLyoqIE1hcGJveCBUZXJyYWluLVJHQiBkZWZhdWx0IGRlY29kZSBmdW5jdGlvbgogICAqICAociAqIDI1NiAqIDI1NikgLyAxMCArIChnICogMjU2KSAvIDEwICsgYiAvIDEwIC0gMTAwMDAKICAgKi8KICB2YXIgZGVmYXVsdE1hcGJveERlY29kZVJnYiA9IGZ1bmN0aW9uIGRlZmF1bHRNYXBib3hEZWNvZGVSZ2IociwgZywgYiwgYSkgewogICAgcmV0dXJuIHIgKiA2NTUzLjYgKyBnICogMjUuNiArIGIgKiAwLjEgLSAxMDAwMDsKICB9OwogIGZ1bmN0aW9uIHJnYlRlcnJhaW5Ub0dyaWQocG5nLCBkZWNvZGVSZ2IpIHsKICAgIC8vIG1heWJlIHdlIHNob3VsZCBkbyB0aGlzIG9uIHRoZSBHUFUgdXNpbmcgUkVHTD8KICAgIC8vIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgR1BVIC0+IENQVSAtPiBHUFUKICAgIHZhciBncmlkU2l6ZSA9IHBuZy5zaGFwZVswXSArIDE7CiAgICB2YXIgdGVycmFpbiA9IG5ldyBGbG9hdDMyQXJyYXkoZ3JpZFNpemUgKiBncmlkU2l6ZSk7CiAgICB2YXIgdGlsZVNpemUgPSBwbmcuc2hhcGVbMF07CiAgICB2YXIgZGVjb2RlID0gZGVjb2RlUmdiICE9PSBudWxsICYmIGRlY29kZVJnYiAhPT0gdm9pZCAwID8gZGVjb2RlUmdiIDogZGVmYXVsdE1hcGJveERlY29kZVJnYjsKCiAgICAvLyBkZWNvZGUgdGVycmFpbiB2YWx1ZXMKICAgIGZvciAodmFyIHkgPSAwOyB5IDwgdGlsZVNpemU7IHkrKykgewogICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRpbGVTaXplOyB4KyspIHsKICAgICAgICB2YXIgeWMgPSB5OwogICAgICAgIHZhciBfciA9IHBuZy5nZXQoeCwgeWMsIDApOwogICAgICAgIHZhciBfZyA9IHBuZy5nZXQoeCwgeWMsIDEpOwogICAgICAgIHZhciBfYiA9IHBuZy5nZXQoeCwgeWMsIDIpOwogICAgICAgIHZhciBfYSA9IHBuZy5nZXQoeCwgeWMsIDMpOwogICAgICAgIHRlcnJhaW5beSAqIGdyaWRTaXplICsgeF0gPSBkZWNvZGUoX3IsIF9nLCBfYiwgX2EpOwogICAgICB9CiAgICB9CiAgICAvLyBiYWNrZmlsbCByaWdodCBhbmQgYm90dG9tIGJvcmRlcnMKICAgIGZvciAodmFyIF94ID0gMDsgX3ggPCBncmlkU2l6ZSAtIDE7IF94KyspIHsKICAgICAgdGVycmFpbltncmlkU2l6ZSAqIChncmlkU2l6ZSAtIDEpICsgX3hdID0gdGVycmFpbltncmlkU2l6ZSAqIChncmlkU2l6ZSAtIDIpICsgX3hdOwogICAgfQogICAgZm9yICh2YXIgX3kgPSAwOyBfeSA8IGdyaWRTaXplOyBfeSsrKSB7CiAgICAgIHRlcnJhaW5bZ3JpZFNpemUgKiBfeSArIGdyaWRTaXplIC0gMV0gPSB0ZXJyYWluW2dyaWRTaXplICogX3kgKyBncmlkU2l6ZSAtIDJdOwogICAgfQogICAgcmV0dXJuIHRlcnJhaW47CiAgfQoKICAvKiogVGVycmFpbiB3b3JrZXJzIHNob3VsZCByZXR1cm4gYSBxdWFudGl6ZWQgbWVzaCAqLwoKICBmdW5jdGlvbiBjcmVhdGVRdWFudGl6ZWRNZXNoRGF0YSh0aWxlLCBtZXNoLCB0aWxlU2l6ZSwgdGVycmFpbikgewogICAgLyoqIFRlcnJhaW4gaXMgcGFzc2VkIHRocm91Z2ggc28gd2UgY2FuIGtlZXAgdHJhY2sgb2YgaXQKICAgICAqIGZvciBvdmVyc2NhbGVkIHRpbGVzCiAgICAgKi8KCiAgICB2YXIgeHZhbHMgPSBbXTsKICAgIHZhciB5dmFscyA9IFtdOwogICAgdmFyIGhlaWdodE1ldGVycyA9IFtdOwogICAgdmFyIG5vcnRoSW5kaWNlcyA9IFtdOwogICAgdmFyIHNvdXRoSW5kaWNlcyA9IFtdOwogICAgdmFyIGVhc3RJbmRpY2VzID0gW107CiAgICB2YXIgd2VzdEluZGljZXMgPSBbXTsKICAgIHZhciBtaW5pbXVtSGVpZ2h0ID0gSW5maW5pdHk7CiAgICB2YXIgbWF4aW11bUhlaWdodCA9IC1JbmZpbml0eTsKICAgIHZhciBzY2FsYXIgPSAzMjc2OC4wIC8gdGlsZVNpemU7CgogICAgLy8gVGhlcmUgYXBwZWFycyB0byBiZSBhIHByb2JsZW0gd2l0aCB0aGUgeC95IGluZGV4aW5nIHdoZW4gdXNpbmcgNTEyeDUxMiB0aWxlcwogICAgLy8gVGhpcyBtYXkgYmUgc29sdmVkIGJ5IGluY3JlYXNpbmcgdGhlIG1pbnVtdW1FcnJvckxldmVsIGluIHRoZSB0ZXJyYWluIHByb3ZpZGVyCiAgICBmb3IgKHZhciBpeCA9IDA7IGl4IDwgbWVzaC52ZXJ0aWNlcy5sZW5ndGggLyAyOyBpeCsrKSB7CiAgICAgIHZhciB2ZXJ0ZXhJeCA9IGl4OwogICAgICB2YXIgcHggPSBtZXNoLnZlcnRpY2VzW2l4ICogMl07CiAgICAgIHZhciBweSA9IG1lc2gudmVydGljZXNbaXggKiAyICsgMV07CiAgICAgIHZhciBoZWlnaHQgPSB0aWxlLnRlcnJhaW5bcHkgKiAodGlsZVNpemUgKyAxKSArIHB4XTsKICAgICAgaWYgKGhlaWdodCA+IG1heGltdW1IZWlnaHQpIG1heGltdW1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgIGlmIChoZWlnaHQgPCBtaW5pbXVtSGVpZ2h0KSBtaW5pbXVtSGVpZ2h0ID0gaGVpZ2h0OwogICAgICBoZWlnaHRNZXRlcnMucHVzaChoZWlnaHQpOwogICAgICBpZiAocHkgPT0gMCkgbm9ydGhJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHkgPT0gdGlsZVNpemUpIHNvdXRoSW5kaWNlcy5wdXNoKHZlcnRleEl4KTsKICAgICAgaWYgKHB4ID09IDApIHdlc3RJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICBpZiAocHggPT0gdGlsZVNpemUpIGVhc3RJbmRpY2VzLnB1c2godmVydGV4SXgpOwogICAgICB2YXIgeHYgPSBweCAqIHNjYWxhcjsKICAgICAgdmFyIHl2ID0gKHRpbGVTaXplIC0gcHkpICogc2NhbGFyOwogICAgICB4dmFscy5wdXNoKHh2KTsKICAgICAgeXZhbHMucHVzaCh5dik7CiAgICB9CiAgICB2YXIgaGVpZ2h0UmFuZ2UgPSBtYXhpbXVtSGVpZ2h0IC0gbWluaW11bUhlaWdodDsKICAgIHZhciBoZWlnaHRzID0gaGVpZ2h0TWV0ZXJzLm1hcChmdW5jdGlvbiAoZCkgewogICAgICBpZiAoaGVpZ2h0UmFuZ2UgPCAxKSByZXR1cm4gMDsKICAgICAgcmV0dXJuIChkIC0gbWluaW11bUhlaWdodCkgKiAoMzI3NjguMCAvIGhlaWdodFJhbmdlKTsKICAgIH0pOwogICAgdmFyIHRyaWFuZ2xlcyA9IG5ldyBVaW50MTZBcnJheShtZXNoLnRyaWFuZ2xlcyk7CiAgICB2YXIgcXVhbnRpemVkVmVydGljZXMgPSBuZXcgVWludDE2QXJyYXkoLy92ZXJ0cwogICAgW10uY29uY2F0KHh2YWxzLCB5dmFscywgX3RvQ29uc3VtYWJsZUFycmF5KGhlaWdodHMpKSk7CgogICAgLy8gU0UgTlcgTkUKICAgIC8vIE5FIE5XIFNFCgogICAgcmV0dXJuIHsKICAgICAgbWluaW11bUhlaWdodDogbWluaW11bUhlaWdodCwKICAgICAgbWF4aW11bUhlaWdodDogbWF4aW11bUhlaWdodCwKICAgICAgcXVhbnRpemVkVmVydGljZXM6IHF1YW50aXplZFZlcnRpY2VzLAogICAgICBpbmRpY2VzOiB0cmlhbmdsZXMsCiAgICAgIHdlc3RJbmRpY2VzOiB3ZXN0SW5kaWNlcywKICAgICAgc291dGhJbmRpY2VzOiBzb3V0aEluZGljZXMsCiAgICAgIGVhc3RJbmRpY2VzOiBlYXN0SW5kaWNlcywKICAgICAgbm9ydGhJbmRpY2VzOiBub3J0aEluZGljZXMsCiAgICAgIHF1YW50aXplZEhlaWdodHM6IHRlcnJhaW4KICAgIH07CiAgfQoKICBmdW5jdGlvbiBpb3RhKG4pIHsKICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkobik7CiAgICBmb3IodmFyIGk9MDsgaTxuOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gaTsKICAgIH0KICAgIHJldHVybiByZXN1bHQKICB9CgogIHZhciBpb3RhXzEgPSBpb3RhOwoKICAvKiEKICAgKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyCiAgICoKICAgKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnPgogICAqIEBsaWNlbnNlICBNSVQKICAgKi8KICAvLyBUaGUgX2lzQnVmZmVyIGNoZWNrIGlzIGZvciBTYWZhcmkgNS03IHN1cHBvcnQsIGJlY2F1c2UgaXQncyBtaXNzaW5nCiAgLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseQogIHZhciBpc0J1ZmZlcl8xID0gZnVuY3Rpb24gKG9iaikgewogICAgcmV0dXJuIG9iaiAhPSBudWxsICYmIChpc0J1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopIHx8ICEhb2JqLl9pc0J1ZmZlcikKICB9OwoKICBmdW5jdGlvbiBpc0J1ZmZlciAob2JqKSB7CiAgICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKQogIH0KCiAgLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS4KICBmdW5jdGlvbiBpc1Nsb3dCdWZmZXIgKG9iaikgewogICAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0J1ZmZlcihvYmouc2xpY2UoMCwgMCkpCiAgfQoKICB2YXIgaGFzVHlwZWRBcnJheXMgID0gKCh0eXBlb2YgRmxvYXQ2NEFycmF5KSAhPT0gInVuZGVmaW5lZCIpOwoKICBmdW5jdGlvbiBjb21wYXJlMXN0KGEsIGIpIHsKICAgIHJldHVybiBhWzBdIC0gYlswXQogIH0KCiAgZnVuY3Rpb24gb3JkZXIoKSB7CiAgICB2YXIgc3RyaWRlID0gdGhpcy5zdHJpZGU7CiAgICB2YXIgdGVybXMgPSBuZXcgQXJyYXkoc3RyaWRlLmxlbmd0aCk7CiAgICB2YXIgaTsKICAgIGZvcihpPTA7IGk8dGVybXMubGVuZ3RoOyArK2kpIHsKICAgICAgdGVybXNbaV0gPSBbTWF0aC5hYnMoc3RyaWRlW2ldKSwgaV07CiAgICB9CiAgICB0ZXJtcy5zb3J0KGNvbXBhcmUxc3QpOwogICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh0ZXJtcy5sZW5ndGgpOwogICAgZm9yKGk9MDsgaTxyZXN1bHQubGVuZ3RoOyArK2kpIHsKICAgICAgcmVzdWx0W2ldID0gdGVybXNbaV1bMV07CiAgICB9CiAgICByZXR1cm4gcmVzdWx0CiAgfQoKICBmdW5jdGlvbiBjb21waWxlQ29uc3RydWN0b3IoZHR5cGUsIGRpbWVuc2lvbikgewogICAgdmFyIGNsYXNzTmFtZSA9IFsiVmlldyIsIGRpbWVuc2lvbiwgImQiLCBkdHlwZV0uam9pbigiIik7CiAgICBpZihkaW1lbnNpb24gPCAwKSB7CiAgICAgIGNsYXNzTmFtZSA9ICJWaWV3X05pbCIgKyBkdHlwZTsKICAgIH0KICAgIHZhciB1c2VHZXR0ZXJzID0gKGR0eXBlID09PSAiZ2VuZXJpYyIpOwoKICAgIGlmKGRpbWVuc2lvbiA9PT0gLTEpIHsKICAgICAgLy9TcGVjaWFsIGNhc2UgZm9yIHRyaXZpYWwgYXJyYXlzCiAgICAgIHZhciBjb2RlID0KICAgICAgICAiZnVuY3Rpb24gIitjbGFzc05hbWUrIihhKXt0aGlzLmRhdGE9YTt9O1wKdmFyIHByb3RvPSIrY2xhc3NOYW1lKyIucHJvdG90eXBlO1wKcHJvdG8uZHR5cGU9JyIrZHR5cGUrIic7XApwcm90by5pbmRleD1mdW5jdGlvbigpe3JldHVybiAtMX07XApwcm90by5zaXplPTA7XApwcm90by5kaW1lbnNpb249LTE7XApwcm90by5zaGFwZT1wcm90by5zdHJpZGU9cHJvdG8ub3JkZXI9W107XApwcm90by5sbz1wcm90by5oaT1wcm90by50cmFuc3Bvc2U9cHJvdG8uc3RlcD1cCmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyAiK2NsYXNzTmFtZSsiKHRoaXMuZGF0YSk7fTtcCnByb3RvLmdldD1wcm90by5zZXQ9ZnVuY3Rpb24oKXt9O1wKcHJvdG8ucGljaz1mdW5jdGlvbigpe3JldHVybiBudWxsfTtcCnJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RfIitjbGFzc05hbWUrIihhKXtyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIoYSk7fSI7CiAgICAgIHZhciBwcm9jZWR1cmUgPSBuZXcgRnVuY3Rpb24oY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoKQogICAgfSBlbHNlIGlmKGRpbWVuc2lvbiA9PT0gMCkgewogICAgICAvL1NwZWNpYWwgY2FzZSBmb3IgMGQgYXJyYXlzCiAgICAgIHZhciBjb2RlID0KICAgICAgICAiZnVuY3Rpb24gIitjbGFzc05hbWUrIihhLGQpIHtcCnRoaXMuZGF0YSA9IGE7XAp0aGlzLm9mZnNldCA9IGRcCn07XAp2YXIgcHJvdG89IitjbGFzc05hbWUrIi5wcm90b3R5cGU7XApwcm90by5kdHlwZT0nIitkdHlwZSsiJztcCnByb3RvLmluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2Zmc2V0fTtcCnByb3RvLmRpbWVuc2lvbj0wO1wKcHJvdG8uc2l6ZT0xO1wKcHJvdG8uc2hhcGU9XApwcm90by5zdHJpZGU9XApwcm90by5vcmRlcj1bXTtcCnByb3RvLmxvPVwKcHJvdG8uaGk9XApwcm90by50cmFuc3Bvc2U9XApwcm90by5zdGVwPWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfY29weSgpIHtcCnJldHVybiBuZXcgIitjbGFzc05hbWUrIih0aGlzLmRhdGEsdGhpcy5vZmZzZXQpXAp9O1wKcHJvdG8ucGljaz1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX3BpY2soKXtcCnJldHVybiBUcml2aWFsQXJyYXkodGhpcy5kYXRhKTtcCn07XApwcm90by52YWx1ZU9mPXByb3RvLmdldD1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX2dldCgpe1wKcmV0dXJuICIrKHVzZUdldHRlcnMgPyAidGhpcy5kYXRhLmdldCh0aGlzLm9mZnNldCkiIDogInRoaXMuZGF0YVt0aGlzLm9mZnNldF0iKSsKICAifTtcCnByb3RvLnNldD1mdW5jdGlvbiAiK2NsYXNzTmFtZSsiX3NldCh2KXtcCnJldHVybiAiKyh1c2VHZXR0ZXJzID8gInRoaXMuZGF0YS5zZXQodGhpcy5vZmZzZXQsdikiIDogInRoaXMuZGF0YVt0aGlzLm9mZnNldF09diIpKyJcCn07XApyZXR1cm4gZnVuY3Rpb24gY29uc3RydWN0XyIrY2xhc3NOYW1lKyIoYSxiLGMsZCl7cmV0dXJuIG5ldyAiK2NsYXNzTmFtZSsiKGEsZCl9IjsKICAgICAgdmFyIHByb2NlZHVyZSA9IG5ldyBGdW5jdGlvbigiVHJpdmlhbEFycmF5IiwgY29kZSk7CiAgICAgIHJldHVybiBwcm9jZWR1cmUoQ0FDSEVEX0NPTlNUUlVDVE9SU1tkdHlwZV1bMF0pCiAgICB9CgogICAgdmFyIGNvZGUgPSBbIid1c2Ugc3RyaWN0JyJdOwoKICAgIC8vQ3JlYXRlIGNvbnN0cnVjdG9yIGZvciB2aWV3CiAgICB2YXIgaW5kaWNlcyA9IGlvdGFfMShkaW1lbnNpb24pOwogICAgdmFyIGFyZ3MgPSBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiAiaSIraSB9KTsKICAgIHZhciBpbmRleF9zdHIgPSAidGhpcy5vZmZzZXQrIiArIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICAgIHJldHVybiAidGhpcy5zdHJpZGVbIiArIGkgKyAiXSppIiArIGkKICAgICAgICB9KS5qb2luKCIrIik7CiAgICB2YXIgc2hhcGVBcmcgPSBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJiIitpCiAgICAgIH0pLmpvaW4oIiwiKTsKICAgIHZhciBzdHJpZGVBcmcgPSBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJjIitpCiAgICAgIH0pLmpvaW4oIiwiKTsKICAgIGNvZGUucHVzaCgKICAgICAgImZ1bmN0aW9uICIrY2xhc3NOYW1lKyIoYSwiICsgc2hhcGVBcmcgKyAiLCIgKyBzdHJpZGVBcmcgKyAiLGQpe3RoaXMuZGF0YT1hIiwKICAgICAgICAidGhpcy5zaGFwZT1bIiArIHNoYXBlQXJnICsgIl0iLAogICAgICAgICJ0aGlzLnN0cmlkZT1bIiArIHN0cmlkZUFyZyArICJdIiwKICAgICAgICAidGhpcy5vZmZzZXQ9ZHwwfSIsCiAgICAgICJ2YXIgcHJvdG89IitjbGFzc05hbWUrIi5wcm90b3R5cGUiLAogICAgICAicHJvdG8uZHR5cGU9JyIrZHR5cGUrIiciLAogICAgICAicHJvdG8uZGltZW5zaW9uPSIrZGltZW5zaW9uKTsKCiAgICAvL3ZpZXcuc2l6ZToKICAgIGNvZGUucHVzaCgiT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCdzaXplJyx7Z2V0OmZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfc2l6ZSgpe1wKcmV0dXJuICIraW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gInRoaXMuc2hhcGVbIitpKyJdIiB9KS5qb2luKCIqIiksCiAgIn19KSIpOwoKICAgIC8vdmlldy5vcmRlcjoKICAgIGlmKGRpbWVuc2lvbiA9PT0gMSkgewogICAgICBjb2RlLnB1c2goInByb3RvLm9yZGVyPVswXSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sJ29yZGVyJyx7Z2V0OiIpOwogICAgICBpZihkaW1lbnNpb24gPCA0KSB7CiAgICAgICAgY29kZS5wdXNoKCJmdW5jdGlvbiAiK2NsYXNzTmFtZSsiX29yZGVyKCl7Iik7CiAgICAgICAgaWYoZGltZW5zaW9uID09PSAyKSB7CiAgICAgICAgICBjb2RlLnB1c2goInJldHVybiAoTWF0aC5hYnModGhpcy5zdHJpZGVbMF0pPk1hdGguYWJzKHRoaXMuc3RyaWRlWzFdKSk/WzEsMF06WzAsMV19fSkiKTsKICAgICAgICB9IGVsc2UgaWYoZGltZW5zaW9uID09PSAzKSB7CiAgICAgICAgICBjb2RlLnB1c2goCiAgInZhciBzMD1NYXRoLmFicyh0aGlzLnN0cmlkZVswXSksczE9TWF0aC5hYnModGhpcy5zdHJpZGVbMV0pLHMyPU1hdGguYWJzKHRoaXMuc3RyaWRlWzJdKTtcCmlmKHMwPnMxKXtcCmlmKHMxPnMyKXtcCnJldHVybiBbMiwxLDBdO1wKfWVsc2UgaWYoczA+czIpe1wKcmV0dXJuIFsxLDIsMF07XAp9ZWxzZXtcCnJldHVybiBbMSwwLDJdO1wKfVwKfWVsc2UgaWYoczA+czIpe1wKcmV0dXJuIFsyLDAsMV07XAp9ZWxzZSBpZihzMj5zMSl7XApyZXR1cm4gWzAsMSwyXTtcCn1lbHNle1wKcmV0dXJuIFswLDIsMV07XAp9fX0pIik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGNvZGUucHVzaCgiT1JERVJ9KSIpOwogICAgICB9CiAgICB9CgogICAgLy92aWV3LnNldChpMCwgLi4uLCB2KToKICAgIGNvZGUucHVzaCgKICAicHJvdG8uc2V0PWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfc2V0KCIrYXJncy5qb2luKCIsIikrIix2KXsiKTsKICAgIGlmKHVzZUdldHRlcnMpIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhLnNldCgiK2luZGV4X3N0cisiLHYpfSIpOwogICAgfSBlbHNlIHsKICAgICAgY29kZS5wdXNoKCJyZXR1cm4gdGhpcy5kYXRhWyIraW5kZXhfc3RyKyJdPXZ9Iik7CiAgICB9CgogICAgLy92aWV3LmdldChpMCwgLi4uKToKICAgIGNvZGUucHVzaCgicHJvdG8uZ2V0PWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfZ2V0KCIrYXJncy5qb2luKCIsIikrIil7Iik7CiAgICBpZih1c2VHZXR0ZXJzKSB7CiAgICAgIGNvZGUucHVzaCgicmV0dXJuIHRoaXMuZGF0YS5nZXQoIitpbmRleF9zdHIrIil9Iik7CiAgICB9IGVsc2UgewogICAgICBjb2RlLnB1c2goInJldHVybiB0aGlzLmRhdGFbIitpbmRleF9zdHIrIl19Iik7CiAgICB9CgogICAgLy92aWV3LmluZGV4OgogICAgY29kZS5wdXNoKAogICAgICAicHJvdG8uaW5kZXg9ZnVuY3Rpb24gIitjbGFzc05hbWUrIl9pbmRleCgiLCBhcmdzLmpvaW4oKSwgIil7cmV0dXJuICIraW5kZXhfc3RyKyJ9Iik7CgogICAgLy92aWV3LmhpKCk6CiAgICBjb2RlLnB1c2goInByb3RvLmhpPWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfaGkoIithcmdzLmpvaW4oIiwiKSsiKXtyZXR1cm4gbmV3ICIrY2xhc3NOYW1lKyIodGhpcy5kYXRhLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gWyIodHlwZW9mIGkiLGksIiE9PSdudW1iZXInfHxpIixpLCI8MCk/dGhpcy5zaGFwZVsiLCBpLCAiXTppIiwgaSwifDAiXS5qb2luKCIiKQogICAgICB9KS5qb2luKCIsIikrIiwiKwogICAgICBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJ0aGlzLnN0cmlkZVsiK2kgKyAiXSIKICAgICAgfSkuam9pbigiLCIpKyIsdGhpcy5vZmZzZXQpfSIpOwoKICAgIC8vdmlldy5sbygpOgogICAgdmFyIGFfdmFycyA9IGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuICJhIitpKyI9dGhpcy5zaGFwZVsiK2krIl0iIH0pOwogICAgdmFyIGNfdmFycyA9IGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuICJjIitpKyI9dGhpcy5zdHJpZGVbIitpKyJdIiB9KTsKICAgIGNvZGUucHVzaCgicHJvdG8ubG89ZnVuY3Rpb24gIitjbGFzc05hbWUrIl9sbygiK2FyZ3Muam9pbigiLCIpKyIpe3ZhciBiPXRoaXMub2Zmc2V0LGQ9MCwiK2FfdmFycy5qb2luKCIsIikrIiwiK2NfdmFycy5qb2luKCIsIikpOwogICAgZm9yKHZhciBpPTA7IGk8ZGltZW5zaW9uOyArK2kpIHsKICAgICAgY29kZS5wdXNoKAogICJpZih0eXBlb2YgaSIraSsiPT09J251bWJlcicmJmkiK2krIj49MCl7XApkPWkiK2krInwwO1wKYis9YyIraSsiKmQ7XAphIitpKyItPWR9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIitjbGFzc05hbWUrIih0aGlzLmRhdGEsIisKICAgICAgaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAiYSIraQogICAgICB9KS5qb2luKCIsIikrIiwiKwogICAgICBpbmRpY2VzLm1hcChmdW5jdGlvbihpKSB7CiAgICAgICAgcmV0dXJuICJjIitpCiAgICAgIH0pLmpvaW4oIiwiKSsiLGIpfSIpOwoKICAgIC8vdmlldy5zdGVwKCk6CiAgICBjb2RlLnB1c2goInByb3RvLnN0ZXA9ZnVuY3Rpb24gIitjbGFzc05hbWUrIl9zdGVwKCIrYXJncy5qb2luKCIsIikrIil7dmFyICIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gImEiK2krIj10aGlzLnNoYXBlWyIraSsiXSIKICAgICAgfSkuam9pbigiLCIpKyIsIisKICAgICAgaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAiYiIraSsiPXRoaXMuc3RyaWRlWyIraSsiXSIKICAgICAgfSkuam9pbigiLCIpKyIsYz10aGlzLm9mZnNldCxkPTAsY2VpbD1NYXRoLmNlaWwiKTsKICAgIGZvcih2YXIgaT0wOyBpPGRpbWVuc2lvbjsgKytpKSB7CiAgICAgIGNvZGUucHVzaCgKICAiaWYodHlwZW9mIGkiK2krIj09PSdudW1iZXInKXtcCmQ9aSIraSsifDA7XAppZihkPDApe1wKYys9YiIraSsiKihhIitpKyItMSk7XAphIitpKyI9Y2VpbCgtYSIraSsiL2QpXAp9ZWxzZXtcCmEiK2krIj1jZWlsKGEiK2krIi9kKVwKfVwKYiIraSsiKj1kXAp9Iik7CiAgICB9CiAgICBjb2RlLnB1c2goInJldHVybiBuZXcgIitjbGFzc05hbWUrIih0aGlzLmRhdGEsIisKICAgICAgaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAiYSIgKyBpCiAgICAgIH0pLmpvaW4oIiwiKSsiLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gImIiICsgaQogICAgICB9KS5qb2luKCIsIikrIixjKX0iKTsKCiAgICAvL3ZpZXcudHJhbnNwb3NlKCk6CiAgICB2YXIgdFNoYXBlID0gbmV3IEFycmF5KGRpbWVuc2lvbik7CiAgICB2YXIgdFN0cmlkZSA9IG5ldyBBcnJheShkaW1lbnNpb24pOwogICAgZm9yKHZhciBpPTA7IGk8ZGltZW5zaW9uOyArK2kpIHsKICAgICAgdFNoYXBlW2ldID0gImFbaSIraSsiXSI7CiAgICAgIHRTdHJpZGVbaV0gPSAiYltpIitpKyJdIjsKICAgIH0KICAgIGNvZGUucHVzaCgicHJvdG8udHJhbnNwb3NlPWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfdHJhbnNwb3NlKCIrYXJncysiKXsiKwogICAgICBhcmdzLm1hcChmdW5jdGlvbihuLGlkeCkgeyByZXR1cm4gbiArICI9KCIgKyBuICsgIj09PXVuZGVmaW5lZD8iICsgaWR4ICsgIjoiICsgbiArICJ8MCkifSkuam9pbigiOyIpLAogICAgICAidmFyIGE9dGhpcy5zaGFwZSxiPXRoaXMuc3RyaWRlO3JldHVybiBuZXcgIitjbGFzc05hbWUrIih0aGlzLmRhdGEsIit0U2hhcGUuam9pbigiLCIpKyIsIit0U3RyaWRlLmpvaW4oIiwiKSsiLHRoaXMub2Zmc2V0KX0iKTsKCiAgICAvL3ZpZXcucGljaygpOgogICAgY29kZS5wdXNoKCJwcm90by5waWNrPWZ1bmN0aW9uICIrY2xhc3NOYW1lKyJfcGljaygiK2FyZ3MrIil7dmFyIGE9W10sYj1bXSxjPXRoaXMub2Zmc2V0Iik7CiAgICBmb3IodmFyIGk9MDsgaTxkaW1lbnNpb247ICsraSkgewogICAgICBjb2RlLnB1c2goImlmKHR5cGVvZiBpIitpKyI9PT0nbnVtYmVyJyYmaSIraSsiPj0wKXtjPShjK3RoaXMuc3RyaWRlWyIraSsiXSppIitpKyIpfDB9ZWxzZXthLnB1c2godGhpcy5zaGFwZVsiK2krIl0pO2IucHVzaCh0aGlzLnN0cmlkZVsiK2krIl0pfSIpOwogICAgfQogICAgY29kZS5wdXNoKCJ2YXIgY3Rvcj1DVE9SX0xJU1RbYS5sZW5ndGgrMV07cmV0dXJuIGN0b3IodGhpcy5kYXRhLGEsYixjKX0iKTsKCiAgICAvL0FkZCByZXR1cm4gc3RhdGVtZW50CiAgICBjb2RlLnB1c2goInJldHVybiBmdW5jdGlvbiBjb25zdHJ1Y3RfIitjbGFzc05hbWUrIihkYXRhLHNoYXBlLHN0cmlkZSxvZmZzZXQpe3JldHVybiBuZXcgIitjbGFzc05hbWUrIihkYXRhLCIrCiAgICAgIGluZGljZXMubWFwKGZ1bmN0aW9uKGkpIHsKICAgICAgICByZXR1cm4gInNoYXBlWyIraSsiXSIKICAgICAgfSkuam9pbigiLCIpKyIsIisKICAgICAgaW5kaWNlcy5tYXAoZnVuY3Rpb24oaSkgewogICAgICAgIHJldHVybiAic3RyaWRlWyIraSsiXSIKICAgICAgfSkuam9pbigiLCIpKyIsb2Zmc2V0KX0iKTsKCiAgICAvL0NvbXBpbGUgcHJvY2VkdXJlCiAgICB2YXIgcHJvY2VkdXJlID0gbmV3IEZ1bmN0aW9uKCJDVE9SX0xJU1QiLCAiT1JERVIiLCBjb2RlLmpvaW4oIlxuIikpOwogICAgcmV0dXJuIHByb2NlZHVyZShDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXSwgb3JkZXIpCiAgfQoKICBmdW5jdGlvbiBhcnJheURUeXBlKGRhdGEpIHsKICAgIGlmKGlzQnVmZmVyXzEoZGF0YSkpIHsKICAgICAgcmV0dXJuICJidWZmZXIiCiAgICB9CiAgICBpZihoYXNUeXBlZEFycmF5cykgewogICAgICBzd2l0Y2goT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpKSB7CiAgICAgICAgY2FzZSAiW29iamVjdCBGbG9hdDY0QXJyYXldIjoKICAgICAgICAgIHJldHVybiAiZmxvYXQ2NCIKICAgICAgICBjYXNlICJbb2JqZWN0IEZsb2F0MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJmbG9hdDMyIgogICAgICAgIGNhc2UgIltvYmplY3QgSW50OEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImludDgiCiAgICAgICAgY2FzZSAiW29iamVjdCBJbnQxNkFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImludDE2IgogICAgICAgIGNhc2UgIltvYmplY3QgSW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJpbnQzMiIKICAgICAgICBjYXNlICJbb2JqZWN0IFVpbnQ4QXJyYXldIjoKICAgICAgICAgIHJldHVybiAidWludDgiCiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50MTZBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50MTYiCiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50MzJBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50MzIiCiAgICAgICAgY2FzZSAiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJ1aW50OF9jbGFtcGVkIgogICAgICAgIGNhc2UgIltvYmplY3QgQmlnSW50NjRBcnJheV0iOgogICAgICAgICAgcmV0dXJuICJiaWdpbnQ2NCIKICAgICAgICBjYXNlICJbb2JqZWN0IEJpZ1VpbnQ2NEFycmF5XSI6CiAgICAgICAgICByZXR1cm4gImJpZ3VpbnQ2NCIKICAgICAgfQogICAgfQogICAgaWYoQXJyYXkuaXNBcnJheShkYXRhKSkgewogICAgICByZXR1cm4gImFycmF5IgogICAgfQogICAgcmV0dXJuICJnZW5lcmljIgogIH0KCiAgdmFyIENBQ0hFRF9DT05TVFJVQ1RPUlMgPSB7CiAgICAiZmxvYXQzMiI6W10sCiAgICAiZmxvYXQ2NCI6W10sCiAgICAiaW50OCI6W10sCiAgICAiaW50MTYiOltdLAogICAgImludDMyIjpbXSwKICAgICJ1aW50OCI6W10sCiAgICAidWludDE2IjpbXSwKICAgICJ1aW50MzIiOltdLAogICAgImFycmF5IjpbXSwKICAgICJ1aW50OF9jbGFtcGVkIjpbXSwKICAgICJiaWdpbnQ2NCI6IFtdLAogICAgImJpZ3VpbnQ2NCI6IFtdLAogICAgImJ1ZmZlciI6W10sCiAgICAiZ2VuZXJpYyI6W10KICB9CgogIDsKICBmdW5jdGlvbiB3cmFwcGVkTkRBcnJheUN0b3IoZGF0YSwgc2hhcGUsIHN0cmlkZSwgb2Zmc2V0KSB7CiAgICBpZihkYXRhID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFyIGN0b3IgPSBDQUNIRURfQ09OU1RSVUNUT1JTLmFycmF5WzBdOwogICAgICByZXR1cm4gY3RvcihbXSkKICAgIH0gZWxzZSBpZih0eXBlb2YgZGF0YSA9PT0gIm51bWJlciIpIHsKICAgICAgZGF0YSA9IFtkYXRhXTsKICAgIH0KICAgIGlmKHNoYXBlID09PSB1bmRlZmluZWQpIHsKICAgICAgc2hhcGUgPSBbIGRhdGEubGVuZ3RoIF07CiAgICB9CiAgICB2YXIgZCA9IHNoYXBlLmxlbmd0aDsKICAgIGlmKHN0cmlkZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHN0cmlkZSA9IG5ldyBBcnJheShkKTsKICAgICAgZm9yKHZhciBpPWQtMSwgc3o9MTsgaT49MDsgLS1pKSB7CiAgICAgICAgc3RyaWRlW2ldID0gc3o7CiAgICAgICAgc3ogKj0gc2hhcGVbaV07CiAgICAgIH0KICAgIH0KICAgIGlmKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIG9mZnNldCA9IDA7CiAgICAgIGZvcih2YXIgaT0wOyBpPGQ7ICsraSkgewogICAgICAgIGlmKHN0cmlkZVtpXSA8IDApIHsKICAgICAgICAgIG9mZnNldCAtPSAoc2hhcGVbaV0tMSkqc3RyaWRlW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIGR0eXBlID0gYXJyYXlEVHlwZShkYXRhKTsKICAgIHZhciBjdG9yX2xpc3QgPSBDQUNIRURfQ09OU1RSVUNUT1JTW2R0eXBlXTsKICAgIHdoaWxlKGN0b3JfbGlzdC5sZW5ndGggPD0gZCsxKSB7CiAgICAgIGN0b3JfbGlzdC5wdXNoKGNvbXBpbGVDb25zdHJ1Y3RvcihkdHlwZSwgY3Rvcl9saXN0Lmxlbmd0aC0xKSk7CiAgICB9CiAgICB2YXIgY3RvciA9IGN0b3JfbGlzdFtkKzFdOwogICAgcmV0dXJuIGN0b3IoZGF0YSwgc2hhcGUsIHN0cmlkZSwgb2Zmc2V0KQogIH0KCiAgdmFyIG5kYXJyYXkgPSB3cmFwcGVkTkRBcnJheUN0b3I7CgogIGNsYXNzIE1hcnRpbmkgewogICAgICBjb25zdHJ1Y3RvcihncmlkU2l6ZSA9IDI1NykgewogICAgICAgICAgdGhpcy5ncmlkU2l6ZSA9IGdyaWRTaXplOwogICAgICAgICAgY29uc3QgdGlsZVNpemUgPSBncmlkU2l6ZSAtIDE7CiAgICAgICAgICBpZiAodGlsZVNpemUgJiAodGlsZVNpemUgLSAxKSkgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgICAgIGBFeHBlY3RlZCBncmlkIHNpemUgdG8gYmUgMl5uKzEsIGdvdCAke2dyaWRTaXplfS5gKTsKCiAgICAgICAgICB0aGlzLm51bVRyaWFuZ2xlcyA9IHRpbGVTaXplICogdGlsZVNpemUgKiAyIC0gMjsKICAgICAgICAgIHRoaXMubnVtUGFyZW50VHJpYW5nbGVzID0gdGhpcy5udW1UcmlhbmdsZXMgLSB0aWxlU2l6ZSAqIHRpbGVTaXplOwoKICAgICAgICAgIHRoaXMuaW5kaWNlcyA9IG5ldyBVaW50MzJBcnJheSh0aGlzLmdyaWRTaXplICogdGhpcy5ncmlkU2l6ZSk7CgogICAgICAgICAgLy8gY29vcmRpbmF0ZXMgZm9yIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMgaW4gYW4gUlRJTiB0aWxlCiAgICAgICAgICB0aGlzLmNvb3JkcyA9IG5ldyBVaW50MTZBcnJheSh0aGlzLm51bVRyaWFuZ2xlcyAqIDQpOwoKICAgICAgICAgIC8vIGdldCB0cmlhbmdsZSBjb29yZGluYXRlcyBmcm9tIGl0cyBpbmRleCBpbiBhbiBpbXBsaWNpdCBiaW5hcnkgdHJlZQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bVRyaWFuZ2xlczsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IGlkID0gaSArIDI7CiAgICAgICAgICAgICAgbGV0IGF4ID0gMCwgYXkgPSAwLCBieCA9IDAsIGJ5ID0gMCwgY3ggPSAwLCBjeSA9IDA7CiAgICAgICAgICAgICAgaWYgKGlkICYgMSkgewogICAgICAgICAgICAgICAgICBieCA9IGJ5ID0gY3ggPSB0aWxlU2l6ZTsgLy8gYm90dG9tLWxlZnQgdHJpYW5nbGUKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBheCA9IGF5ID0gY3kgPSB0aWxlU2l6ZTsgLy8gdG9wLXJpZ2h0IHRyaWFuZ2xlCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdoaWxlICgoaWQgPj49IDEpID4gMSkgewogICAgICAgICAgICAgICAgICBjb25zdCBteCA9IChheCArIGJ4KSA+PiAxOwogICAgICAgICAgICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxOwoKICAgICAgICAgICAgICAgICAgaWYgKGlkICYgMSkgeyAvLyBsZWZ0IGhhbGYKICAgICAgICAgICAgICAgICAgICAgIGJ4ID0gYXg7IGJ5ID0gYXk7CiAgICAgICAgICAgICAgICAgICAgICBheCA9IGN4OyBheSA9IGN5OwogICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyByaWdodCBoYWxmCiAgICAgICAgICAgICAgICAgICAgICBheCA9IGJ4OyBheSA9IGJ5OwogICAgICAgICAgICAgICAgICAgICAgYnggPSBjeDsgYnkgPSBjeTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjeCA9IG14OyBjeSA9IG15OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjb25zdCBrID0gaSAqIDQ7CiAgICAgICAgICAgICAgdGhpcy5jb29yZHNbayArIDBdID0gYXg7CiAgICAgICAgICAgICAgdGhpcy5jb29yZHNbayArIDFdID0gYXk7CiAgICAgICAgICAgICAgdGhpcy5jb29yZHNbayArIDJdID0gYng7CiAgICAgICAgICAgICAgdGhpcy5jb29yZHNbayArIDNdID0gYnk7CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNyZWF0ZVRpbGUodGVycmFpbikgewogICAgICAgICAgcmV0dXJuIG5ldyBUaWxlKHRlcnJhaW4sIHRoaXMpOwogICAgICB9CiAgfQoKICBjbGFzcyBUaWxlIHsKICAgICAgY29uc3RydWN0b3IodGVycmFpbiwgbWFydGluaSkgewogICAgICAgICAgY29uc3Qgc2l6ZSA9IG1hcnRpbmkuZ3JpZFNpemU7CiAgICAgICAgICBpZiAodGVycmFpbi5sZW5ndGggIT09IHNpemUgKiBzaXplKSB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgYEV4cGVjdGVkIHRlcnJhaW4gZGF0YSBvZiBsZW5ndGggJHtzaXplICogc2l6ZX0gKCR7c2l6ZX0geCAke3NpemV9KSwgZ290ICR7dGVycmFpbi5sZW5ndGh9LmApOwoKICAgICAgICAgIHRoaXMudGVycmFpbiA9IHRlcnJhaW47CiAgICAgICAgICB0aGlzLm1hcnRpbmkgPSBtYXJ0aW5pOwogICAgICAgICAgdGhpcy5lcnJvcnMgPSBuZXcgRmxvYXQzMkFycmF5KHRlcnJhaW4ubGVuZ3RoKTsKICAgICAgICAgIHRoaXMudXBkYXRlKCk7CiAgICAgIH0KCiAgICAgIHVwZGF0ZSgpIHsKICAgICAgICAgIGNvbnN0IHtudW1UcmlhbmdsZXMsIG51bVBhcmVudFRyaWFuZ2xlcywgY29vcmRzLCBncmlkU2l6ZTogc2l6ZX0gPSB0aGlzLm1hcnRpbmk7CiAgICAgICAgICBjb25zdCB7dGVycmFpbiwgZXJyb3JzfSA9IHRoaXM7CgogICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZSB0cmlhbmdsZXMsIHN0YXJ0aW5nIGZyb20gdGhlIHNtYWxsZXN0IGxldmVsCiAgICAgICAgICBmb3IgKGxldCBpID0gbnVtVHJpYW5nbGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBrID0gaSAqIDQ7CiAgICAgICAgICAgICAgY29uc3QgYXggPSBjb29yZHNbayArIDBdOwogICAgICAgICAgICAgIGNvbnN0IGF5ID0gY29vcmRzW2sgKyAxXTsKICAgICAgICAgICAgICBjb25zdCBieCA9IGNvb3Jkc1trICsgMl07CiAgICAgICAgICAgICAgY29uc3QgYnkgPSBjb29yZHNbayArIDNdOwogICAgICAgICAgICAgIGNvbnN0IG14ID0gKGF4ICsgYngpID4+IDE7CiAgICAgICAgICAgICAgY29uc3QgbXkgPSAoYXkgKyBieSkgPj4gMTsKICAgICAgICAgICAgICBjb25zdCBjeCA9IG14ICsgbXkgLSBheTsKICAgICAgICAgICAgICBjb25zdCBjeSA9IG15ICsgYXggLSBteDsKCiAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGVycm9yIGluIHRoZSBtaWRkbGUgb2YgdGhlIGxvbmcgZWRnZSBvZiB0aGUgdHJpYW5nbGUKICAgICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRIZWlnaHQgPSAodGVycmFpbltheSAqIHNpemUgKyBheF0gKyB0ZXJyYWluW2J5ICogc2l6ZSArIGJ4XSkgLyAyOwogICAgICAgICAgICAgIGNvbnN0IG1pZGRsZUluZGV4ID0gbXkgKiBzaXplICsgbXg7CiAgICAgICAgICAgICAgY29uc3QgbWlkZGxlRXJyb3IgPSBNYXRoLmFicyhpbnRlcnBvbGF0ZWRIZWlnaHQgLSB0ZXJyYWluW21pZGRsZUluZGV4XSk7CgogICAgICAgICAgICAgIGVycm9yc1ttaWRkbGVJbmRleF0gPSBNYXRoLm1heChlcnJvcnNbbWlkZGxlSW5kZXhdLCBtaWRkbGVFcnJvcik7CgogICAgICAgICAgICAgIGlmIChpIDwgbnVtUGFyZW50VHJpYW5nbGVzKSB7IC8vIGJpZ2dlciB0cmlhbmdsZXM7IGFjY3VtdWxhdGUgZXJyb3Igd2l0aCBjaGlsZHJlbgogICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0Q2hpbGRJbmRleCA9ICgoYXkgKyBjeSkgPj4gMSkgKiBzaXplICsgKChheCArIGN4KSA+PiAxKTsKICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHRDaGlsZEluZGV4ID0gKChieSArIGN5KSA+PiAxKSAqIHNpemUgKyAoKGJ4ICsgY3gpID4+IDEpOwogICAgICAgICAgICAgICAgICBlcnJvcnNbbWlkZGxlSW5kZXhdID0gTWF0aC5tYXgoZXJyb3JzW21pZGRsZUluZGV4XSwgZXJyb3JzW2xlZnRDaGlsZEluZGV4XSwgZXJyb3JzW3JpZ2h0Q2hpbGRJbmRleF0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfQoKICAgICAgZ2V0TWVzaChtYXhFcnJvciA9IDAsIG1heExlbmd0aCA9IG51bGwpIHsKICAgICAgICAgIGNvbnN0IHtncmlkU2l6ZTogc2l6ZSwgaW5kaWNlc30gPSB0aGlzLm1hcnRpbmk7CiAgICAgICAgICBjb25zdCB7ZXJyb3JzfSA9IHRoaXM7CiAgICAgICAgICBsZXQgbnVtVmVydGljZXMgPSAwOwogICAgICAgICAgbGV0IG51bVRyaWFuZ2xlcyA9IDA7CiAgICAgICAgICBjb25zdCBtYXggPSBzaXplIC0gMTsKCiAgICAgICAgICAvLyBUaGUgbWF4TGVuZ3RoIHBhcmFtZXRlciB3aWxsIGNhdXNlIHRyaWFuZ2xlcyB0byBiZSBnZW5lcmF0ZWQgdW50aWwgdGhlIGxlZ3MgYXJlIGJlbG93IHRoaXMgbGVuZ3RoCiAgICAgICAgICAvLyBJdCBpcyBtZWFudCB0byBzdXBwb3J0IGNhc2VzIHdoZXJlIGEgY2VydGFpbiBtZXNoIGRlbnNpdHkgaXMgcmVxdWlyZWQgdG8gZG8gc3BoZXJpY2FsIG1hdGggb24gZGlnaXRhbCBnbG9iZXMKICAgICAgICAgIGNvbnN0IG1heFNjYWxlID0gbWF4TGVuZ3RoIHx8IHNpemU7CgogICAgICAgICAgLy8gdXNlIGFuIGluZGV4IGdyaWQgdG8ga2VlcCB0cmFjayBvZiB2ZXJ0aWNlcyB0aGF0IHdlcmUgYWxyZWFkeSB1c2VkIHRvIGF2b2lkIGR1cGxpY2F0aW9uCiAgICAgICAgICBpbmRpY2VzLmZpbGwoMCk7CgogICAgICAgICAgLy8gcmV0cmlldmUgbWVzaCBpbiB0d28gc3RhZ2VzIHRoYXQgYm90aCB0cmF2ZXJzZSB0aGUgZXJyb3IgbWFwOgogICAgICAgICAgLy8gLSBjb3VudEVsZW1lbnRzOiBmaW5kIHVzZWQgdmVydGljZXMgKGFuZCBhc3NpZ24gZWFjaCBhbiBpbmRleCksIGFuZCBjb3VudCB0cmlhbmdsZXMgKGZvciBtaW5pbXVtIGFsbG9jYXRpb24pCiAgICAgICAgICAvLyAtIHByb2Nlc3NUcmlhbmdsZTogZmlsbCB0aGUgYWxsb2NhdGVkIHZlcnRpY2VzICYgdHJpYW5nbGVzIHR5cGVkIGFycmF5cwoKICAgICAgICAgIGZ1bmN0aW9uIGNvdW50RWxlbWVudHMoYXgsIGF5LCBieCwgYnksIGN4LCBjeSkgewogICAgICAgICAgICAgIGNvbnN0IG14ID0gKGF4ICsgYngpID4+IDE7CiAgICAgICAgICAgICAgY29uc3QgbXkgPSAoYXkgKyBieSkgPj4gMTsKCiAgICAgICAgICAgICAgY29uc3QgbGVnTGVuZ3RoID0gTWF0aC5hYnMoYXggLSBjeCkgKyBNYXRoLmFicyhheSAtIGN5KTsKICAgICAgICAgICAgICBpZiAoKGxlZ0xlbmd0aCA+IDEgJiYgZXJyb3JzW215ICogc2l6ZSArIG14XSA+IG1heEVycm9yKSB8fCBsZWdMZW5ndGggPiBtYXhTY2FsZSkgewogICAgICAgICAgICAgICAgICBjb3VudEVsZW1lbnRzKGN4LCBjeSwgYXgsIGF5LCBteCwgbXkpOwogICAgICAgICAgICAgICAgICBjb3VudEVsZW1lbnRzKGJ4LCBieSwgY3gsIGN5LCBteCwgbXkpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGluZGljZXNbYXkgKiBzaXplICsgYXhdID0gaW5kaWNlc1theSAqIHNpemUgKyBheF0gfHwgKytudW1WZXJ0aWNlczsKICAgICAgICAgICAgICAgICAgaW5kaWNlc1tieSAqIHNpemUgKyBieF0gPSBpbmRpY2VzW2J5ICogc2l6ZSArIGJ4XSB8fCArK251bVZlcnRpY2VzOwogICAgICAgICAgICAgICAgICBpbmRpY2VzW2N5ICogc2l6ZSArIGN4XSA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIHx8ICsrbnVtVmVydGljZXM7CiAgICAgICAgICAgICAgICAgIG51bVRyaWFuZ2xlcysrOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGNvdW50RWxlbWVudHMoMCwgMCwgbWF4LCBtYXgsIG1heCwgMCk7CiAgICAgICAgICBjb3VudEVsZW1lbnRzKG1heCwgbWF4LCAwLCAwLCAwLCBtYXgpOwoKICAgICAgICAgIGNvbnN0IHZlcnRpY2VzID0gbmV3IFVpbnQxNkFycmF5KG51bVZlcnRpY2VzICogMik7CiAgICAgICAgICBjb25zdCB0cmlhbmdsZXMgPSBuZXcgVWludDMyQXJyYXkobnVtVHJpYW5nbGVzICogMyk7CiAgICAgICAgICBsZXQgdHJpSW5kZXggPSAwOwoKICAgICAgICAgIGZ1bmN0aW9uIHByb2Nlc3NUcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5KSB7CiAgICAgICAgICAgICAgY29uc3QgbXggPSAoYXggKyBieCkgPj4gMTsKICAgICAgICAgICAgICBjb25zdCBteSA9IChheSArIGJ5KSA+PiAxOwoKICAgICAgICAgICAgICBjb25zdCBsZWdMZW5ndGggPSBNYXRoLmFicyhheCAtIGN4KSArIE1hdGguYWJzKGF5IC0gY3kpOwogICAgICAgICAgICAgIGlmICgobGVnTGVuZ3RoID4gMSAmJiBlcnJvcnNbbXkgKiBzaXplICsgbXhdID4gbWF4RXJyb3IpIHx8IGxlZ0xlbmd0aCA+IG1heFNjYWxlKSB7CiAgICAgICAgICAgICAgICAgIC8vIHRyaWFuZ2xlIGRvZXNuJ3QgYXBwcm94aW1hdGUgdGhlIHN1cmZhY2Ugd2VsbCBlbm91Z2g7IGRyaWxsIGRvd24gZnVydGhlcgogICAgICAgICAgICAgICAgICBwcm9jZXNzVHJpYW5nbGUoY3gsIGN5LCBheCwgYXksIG14LCBteSk7CiAgICAgICAgICAgICAgICAgIHByb2Nlc3NUcmlhbmdsZShieCwgYnksIGN4LCBjeSwgbXgsIG15KTsKCiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gYWRkIGEgdHJpYW5nbGUKICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IGluZGljZXNbYXkgKiBzaXplICsgYXhdIC0gMTsKICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IGluZGljZXNbYnkgKiBzaXplICsgYnhdIC0gMTsKICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGluZGljZXNbY3kgKiBzaXplICsgY3hdIC0gMTsKCiAgICAgICAgICAgICAgICAgIHZlcnRpY2VzWzIgKiBhXSA9IGF4OwogICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1syICogYSArIDFdID0gYXk7CgogICAgICAgICAgICAgICAgICB2ZXJ0aWNlc1syICogYl0gPSBieDsKICAgICAgICAgICAgICAgICAgdmVydGljZXNbMiAqIGIgKyAxXSA9IGJ5OwoKICAgICAgICAgICAgICAgICAgdmVydGljZXNbMiAqIGNdID0gY3g7CiAgICAgICAgICAgICAgICAgIHZlcnRpY2VzWzIgKiBjICsgMV0gPSBjeTsKCiAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGE7CiAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGI7CiAgICAgICAgICAgICAgICAgIHRyaWFuZ2xlc1t0cmlJbmRleCsrXSA9IGM7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcHJvY2Vzc1RyaWFuZ2xlKDAsIDAsIG1heCwgbWF4LCBtYXgsIDApOwogICAgICAgICAgcHJvY2Vzc1RyaWFuZ2xlKG1heCwgbWF4LCAwLCAwLCAwLCBtYXgpOwoKICAgICAgICAgIHJldHVybiB7dmVydGljZXMsIHRyaWFuZ2xlc307CiAgICAgIH0KICB9CgogIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9DZXNpdW1HUy9jZXNpdW0vYmxvYi8xLjc2L1NvdXJjZS9Xb3JrZXJzRVM2L2NyZWF0ZVZlcnRpY2VzRnJvbVF1YW50aXplZFRlcnJhaW5NZXNoLmpzCgogIHZhciBtYXJ0aW5pQ2FjaGUgPSB7fTsKICBmdW5jdGlvbiBkZWNvZGVUZXJyYWluKHBhcmFtZXRlcnMsIHRyYW5zZmVyYWJsZU9iamVjdHMpIHsKICAgIHZhciBfbWFydGluaUNhY2hlJHRpbGVTaXo7CiAgICB2YXIgaW1hZ2VEYXRhID0gcGFyYW1ldGVycy5pbWFnZURhdGEsCiAgICAgIF9wYXJhbWV0ZXJzJHRpbGVTaXplID0gcGFyYW1ldGVycy50aWxlU2l6ZSwKICAgICAgdGlsZVNpemUgPSBfcGFyYW1ldGVycyR0aWxlU2l6ZSA9PT0gdm9pZCAwID8gMjU2IDogX3BhcmFtZXRlcnMkdGlsZVNpemUsCiAgICAgIGVycm9yTGV2ZWwgPSBwYXJhbWV0ZXJzLmVycm9yTGV2ZWwsCiAgICAgIG1heFZlcnRleERpc3RhbmNlID0gcGFyYW1ldGVycy5tYXhWZXJ0ZXhEaXN0YW5jZTsKCiAgICAvLyBIZWlnaHQgZGF0YSBjYW4gYmUgZWl0aGVyIGFuIGFycmF5IG9mIG51bWJlcnMgKGZvciBwcmUtZXhpc3RpbmcgdGVycmFpbiBkYXRhKQogICAgLy8gb3IgYW4gaW1hZ2UgZGF0YSBhcnJheSAoZm9yIGRlY29kaW5nIGZyb20gYW4gaW1hZ2UpCgogICAgdmFyIGhlaWdodERhdGEgPSB7CiAgICAgIHR5cGU6ICJpbWFnZSIsCiAgICAgIGFycmF5OiBpbWFnZURhdGEKICAgIH07CiAgICB2YXIgdGVycmFpbjsKICAgIHsKICAgICAgdmFyIGFycmF5ID0gaGVpZ2h0RGF0YS5hcnJheTsKICAgICAgdmFyIHBpeGVscyA9IG5kYXJyYXkobmV3IFVpbnQ4QXJyYXkoYXJyYXkpLCBbdGlsZVNpemUsIHRpbGVTaXplLCA0XSwgWzQsIDQgKiB0aWxlU2l6ZSwgMV0sIDApOwogICAgICB0ZXJyYWluID0gcmdiVGVycmFpblRvR3JpZChwaXhlbHMpOwogICAgfQoKICAgIC8vIFRpbGUgc2l6ZSBtdXN0IGJlIG1haW50YWluZWQgdGhyb3VnaCB0aGUgbGlmZSBvZiB0aGUgd29ya2VyCiAgICAoX21hcnRpbmlDYWNoZSR0aWxlU2l6ID0gbWFydGluaUNhY2hlW3RpbGVTaXplXSkgIT09IG51bGwgJiYgX21hcnRpbmlDYWNoZSR0aWxlU2l6ICE9PSB2b2lkIDAgPyBfbWFydGluaUNhY2hlJHRpbGVTaXogOiBtYXJ0aW5pQ2FjaGVbdGlsZVNpemVdID0gbmV3IE1hcnRpbmkodGlsZVNpemUgKyAxKTsKICAgIHZhciB0aWxlID0gbWFydGluaUNhY2hlW3RpbGVTaXplXS5jcmVhdGVUaWxlKHRlcnJhaW4pOwoKICAgIC8vIGdldCBhIG1lc2ggKHZlcnRpY2VzIGFuZCB0cmlhbmdsZXMgaW5kaWNlcykgZm9yIGEgMTBtIGVycm9yCiAgICB2YXIgbWVzaCA9IHRpbGUuZ2V0TWVzaChlcnJvckxldmVsLCBNYXRoLm1pbihtYXhWZXJ0ZXhEaXN0YW5jZSwgdGlsZVNpemUpKTsKICAgIHZhciByZXMgPSBjcmVhdGVRdWFudGl6ZWRNZXNoRGF0YSh0aWxlLCBtZXNoLCB0aWxlU2l6ZSwKICAgIC8vIE9ubHkgaW5jbHVkZSB2ZXJ0ZXggZGF0YSBpZiBhbnRpY2lwYXRlIHVwc2NhbGluZyB0aWxlCiAgICB0ZXJyYWluICk7CiAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2gocmVzLmluZGljZXMuYnVmZmVyKTsKICAgIHRyYW5zZmVyYWJsZU9iamVjdHMucHVzaChyZXMucXVhbnRpemVkVmVydGljZXMuYnVmZmVyKTsKICAgIGlmIChyZXMucXVhbnRpemVkSGVpZ2h0cykgewogICAgICB0cmFuc2ZlcmFibGVPYmplY3RzLnB1c2gocmVzLnF1YW50aXplZEhlaWdodHMuYnVmZmVyKTsKICAgIH0KICAgIHJldHVybiByZXM7CiAgfQogIHNlbGYub25tZXNzYWdlID0gZnVuY3Rpb24gKG1zZykgewogICAgdmFyIF9tc2ckZGF0YSA9IG1zZy5kYXRhLAogICAgICBpZCA9IF9tc2ckZGF0YS5pZCwKICAgICAgcGF5bG9hZCA9IF9tc2ckZGF0YS5wYXlsb2FkOwogICAgaWYgKGlkID09IG51bGwpIHJldHVybjsKICAgIHZhciBvYmplY3RzID0gW107CiAgICB2YXIgcmVzID0gbnVsbDsKICAgIHRyeSB7CiAgICAgIHJlcyA9IGRlY29kZVRlcnJhaW4ocGF5bG9hZCwgb2JqZWN0cyk7CiAgICAgIC8vIEB0cy1pZ25vcmUKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7CiAgICAgICAgaWQ6IGlkLAogICAgICAgIHBheWxvYWQ6IHJlcwogICAgICB9LCBvYmplY3RzKTsKICAgIH0gY2F0Y2ggKGVycikgewogICAgICB2YXIgX2VyciRtZXNzYWdlOwogICAgICB2YXIgX21zZyA9IChfZXJyJG1lc3NhZ2UgPSBlcnIubWVzc2FnZSkgIT09IG51bGwgJiYgX2VyciRtZXNzYWdlICE9PSB2b2lkIDAgPyBfZXJyJG1lc3NhZ2UgOiBlcnI7CiAgICAgIHNlbGYucG9zdE1lc3NhZ2UoewogICAgICAgIGlkOiBpZCwKICAgICAgICBlcnI6IF9tc2cudG9TdHJpbmcoKQogICAgICB9KTsKICAgIH0gZmluYWxseSB7CiAgICAgIHJlcyA9IG51bGw7CiAgICAgIG9iamVjdHMgPSBudWxsOwogICAgfQogIH07Cgp9KSgpOwoK', null, false);
1072
1584
  /* eslint-enable */
1073
1585
 
1074
1586
  var MapboxTerrainProvider = /*#__PURE__*/function (_MartiniTerrainProvid) {
@@ -1088,5 +1600,5 @@ var MapboxTerrainProvider = /*#__PURE__*/function (_MartiniTerrainProvid) {
1088
1600
  return _createClass(MapboxTerrainProvider);
1089
1601
  }(MartiniTerrainProvider);
1090
1602
 
1091
- export { DefaultHeightmapResource, MapboxTerrainResource, MartiniTerrainProvider, MapboxTerrainProvider as default };
1603
+ export { DefaultHeightmapResource, DefaultTerrainDecoder, MapboxTerrainResource, MartiniTerrainProvider, StretchedTilingScheme, WorkerFarmTerrainDecoder, createQuantizedMeshData, MapboxTerrainProvider as default, emptyMesh, rgbTerrainToGrid, subsetByWindow, testMeshData };
1092
1604
  //# sourceMappingURL=index.js.map