UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

227 lines (188 loc) 21.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.distortCylinderPositions = distortCylinderPositions; exports.getAngle = getAngle; exports.getCenterHex = getCenterHex; exports.getCentroid = getCentroid; exports.getH3VerticeTransform = getH3VerticeTransform; exports.getRadius = getRadius; exports.getVertices = getVertices; Object.defineProperty(exports, "h3GetResolution", { enumerable: true, get: function get() { return _h3Js.h3GetResolution; } }); Object.defineProperty(exports, "h3IsValid", { enumerable: true, get: function get() { return _h3Js.h3IsValid; } }); exports.idToPolygonGeo = idToPolygonGeo; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _h3Js = require("h3-js"); // Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // get vertices should return [lon, lat] function getVertices(_ref) { var id = _ref.id; // always reverse it return (0, _h3Js.h3ToGeoBoundary)(id, true); } // get centroid should return [lon, lat] function getCentroid(_ref2) { var id = _ref2.id; // always reverse it to [lng, lat] return (0, _h3Js.h3ToGeo)(id).reverse(); } function idToPolygonGeo(_ref3, properties) { var object = _ref3.object; if (!object || !object.id) { return null; } var vertices = getVertices(object); return { geometry: { coordinates: vertices, type: 'LineString' }, properties: properties }; } function getCenterHex(_ref4, resolution) { var latitude = _ref4.latitude, longitude = _ref4.longitude; return (0, _h3Js.geoToH3)(latitude, longitude, resolution); } // H3 hexagon are not perfect hexagon after projection, they are slightly distorted // Here we calculate the distortion from perfect hexagon to h3 hexagon // A mathematica proof can be found at // https://beta.observablehq.com/@heshan0131/h3-hexagon-shape-normalize function getH3VerticeTransform(rawVertices, centroid) { var vertices = revertVertices(rawVertices.map(function (vt) { return offset(vt, centroid); })); var radius = getRadius(vertices[0], vertices[3]); var angle = getAngle(vertices[0], vertices[3]); // rotate hexagon vertices, so that v0 - v3 axis parallel with xAxis // 2___1 // 3 / \ 0 // \___/ // 4 5 // var rotatedVertices = vertices.map(function (vt) { return rotate([0, 0], vt, angle); }); // vertices of a perfect hexagon var normalVertices = getHexagonVertices(radius); // calculate distortion return getDistortions(rotatedVertices, normalVertices); } // Vertices index based on // https://github.com/uber/luma.gl/blob/master/modules/core/src/geometry/truncated-cone-geometry.js function distortCylinderPositions(positions, distortions) { var primitives = distortions.map(function (_ref5, i) { var dr = _ref5.dr, da = _ref5.da; return getPtOnCircle(dr, da + Math.PI * i / 3); }); // close it primitives.push(primitives[0]); // starting from the 8th vertice, repeat 4 times, only replace x(0), y(1) return positions.map(function (v, i) { if (i > 20 && i < 21 * 5 && i % 3 < 2) { var row = Math.floor(i / 3); var col = i % 3; return primitives[row % 7][col]; } return v; }); } function offset(_ref6, _ref7) { var _ref8 = (0, _slicedToArray2["default"])(_ref6, 2), px = _ref8[0], py = _ref8[1]; var _ref9 = (0, _slicedToArray2["default"])(_ref7, 2), x0 = _ref9[0], y0 = _ref9[1]; return [[px - x0], [py - y0]]; } function rotate(_ref10, _ref11, radians) { var _ref12 = (0, _slicedToArray2["default"])(_ref10, 2), cx = _ref12[0], cy = _ref12[1]; var _ref13 = (0, _slicedToArray2["default"])(_ref11, 2), x = _ref13[0], y = _ref13[1]; var cos = Math.cos(radians); var sin = Math.sin(radians); var nx = cos * (x - cx) + sin * (y - cy) + cx; var ny = cos * (y - cy) - sin * (x - cx) + cy; return [nx, ny]; } function getDistance(pt0, pt1) { var dx = pt0[0] - pt1[0]; var dy = pt0[1] - pt1[1]; var dxy = Math.sqrt(dx * dx + dy * dy); return dxy; } function getRadius(pt0, pt3) { var dxy = getDistance(pt0, pt3); return dxy / 2; } function getAngle(pt0, pt3) { var dx = pt0[0] - pt3[0]; var dy = pt0[1] - pt3[1]; var dxy = Math.sqrt(dx * dx + dy * dy); // Calculate angle that the perpendicular hexagon vertex axis is tilted var angle = Math.acos(dx / dxy) * Math.sign(dy); return angle; } function getPtOnCircle(radius, angle) { return [radius * Math.cos(angle), radius * Math.sin(angle)]; } function getHexagonVertices(r) { var ang60 = Math.PI / 3; var pts = []; for (var i = 0; i < 6; i++) { pts.push(getPtOnCircle(r, ang60 * i)); } return pts; } function revertVertices(verts) { // reverting verts from clock (h3) to counter clock wise (luma cylinder) var seq = [0, 5, 4, 3, 2, 1]; return seq.map(function (s) { return verts[s]; }); } function getDistortions(vts, origs) { // 0 and 3 should be the guide var ct = [0, 0]; var distortions = []; for (var i = 0; i < 6; i++) { var vt = vts[i]; var org = origs[i]; var r = getRadius(org, ct); var dr = getRadius(vt, ct) / r; var da = Math.atan2(vt[1], vt[0]) - Math.atan2(org[1], org[0]); distortions.push({ dr: dr, da: da }); } return distortions; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvaDMtaGV4YWdvbi1sYXllci9oMy11dGlscy5qcyJdLCJuYW1lcyI6WyJnZXRWZXJ0aWNlcyIsImlkIiwiZ2V0Q2VudHJvaWQiLCJyZXZlcnNlIiwiaWRUb1BvbHlnb25HZW8iLCJwcm9wZXJ0aWVzIiwib2JqZWN0IiwidmVydGljZXMiLCJnZW9tZXRyeSIsImNvb3JkaW5hdGVzIiwidHlwZSIsImdldENlbnRlckhleCIsInJlc29sdXRpb24iLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImdldEgzVmVydGljZVRyYW5zZm9ybSIsInJhd1ZlcnRpY2VzIiwiY2VudHJvaWQiLCJyZXZlcnRWZXJ0aWNlcyIsIm1hcCIsInZ0Iiwib2Zmc2V0IiwicmFkaXVzIiwiZ2V0UmFkaXVzIiwiYW5nbGUiLCJnZXRBbmdsZSIsInJvdGF0ZWRWZXJ0aWNlcyIsInJvdGF0ZSIsIm5vcm1hbFZlcnRpY2VzIiwiZ2V0SGV4YWdvblZlcnRpY2VzIiwiZ2V0RGlzdG9ydGlvbnMiLCJkaXN0b3J0Q3lsaW5kZXJQb3NpdGlvbnMiLCJwb3NpdGlvbnMiLCJkaXN0b3J0aW9ucyIsInByaW1pdGl2ZXMiLCJpIiwiZHIiLCJkYSIsImdldFB0T25DaXJjbGUiLCJNYXRoIiwiUEkiLCJwdXNoIiwidiIsInJvdyIsImZsb29yIiwiY29sIiwicHgiLCJweSIsIngwIiwieTAiLCJyYWRpYW5zIiwiY3giLCJjeSIsIngiLCJ5IiwiY29zIiwic2luIiwibngiLCJueSIsImdldERpc3RhbmNlIiwicHQwIiwicHQxIiwiZHgiLCJkeSIsImR4eSIsInNxcnQiLCJwdDMiLCJhY29zIiwic2lnbiIsInIiLCJhbmc2MCIsInB0cyIsInZlcnRzIiwic2VxIiwicyIsInZ0cyIsIm9yaWdzIiwiY3QiLCJvcmciLCJhdGFuMiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQXBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0FBSixDQUFYO0FBQ0EsTUFBTTVDLFdBQVcsR0FBRyxFQUFwQjs7QUFFQSxPQUFLLElBQUlFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUcsQ0FBcEIsRUFBdUJBLENBQUMsRUFBeEIsRUFBNEI7QUFDMUIsUUFBTWYsRUFBRSxHQUFHdUQsR0FBRyxDQUFDeEMsQ0FBRCxDQUFkO0FBQ0EsUUFBTTJDLEdBQUcsR0FBR0YsS0FBSyxDQUFDekMsQ0FBRCxDQUFqQjtBQUVBLFFBQU1rQyxDQUFDLEdBQUc5QyxTQUFTLENBQUN1RCxHQUFELEVBQU1ELEVBQU4sQ0FBbkI7QUFDQSxRQUFNekMsRUFBRSxHQUFHYixTQUFTLENBQUNILEVBQUQsRUFBS3lELEVBQUwsQ0FBVCxHQUFvQlIsQ0FBL0I7QUFFQSxRQUFNaEMsRUFBRSxHQUFHRSxJQUFJLENBQUN3QyxLQUFMLENBQVczRCxFQUFFLENBQUMsQ0FBRCxDQUFiLEVBQWtCQSxFQUFFLENBQUMsQ0FBRCxDQUFwQixJQUEyQm1CLElBQUksQ0FBQ3dDLEtBQUwsQ0FBV0QsR0FBRyxDQUFDLENBQUQsQ0FBZCxFQUFtQkEsR0FBRyxDQUFDLENBQUQsQ0FBdEIsQ0FBdEM7QUFFQTdDLElBQUFBLFdBQVcsQ0FBQ1EsSUFBWixDQUFpQjtBQUFDTCxNQUFBQSxFQUFFLEVBQUZBLEVBQUQ7QUFBS0MsTUFBQUEsRUFBRSxFQUFGQTtBQUFMLEtBQWpCO0FBQ0Q7O0FBRUQsU0FBT0osV0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtoM0dldFJlc29sdXRpb24sIGgzSXNWYWxpZCwgaDNUb0dlbywgaDNUb0dlb0JvdW5kYXJ5LCBnZW9Ub0gzfSBmcm9tICdoMy1qcyc7XG5leHBvcnQge2gzR2V0UmVzb2x1dGlvbiwgaDNJc1ZhbGlkfTtcblxuLy8gZ2V0IHZlcnRpY2VzIHNob3VsZCByZXR1cm4gW2xvbiwgbGF0XVxuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnRpY2VzKHtpZH0pIHtcbiAgLy8gYWx3YXlzIHJldmVyc2UgaXRcbiAgcmV0dXJuIGgzVG9HZW9Cb3VuZGFyeShpZCwgdHJ1ZSk7XG59XG5cbi8vIGdldCBjZW50cm9pZCBzaG91bGQgcmV0dXJuIFtsb24sIGxhdF1cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZW50cm9pZCh7aWR9KSB7XG4gIC8vIGFsd2F5cyByZXZlcnNlIGl0IHRvIFtsbmcsIGxhdF1cbiAgcmV0dXJuIGgzVG9HZW8oaWQpLnJldmVyc2UoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkVG9Qb2x5Z29uR2VvKHtvYmplY3R9LCBwcm9wZXJ0aWVzKSB7XG4gIGlmICghb2JqZWN0IHx8ICFvYmplY3QuaWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZlcnRpY2VzID0gZ2V0VmVydGljZXMob2JqZWN0KTtcblxuICByZXR1cm4ge1xuICAgIGdlb21ldHJ5OiB7XG4gICAgICBjb29yZGluYXRlczogdmVydGljZXMsXG4gICAgICB0eXBlOiAnTGluZVN0cmluZydcbiAgICB9LFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENlbnRlckhleCh7bGF0aXR1ZGUsIGxvbmdpdHVkZX0sIHJlc29sdXRpb24pIHtcbiAgcmV0dXJuIGdlb1RvSDMobGF0aXR1ZGUsIGxvbmdpdHVkZSwgcmVzb2x1dGlvbik7XG59XG5cbi8vIEgzIGhleGFnb24gYXJlIG5vdCBwZXJmZWN0IGhleGFnb24gYWZ0ZXIgcHJvamVjdGlvbiwgdGhleSBhcmUgc2xpZ2h0bHkgZGlzdG9ydGVkXG4vLyBIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgZGlzdG9ydGlvbiBmcm9tIHBlcmZlY3QgaGV4YWdvbiB0byBoMyBoZXhhZ29uXG4vLyBBIG1hdGhlbWF0aWNhIHByb29mIGNhbiBiZSBmb3VuZCBhdFxuLy8gaHR0cHM6Ly9iZXRhLm9ic2VydmFibGVocS5jb20vQGhlc2hhbjAxMzEvaDMtaGV4YWdvbi1zaGFwZS1ub3JtYWxpemVcbmV4cG9ydCBmdW5jdGlvbiBnZXRIM1ZlcnRpY2VUcmFuc2Zvcm0ocmF3VmVydGljZXMsIGNlbnRyb2lkKSB7XG4gIGNvbnN0IHZlcnRpY2VzID0gcmV2ZXJ0VmVydGljZXMocmF3VmVydGljZXMubWFwKHZ0ID0+IG9mZnNldCh2dCwgY2VudHJvaWQpKSk7XG4gIGNvbnN0IHJhZGl1cyA9IGdldFJhZGl1cyh2ZXJ0aWNlc1swXSwgdmVydGljZXNbM10pO1xuXG4gIGNvbnN0IGFuZ2xlID0gZ2V0QW5nbGUodmVydGljZXNbMF0sIHZlcnRpY2VzWzNdKVxuXG4gIC8vIHJvdGF0ZSBoZXhhZ29uIHZlcnRpY2VzLCBzbyB0aGF0IHYwIC0gdjMgYXhpcyBwYXJhbGxlbCB3aXRoIHhBeGlzXG4gIC8vICAgMl9fXzFcbiAgLy8gMyAvICAgXFwgMFxuICAvLyAgIFxcX19fL1xuICAvLyAgIDQgICA1XG4gIC8vXG4gIGNvbnN0IHJvdGF0ZWRWZXJ0aWNlcyA9IHZlcnRpY2VzLm1hcCh2dCA9PiByb3RhdGUoWzAsIDBdLCB2dCwgYW5nbGUpKTtcblxuICAvLyB2ZXJ0aWNlcyBvZiBhIHBlcmZlY3QgaGV4YWdvblxuICBjb25zdCBub3JtYWxWZXJ0aWNlcyA9IGdldEhleGFnb25WZXJ0aWNlcyhyYWRpdXMpO1xuXG4gIC8vIGNhbGN1bGF0ZSBkaXN0b3J0aW9uXG4gIHJldHVybiBnZXREaXN0b3J0aW9ucyhyb3RhdGVkVmVydGljZXMsIG5vcm1hbFZlcnRpY2VzKVxufVxuXG4vLyBWZXJ0aWNlcyBpbmRleCBiYXNlZCBvblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3ViZXIvbHVtYS5nbC9ibG9iL21hc3Rlci9tb2R1bGVzL2NvcmUvc3JjL2dlb21ldHJ5L3RydW5jYXRlZC1jb25lLWdlb21ldHJ5LmpzXG5leHBvcnQgZnVuY3Rpb24gZGlzdG9ydEN5bGluZGVyUG9zaXRpb25zKHBvc2l0aW9ucywgZGlzdG9ydGlvbnMpIHtcblxuICBjb25zdCBwcmltaXRpdmVzID0gZGlzdG9ydGlvbnMubWFwKCh7ZHIsIGRhfSwgaSkgPT5cbiAgICBnZXRQdE9uQ2lyY2xlKGRyLCBkYSArIE1hdGguUEkgKiBpIC8gMykpO1xuICAvLyBjbG9zZSBpdFxuICBwcmltaXRpdmVzLnB1c2gocHJpbWl0aXZlc1swXSk7XG5cbiAgLy8gc3RhcnRpbmcgZnJvbSB0aGUgOHRoIHZlcnRpY2UsIHJlcGVhdCA0IHRpbWVzLCBvbmx5IHJlcGxhY2UgeCgwKSwgeSgxKVxuICByZXR1cm4gcG9zaXRpb25zLm1hcCgodiwgaSkgPT4ge1xuICAgIGlmIChpID4gMjAgJiYgaSA8IDIxICogNSAmJiBpICUgMyA8IDIpIHtcbiAgICAgIGNvbnN0IHJvdyA9IE1hdGguZmxvb3IoaSAvIDMpO1xuICAgICAgY29uc3QgY29sID0gaSAlIDM7XG4gICAgICByZXR1cm4gcHJpbWl0aXZlc1tyb3cgJSA3XVtjb2xdO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9mZnNldChbcHgsIHB5XSwgW3gwLCB5MF0pIHtcbiAgcmV0dXJuIFtbcHggLSB4MF0sIFtweSAtIHkwXV07XG59XG5cbmZ1bmN0aW9uIHJvdGF0ZShbY3gsIGN5XSwgW3gsIHldLCByYWRpYW5zKSB7XG4gIGNvbnN0IGNvcyA9IE1hdGguY29zKHJhZGlhbnMpO1xuICBjb25zdCBzaW4gPSBNYXRoLnNpbihyYWRpYW5zKTtcbiAgY29uc3QgbnggPSAoY29zICogKHggLSBjeCkpICsgKHNpbiAqICh5IC0gY3kpKSArIGN4O1xuICBjb25zdCBueSA9IChjb3MgKiAoeSAtIGN5KSkgLSAoc2luICogKHggLSBjeCkpICsgY3k7XG5cbiAgcmV0dXJuIFtueCwgbnldO1xufVxuXG5mdW5jdGlvbiBnZXREaXN0YW5jZShwdDAsIHB0MSkge1xuICBjb25zdCBkeCA9IHB0MFswXSAtIHB0MVswXTtcbiAgY29uc3QgZHkgPSBwdDBbMV0gLSBwdDFbMV07XG4gIGNvbnN0IGR4eSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gIHJldHVybiBkeHk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWRpdXMocHQwLCBwdDMpIHtcbiAgY29uc3QgZHh5ID0gZ2V0RGlzdGFuY2UocHQwLCBwdDMpO1xuICByZXR1cm4gZHh5IC8gMjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKHB0MCwgcHQzKSB7XG4gIGNvbnN0IGR4ID0gcHQwWzBdIC0gcHQzWzBdO1xuICBjb25zdCBkeSA9IHB0MFsxXSAtIHB0M1sxXTtcbiAgY29uc3QgZHh5ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAvLyBDYWxjdWxhdGUgYW5nbGUgdGhhdCB0aGUgcGVycGVuZGljdWxhciBoZXhhZ29uIHZlcnRleCBheGlzIGlzIHRpbHRlZFxuICBjb25zdCBhbmdsZSA9IE1hdGguYWNvcyhkeCAvIGR4eSkgKiBNYXRoLnNpZ24oZHkpO1xuICByZXR1cm4gYW5nbGU7XG59XG5cbmZ1bmN0aW9uIGdldFB0T25DaXJjbGUocmFkaXVzLCBhbmdsZSkge1xuICByZXR1cm4gW3JhZGl1cyAqICBNYXRoLmNvcyhhbmdsZSksIHJhZGl1cyAqICBNYXRoLnNpbihhbmdsZSldO1xufVxuXG5mdW5jdGlvbiBnZXRIZXhhZ29uVmVydGljZXMocikge1xuICBjb25zdCBhbmc2MCA9IE1hdGguUEkgLyAzO1xuICBjb25zdCBwdHMgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgIHB0cy5wdXNoKGdldFB0T25DaXJjbGUociwgYW5nNjAgKiBpKSlcbiAgfVxuXG4gIHJldHVybiBwdHM7XG59XG5cbmZ1bmN0aW9uIHJldmVydFZlcnRpY2VzKHZlcnRzKSB7XG4gIC8vIHJldmVydGluZyB2ZXJ0cyBmcm9tIGNsb2NrIChoMykgdG8gY291bnRlciBjbG9jayB3aXNlIChsdW1hIGN5bGluZGVyKVxuICBjb25zdCBzZXEgPSBbMCwgNSwgNCwgMywgMiwgMV07XG4gIHJldHVybiBzZXEubWFwKHMgPT4gdmVydHNbc10pO1xufVxuXG5mdW5jdGlvbiBnZXREaXN0b3J0aW9ucyh2dHMsIG9yaWdzKSB7XG4gIC8vIDAgYW5kIDMgc2hvdWxkIGJlIHRoZSBndWlkZVxuICBjb25zdCBjdCA9IFswLCAwXTtcbiAgY29uc3QgZGlzdG9ydGlvbnMgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgIGNvbnN0IHZ0ID0gdnRzW2ldO1xuICAgIGNvbnN0IG9yZyA9IG9yaWdzW2ldO1xuXG4gICAgY29uc3QgciA9IGdldFJhZGl1cyhvcmcsIGN0KTtcbiAgICBjb25zdCBkciA9IGdldFJhZGl1cyh2dCwgY3QpIC8gclxuXG4gICAgY29uc3QgZGEgPSBNYXRoLmF0YW4yKHZ0WzFdLCB2dFswXSkgLSBNYXRoLmF0YW4yKG9yZ1sxXSwgb3JnWzBdKTtcblxuICAgIGRpc3RvcnRpb25zLnB1c2goe2RyLCBkYX0pO1xuICB9XG5cbiAgcmV0dXJuIGRpc3RvcnRpb25zO1xufVxuIl19