UNPKG

kepler.gl.geoiq

Version:

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

199 lines (159 loc) 17.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.camelToTitle = camelToTitle; exports.capitalizeFirstLetter = capitalizeFirstLetter; exports.generateHashId = generateHashId; exports.getError = getError; exports.getHTMLMapModeTileUrl = getHTMLMapModeTileUrl; exports.isChrome = isChrome; exports.isObject = isObject; exports.isPlainObject = isPlainObject; exports.notNullorUndefined = notNullorUndefined; exports.set = void 0; exports.toArray = toArray; var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _window = _interopRequireDefault(require("global/window")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /** * Generate a hash string based on number of character * @param {number} count * @returns {string} hash string */ function generateHashId() { var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 6; return Math.random().toString(36).substr(count); } /** * Detect chrome * @returns {boolean} - yes or no */ function isChrome() { // Chrome 1+ return _window["default"].chrome && _window["default"].chrome.webstore; } /** * whether is an object * @returns {boolean} - yes or no */ function isPlainObject(obj) { return obj === Object(obj) && typeof obj !== 'function' && !Array.isArray(obj); } /** * Capitalize first letter of a string * @param {string} str * @returns {string} */ function capitalizeFirstLetter(str) { return str.charAt(0).toUpperCase() + str.slice(1); } /** * Convert camel style names to title * strokeColor -> Stroke Color * @param {string} str * @returns {string} */ function camelToTitle(str) { var breakWord = str.replace(/([A-Z])/g, ' $1'); return capitalizeFirstLetter(breakWord); } /** * Returns the img url for a given map export option * @param mode export option * @return {string} url */ function getHTMLMapModeTileUrl(mode) { return "https://d1a3f4spazzrp4.cloudfront.net/kepler.gl/documentation/map-".concat(mode.toLowerCase(), "-mode.png"); } function notNullorUndefined(d) { return d !== undefined && d !== null; } /** * Converts non-arrays to arrays. Leaves arrays alone. Converts * undefined values to empty arrays ([] instead of [undefined]). * Otherwise, just returns [item] for non-array items. * * @param {*} item * @returns {array} boom! much array. very indexed. so useful. */ function toArray(item) { if (Array.isArray(item)) { return item; } if (typeof item === 'undefined' || item === null) { return []; } return [item]; } /** * immutably insert value to an Array or Object * @param {Array|Object} obj * @param {Number|String} key * @param {*} value * @returns {Array|Object} */ var insertValue = function insertValue(obj, key, value) { if (Array.isArray(obj) && typeof key === 'number') { return [].concat((0, _toConsumableArray2["default"])(obj.slice(0, key)), [value], (0, _toConsumableArray2["default"])(obj.slice(key + 1, obj.length))); } return _objectSpread(_objectSpread({}, obj), {}, (0, _defineProperty2["default"])({}, key, value)); }; /** * check if value is a loose object including a plain object, array, function * @param {*} value */ function isObject(value) { return value !== null && ((0, _typeof2["default"])(value) === 'object' || typeof value === 'function'); } var setPath = function setPath(_ref, value, obj) { var _ref2 = (0, _toArray2["default"])(_ref), key = _ref2[0], next = _ref2.slice(1); // is Object allows js object, array and function if (!isObject(obj)) { return obj; } if (next.length === 0) { return insertValue(obj, key, value); } return insertValue(obj, key, setPath(next, value, obj.hasOwnProperty(key) ? obj[key] : {})); }; /** * Immutable version of _.set * @param {Array<String|Number>} path * @param {*} value * @param {Object} obj * @returns {Object} */ var set = exports.set = function set(path, value, obj) { return obj === null ? obj : setPath(path, value, obj); }; /** * Get error information of unknown type * Extracts as much human readable information as possible * Ensure result is an Error object suitable for throw or promise rejection * * @private * @param {*} err - Unknown error * @return {string} - human readable error msg */ function getError(err) { if (!err) { return 'Something went wrong'; } if (typeof err === 'string') { return err; } else if (err instanceof Error) { return err.message; } else if ((0, _typeof2["default"])(err) === 'object') { return err.error ? getError(err.error) : err.err ? getError(err.err) : err.message ? getError(err.message) : JSON.stringify(err); } return null; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlscy5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZUhhc2hJZCIsImNvdW50IiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwic3Vic3RyIiwiaXNDaHJvbWUiLCJ3aW5kb3ciLCJjaHJvbWUiLCJ3ZWJzdG9yZSIsImlzUGxhaW5PYmplY3QiLCJvYmoiLCJPYmplY3QiLCJBcnJheSIsImlzQXJyYXkiLCJjYXBpdGFsaXplRmlyc3RMZXR0ZXIiLCJzdHIiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiY2FtZWxUb1RpdGxlIiwiYnJlYWtXb3JkIiwicmVwbGFjZSIsImdldEhUTUxNYXBNb2RlVGlsZVVybCIsIm1vZGUiLCJ0b0xvd2VyQ2FzZSIsIm5vdE51bGxvclVuZGVmaW5lZCIsImQiLCJ1bmRlZmluZWQiLCJ0b0FycmF5IiwiaXRlbSIsImluc2VydFZhbHVlIiwia2V5IiwidmFsdWUiLCJsZW5ndGgiLCJpc09iamVjdCIsInNldFBhdGgiLCJuZXh0IiwiaGFzT3duUHJvcGVydHkiLCJzZXQiLCJwYXRoIiwiZ2V0RXJyb3IiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJlcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7Ozs7O0FBRUE7Ozs7O0FBS08sU0FBU0EsY0FBVCxHQUFtQztBQUFBLE1BQVhDLEtBQVcsdUVBQUgsQ0FBRztBQUN4QyxTQUFPQyxJQUFJLENBQUNDLE1BQUwsR0FDSkMsUUFESSxDQUNLLEVBREwsRUFFSkMsTUFGSSxDQUVHSixLQUZILENBQVA7QUFHRDtBQUVEOzs7Ozs7QUFJTyxTQUFTSyxRQUFULEdBQW9CO0FBQ3pCO0FBQ0EsU0FBT0MsbUJBQU9DLE1BQVAsSUFBaUJELG1CQUFPQyxNQUFQLENBQWNDLFFBQXRDO0FBQ0Q7QUFFRDs7Ozs7O0FBSU8sU0FBU0MsYUFBVCxDQUF1QkMsR0FBdkIsRUFBNEI7QUFD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Q0FBbEI7QUFLRCxDQWZEO0FBaUJBOzs7Ozs7Ozs7QUFPTyxJQUFNTyxHQUFHLGlCQUFHLFNBQU5BLEdBQU0sQ0FBQ0MsSUFBRCxFQUFPUCxLQUFQLEVBQWN0QixHQUFkO0FBQUEsU0FDakJBLEdBQUcsS0FBSyxJQUFSLEdBQWVBLEdBQWYsR0FBcUJ5QixPQUFPLENBQUNJLElBQUQsRUFBT1AsS0FBUCxFQUFjdEIsR0FBZCxDQURYO0FBQUEsQ0FBWjtBQUdQOzs7Ozs7Ozs7OztBQVNPLFNBQVM4QixRQUFULENBQWtCQyxHQUFsQixFQUF1QjtBQUM1QixNQUFJLENBQUNBLEdBQUwsRUFBVTtBQUNSLFdBQU8sc0JBQVA7QUFDRDs7QUFFRCxNQUFJLE9BQU9BLEdBQVAsS0FBZSxRQUFuQixFQUE2QjtBQUMzQixXQUFPQSxHQUFQO0FBQ0QsR0FGRCxNQUVPLElBQUlBLEdBQUcsWUFBWUMsS0FBbkIsRUFBMEI7QUFDL0IsV0FBT0QsR0FBRyxDQUFDRSxPQUFYO0FBQ0QsR0FGTSxNQUVBLElBQUkseUJBQU9GLEdBQVAsTUFBZSxRQUFuQixFQUE2QjtBQUNsQyxXQUFPQSxHQUFHLENBQUNHLEtBQUosR0FDSEosUUFBUSxDQUFDQyxHQUFHLENBQUNHLEtBQUwsQ0FETCxHQUVISCxHQUFHLENBQUNBLEdBQUosR0FDQUQsUUFBUSxDQUFDQyxHQUFHLENBQUNBLEdBQUwsQ0FEUixHQUVBQSxHQUFHLENBQUNFLE9BQUosR0FDQUgsUUFBUSxDQUFDQyxHQUFHLENBQUNFLE9BQUwsQ0FEUixHQUVBRSxJQUFJLENBQUNDLFNBQUwsQ0FBZUwsR0FBZixDQU5KO0FBT0Q7O0FBRUQsU0FBTyxJQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgaGFzaCBzdHJpbmcgYmFzZWQgb24gbnVtYmVyIG9mIGNoYXJhY3RlclxuICogQHBhcmFtIHtudW1iZXJ9IGNvdW50XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBoYXNoIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVIYXNoSWQoY291bnQgPSA2KSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpXG4gICAgLnRvU3RyaW5nKDM2KVxuICAgIC5zdWJzdHIoY291bnQpO1xufVxuXG4vKipcbiAqIERldGVjdCBjaHJvbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIHllcyBvciBub1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDaHJvbWUoKSB7XG4gIC8vIENocm9tZSAxK1xuICByZXR1cm4gd2luZG93LmNocm9tZSAmJiB3aW5kb3cuY2hyb21lLndlYnN0b3JlO1xufVxuXG4vKipcbiAqIHdoZXRoZXIgaXMgYW4gb2JqZWN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB5ZXMgb3Igbm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gIHJldHVybiAoXG4gICAgb2JqID09PSBPYmplY3Qob2JqKSAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nICYmICFBcnJheS5pc0FycmF5KG9iailcbiAgKTtcbn1cblxuLyoqXG4gKiBDYXBpdGFsaXplIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcGl0YWxpemVGaXJzdExldHRlcihzdHIpIHtcbiAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGNhbWVsIHN0eWxlIG5hbWVzIHRvIHRpdGxlXG4gKiBzdHJva2VDb2xvciAtPiBTdHJva2UgQ29sb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbFRvVGl0bGUoc3RyKSB7XG4gIGNvbnN0IGJyZWFrV29yZCA9IHN0ci5yZXBsYWNlKC8oW0EtWl0pL2csICcgJDEnKTtcbiAgcmV0dXJuIGNhcGl0YWxpemVGaXJzdExldHRlcihicmVha1dvcmQpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGltZyB1cmwgZm9yIGEgZ2l2ZW4gbWFwIGV4cG9ydCBvcHRpb25cbiAqIEBwYXJhbSBtb2RlIGV4cG9ydCBvcHRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gdXJsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIVE1MTWFwTW9kZVRpbGVVcmwobW9kZSkge1xuICByZXR1cm4gYGh0dHBzOi8vZDFhM2Y0c3BhenpycDQuY2xvdWRmcm9udC5uZXQva2VwbGVyLmdsL2RvY3VtZW50YXRpb24vbWFwLSR7bW9kZS50b0xvd2VyQ2FzZSgpfS1tb2RlLnBuZ2A7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3ROdWxsb3JVbmRlZmluZWQoZCkge1xuICByZXR1cm4gZCAhPT0gdW5kZWZpbmVkICYmIGQgIT09IG51bGw7XG59XG5cbi8qKlxuICogQ29udmVydHMgbm9uLWFycmF5cyB0byBhcnJheXMuICBMZWF2ZXMgYXJyYXlzIGFsb25lLiAgQ29udmVydHNcbiAqIHVuZGVmaW5lZCB2YWx1ZXMgdG8gZW1wdHkgYXJyYXlzIChbXSBpbnN0ZWFkIG9mIFt1bmRlZmluZWRdKS5cbiAqIE90aGVyd2lzZSwganVzdCByZXR1cm5zIFtpdGVtXSBmb3Igbm9uLWFycmF5IGl0ZW1zLlxuICpcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICogQHJldHVybnMge2FycmF5fSBib29tISBtdWNoIGFycmF5LiB2ZXJ5IGluZGV4ZWQuIHNvIHVzZWZ1bC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQXJyYXkoaXRlbSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBpdGVtO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpdGVtID09PSAndW5kZWZpbmVkJyB8fCBpdGVtID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFtpdGVtXTtcbn1cblxuLyoqXG4gKiBpbW11dGFibHkgaW5zZXJ0IHZhbHVlIHRvIGFuIEFycmF5IG9yIE9iamVjdFxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG9ialxuICogQHBhcmFtIHtOdW1iZXJ8U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9XG4gKi9cbmNvbnN0IGluc2VydFZhbHVlID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopICYmIHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFsuLi5vYmouc2xpY2UoMCwga2V5KSwgdmFsdWUsIC4uLm9iai5zbGljZShrZXkgKyAxLCBvYmoubGVuZ3RoKV07XG4gIH1cblxuICByZXR1cm4gey4uLm9iaiwgW2tleV06IHZhbHVlfTtcbn07XG5cbi8qKlxuICogY2hlY2sgaWYgdmFsdWUgaXMgYSBsb29zZSBvYmplY3QgaW5jbHVkaW5nIGEgcGxhaW4gb2JqZWN0LCBhcnJheSwgZnVuY3Rpb25cbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKVxuICApO1xufVxuXG5jb25zdCBzZXRQYXRoID0gKFtrZXksIC4uLm5leHRdLCB2YWx1ZSwgb2JqKSA9PiB7XG4gIC8vIGlzIE9iamVjdCBhbGxvd3MganMgb2JqZWN0LCBhcnJheSBhbmQgZnVuY3Rpb25cbiAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChuZXh0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBpbnNlcnRWYWx1ZShvYmosIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIGluc2VydFZhbHVlKFxuICAgIG9iaixcbiAgICBrZXksXG4gICAgc2V0UGF0aChuZXh0LCB2YWx1ZSwgb2JqLmhhc093blByb3BlcnR5KGtleSkgPyBvYmpba2V5XSA6IHt9KVxuICApO1xufTtcblxuLyoqXG4gKiBJbW11dGFibGUgdmVyc2lvbiBvZiBfLnNldFxuICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuZXhwb3J0IGNvbnN0IHNldCA9IChwYXRoLCB2YWx1ZSwgb2JqKSA9PlxuICBvYmogPT09IG51bGwgPyBvYmogOiBzZXRQYXRoKHBhdGgsIHZhbHVlLCBvYmopO1xuXG4vKipcbiAqIEdldCBlcnJvciBpbmZvcm1hdGlvbiBvZiB1bmtub3duIHR5cGVcbiAqIEV4dHJhY3RzIGFzIG11Y2ggaHVtYW4gcmVhZGFibGUgaW5mb3JtYXRpb24gYXMgcG9zc2libGVcbiAqIEVuc3VyZSByZXN1bHQgaXMgYW4gRXJyb3Igb2JqZWN0IHN1aXRhYmxlIGZvciB0aHJvdyBvciBwcm9taXNlIHJlamVjdGlvblxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9ICBlcnIgLSBVbmtub3duIGVycm9yXG4gKiBAcmV0dXJuIHtzdHJpbmd9IC0gaHVtYW4gcmVhZGFibGUgZXJyb3IgbXNnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvcihlcnIpIHtcbiAgaWYgKCFlcnIpIHtcbiAgICByZXR1cm4gJ1NvbWV0aGluZyB3ZW50IHdyb25nJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgZXJyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBlcnI7XG4gIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gZXJyLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyciA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZXJyLmVycm9yXG4gICAgICA/IGdldEVycm9yKGVyci5lcnJvcilcbiAgICAgIDogZXJyLmVyclxuICAgICAgPyBnZXRFcnJvcihlcnIuZXJyKVxuICAgICAgOiBlcnIubWVzc2FnZVxuICAgICAgPyBnZXRFcnJvcihlcnIubWVzc2FnZSlcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkoZXJyKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl19