{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","vizicities-worker.min.js","webpack:/webpack/bootstrap 8912944b678b5a293f37","webpack:///src/vizicities-worker.js","webpack:///src/geo/Geo.js","webpack:///src/geo/LatLon.js","webpack:///src/geo/Point.js","webpack:///src/layer/Layer.js","webpack:///~/eventemitter3/index.js","webpack:///~/lodash.assign/index.js","webpack:///~/lodash.keys/index.js","webpack:///~/lodash.rest/index.js","webpack:///~/shortid/index.js","webpack:///~/shortid/lib/index.js","webpack:///~/shortid/lib/alphabet.js","webpack:///~/shortid/lib/random/random-from-seed.js","webpack:///~/shortid/lib/encode.js","webpack:///~/shortid/lib/random/random-byte-browser.js","webpack:///~/shortid/lib/decode.js","webpack:///~/shortid/lib/is-valid.js","webpack:///~/shortid/lib/util/cluster-worker-id-browser.js","webpack:/external \"THREE\"","webpack:///src/engine/Scene.js","webpack:///src/vendor/CSS3DRenderer.js","webpack:///src/vendor/CSS2DRenderer.js","webpack:///src/layer/GeoJSONWorkerLayer.js","webpack:///~/reqwest/reqwest.js","webpack:///src/util/GeoJSON.js","webpack:///~/topojson/build/topojson.js","webpack:///~/geojson-merge/index.js","webpack:///~/geojson-normalize/index.js","webpack:///~/earcut/src/earcut.js","webpack:///src/util/extrudePolygon.js","webpack:///src/util/Worker.js","webpack:///src/util/WorkerPool.js","webpack:///src/util/WorkerPoolWorker.js","webpack:///src/util/Buffer.js","webpack:///src/util/Stringify.js","webpack:///src/layer/geometry/PolygonLayer.js","webpack:///src/engine/PickingMaterial.js","webpack:///src/engine/PickingShader.js","webpack:///src/layer/geometry/PolylineLayer.js","webpack:///src/layer/geometry/PointLayer.js","webpack:///src/util/index.js","webpack:///src/util/wrapNum.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_18__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_geoGeoJs","_geoGeoJs2","_layerLayer","_layerLayer2","_layerGeoJSONWorkerLayer","_layerGeoJSONWorkerLayer2","_layerGeometryPolygonLayer","_layerGeometryPolygonLayer2","_geoPoint","_geoPoint2","_geoLatLon","_geoLatLon2","_utilIndex","_utilIndex2","VIZI","version","Geo","Layer","layer","GeoJSONWorkerLayer","geoJSONWorkerLayer","PolygonLayer","polygonLayer","Point","point","LatLon","latLon","Util","_LatLon","_Point","R","MAX_LATITUDE","ECC","ECC2","project","latlon","d","Math","PI","max","lat","min","sin","lon","log","unproject","atan","exp","y","x","latLonToPoint","projected","pointToLatLon","_point","pointScale","accurate","k","rad","a","sinLat","sinLat2","cosLat","cos","pow","v","sqrt","h","metresToProjected","metres","projectedToMetres","projectedUnits","metresToWorld","projectedMetres","scale","scaledMetres","worldToMetres","worldUnits","realMetres","zoom","LN2","distance","latlon1","latlon2","lat1","lat2","lon1","lon2","deltaLat","deltaLon","halfDeltaLat","halfDeltaLon","atan2","acos","bounds","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","prototype","alt","isNaN","Error","undefined","noNew","b","Array","isArray","lng","round","clone","_add","_subtract","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_get","_x","_x2","_x3","_again","object","property","receiver","Function","desc","getOwnPropertyDescriptor","getter","get","parent","getPrototypeOf","_eventemitter3","_eventemitter32","_lodashAssign","_lodashAssign2","_shortid","_shortid2","_three","_three2","_engineScene","_vendorCSS3DRenderer","_vendorCSS2DRenderer","_EventEmitter","options","defaults","generate","output","outputToScene","_options","isOutput","_object3D","Object3D","_dom3D","document","createElement","_domObject3D","CSS3DObject","_dom2D","_domObject2D","CSS2DObject","add","remove","world","addLayer","_this","_world","Promise","resolve","reject","_onAdd","then","emit","_engine","_picking","getNextId","visible","_pickingMesh","children","child","geometry","dispose","material","map","removeDOM3D","removeDOM2D","EE","fn","context","once","EventEmitter","has","hasOwnProperty","prefix","_events","eventNames","name","events","names","push","slice","getOwnPropertySymbols","concat","listeners","event","exists","evt","available","l","ee","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","on","listener","removeAllListeners","off","addListener","setMaxListeners","prefixed","assignValue","objValue","eq","baseProperty","copyObject","source","customizer","index","newValue","createAssigner","assigner","rest","sources","guard","isIterateeCall","isIndex","MAX_SAFE_INTEGER","reIsUint","test","isObject","type","isArrayLike","isPrototype","Ctor","proto","objectProto","other","isLength","getLength","isFunction","tag","objectToString","funcTag","genTag","keys","toString","propertyIsEnumerable","nonEnumShadows","valueOf","assign","baseTimes","n","iteratee","result","baseHas","getPrototype","baseKeys","nativeKeys","nativeGetPrototype","indexKeys","isString","isArguments","String","isArrayLikeObject","argsTag","isObjectLike","stringTag","isProto","indexes","skipIndexes","func","thisArg","start","FUNC_ERROR_TEXT","nativeMax","toInteger","array","otherArgs","isSymbol","symbolTag","toFinite","toNumber","INFINITY","sign","MAX_INTEGER","remainder","NAN","replace","reTrim","isBinary","reIsBinary","reIsOctal","freeParseInt","reIsBadHex","parseInt","str","seconds","floor","Date","now","REDUCE_TIME","previousSeconds","counter","encode","alphabet","lookup","clusterWorkerId","seed","seedValue","worker","workerId","characters","newCharacters","shuffled","decode","isValid","reset","setCharacters","_alphabet_","ORIGINAL","unique","split","filter","item","ind","arr","lastIndexOf","join","setSeed","randomFromSeed","previousSeed","shuffle","characterIndex","sourceArray","targetArray","r","nextValue","splice","getShuffled","alphabetShuffled","getNextValue","_seed_","number","done","loopCounter","randomByte","crypto","getRandomValues","random","dest","Uint8Array","window","msCrypto","indexOf","substr","isShortId","scene","Scene","element","style","position","addEventListener","parentNode","removeChild","CSS3DSprite","CSS3DRenderer","console","REVISION","_width","_height","_widthHalf","_heightHalf","matrix","Matrix4","cache","camera","fov","objects","domElement","overflow","WebkitTransformStyle","MozTransformStyle","oTransformStyle","transformStyle","cameraElement","appendChild","setClearColor","getSize","width","height","setSize","epsilon","abs","Number","EPSILON","getCameraCSSMatrix","elements","getObjectCSSMatrix","renderObject","copy","matrixWorldInverse","transpose","copyPosition","matrixWorld","cachedStyle","WebkitTransform","MozTransform","oTransform","transform","render","tan","degToRad","WebkitPerspective","MozPerspective","oPerspective","perspective","updateMatrixWorld","getInverse","CSS2DRenderer","vector","Vector3","viewMatrix","viewProjectionMatrix","frustum","Frustum","setFromMatrixPosition","applyProjection","containsPoint","display","multiplyMatrices","projectionMatrix","setFromMatrix","_slicedToArray","sliceIterator","_arr","_n","_d","_e","_s","_i","Symbol","iterator","next","err","_Layer2","_Layer3","_reqwest","_reqwest2","_utilGeoJSON","_utilGeoJSON2","_utilWorker","_utilWorker2","_utilBuffer","_utilBuffer2","_utilStringify","_utilStringify2","_geometryPolygonLayer","_geometryPolygonLayer2","_geometryPolylineLayer","_geometryPolylineLayer2","_geometryPointLayer","_geometryPointLayer2","_geoGeo","_geoGeo2","_enginePickingMaterial","_Layer","geojson","topojson","defaultStyle","onEachFeature","onEachFeatureWorker","onAddAttributes","interactive","pointGeometry","onClick","headers","_aborted","_geojson","THREE","_process","functionToString","transferrables","stringToUint8Array","JSON","stringify","buffer","_execWorker","_originPoint","RequestGeoJSON","res","fc","collectFeatures","features","feature","originPoint","_this2","time","exec","results","timeEnd","processPromises","polygons","_processPolygonResults","polylines","_processPolylineResults","points","_processPointResults","all","_this3","splitOutlinePositions","splitOutlineColors","splitPositions","splitFloat32Array","attributes","positions","splitNormals","normals","splitColors","colors","splitTops","tops","outlineAttributes","splitProperties","properties","splitUint8Array","pickingId","pickingIds","flats","outlineObjects","polygonAttributeLengths","polygonOutlineAttributeLengths","parse","uint8ArrayToString","flat","getPickingId","Float32Array","fill","_addPicking","customAttribute","customAttributes","polygonAttributes","polygonOutlineAttributes","polygonFlat","bufferAttributes","mergeAttributes","outputPromises","mergedPolygonAttributes","_setPolygonMesh","mergedPolygonOutlineAttributes","outlineRenderOrder","lineRenderOrder","renderOrder","outlineWidth","lineWidth","_setPolylineMesh","_results","polygonResult","outlineResult","_polygonMesh","mesh","pickingMesh","_this4","polylineAttributeLengths","polylineAttributes","polylineFlat","mergedPolylineAttributes","_polylineMesh","_this5","pointAttributeLengths","pointAttributes","pointFlat","mergedPointAttributes","_setPointMesh","_pointMesh","attributeLengths","SetMesh","_environment","_skybox","_this6","point2d","point3d","intersects","_style","_properties","_pointGeometry","ProcessGeoJSON","stringToFunction","coordinates","isSingle","converted","_coordinates","ring","coordinate","polygon","polyline","polygonBufferPromises","polylineBufferPromises","pointBufferPromises","SetBufferAttributes","data","ProcessPolygons","ProcessPolylines","ProcessPoints","polygonPromises","outlinePositions","outlineColors","mergedAttributes","mergeFloat32Arrays","mergedOutlineAttributes","mergedProperties","mergeUint8Arrays","polylinePromises","pointPromises","path","url","crossOrigin","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_RESULT__","definition","succeed","protocol","protocolRe","location","httpsRe","twoHundo","request","status","response","handleReadyState","success","error","_timedOut","readyState","onreadystatechange","noop","setHeaders","http","o","defaultHeaders","isAFormData","FormData","requestedWith","contentType","setRequestHeader","setCredentials","withCredentials","generalCallback","lastValue","urlappend","s","handleJsonp","reqId","uniqid","cbkey","cbval","reqwest","getcallbackPrefix","cbreg","RegExp","match","script","doc","isIE10","navigator","userAgent","src","async","htmlFor","onload","onclick","head","abort","getRequest","method","toUpperCase","toQueryString","sendWait","xhr","open","xDomainRequest","onerror","onprogress","setTimeout","send","Reqwest","init","setType","header","complete","resp","clearTimeout","self","timeout","_completeHandlers","shift","getResponseHeader","filteredResponse","globalSetupOptions","dataFilter","responseText","e","eval","responseXML","parseError","errorCode","reason","_responseArgs","_fulfilled","_successHandler","_fulfillmentHandlers","timedOut","msg","t","_erred","_errorHandlers","normalize","serial","el","cb","ch","ra","val","tagName","toLowerCase","optCb","disabled","checked","selectedIndex","selected","eachFormElement","serializeSubtags","tags","fa","byTag","serializeQueryString","serializeArray","serializeHash","hash","buildParams","traditional","rbracket","XHR2","ex","callbackPrefix","xmlHttpRequest","accept","*","xml","html","text","json","js","XMLHttpRequest","XDomainRequest","ActiveXObject","retry","fail","always","catch","serialize","opt","pop","nodeType","trad","enc","encodeURIComponent","compat","ajaxSetup","_interopRequireWildcard","newObj","_topojson2","_geojsonMerge","_geojsonMerge2","_earcut","_earcut2","_extrudePolygon","_extrudePolygon2","light","Color","shadow","GeoJSON","color","outline","outlineColor","transparent","opacity","blending","NormalBlending","lineOpacity","lineTransparent","lineColor","lineBlending","_topojson","collections","tk","gk","lineStringAttributes","colour","nextCoord","_coords","_colours","forEach","g","vertices","colours","multiLineStringAttributes","coord","earcutData","_toEarcut","faces","_triangulate","holes","dimensions","groupedVertices","il","_colour","extruded","bottom","top","topColor","multiply","bottomColor","_vertices","_faces","face","fi","allFlat","sides","dim","holeIndex","contour","global","transformAbsolute","x0","y0","kx","ky","dx","translate","dy","transformRelative","x1","y1","reverse","bisect","lo","hi","mid","topology","geometries","feature$1","f","arc","arcs","absolute","line","geometryType","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","stitchArcs","ends","p1","p0","dp","flush","fragmentByEnd","fragmentByStart","end","stitchedArcs","fragments","emptyIndex","fg","unshift","gf","meshArcs","geomsByArc","geom","geoms","cartesianTriangleArea","triangle","area","merge","mergeArcs","register","ring$$","polygonsByArc","components","_","component","neighbors","ki","indexesByArc","ij","ik","compareArea","minAreaHeap","up","down","size","heap","removed","presimplify","triangleArea","update","relative","triangles","maxArea","Infinity","previous","inputs","reduce","memo","input","gj","types","GeometryCollection","Feature","FeatureCollection","earcut","holeIndices","hasHoles","outerLen","outerNode","linkedList","minX","minY","maxX","maxY","eliminateHoles","earcutLinked","clockwise","last","signedArea","insertNode","equals","removeNode","filterPoints","again","steiner","prev","ear","pass","indexCurve","stop","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","zOrder","maxZ","nextZ","z","prevZ","locallyInside","isValidDiagonal","splitPolygon","list","queue","getLeftmost","sort","compareX","eliminateHole","hole","findHoleBridge","hx","hy","qx","mx","my","tanMin","sortLinked","q","tail","numMerges","pSize","qSize","inSize","leftmost","ax","ay","bx","by","cx","cy","px","py","intersectsPolygon","middleInside","p2","q1","q2","inside","Node","b2","an","bp","sum","deviation","polygonArea","trianglesArea","flatten","extrudePolygon","cells","topCells","full","sideCells","closed","bottomCells","_WorkerPool","_WorkerPool2","Worker","pool","_maxWorkers","createWorkers","maxWorkers","workerScript","numThreads","_WorkerPoolWorker","_WorkerPoolWorker2","DEBUG","WorkerPool","workers","tasks","workerPromises","createWorker","performance","find","busy","deferred","task","processTasks","promise","getFreeWorker","WorkerPoolWorker","ready","onStartup","removeEventListener","onMessage","postMessage","payload","Buffer","arrays","Int32Array","lastIndex","_array","set","mergedArray","subarray","lengths","_attributes","lastLengths","createLineGeometry","lines","offset","BufferGeometry","verticesCount","_pickingId","az","c1","addAttribute","BufferAttribute","computeBoundingBox","createGeometry","facesCount","pA","pB","pC","ab","bz","c2","cz","c3","subVectors","cross","nx","ny","nz","textEncoder","TextEncoder","textDecoder","TextDecoder","Stringify","_earcut3","_utilExtrudePolygon","_utilExtrudePolygon2","_enginePickingMaterial2","polygonMaterial","onPolygonMesh","onBufferAttributes","_setCoordinates","addToPicking","_setPickingId","_addPickingEvents","_projectedCoordinates","_bufferAttributes","_outlineBufferAttributes","_flat","_center","_bounds","_convertCoordinates","_projectedBounds","_projectCoordinates","_offset","clearCoordinates","clearBufferAttributes","ToEarcut","Triangulate","_tops","outlineColour","Set2DOutline","ToAttributes","_ring","verticeCount","first","skybox","Material","MeshStandardMaterial","vertexColors","VertexColors","side","BackSide","roughness","metalness","envMapIntensity","envMap","getRenderTarget","MeshPhongMaterial","Mesh","castShadow","receiveShadow","depthWrite","t1","t2","t3","_PickingShader","_PickingShader2","PickingMaterial","ShaderMaterial","uniforms","vertexShader","fragmentShader","linePadding","setPointSize","setPointScale","PickingShader","PolylineLayer","polylineMaterial","onPolylineMesh","lineHeight","LineBasicMaterial","linewidth","LineSegments","polylineLayer","_PolygonLayer","PointLayer","pointMaterial","onPointMesh","pointColor","pointHeight","Geometry","geometryWidth","geometryHeight","_geometry","BoxGeometry","fromGeometry","_normals","normal","pointLayer","_wrapNum","_wrapNum2","_GeoJSON","_GeoJSON2","_Buffer","_Buffer2","_Worker","_Worker2","_Stringify","_Stringify2","wrapNum","range","includeMax"],"mappings":"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","file":"vizicities-worker.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_18__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_18__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _geoGeoJs = __webpack_require__(1);\n\t\n\tvar _geoGeoJs2 = _interopRequireDefault(_geoGeoJs);\n\t\n\tvar _layerLayer = __webpack_require__(4);\n\t\n\tvar _layerLayer2 = _interopRequireDefault(_layerLayer);\n\t\n\tvar _layerGeoJSONWorkerLayer = __webpack_require__(22);\n\t\n\tvar _layerGeoJSONWorkerLayer2 = _interopRequireDefault(_layerGeoJSONWorkerLayer);\n\t\n\tvar _layerGeometryPolygonLayer = __webpack_require__(36);\n\t\n\tvar _layerGeometryPolygonLayer2 = _interopRequireDefault(_layerGeometryPolygonLayer);\n\t\n\tvar _geoPoint = __webpack_require__(3);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(2);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _utilIndex = __webpack_require__(41);\n\t\n\tvar _utilIndex2 = _interopRequireDefault(_utilIndex);\n\t\n\tvar VIZI = {\n\t version: '0.3',\n\t\n\t Geo: _geoGeoJs2['default'],\n\t Layer: _layerLayer2['default'],\n\t layer: _layerLayer.layer,\n\t GeoJSONWorkerLayer: _layerGeoJSONWorkerLayer2['default'],\n\t geoJSONWorkerLayer: _layerGeoJSONWorkerLayer.geoJSONWorkerLayer,\n\t PolygonLayer: _layerGeometryPolygonLayer2['default'],\n\t polygonLayer: _layerGeometryPolygonLayer.polygonLayer,\n\t Point: _geoPoint2['default'],\n\t point: _geoPoint.point,\n\t LatLon: _geoLatLon2['default'],\n\t latLon: _geoLatLon.latLon,\n\t Util: _utilIndex2['default']\n\t};\n\t\n\texports['default'] = VIZI;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _LatLon = __webpack_require__(2);\n\t\n\tvar _Point = __webpack_require__(3);\n\t\n\tvar Geo = {};\n\t\n\t// Radius / WGS84 semi-major axis\n\tGeo.R = 6378137;\n\tGeo.MAX_LATITUDE = 85.0511287798;\n\t\n\t// WGS84 eccentricity\n\tGeo.ECC = 0.081819191;\n\tGeo.ECC2 = 0.081819191 * 0.081819191;\n\t\n\tGeo.project = function (latlon) {\n\t var d = Math.PI / 180;\n\t var max = Geo.MAX_LATITUDE;\n\t var lat = Math.max(Math.min(max, latlon.lat), -max);\n\t var sin = Math.sin(lat * d);\n\t\n\t return (0, _Point.point)(Geo.R * latlon.lon * d, Geo.R * Math.log((1 + sin) / (1 - sin)) / 2);\n\t}, Geo.unproject = function (point) {\n\t var d = 180 / Math.PI;\n\t\n\t return (0, _LatLon.latLon)((2 * Math.atan(Math.exp(point.y / Geo.R)) - Math.PI / 2) * d, point.x * d / Geo.R);\n\t};\n\t\n\t// Converts geo coords to pixel / WebGL ones\n\t// This just reverses the Y axis to match WebGL\n\tGeo.latLonToPoint = function (latlon) {\n\t var projected = Geo.project(latlon);\n\t projected.y *= -1;\n\t\n\t return projected;\n\t};\n\t\n\t// Converts pixel / WebGL coords to geo coords\n\t// This just reverses the Y axis to match WebGL\n\tGeo.pointToLatLon = function (point) {\n\t var _point = (0, _Point.point)(point.x, point.y * -1);\n\t return Geo.unproject(_point);\n\t};\n\t\n\t// Scale factor for converting between real metres and projected metres\n\t//\n\t// projectedMetres = realMetres * pointScale\n\t// realMetres = projectedMetres / pointScale\n\t//\n\t// Accurate scale factor uses proper Web Mercator scaling\n\t// See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t// See: http://jsfiddle.net/robhawkes/yws924cf/\n\tGeo.pointScale = function (latlon, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var k;\n\t\n\t if (!accurate) {\n\t k = 1 / Math.cos(latlon.lat * rad);\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t } else {\n\t var lat = latlon.lat * rad;\n\t var lon = latlon.lon * rad;\n\t\n\t var a = Geo.R;\n\t\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t\n\t var cosLat = Math.cos(lat);\n\t\n\t // Radius meridian\n\t var p = a * (1 - Geo.ECC2) / Math.pow(1 - Geo.ECC2 * sinLat2, 3 / 2);\n\t\n\t // Radius prime meridian\n\t var v = a / Math.sqrt(1 - Geo.ECC2 * sinLat2);\n\t\n\t // Scale N/S\n\t var h = a / p / cosLat;\n\t\n\t // Scale E/W\n\t k = a / v / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, h];\n\t }\n\t};\n\t\n\t// Convert real metres to projected units\n\t//\n\t// Latitude scale is chosen because it fluctuates more than longitude\n\tGeo.metresToProjected = function (metres, pointScale) {\n\t return metres * pointScale[1];\n\t};\n\t\n\t// Convert projected units to real metres\n\t//\n\t// Latitude scale is chosen because it fluctuates more than longitude\n\tGeo.projectedToMetres = function (projectedUnits, pointScale) {\n\t return projectedUnits / pointScale[1];\n\t};\n\t\n\t// Convert real metres to a value in world (WebGL) units\n\tGeo.metresToWorld = function (metres, pointScale) {\n\t // Transform metres to projected metres using the latitude point scale\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t var projectedMetres = Geo.metresToProjected(metres, pointScale);\n\t\n\t var scale = Geo.scale();\n\t\n\t // Scale projected metres\n\t var scaledMetres = scale * projectedMetres;\n\t\n\t return scaledMetres;\n\t};\n\t\n\t// Convert world (WebGL) units to a value in real metres\n\tGeo.worldToMetres = function (worldUnits, pointScale) {\n\t var scale = Geo.scale();\n\t\n\t var projectedUnits = worldUnits / scale;\n\t var realMetres = Geo.projectedToMetres(projectedUnits, pointScale);\n\t\n\t return realMetres;\n\t};\n\t\n\t// If zoom is provided, returns the map width in pixels for a given zoom\n\t// Else, provides fixed scale value\n\tGeo.scale = function (zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom >= 0) {\n\t return 256 * Math.pow(2, zoom);\n\t // Else, return fixed scale value to expand projected coordinates from\n\t // their 0 to 1 range into something more practical\n\t } else {\n\t return 1;\n\t }\n\t};\n\t\n\t// Returns zoom level for a given scale value\n\t// This only works with a scale value that is based on map pixel width\n\tGeo.zoom = function (scale) {\n\t return Math.log(scale / 256) / Math.LN2;\n\t};\n\t\n\t// Distance between two geographical points using spherical law of cosines\n\t// approximation or Haversine\n\t//\n\t// See: http://www.movable-type.co.uk/scripts/latlong.html\n\tGeo.distance = function (latlon1, latlon2, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var lat1;\n\t var lat2;\n\t\n\t var a;\n\t\n\t if (!accurate) {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\t\n\t return Geo.R * Math.acos(Math.min(a, 1));\n\t } else {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t var lon1 = latlon1.lon * rad;\n\t var lon2 = latlon2.lon * rad;\n\t\n\t var deltaLat = lat2 - lat1;\n\t var deltaLon = lon2 - lon1;\n\t\n\t var halfDeltaLat = deltaLat / 2;\n\t var halfDeltaLon = deltaLon / 2;\n\t\n\t a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\t\n\t var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\n\t return Geo.R * c;\n\t }\n\t};\n\t\n\tGeo.bounds = (function () {\n\t var d = Geo.R * Math.PI;\n\t return [[-d, -d], [d, d]];\n\t})();\n\t\n\texports['default'] = Geo;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * LatLon is a helper class for ensuring consistent geographic coordinates.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n\t */\n\t\n\tvar LatLon = (function () {\n\t function LatLon(lat, lon, alt) {\n\t _classCallCheck(this, LatLon);\n\t\n\t if (isNaN(lat) || isNaN(lon)) {\n\t throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n\t }\n\t\n\t this.lat = +lat;\n\t this.lon = +lon;\n\t\n\t if (alt !== undefined) {\n\t this.alt = +alt;\n\t }\n\t }\n\t\n\t _createClass(LatLon, [{\n\t key: 'clone',\n\t value: function clone() {\n\t return new LatLon(this.lat, this.lon, this.alt);\n\t }\n\t }]);\n\t\n\t return LatLon;\n\t})();\n\t\n\texports['default'] = LatLon;\n\t\n\t// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n\t// Also converts between lng and lon\n\tvar noNew = function noNew(a, b, c) {\n\t if (a instanceof LatLon) {\n\t return a;\n\t }\n\t if (Array.isArray(a) && typeof a[0] !== 'object') {\n\t if (a.length === 3) {\n\t return new LatLon(a[0], a[1], a[2]);\n\t }\n\t if (a.length === 2) {\n\t return new LatLon(a[0], a[1]);\n\t }\n\t return null;\n\t }\n\t if (a === undefined || a === null) {\n\t return a;\n\t }\n\t if (typeof a === 'object' && 'lat' in a) {\n\t return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n\t }\n\t if (b === undefined) {\n\t return null;\n\t }\n\t return new LatLon(a, b, c);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports.latLon = noNew;\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * Point is a helper class for ensuring consistent world positions.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n\t */\n\t\n\tvar Point = (function () {\n\t function Point(x, y, round) {\n\t _classCallCheck(this, Point);\n\t\n\t this.x = round ? Math.round(x) : x;\n\t this.y = round ? Math.round(y) : y;\n\t }\n\t\n\t _createClass(Point, [{\n\t key: \"clone\",\n\t value: function clone() {\n\t return new Point(this.x, this.y);\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"add\",\n\t value: function add(point) {\n\t return this.clone()._add(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_add\",\n\t value: function _add(point) {\n\t this.x += point.x;\n\t this.y += point.y;\n\t return this;\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"subtract\",\n\t value: function subtract(point) {\n\t return this.clone()._subtract(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_subtract\",\n\t value: function _subtract(point) {\n\t this.x -= point.x;\n\t this.y -= point.y;\n\t return this;\n\t }\n\t }]);\n\t\n\t return Point;\n\t})();\n\t\n\texports[\"default\"] = Point;\n\t\n\t// Accepts (point), ([x, y]) and (x, y, round)\n\tvar _point = function _point(x, y, round) {\n\t if (x instanceof Point) {\n\t return x;\n\t }\n\t if (Array.isArray(x)) {\n\t return new Point(x[0], x[1]);\n\t }\n\t if (x === undefined || x === null) {\n\t return x;\n\t }\n\t return new Point(x, y, round);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports.point = _point;\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(5);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _lodashAssign = __webpack_require__(6);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _shortid = __webpack_require__(9);\n\t\n\tvar _shortid2 = _interopRequireDefault(_shortid);\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _engineScene = __webpack_require__(19);\n\t\n\tvar _engineScene2 = _interopRequireDefault(_engineScene);\n\t\n\tvar _vendorCSS3DRenderer = __webpack_require__(20);\n\t\n\tvar _vendorCSS2DRenderer = __webpack_require__(21);\n\t\n\t// TODO: Make sure nothing is left behind in the heap after calling destroy()\n\t\n\t// TODO: Need a single move method that handles moving all the various object\n\t// layers so that the DOM layers stay in sync with the 3D layer\n\t\n\t// TODO: Double check that objects within the _object3D Object3D parent are frustum\n\t// culled even if the layer position stays at the default (0,0,0) and the child\n\t// objects are positioned much further away\n\t//\n\t// Or does the layer being at (0,0,0) prevent the child objects from being\n\t// culled because the layer parent is effectively always in view even if the\n\t// child is actually out of camera\n\t\n\tvar Layer = (function (_EventEmitter) {\n\t _inherits(Layer, _EventEmitter);\n\t\n\t function Layer(options) {\n\t _classCallCheck(this, Layer);\n\t\n\t _get(Object.getPrototypeOf(Layer.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t id: _shortid2['default'].generate(),\n\t output: true,\n\t outputToScene: true\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])({}, defaults, options);\n\t\n\t if (this.isOutput()) {\n\t this._object3D = new _three2['default'].Object3D();\n\t\n\t this._dom3D = document.createElement('div');\n\t this._domObject3D = new _vendorCSS3DRenderer.CSS3DObject(this._dom3D);\n\t\n\t this._dom2D = document.createElement('div');\n\t this._domObject2D = new _vendorCSS2DRenderer.CSS2DObject(this._dom2D);\n\t }\n\t }\n\t\n\t // Add THREE object directly to layer\n\t\n\t _createClass(Layer, [{\n\t key: 'add',\n\t value: function add(object) {\n\t this._object3D.add(object);\n\t }\n\t\n\t // Remove THREE object from to layer\n\t }, {\n\t key: 'remove',\n\t value: function remove(object) {\n\t this._object3D.remove(object);\n\t }\n\t }, {\n\t key: 'addDOM3D',\n\t value: function addDOM3D(object) {\n\t this._domObject3D.add(object);\n\t }\n\t }, {\n\t key: 'removeDOM3D',\n\t value: function removeDOM3D(object) {\n\t this._domObject3D.remove(object);\n\t }\n\t }, {\n\t key: 'addDOM2D',\n\t value: function addDOM2D(object) {\n\t this._domObject2D.add(object);\n\t }\n\t }, {\n\t key: 'removeDOM2D',\n\t value: function removeDOM2D(object) {\n\t this._domObject2D.remove(object);\n\t }\n\t\n\t // Add layer to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t return world.addLayer(this);\n\t }\n\t\n\t // Internal method called by World.addLayer to actually add the layer\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t var _this = this;\n\t\n\t this._world = world;\n\t\n\t return new Promise(function (resolve, reject) {\n\t _this._onAdd(world).then(function () {\n\t _this.emit('added');\n\t resolve(_this);\n\t })['catch'](reject);\n\t });\n\t }\n\t\n\t // Must return a promise\n\t }, {\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t return Promise.resolve(this);\n\t }\n\t }, {\n\t key: 'getPickingId',\n\t value: function getPickingId() {\n\t if (this._world._engine._picking) {\n\t return this._world._engine._picking.getNextId();\n\t }\n\t\n\t return false;\n\t }\n\t\n\t // TODO: Tidy this up and don't access so many private properties to work\n\t }, {\n\t key: 'addToPicking',\n\t value: function addToPicking(object) {\n\t if (!this._world._engine._picking) {\n\t return;\n\t }\n\t\n\t this._world._engine._picking.add(object);\n\t }\n\t }, {\n\t key: 'removeFromPicking',\n\t value: function removeFromPicking(object) {\n\t if (!this._world._engine._picking) {\n\t return;\n\t }\n\t\n\t this._world._engine._picking.remove(object);\n\t }\n\t }, {\n\t key: 'isOutput',\n\t value: function isOutput() {\n\t return this._options.output;\n\t }\n\t }, {\n\t key: 'isOutputToScene',\n\t value: function isOutputToScene() {\n\t return this._options.outputToScene;\n\t }\n\t\n\t // TODO: Also hide any attached DOM layers\n\t }, {\n\t key: 'hide',\n\t value: function hide() {\n\t this._object3D.visible = false;\n\t\n\t if (this._pickingMesh) {\n\t this._pickingMesh.visible = false;\n\t }\n\t }\n\t\n\t // TODO: Also show any attached DOM layers\n\t }, {\n\t key: 'show',\n\t value: function show() {\n\t this._object3D.visible = true;\n\t\n\t if (this._pickingMesh) {\n\t this._pickingMesh.visible = true;\n\t }\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t if (this._object3D && this._object3D.children) {\n\t // Remove everything else in the layer\n\t var child;\n\t for (var i = this._object3D.children.length - 1; i >= 0; i--) {\n\t child = this._object3D.children[i];\n\t\n\t if (!child) {\n\t continue;\n\t }\n\t\n\t this.remove(child);\n\t\n\t if (child.geometry) {\n\t // Dispose of mesh and materials\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t }\n\t\n\t if (child.material) {\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t }\n\t }\n\t }\n\t\n\t if (this._domObject3D && this._domObject3D.children) {\n\t // Remove everything else in the layer\n\t var child;\n\t for (var i = this._domObject3D.children.length - 1; i >= 0; i--) {\n\t child = this._domObject3D.children[i];\n\t\n\t if (!child) {\n\t continue;\n\t }\n\t\n\t this.removeDOM3D(child);\n\t }\n\t }\n\t\n\t if (this._domObject2D && this._domObject2D.children) {\n\t // Remove everything else in the layer\n\t var child;\n\t for (var i = this._domObject2D.children.length - 1; i >= 0; i--) {\n\t child = this._domObject2D.children[i];\n\t\n\t if (!child) {\n\t continue;\n\t }\n\t\n\t this.removeDOM2D(child);\n\t }\n\t }\n\t\n\t this._domObject3D = null;\n\t this._domObject2D = null;\n\t\n\t this._world = null;\n\t this._object3D = null;\n\t }\n\t }]);\n\t\n\t return Layer;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = Layer;\n\t\n\tvar noNew = function noNew(options) {\n\t return new Layer(options);\n\t};\n\t\n\texports.layer = noNew;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar has = Object.prototype.hasOwnProperty;\n\t\n\t//\n\t// We store our EE objects in a plain object whose properties are event names.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// `~` to make sure that the built-in object properties are not overridden or\n\t// used as an attack vector.\n\t// We also assume that `Object.create(null)` is available when the event name\n\t// is an ES6 Symbol.\n\t//\n\tvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\t\n\t/**\n\t * Representation of a single EventEmitter function.\n\t *\n\t * @param {Function} fn Event handler to be called.\n\t * @param {Mixed} context Context for function execution.\n\t * @param {Boolean} [once=false] Only emit once\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\t\n\t/**\n\t * Minimal EventEmitter interface that is molded against the Node.js\n\t * EventEmitter interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() { /* Nothing to set */ }\n\t\n\t/**\n\t * Hold the assigned EventEmitters by name.\n\t *\n\t * @type {Object}\n\t * @private\n\t */\n\tEventEmitter.prototype._events = undefined;\n\t\n\t/**\n\t * Return an array listing the events for which the emitter has registered\n\t * listeners.\n\t *\n\t * @returns {Array}\n\t * @api public\n\t */\n\tEventEmitter.prototype.eventNames = function eventNames() {\n\t var events = this._events\n\t , names = []\n\t , name;\n\t\n\t if (!events) return names;\n\t\n\t for (name in events) {\n\t if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n\t }\n\t\n\t if (Object.getOwnPropertySymbols) {\n\t return names.concat(Object.getOwnPropertySymbols(events));\n\t }\n\t\n\t return names;\n\t};\n\t\n\t/**\n\t * Return a list of assigned event listeners.\n\t *\n\t * @param {String} event The events that should be listed.\n\t * @param {Boolean} exists We only need to know if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events && this._events[evt];\n\t\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\t\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\t\n\t return ee;\n\t};\n\t\n\t/**\n\t * Emit an event to all registered event listeners.\n\t *\n\t * @param {String} event The name of the event.\n\t * @returns {Boolean} Indication if we've emitted an event.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return false;\n\t\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\t\n\t if ('function' === typeof listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\t\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\t\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\t\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\t\n\t return true;\n\t};\n\t\n\t/**\n\t * Register a new EventListener for the given event.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} [context=this] The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Add an EventListener that's only called once.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} [context=this] The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove event listeners.\n\t *\n\t * @param {String} event The event we want to remove.\n\t * @param {Function} fn The listener that we need to find.\n\t * @param {Mixed} context Only remove listeners matching this context.\n\t * @param {Boolean} once Only remove once listeners.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return this;\n\t\n\t var listeners = this._events[evt]\n\t , events = [];\n\t\n\t if (fn) {\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn !== fn\n\t || (once && !listeners.once)\n\t || (context && listeners.context !== context)\n\t ) {\n\t events.push(listeners);\n\t }\n\t } else {\n\t for (var i = 0, length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) {\n\t this._events[evt] = events.length === 1 ? events[0] : events;\n\t } else {\n\t delete this._events[evt];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove all listeners or only the listeners for the specified event.\n\t *\n\t * @param {String} event The event want to remove all listeners for.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t if (!this._events) return this;\n\t\n\t if (event) delete this._events[prefix ? prefix + event : event];\n\t else this._events = prefix ? {} : Object.create(null);\n\t\n\t return this;\n\t};\n\t\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\t\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\t\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\t\n\t//\n\t// Expose the module.\n\t//\n\tif (true) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright jQuery Foundation and other contributors \n\t * Released under MIT license \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t */\n\tvar keys = __webpack_require__(7),\n\t rest = __webpack_require__(8);\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */\n\tvar nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new accessor function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property identifiers to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index];\n\t\n\t var newValue = customizer\n\t ? customizer(object[key], source[key], key, object, source)\n\t : source[key];\n\t\n\t assignValue(object, key, newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return rest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = (assigner.length > 3 && typeof customizer == 'function')\n\t ? (length--, customizer)\n\t : undefined;\n\t\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a\n\t * [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects\n\t * Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return !!length &&\n\t (typeof value == 'number' || reIsUint.test(value)) &&\n\t (value > -1 && value % 1 == 0 && value < length);\n\t}\n\t\n\t/**\n\t * Checks if the given arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n\t * else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)\n\t ) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Performs a\n\t * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null && isLength(getLength(value)) && !isFunction(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array and weak map constructors,\n\t // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on\n\t * [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' &&\n\t value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the\n\t * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n\t * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Assigns own enumerable string keyed properties of source objects to the\n\t * destination object. Source objects are applied from left to right.\n\t * Subsequent sources overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.10.0\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @see _.assignIn\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.e = 5;\n\t * }\n\t *\n\t * Foo.prototype.d = 4;\n\t * Bar.prototype.f = 6;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3, 'e': 5 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {\n\t copyObject(source, keys(source), object);\n\t return;\n\t }\n\t for (var key in source) {\n\t if (hasOwnProperty.call(source, key)) {\n\t assignValue(object, key, source[key]);\n\t }\n\t }\n\t});\n\t\n\tmodule.exports = assign;\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright jQuery Foundation and other contributors \n\t * Released under MIT license \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t stringTag = '[object String]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeGetPrototype = Object.getPrototypeOf,\n\t nativeKeys = Object.keys;\n\t\n\t/**\n\t * The base implementation of `_.has` without support for deep paths.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} key The key to check.\n\t * @returns {boolean} Returns `true` if `key` exists, else `false`.\n\t */\n\tfunction baseHas(object, key) {\n\t // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n\t // that are composed entirely of index properties, return `false` for\n\t // `hasOwnProperty` checks of them.\n\t return hasOwnProperty.call(object, key) ||\n\t (typeof object == 'object' && key in object && getPrototype(object) === null);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't skip the constructor\n\t * property of prototypes or treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t return nativeKeys(Object(object));\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new accessor function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a\n\t * [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects\n\t * Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Gets the `[[Prototype]]` of `value`.\n\t *\n\t * @private\n\t * @param {*} value The value to query.\n\t * @returns {null|Object} Returns the `[[Prototype]]`.\n\t */\n\tfunction getPrototype(value) {\n\t return nativeGetPrototype(Object(value));\n\t}\n\t\n\t/**\n\t * Creates an array of index keys for `object` values of arrays,\n\t * `arguments` objects, and strings, otherwise `null` is returned.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array|null} Returns index keys, else `null`.\n\t */\n\tfunction indexKeys(object) {\n\t var length = object ? object.length : undefined;\n\t if (isLength(length) &&\n\t (isArray(object) || isString(object) || isArguments(object))) {\n\t return baseTimes(length, String);\n\t }\n\t return null;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return !!length &&\n\t (typeof value == 'number' || reIsUint.test(value)) &&\n\t (value > -1 && value % 1 == 0 && value < length);\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @type {Function}\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null && isLength(getLength(value)) && !isFunction(value);\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array and weak map constructors,\n\t // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on\n\t * [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' &&\n\t value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the\n\t * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n\t * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @since 0.1.0\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\tfunction isString(value) {\n\t return typeof value == 'string' ||\n\t (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n\t}\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @since 0.1.0\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t var isProto = isPrototype(object);\n\t if (!(isProto || isArrayLike(object))) {\n\t return baseKeys(object);\n\t }\n\t var indexes = indexKeys(object),\n\t skipIndexes = !!indexes,\n\t result = indexes || [],\n\t length = result.length;\n\t\n\t for (var key in object) {\n\t if (baseHas(object, key) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n\t !(isProto && key == 'constructor')) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\tmodule.exports = keys;\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash (Custom Build) \n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright jQuery Foundation and other contributors \n\t * Released under MIT license \n\t * Based on Underscore.js 1.8.3 \n\t * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar INFINITY = 1 / 0,\n\t MAX_INTEGER = 1.7976931348623157e+308,\n\t NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t symbolTag = '[object Symbol]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {Array} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t var length = args.length;\n\t switch (length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the\n\t * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Creates a function that invokes `func` with the `this` binding of the\n\t * created function and arguments from `start` and beyond provided as\n\t * an array.\n\t *\n\t * **Note:** This method is based on the\n\t * [rest parameter](https://mdn.io/rest_parameters).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Function\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t * @example\n\t *\n\t * var say = _.rest(function(what, names) {\n\t * return what + ' ' + _.initial(names).join(', ') +\n\t * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n\t * });\n\t *\n\t * say('hello', 'fred', 'barney', 'pebbles');\n\t * // => 'hello fred, barney, & pebbles'\n\t */\n\tfunction rest(func, start) {\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t switch (start) {\n\t case 0: return func.call(this, array);\n\t case 1: return func.call(this, args[0], array);\n\t case 2: return func.call(this, args[0], args[1], array);\n\t }\n\t var otherArgs = Array(start + 1);\n\t index = -1;\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array and weak map constructors,\n\t // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the\n\t * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n\t * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 0.1.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Symbol` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified,\n\t * else `false`.\n\t * @example\n\t *\n\t * _.isSymbol(Symbol.iterator);\n\t * // => true\n\t *\n\t * _.isSymbol('abc');\n\t * // => false\n\t */\n\tfunction isSymbol(value) {\n\t return typeof value == 'symbol' ||\n\t (isObjectLike(value) && objectToString.call(value) == symbolTag);\n\t}\n\t\n\t/**\n\t * Converts `value` to a finite number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.12.0\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted number.\n\t * @example\n\t *\n\t * _.toFinite(3.2);\n\t * // => 3.2\n\t *\n\t * _.toFinite(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toFinite(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toFinite('3.2');\n\t * // => 3.2\n\t */\n\tfunction toFinite(value) {\n\t if (!value) {\n\t return value === 0 ? value : 0;\n\t }\n\t value = toNumber(value);\n\t if (value === INFINITY || value === -INFINITY) {\n\t var sign = (value < 0 ? -1 : 1);\n\t return sign * MAX_INTEGER;\n\t }\n\t return value === value ? value : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to an integer.\n\t *\n\t * **Note:** This function is loosely based on\n\t * [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.toInteger(3.2);\n\t * // => 3\n\t *\n\t * _.toInteger(Number.MIN_VALUE);\n\t * // => 0\n\t *\n\t * _.toInteger(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toInteger('3.2');\n\t * // => 3\n\t */\n\tfunction toInteger(value) {\n\t var result = toFinite(value),\n\t remainder = result % 1;\n\t\n\t return result === result ? (remainder ? result - remainder : result) : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @since 4.0.0\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3.2);\n\t * // => 3.2\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3.2');\n\t * // => 3.2\n\t */\n\tfunction toNumber(value) {\n\t if (typeof value == 'number') {\n\t return value;\n\t }\n\t if (isSymbol(value)) {\n\t return NAN;\n\t }\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = rest;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tmodule.exports = __webpack_require__(10);\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar alphabet = __webpack_require__(11);\n\tvar encode = __webpack_require__(13);\n\tvar decode = __webpack_require__(15);\n\tvar isValid = __webpack_require__(16);\n\t\n\t// Ignore all milliseconds before a certain time to reduce the size of the date entropy without sacrificing uniqueness.\n\t// This number should be updated every year or so to keep the generated id short.\n\t// To regenerate `new Date() - 0` and bump the version. Always bump the version!\n\tvar REDUCE_TIME = 1459707606518;\n\t\n\t// don't change unless we change the algos or REDUCE_TIME\n\t// must be an integer and less than 16\n\tvar version = 6;\n\t\n\t// if you are using cluster or multiple servers use this to make each instance\n\t// has a unique value for worker\n\t// Note: I don't know if this is automatically set when using third\n\t// party cluster solutions such as pm2.\n\tvar clusterWorkerId = __webpack_require__(17) || 0;\n\t\n\t// Counter is used when shortid is called multiple times in one second.\n\tvar counter;\n\t\n\t// Remember the last time shortid was called in case counter is needed.\n\tvar previousSeconds;\n\t\n\t/**\n\t * Generate unique id\n\t * Returns string id\n\t */\n\tfunction generate() {\n\t\n\t var str = '';\n\t\n\t var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);\n\t\n\t if (seconds === previousSeconds) {\n\t counter++;\n\t } else {\n\t counter = 0;\n\t previousSeconds = seconds;\n\t }\n\t\n\t str = str + encode(alphabet.lookup, version);\n\t str = str + encode(alphabet.lookup, clusterWorkerId);\n\t if (counter > 0) {\n\t str = str + encode(alphabet.lookup, counter);\n\t }\n\t str = str + encode(alphabet.lookup, seconds);\n\t\n\t return str;\n\t}\n\t\n\t\n\t/**\n\t * Set the seed.\n\t * Highly recommended if you don't want people to try to figure out your id schema.\n\t * exposed as shortid.seed(int)\n\t * @param seed Integer value to seed the random alphabet. ALWAYS USE THE SAME SEED or you might get overlaps.\n\t */\n\tfunction seed(seedValue) {\n\t alphabet.seed(seedValue);\n\t return module.exports;\n\t}\n\t\n\t/**\n\t * Set the cluster worker or machine id\n\t * exposed as shortid.worker(int)\n\t * @param workerId worker must be positive integer. Number less than 16 is recommended.\n\t * returns shortid module so it can be chained.\n\t */\n\tfunction worker(workerId) {\n\t clusterWorkerId = workerId;\n\t return module.exports;\n\t}\n\t\n\t/**\n\t *\n\t * sets new characters to use in the alphabet\n\t * returns the shuffled alphabet\n\t */\n\tfunction characters(newCharacters) {\n\t if (newCharacters !== undefined) {\n\t alphabet.characters(newCharacters);\n\t }\n\t\n\t return alphabet.shuffled();\n\t}\n\t\n\t\n\t// Export all other functions as properties of the generate function\n\tmodule.exports = generate;\n\tmodule.exports.generate = generate;\n\tmodule.exports.seed = seed;\n\tmodule.exports.worker = worker;\n\tmodule.exports.characters = characters;\n\tmodule.exports.decode = decode;\n\tmodule.exports.isValid = isValid;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar randomFromSeed = __webpack_require__(12);\n\t\n\tvar ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';\n\tvar alphabet;\n\tvar previousSeed;\n\t\n\tvar shuffled;\n\t\n\tfunction reset() {\n\t shuffled = false;\n\t}\n\t\n\tfunction setCharacters(_alphabet_) {\n\t if (!_alphabet_) {\n\t if (alphabet !== ORIGINAL) {\n\t alphabet = ORIGINAL;\n\t reset();\n\t }\n\t return;\n\t }\n\t\n\t if (_alphabet_ === alphabet) {\n\t return;\n\t }\n\t\n\t if (_alphabet_.length !== ORIGINAL.length) {\n\t throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);\n\t }\n\t\n\t var unique = _alphabet_.split('').filter(function(item, ind, arr){\n\t return ind !== arr.lastIndexOf(item);\n\t });\n\t\n\t if (unique.length) {\n\t throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));\n\t }\n\t\n\t alphabet = _alphabet_;\n\t reset();\n\t}\n\t\n\tfunction characters(_alphabet_) {\n\t setCharacters(_alphabet_);\n\t return alphabet;\n\t}\n\t\n\tfunction setSeed(seed) {\n\t randomFromSeed.seed(seed);\n\t if (previousSeed !== seed) {\n\t reset();\n\t previousSeed = seed;\n\t }\n\t}\n\t\n\tfunction shuffle() {\n\t if (!alphabet) {\n\t setCharacters(ORIGINAL);\n\t }\n\t\n\t var sourceArray = alphabet.split('');\n\t var targetArray = [];\n\t var r = randomFromSeed.nextValue();\n\t var characterIndex;\n\t\n\t while (sourceArray.length > 0) {\n\t r = randomFromSeed.nextValue();\n\t characterIndex = Math.floor(r * sourceArray.length);\n\t targetArray.push(sourceArray.splice(characterIndex, 1)[0]);\n\t }\n\t return targetArray.join('');\n\t}\n\t\n\tfunction getShuffled() {\n\t if (shuffled) {\n\t return shuffled;\n\t }\n\t shuffled = shuffle();\n\t return shuffled;\n\t}\n\t\n\t/**\n\t * lookup shuffled letter\n\t * @param index\n\t * @returns {string}\n\t */\n\tfunction lookup(index) {\n\t var alphabetShuffled = getShuffled();\n\t return alphabetShuffled[index];\n\t}\n\t\n\tmodule.exports = {\n\t characters: characters,\n\t seed: setSeed,\n\t lookup: lookup,\n\t shuffled: getShuffled\n\t};\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\t// Found this seed-based random generator somewhere\n\t// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)\n\t\n\tvar seed = 1;\n\t\n\t/**\n\t * return a random number based on a seed\n\t * @param seed\n\t * @returns {number}\n\t */\n\tfunction getNextValue() {\n\t seed = (seed * 9301 + 49297) % 233280;\n\t return seed/(233280.0);\n\t}\n\t\n\tfunction setSeed(_seed_) {\n\t seed = _seed_;\n\t}\n\t\n\tmodule.exports = {\n\t nextValue: getNextValue,\n\t seed: setSeed\n\t};\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tvar randomByte = __webpack_require__(14);\n\t\n\tfunction encode(lookup, number) {\n\t var loopCounter = 0;\n\t var done;\n\t\n\t var str = '';\n\t\n\t while (!done) {\n\t str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );\n\t done = number < (Math.pow(16, loopCounter + 1 ) );\n\t loopCounter++;\n\t }\n\t return str;\n\t}\n\t\n\tmodule.exports = encode;\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tvar crypto = typeof window === 'object' && (window.crypto || window.msCrypto); // IE 11 uses window.msCrypto\n\t\n\tfunction randomByte() {\n\t if (!crypto || !crypto.getRandomValues) {\n\t return Math.floor(Math.random() * 256) & 0x30;\n\t }\n\t var dest = new Uint8Array(1);\n\t crypto.getRandomValues(dest);\n\t return dest[0] & 0x30;\n\t}\n\t\n\tmodule.exports = randomByte;\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar alphabet = __webpack_require__(11);\n\t\n\t/**\n\t * Decode the id to get the version and worker\n\t * Mainly for debugging and testing.\n\t * @param id - the shortid-generated id.\n\t */\n\tfunction decode(id) {\n\t var characters = alphabet.shuffled();\n\t return {\n\t version: characters.indexOf(id.substr(0, 1)) & 0x0f,\n\t worker: characters.indexOf(id.substr(1, 1)) & 0x0f\n\t };\n\t}\n\t\n\tmodule.exports = decode;\n\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\tvar alphabet = __webpack_require__(11);\n\t\n\tfunction isShortId(id) {\n\t if (!id || typeof id !== 'string' || id.length < 6 ) {\n\t return false;\n\t }\n\t\n\t var characters = alphabet.characters();\n\t var len = id.length;\n\t for(var i = 0; i < len;i++) {\n\t if (characters.indexOf(id[i]) === -1) {\n\t return false;\n\t }\n\t }\n\t return true;\n\t}\n\t\n\tmodule.exports = isShortId;\n\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = 0;\n\n\n/***/ },\n/* 18 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_18__;\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can be imported from anywhere and will still reference the same scene,\n\t// though there is a helper reference in Engine.scene\n\t\n\texports['default'] = (function () {\n\t var scene = new _three2['default'].Scene();\n\t\n\t // TODO: Re-enable when this works with the skybox\n\t // scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n\t return scene;\n\t})();\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/* eslint-disable */\n\t\n\t/**\n\t * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar CSS3DObject = function CSS3DObject(element) {\n\t\n\t\t_three2['default'].Object3D.call(this);\n\t\n\t\tthis.element = element;\n\t\tthis.element.style.position = 'absolute';\n\t\n\t\tthis.addEventListener('removed', function (event) {\n\t\n\t\t\tif (this.element.parentNode !== null) {\n\t\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\t}\n\t\t});\n\t};\n\t\n\tCSS3DObject.prototype = Object.create(_three2['default'].Object3D.prototype);\n\tCSS3DObject.prototype.constructor = CSS3DObject;\n\t\n\tvar CSS3DSprite = function CSS3DSprite(element) {\n\t\n\t\tCSS3DObject.call(this, element);\n\t};\n\t\n\tCSS3DSprite.prototype = Object.create(CSS3DObject.prototype);\n\tCSS3DSprite.prototype.constructor = CSS3DSprite;\n\t\n\t//\n\t\n\tvar CSS3DRenderer = function CSS3DRenderer() {\n\t\n\t\tconsole.log('THREE.CSS3DRenderer', _three2['default'].REVISION);\n\t\n\t\tvar _width, _height;\n\t\tvar _widthHalf, _heightHalf;\n\t\n\t\tvar matrix = new _three2['default'].Matrix4();\n\t\n\t\tvar cache = {\n\t\t\tcamera: { fov: 0, style: '' },\n\t\t\tobjects: {}\n\t\t};\n\t\n\t\tvar domElement = document.createElement('div');\n\t\tdomElement.style.overflow = 'hidden';\n\t\n\t\tdomElement.style.WebkitTransformStyle = 'preserve-3d';\n\t\tdomElement.style.MozTransformStyle = 'preserve-3d';\n\t\tdomElement.style.oTransformStyle = 'preserve-3d';\n\t\tdomElement.style.transformStyle = 'preserve-3d';\n\t\n\t\tthis.domElement = domElement;\n\t\n\t\tvar cameraElement = document.createElement('div');\n\t\n\t\tcameraElement.style.WebkitTransformStyle = 'preserve-3d';\n\t\tcameraElement.style.MozTransformStyle = 'preserve-3d';\n\t\tcameraElement.style.oTransformStyle = 'preserve-3d';\n\t\tcameraElement.style.transformStyle = 'preserve-3d';\n\t\n\t\tdomElement.appendChild(cameraElement);\n\t\n\t\tthis.setClearColor = function () {};\n\t\n\t\tthis.getSize = function () {\n\t\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\t\t};\n\t\n\t\tthis.setSize = function (width, height) {\n\t\n\t\t\t_width = width;\n\t\t\t_height = height;\n\t\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\t\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\t\n\t\t\tcameraElement.style.width = width + 'px';\n\t\t\tcameraElement.style.height = height + 'px';\n\t\t};\n\t\n\t\tvar epsilon = function epsilon(value) {\n\t\n\t\t\treturn Math.abs(value) < Number.EPSILON ? 0 : value;\n\t\t};\n\t\n\t\tvar getCameraCSSMatrix = function getCameraCSSMatrix(matrix) {\n\t\n\t\t\tvar elements = matrix.elements;\n\t\n\t\t\treturn 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(-elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(elements[6]) + ',' + epsilon(elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(-elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(-elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')';\n\t\t};\n\t\n\t\tvar getObjectCSSMatrix = function getObjectCSSMatrix(matrix) {\n\t\n\t\t\tvar elements = matrix.elements;\n\t\n\t\t\treturn 'translate3d(-50%,-50%,0) matrix3d(' + epsilon(elements[0]) + ',' + epsilon(elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(-elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(-elements[6]) + ',' + epsilon(-elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')';\n\t\t};\n\t\n\t\tvar renderObject = function renderObject(object, camera) {\n\t\n\t\t\tif (object instanceof CSS3DObject) {\n\t\n\t\t\t\tvar style;\n\t\n\t\t\t\tif (object instanceof CSS3DSprite) {\n\t\n\t\t\t\t\t// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\t\n\t\t\t\t\tmatrix.copy(camera.matrixWorldInverse);\n\t\t\t\t\tmatrix.transpose();\n\t\t\t\t\tmatrix.copyPosition(object.matrixWorld);\n\t\t\t\t\tmatrix.scale(object.scale);\n\t\n\t\t\t\t\tmatrix.elements[3] = 0;\n\t\t\t\t\tmatrix.elements[7] = 0;\n\t\t\t\t\tmatrix.elements[11] = 0;\n\t\t\t\t\tmatrix.elements[15] = 1;\n\t\n\t\t\t\t\tstyle = getObjectCSSMatrix(matrix);\n\t\t\t\t} else {\n\t\n\t\t\t\t\tstyle = getObjectCSSMatrix(object.matrixWorld);\n\t\t\t\t}\n\t\n\t\t\t\tvar element = object.element;\n\t\t\t\tvar cachedStyle = cache.objects[object.id];\n\t\n\t\t\t\tif (cachedStyle === undefined || cachedStyle !== style) {\n\t\n\t\t\t\t\telement.style.WebkitTransform = style;\n\t\t\t\t\telement.style.MozTransform = style;\n\t\t\t\t\telement.style.oTransform = style;\n\t\t\t\t\telement.style.transform = style;\n\t\n\t\t\t\t\tcache.objects[object.id] = style;\n\t\t\t\t}\n\t\n\t\t\t\tif (element.parentNode !== cameraElement) {\n\t\n\t\t\t\t\tcameraElement.appendChild(element);\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tfor (var i = 0, l = object.children.length; i < l; i++) {\n\t\n\t\t\t\trenderObject(object.children[i], camera);\n\t\t\t}\n\t\t};\n\t\n\t\tthis.render = function (scene, camera) {\n\t\n\t\t\tvar fov = 0.5 / Math.tan(_three2['default'].Math.degToRad(camera.fov * 0.5)) * _height;\n\t\n\t\t\tif (cache.camera.fov !== fov) {\n\t\n\t\t\t\tdomElement.style.WebkitPerspective = fov + 'px';\n\t\t\t\tdomElement.style.MozPerspective = fov + 'px';\n\t\t\t\tdomElement.style.oPerspective = fov + 'px';\n\t\t\t\tdomElement.style.perspective = fov + 'px';\n\t\n\t\t\t\tcache.camera.fov = fov;\n\t\t\t}\n\t\n\t\t\tscene.updateMatrixWorld();\n\t\n\t\t\tif (camera.parent === null) camera.updateMatrixWorld();\n\t\n\t\t\tcamera.matrixWorldInverse.getInverse(camera.matrixWorld);\n\t\n\t\t\tvar style = 'translate3d(0,0,' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse) + ' translate3d(' + _widthHalf + 'px,' + _heightHalf + 'px, 0)';\n\t\n\t\t\tif (cache.camera.style !== style) {\n\t\n\t\t\t\tcameraElement.style.WebkitTransform = style;\n\t\t\t\tcameraElement.style.MozTransform = style;\n\t\t\t\tcameraElement.style.oTransform = style;\n\t\t\t\tcameraElement.style.transform = style;\n\t\n\t\t\t\tcache.camera.style = style;\n\t\t\t}\n\t\n\t\t\trenderObject(scene, camera);\n\t\t};\n\t};\n\t\n\texports.CSS3DObject = CSS3DObject;\n\texports.CSS3DSprite = CSS3DSprite;\n\texports.CSS3DRenderer = CSS3DRenderer;\n\t\n\t_three2['default'].CSS3DObject = CSS3DObject;\n\t_three2['default'].CSS3DSprite = CSS3DSprite;\n\t_three2['default'].CSS3DRenderer = CSS3DRenderer;\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/* eslint-disable */\n\t\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar CSS2DObject = function CSS2DObject(element) {\n\t\n\t\t_three2['default'].Object3D.call(this);\n\t\n\t\tthis.element = element;\n\t\tthis.element.style.position = 'absolute';\n\t\n\t\tthis.addEventListener('removed', function (event) {\n\t\n\t\t\tif (this.element.parentNode !== null) {\n\t\n\t\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t\t}\n\t\t});\n\t};\n\t\n\tCSS2DObject.prototype = Object.create(_three2['default'].Object3D.prototype);\n\tCSS2DObject.prototype.constructor = CSS2DObject;\n\t\n\t//\n\t\n\tvar CSS2DRenderer = function CSS2DRenderer() {\n\t\n\t\tconsole.log('THREE.CSS2DRenderer', _three2['default'].REVISION);\n\t\n\t\tvar _width, _height;\n\t\tvar _widthHalf, _heightHalf;\n\t\n\t\tvar vector = new _three2['default'].Vector3();\n\t\tvar viewMatrix = new _three2['default'].Matrix4();\n\t\tvar viewProjectionMatrix = new _three2['default'].Matrix4();\n\t\n\t\tvar frustum = new _three2['default'].Frustum();\n\t\n\t\tvar domElement = document.createElement('div');\n\t\tdomElement.style.overflow = 'hidden';\n\t\n\t\tthis.domElement = domElement;\n\t\n\t\tthis.setSize = function (width, height) {\n\t\n\t\t\t_width = width;\n\t\t\t_height = height;\n\t\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\t\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\t\t};\n\t\n\t\tvar renderObject = function renderObject(object, camera) {\n\t\n\t\t\tif (object instanceof CSS2DObject) {\n\t\n\t\t\t\tvector.setFromMatrixPosition(object.matrixWorld);\n\t\t\t\tvector.applyProjection(viewProjectionMatrix);\n\t\n\t\t\t\tvar element = object.element;\n\t\t\t\tvar style = 'translate(-50%,-50%) translate(' + (vector.x * _widthHalf + _widthHalf) + 'px,' + (-vector.y * _heightHalf + _heightHalf) + 'px)';\n\t\n\t\t\t\telement.style.WebkitTransform = style;\n\t\t\t\telement.style.MozTransform = style;\n\t\t\t\telement.style.oTransform = style;\n\t\t\t\telement.style.transform = style;\n\t\n\t\t\t\tif (element.parentNode !== domElement) {\n\t\n\t\t\t\t\tdomElement.appendChild(element);\n\t\t\t\t}\n\t\n\t\t\t\t// Hide if outside view frustum\n\t\t\t\tif (!frustum.containsPoint(object.position)) {\n\t\t\t\t\telement.style.display = 'none';\n\t\t\t\t} else {\n\t\t\t\t\telement.style.display = 'block';\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\tfor (var i = 0, l = object.children.length; i < l; i++) {\n\t\n\t\t\t\trenderObject(object.children[i], camera);\n\t\t\t}\n\t\t};\n\t\n\t\tthis.render = function (scene, camera) {\n\t\n\t\t\tscene.updateMatrixWorld();\n\t\n\t\t\tif (camera.parent === null) camera.updateMatrixWorld();\n\t\n\t\t\tcamera.matrixWorldInverse.getInverse(camera.matrixWorld);\n\t\n\t\t\tviewMatrix.copy(camera.matrixWorldInverse.getInverse(camera.matrixWorld));\n\t\t\tviewProjectionMatrix.multiplyMatrices(camera.projectionMatrix, viewMatrix);\n\t\n\t\t\tfrustum.setFromMatrix(new _three2['default'].Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n\t\n\t\t\trenderObject(scene, camera);\n\t\t};\n\t};\n\t\n\texports.CSS2DObject = CSS2DObject;\n\texports.CSS2DRenderer = CSS2DRenderer;\n\t\n\t_three2['default'].CSS2DObject = CSS2DObject;\n\t_three2['default'].CSS2DRenderer = CSS2DRenderer;\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(4);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(6);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _reqwest = __webpack_require__(23);\n\t\n\tvar _reqwest2 = _interopRequireDefault(_reqwest);\n\t\n\tvar _utilGeoJSON = __webpack_require__(25);\n\t\n\tvar _utilGeoJSON2 = _interopRequireDefault(_utilGeoJSON);\n\t\n\tvar _utilWorker = __webpack_require__(31);\n\t\n\tvar _utilWorker2 = _interopRequireDefault(_utilWorker);\n\t\n\tvar _utilBuffer = __webpack_require__(34);\n\t\n\tvar _utilBuffer2 = _interopRequireDefault(_utilBuffer);\n\t\n\tvar _utilStringify = __webpack_require__(35);\n\t\n\tvar _utilStringify2 = _interopRequireDefault(_utilStringify);\n\t\n\tvar _geometryPolygonLayer = __webpack_require__(36);\n\t\n\tvar _geometryPolygonLayer2 = _interopRequireDefault(_geometryPolygonLayer);\n\t\n\tvar _geometryPolylineLayer = __webpack_require__(39);\n\t\n\tvar _geometryPolylineLayer2 = _interopRequireDefault(_geometryPolylineLayer);\n\t\n\tvar _geometryPointLayer = __webpack_require__(40);\n\t\n\tvar _geometryPointLayer2 = _interopRequireDefault(_geometryPointLayer);\n\t\n\tvar _geoLatLon = __webpack_require__(2);\n\t\n\tvar _geoPoint = __webpack_require__(3);\n\t\n\tvar _geoGeo = __webpack_require__(1);\n\t\n\tvar _geoGeo2 = _interopRequireDefault(_geoGeo);\n\t\n\tvar _enginePickingMaterial = __webpack_require__(37);\n\t\n\tvar _enginePickingMaterial2 = _interopRequireDefault(_enginePickingMaterial);\n\t\n\t// TODO: Allow filter method to be run inside a worker to improve performance\n\t// TODO: Allow onEachFeature method to be run inside a worker to improve performance\n\t\n\tvar GeoJSONWorkerLayer = (function (_Layer) {\n\t _inherits(GeoJSONWorkerLayer, _Layer);\n\t\n\t function GeoJSONWorkerLayer(geojson, options) {\n\t _classCallCheck(this, GeoJSONWorkerLayer);\n\t\n\t var defaults = {\n\t topojson: false,\n\t style: _utilGeoJSON2['default'].defaultStyle,\n\t onEachFeature: null,\n\t onEachFeatureWorker: null,\n\t onAddAttributes: null,\n\t interactive: false,\n\t pointGeometry: null,\n\t onClick: null,\n\t headers: {}\n\t };\n\t\n\t var _options = (0, _lodashAssign2['default'])({}, defaults, options);\n\t\n\t if (typeof options.style === 'object') {\n\t _options.style = (0, _lodashAssign2['default'])({}, defaults.style, options.style);\n\t }\n\t\n\t _get(Object.getPrototypeOf(GeoJSONWorkerLayer.prototype), 'constructor', this).call(this, _options);\n\t\n\t this._aborted = false;\n\t this._geojson = geojson;\n\t }\n\t\n\t _createClass(GeoJSONWorkerLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t if (this._options.interactive) {\n\t // Worker layer always controls output to add a picking mesh\n\t this._pickingMesh = new THREE.Object3D();\n\t }\n\t\n\t // Process GeoJSON\n\t return this._process(this._geojson);\n\t }\n\t\n\t // Use workers to request and process GeoJSON, returning data structure\n\t // containing geometry and any supplementary data for output\n\t }, {\n\t key: '_process',\n\t value: function _process(_geojson) {\n\t var _this = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t var style = _this._options.style;\n\t\n\t // TODO: Convert to buffer and use transferrable objects\n\t if (typeof _this._options.style === 'function') {\n\t style = _utilStringify2['default'].functionToString(_this._options.style);\n\t }\n\t\n\t var pointGeometry = _this._options.pointGeometry;\n\t\n\t // TODO: Convert to buffer and use transferrable objects\n\t if (typeof _this._options.pointGeometry === 'function') {\n\t pointGeometry = _utilStringify2['default'].functionToString(_this._options.pointGeometry);\n\t }\n\t\n\t var geojson = _geojson;\n\t var transferrables = [];\n\t\n\t if (typeof geojson !== 'string') {\n\t _this._geojson = geojson = _utilBuffer2['default'].stringToUint8Array(JSON.stringify(geojson));\n\t transferrables.push(geojson.buffer);\n\t _this._execWorker(geojson, _this._options.topojson, _this._world._originPoint, style, _this._options.interactive, pointGeometry, transferrables).then(function () {\n\t resolve();\n\t })['catch'](reject);\n\t } else if (typeof _this._options.filter === 'function' || typeof _this._options.onEachFeature === 'function') {\n\t GeoJSONWorkerLayer.RequestGeoJSON(geojson).then(function (res) {\n\t // if (this._aborted) {\n\t // resolve();\n\t // return;\n\t // }\n\t\n\t var fc = _utilGeoJSON2['default'].collectFeatures(res, _this._options.topojson);\n\t var features = fc.features;\n\t\n\t // Run filter, if provided\n\t if (_this._options.filter) {\n\t fc.features = features.filter(_this._options.filter);\n\t }\n\t\n\t if (_this._options.onEachFeature) {\n\t var feature;\n\t for (var i = 0; i < features.length; i++) {\n\t feature = features[i];\n\t _this._options.onEachFeature(feature);\n\t };\n\t }\n\t\n\t _this._geojson = geojson = _utilBuffer2['default'].stringToUint8Array(JSON.stringify(fc));\n\t transferrables.push(geojson.buffer);\n\t\n\t _this._execWorker(geojson, false, _this._options.headers, _this._world._originPoint, style, _this._options.interactive, pointGeometry, transferrables).then(function () {\n\t resolve();\n\t })['catch'](reject);\n\t });\n\t } else {\n\t _this._execWorker(geojson, _this._options.topojson, _this._options.headers, _this._world._originPoint, style, _this._options.interactive, pointGeometry, transferrables).then(function () {\n\t resolve();\n\t })['catch'](reject);\n\t }\n\t });\n\t }\n\t }, {\n\t key: '_execWorker',\n\t value: function _execWorker(geojson, topojson, headers, originPoint, style, interactive, pointGeometry, transferrables) {\n\t var _this2 = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t console.time('Worker round trip');\n\t\n\t _utilWorker2['default'].exec('GeoJSONWorkerLayer.Process', [geojson, topojson, headers, originPoint, style, interactive, pointGeometry], transferrables).then(function (results) {\n\t console.timeEnd('Worker round trip');\n\t\n\t // if (this._aborted) {\n\t // resolve();\n\t // return;\n\t // }\n\t\n\t var processPromises = [];\n\t\n\t if (results.polygons) {\n\t processPromises.push(_this2._processPolygonResults(results.polygons));\n\t }\n\t\n\t if (results.polylines) {\n\t processPromises.push(_this2._processPolylineResults(results.polylines));\n\t }\n\t\n\t if (results.points) {\n\t processPromises.push(_this2._processPointResults(results.points));\n\t }\n\t\n\t if (processPromises.length > 0) {\n\t Promise.all(processPromises).then(function () {\n\t resolve();\n\t })['catch'](reject);\n\t } else {\n\t resolve();\n\t }\n\t });\n\t });\n\t }\n\t\n\t // TODO: Dedupe with polyline method\n\t }, {\n\t key: '_processPolygonResults',\n\t value: function _processPolygonResults(results) {\n\t var _this3 = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t var splitPositions = _utilBuffer2['default'].splitFloat32Array(results.attributes.positions);\n\t var splitNormals = _utilBuffer2['default'].splitFloat32Array(results.attributes.normals);\n\t var splitColors = _utilBuffer2['default'].splitFloat32Array(results.attributes.colors);\n\t var splitTops = _utilBuffer2['default'].splitFloat32Array(results.attributes.tops);\n\t\n\t var splitOutlinePositions;\n\t var splitOutlineColors;\n\t\n\t if (results.outlineAttributes) {\n\t splitOutlinePositions = _utilBuffer2['default'].splitFloat32Array(results.outlineAttributes.positions);\n\t splitOutlineColors = _utilBuffer2['default'].splitFloat32Array(results.outlineAttributes.colors);\n\t }\n\t\n\t var splitProperties;\n\t if (results.properties) {\n\t splitProperties = _utilBuffer2['default'].splitUint8Array(results.properties);\n\t }\n\t\n\t var flats = results.flats;\n\t\n\t var objects = [];\n\t var outlineObjects = [];\n\t\n\t var obj;\n\t var pickingId;\n\t var pickingIds;\n\t var properties;\n\t\n\t var polygonAttributeLengths = {\n\t positions: 3,\n\t normals: 3,\n\t colors: 3,\n\t tops: 1\n\t };\n\t\n\t var polygonOutlineAttributeLengths = {\n\t positions: 3,\n\t colors: 3\n\t };\n\t\n\t for (var i = 0; i < splitPositions.length; i++) {\n\t if (splitProperties && splitProperties[i]) {\n\t properties = JSON.parse(_utilBuffer2['default'].uint8ArrayToString(splitProperties[i]));\n\t } else {\n\t properties = {};\n\t }\n\t\n\t // WORKERS: obj.attributes should actually an array of polygons for\n\t // the feature, though the current logic isn't aware of that\n\t obj = {\n\t attributes: [{\n\t positions: splitPositions[i],\n\t normals: splitNormals[i],\n\t colors: splitColors[i],\n\t tops: splitTops[i]\n\t }],\n\t properties: properties,\n\t flat: flats[i]\n\t };\n\t\n\t // WORKERS: If interactive, generate unique ID for each feature, create\n\t // the buffer attributes and set up event listeners\n\t if (_this3._options.interactive) {\n\t pickingId = _this3.getPickingId();\n\t\n\t pickingIds = new Float32Array(splitPositions[i].length / 3);\n\t pickingIds.fill(pickingId);\n\t\n\t obj.attributes[0].pickingIds = pickingIds;\n\t\n\t polygonAttributeLengths.pickingIds = 1;\n\t\n\t _this3._addPicking(pickingId, properties);\n\t }\n\t\n\t // TODO: Make this specific to polygon attributes\n\t if (typeof _this3._options.onAddAttributes === 'function') {\n\t var customAttributes = _this3._options.onAddAttributes(obj.attributes[0], properties);\n\t var customAttribute;\n\t for (var key in customAttributes) {\n\t customAttribute = customAttributes[key];\n\t obj.attributes[0][key] = customAttribute.value;\n\t polygonAttributeLengths[key] = customAttribute.length;\n\t }\n\t }\n\t\n\t objects.push(obj);\n\t }\n\t\n\t for (var i = 0; i < splitOutlinePositions.length; i++) {\n\t obj = {\n\t attributes: [{\n\t positions: splitOutlinePositions[i],\n\t colors: splitOutlineColors[i]\n\t }],\n\t flat: true\n\t };\n\t\n\t outlineObjects.push(obj);\n\t }\n\t\n\t var polygonAttributes = [];\n\t var polygonOutlineAttributes = [];\n\t\n\t var polygonFlat = true;\n\t\n\t for (var i = 0; i < objects.length; i++) {\n\t obj = objects[i];\n\t\n\t // TODO: Work out why obj.flat is rarely set to something other than\n\t // true or false. Potentially undefined.\n\t if (polygonFlat && obj.flat === false) {\n\t polygonFlat = false;\n\t }\n\t\n\t var bufferAttributes = _utilBuffer2['default'].mergeAttributes(obj.attributes);\n\t polygonAttributes.push(bufferAttributes);\n\t };\n\t\n\t for (var i = 0; i < outlineObjects.length; i++) {\n\t obj = outlineObjects[i];\n\t\n\t var bufferAttributes = _utilBuffer2['default'].mergeAttributes(obj.attributes);\n\t polygonOutlineAttributes.push(bufferAttributes);\n\t };\n\t\n\t var outputPromises = [];\n\t\n\t var style;\n\t\n\t if (polygonAttributes.length > 0) {\n\t var mergedPolygonAttributes = _utilBuffer2['default'].mergeAttributes(polygonAttributes);\n\t\n\t // TODO: Make this work when style is a function per feature\n\t style = typeof _this3._options.style === 'function' ? _this3._options.style(objects[0]) : _this3._options.style;\n\t style = (0, _lodashAssign2['default'])({}, _utilGeoJSON2['default'].defaultStyle, style);\n\t\n\t outputPromises.push(_this3._setPolygonMesh(mergedPolygonAttributes, polygonAttributeLengths, style, polygonFlat));\n\t }\n\t\n\t if (polygonOutlineAttributes.length > 0) {\n\t var mergedPolygonOutlineAttributes = _utilBuffer2['default'].mergeAttributes(polygonOutlineAttributes);\n\t\n\t style = typeof _this3._options.style === 'function' ? _this3._options.style(objects[0]) : _this3._options.style;\n\t style = (0, _lodashAssign2['default'])({}, _utilGeoJSON2['default'].defaultStyle, style);\n\t\n\t if (style.outlineRenderOrder !== undefined) {\n\t style.lineRenderOrder = style.outlineRenderOrder;\n\t } else {\n\t style.lineRenderOrder = style.renderOrder ? style.renderOrder + 1 : 4;\n\t }\n\t\n\t if (style.outlineWidth) {\n\t style.lineWidth = style.outlineWidth;\n\t }\n\t\n\t outputPromises.push(_this3._setPolylineMesh(mergedPolygonOutlineAttributes, polygonOutlineAttributeLengths, style, true));\n\t }\n\t\n\t Promise.all(outputPromises).then(function (results) {\n\t var _results = _slicedToArray(results, 2);\n\t\n\t var polygonResult = _results[0];\n\t var outlineResult = _results[1];\n\t\n\t if (polygonResult) {\n\t _this3._polygonMesh = polygonResult.mesh;\n\t _this3.add(_this3._polygonMesh);\n\t\n\t if (polygonResult.pickingMesh) {\n\t _this3._pickingMesh.add(polygonResult.pickingMesh);\n\t }\n\t }\n\t\n\t if (outlineResult) {\n\t _this3.add(outlineResult.mesh);\n\t }\n\t\n\t resolve();\n\t })['catch'](reject);\n\t });\n\t }\n\t\n\t // TODO: Dedupe with polygon method\n\t }, {\n\t key: '_processPolylineResults',\n\t value: function _processPolylineResults(results) {\n\t var _this4 = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t var splitPositions = _utilBuffer2['default'].splitFloat32Array(results.attributes.positions);\n\t var splitColors = _utilBuffer2['default'].splitFloat32Array(results.attributes.colors);\n\t\n\t var splitProperties;\n\t if (results.properties) {\n\t splitProperties = _utilBuffer2['default'].splitUint8Array(results.properties);\n\t }\n\t\n\t var flats = results.flats;\n\t\n\t var objects = [];\n\t var obj;\n\t var pickingId;\n\t var pickingIds;\n\t var properties;\n\t\n\t var polylineAttributeLengths = {\n\t positions: 3,\n\t colors: 3\n\t };\n\t\n\t for (var i = 0; i < splitPositions.length; i++) {\n\t if (splitProperties && splitProperties[i]) {\n\t properties = JSON.parse(_utilBuffer2['default'].uint8ArrayToString(splitProperties[i]));\n\t } else {\n\t properties = {};\n\t }\n\t\n\t // WORKERS: obj.attributes should actually an array of polygons for\n\t // the feature, though the current logic isn't aware of that\n\t obj = {\n\t attributes: [{\n\t positions: splitPositions[i],\n\t colors: splitColors[i]\n\t }],\n\t properties: properties,\n\t flat: flats[i]\n\t };\n\t\n\t // WORKERS: If interactive, generate unique ID for each feature, create\n\t // the buffer attributes and set up event listeners\n\t if (_this4._options.interactive) {\n\t pickingId = _this4.getPickingId();\n\t\n\t pickingIds = new Float32Array(splitPositions[i].length / 3);\n\t pickingIds.fill(pickingId);\n\t\n\t obj.attributes[0].pickingIds = pickingIds;\n\t\n\t polylineAttributeLengths.pickingIds = 1;\n\t\n\t _this4._addPicking(pickingId, properties);\n\t }\n\t\n\t // TODO: Make this specific to polyline attributes\n\t if (typeof _this4._options.onAddAttributes === 'function') {\n\t var customAttributes = _this4._options.onAddAttributes(obj.attributes[0], properties);\n\t var customAttribute;\n\t for (var key in customAttributes) {\n\t customAttribute = customAttributes[key];\n\t obj.attributes[0][key] = customAttribute.value;\n\t polylineAttributeLengths[key] = customAttribute.length;\n\t }\n\t }\n\t\n\t objects.push(obj);\n\t }\n\t\n\t var polylineAttributes = [];\n\t\n\t var polylineFlat = true;\n\t\n\t for (var i = 0; i < objects.length; i++) {\n\t obj = objects[i];\n\t\n\t if (polylineFlat && !obj.flat) {\n\t polylineFlat = false;\n\t }\n\t\n\t var bufferAttributes = _utilBuffer2['default'].mergeAttributes(obj.attributes);\n\t polylineAttributes.push(bufferAttributes);\n\t };\n\t\n\t if (polylineAttributes.length > 0) {\n\t var mergedPolylineAttributes = _utilBuffer2['default'].mergeAttributes(polylineAttributes);\n\t\n\t // TODO: Make this work when style is a function per feature\n\t var style = typeof _this4._options.style === 'function' ? _this4._options.style(objects[0]) : _this4._options.style;\n\t style = (0, _lodashAssign2['default'])({}, _utilGeoJSON2['default'].defaultStyle, style);\n\t\n\t _this4._setPolylineMesh(mergedPolylineAttributes, polylineAttributeLengths, style, polylineFlat).then(function (result) {\n\t _this4._polylineMesh = result.mesh;\n\t _this4.add(_this4._polylineMesh);\n\t\n\t if (result.pickingMesh) {\n\t _this4._pickingMesh.add(result.pickingMesh);\n\t }\n\t\n\t resolve();\n\t })['catch'](reject);\n\t } else {\n\t resolve();\n\t }\n\t });\n\t }\n\t }, {\n\t key: '_processPointResults',\n\t value: function _processPointResults(results) {\n\t var _this5 = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t var splitPositions = _utilBuffer2['default'].splitFloat32Array(results.attributes.positions);\n\t var splitNormals = _utilBuffer2['default'].splitFloat32Array(results.attributes.normals);\n\t var splitColors = _utilBuffer2['default'].splitFloat32Array(results.attributes.colors);\n\t\n\t var splitProperties;\n\t if (results.properties) {\n\t splitProperties = _utilBuffer2['default'].splitUint8Array(results.properties);\n\t }\n\t\n\t var flats = results.flats;\n\t\n\t var objects = [];\n\t var obj;\n\t var pickingId;\n\t var pickingIds;\n\t var properties;\n\t\n\t var pointAttributeLengths = {\n\t positions: 3,\n\t normals: 3,\n\t colors: 3\n\t };\n\t\n\t for (var i = 0; i < splitPositions.length; i++) {\n\t if (splitProperties && splitProperties[i]) {\n\t properties = JSON.parse(_utilBuffer2['default'].uint8ArrayToString(splitProperties[i]));\n\t } else {\n\t properties = {};\n\t }\n\t\n\t // WORKERS: obj.attributes should actually an array of polygons for\n\t // the feature, though the current logic isn't aware of that\n\t obj = {\n\t attributes: [{\n\t positions: splitPositions[i],\n\t normals: splitNormals[i],\n\t colors: splitColors[i]\n\t }],\n\t properties: properties,\n\t flat: flats[i]\n\t };\n\t\n\t // WORKERS: If interactive, generate unique ID for each feature, create\n\t // the buffer attributes and set up event listeners\n\t if (_this5._options.interactive) {\n\t pickingId = _this5.getPickingId();\n\t\n\t pickingIds = new Float32Array(splitPositions[i].length / 3);\n\t pickingIds.fill(pickingId);\n\t\n\t obj.attributes[0].pickingIds = pickingIds;\n\t\n\t pointAttributeLengths.pickingIds = 1;\n\t\n\t _this5._addPicking(pickingId, properties);\n\t }\n\t\n\t // TODO: Make this specific to polygon attributes\n\t if (typeof _this5._options.onAddAttributes === 'function') {\n\t var customAttributes = _this5._options.onAddAttributes(obj.attributes[0], properties);\n\t var customAttribute;\n\t for (var key in customAttributes) {\n\t customAttribute = customAttributes[key];\n\t obj.attributes[0][key] = customAttribute.value;\n\t pointAttributeLengths[key] = customAttribute.length;\n\t }\n\t }\n\t\n\t objects.push(obj);\n\t }\n\t\n\t var pointAttributes = [];\n\t\n\t var pointFlat = true;\n\t\n\t for (var i = 0; i < objects.length; i++) {\n\t obj = objects[i];\n\t\n\t if (pointFlat && !obj.flat) {\n\t pointFlat = false;\n\t }\n\t\n\t var bufferAttributes = _utilBuffer2['default'].mergeAttributes(obj.attributes);\n\t pointAttributes.push(bufferAttributes);\n\t };\n\t\n\t if (pointAttributes.length > 0) {\n\t var mergedPointAttributes = _utilBuffer2['default'].mergeAttributes(pointAttributes);\n\t\n\t // TODO: Make this work when style is a function per feature\n\t var style = typeof _this5._options.style === 'function' ? _this5._options.style(objects[0]) : _this5._options.style;\n\t style = (0, _lodashAssign2['default'])({}, _utilGeoJSON2['default'].defaultStyle, style);\n\t\n\t _this5._setPointMesh(mergedPointAttributes, pointAttributeLengths, style, pointFlat).then(function (result) {\n\t _this5._pointMesh = result.mesh;\n\t _this5.add(_this5._pointMesh);\n\t\n\t if (result.pickingMesh) {\n\t _this5._pickingMesh.add(result.pickingMesh);\n\t }\n\t\n\t resolve();\n\t })['catch'](reject);\n\t } else {\n\t resolve();\n\t }\n\t });\n\t }\n\t\n\t // TODO: At some point this needs to return all the features to the main thread\n\t // so it can generate meshes and output to the scene, as well as perhaps creating\n\t // individual layers / components for each feature to track things like picking\n\t // and properties\n\t //\n\t // TODO: Find a way so the origin point isn't needed to be passed in as it\n\t // feels a bit messy and against the idea of a static Geo class\n\t //\n\t // TODO: Support passing custom geometry for point layers\n\t }, {\n\t key: '_setPolygonMesh',\n\t\n\t // Create and store mesh from buffer attributes\n\t //\n\t // Could make this an abstract method for each geometry layer\n\t value: function _setPolygonMesh(attributes, attributeLengths, style, flat) {\n\t if (!this._world) {\n\t return Promise.reject();\n\t }\n\t\n\t return _geometryPolygonLayer2['default'].SetMesh(attributes, attributeLengths, flat, style, this._options, this._world._environment._skybox);\n\t }\n\t }, {\n\t key: '_setPolylineMesh',\n\t value: function _setPolylineMesh(attributes, attributeLengths, style, flat) {\n\t if (!this._world) {\n\t return Promise.reject();\n\t }\n\t\n\t return _geometryPolylineLayer2['default'].SetMesh(attributes, attributeLengths, flat, style, this._options);\n\t }\n\t }, {\n\t key: '_setPointMesh',\n\t value: function _setPointMesh(attributes, attributeLengths, style, flat) {\n\t if (!this._world) {\n\t return Promise.reject();\n\t }\n\t\n\t return _geometryPointLayer2['default'].SetMesh(attributes, attributeLengths, flat, style, this._options, this._world._environment._skybox);\n\t }\n\t\n\t // Set up and re-emit interaction events\n\t }, {\n\t key: '_addPicking',\n\t value: function _addPicking(pickingId, properties) {\n\t var _this6 = this;\n\t\n\t this._world.on('pick-click-' + pickingId, function (pickingId, point2d, point3d, intersects) {\n\t _this6._world.emit('click', _this6, properties, point2d, point3d);\n\t });\n\t\n\t this._world.on('pick-hover-' + pickingId, function (pickingId, point2d, point3d, intersects) {\n\t _this6._world.emit('hover', _this6, properties, point2d, point3d);\n\t });\n\t }\n\t\n\t // TODO: Finish cleanup\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(GeoJSONWorkerLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }], [{\n\t key: 'Process',\n\t value: function Process(geojson, topojson, headers, originPoint, _style, _properties, _pointGeometry) {\n\t return new Promise(function (resolve, reject) {\n\t GeoJSONWorkerLayer.ProcessGeoJSON(geojson, headers).then(function (res) {\n\t // Collects features into a single FeatureCollection\n\t //\n\t // Also converts TopoJSON to GeoJSON if instructed\n\t var geojson = _utilGeoJSON2['default'].collectFeatures(res, topojson);\n\t\n\t // TODO: Check that GeoJSON is valid / usable\n\t\n\t var features = geojson.features;\n\t\n\t // TODO: Run filter, if provided (must be static)\n\t\n\t var pointScale;\n\t var polygons = [];\n\t var polylines = [];\n\t var points = [];\n\t\n\t // Deserialise style function if provided\n\t if (typeof _style === 'string') {\n\t _style = _utilStringify2['default'].stringToFunction(_style);\n\t }\n\t\n\t // Assume that a style won't be set per feature\n\t var style = _style;\n\t\n\t var pointGeometry;\n\t // Deserialise pointGeometry function if provided\n\t if (typeof _pointGeometry === 'string') {\n\t pointGeometry = _utilStringify2['default'].stringToFunction(_pointGeometry);\n\t }\n\t\n\t var feature;\n\t for (var i = 0; i < features.length; i++) {\n\t feature = features[i];\n\t\n\t var geometry = feature.geometry;\n\t var coordinates = geometry.coordinates ? geometry.coordinates : null;\n\t\n\t if (!coordinates || !geometry) {\n\t return;\n\t }\n\t\n\t // Get per-feature style object, if provided\n\t if (typeof _style === 'function') {\n\t style = (0, _lodashAssign2['default'])({}, _utilGeoJSON2['default'].defaultStyle, _style(feature));\n\t // console.log(feature, style);\n\t }\n\t\n\t if (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n\t coordinates = _geometryPolygonLayer2['default'].isSingle(coordinates) ? [coordinates] : coordinates;\n\t\n\t var converted = coordinates.map(function (_coordinates) {\n\t return _coordinates.map(function (ring) {\n\t return ring.map(function (coordinate) {\n\t return (0, _geoLatLon.latLon)(coordinate[1], coordinate[0]);\n\t });\n\t });\n\t });\n\t\n\t var point;\n\t var projected = converted.map(function (_coordinates) {\n\t return _coordinates.map(function (ring) {\n\t return ring.map(function (latlon) {\n\t point = _geoGeo2['default'].latLonToPoint(latlon)._subtract(originPoint);\n\t\n\t if (!pointScale) {\n\t pointScale = _geoGeo2['default'].pointScale(latlon);\n\t }\n\t\n\t return point;\n\t });\n\t });\n\t });\n\t\n\t var polygon = {\n\t projected: projected,\n\t options: {\n\t pointScale: pointScale,\n\t style: style\n\t }\n\t };\n\t\n\t if (_properties) {\n\t polygon.properties = feature.properties;\n\t }\n\t\n\t polygons.push(polygon);\n\t }\n\t\n\t if (geometry.type === 'LineString' || geometry.type === 'MultiLineString') {\n\t coordinates = _geometryPolylineLayer2['default'].isSingle(coordinates) ? [coordinates] : coordinates;\n\t\n\t var converted = coordinates.map(function (_coordinates) {\n\t return _coordinates.map(function (coordinate) {\n\t return (0, _geoLatLon.latLon)(coordinate[1], coordinate[0]);\n\t });\n\t });\n\t\n\t var point;\n\t var projected = converted.map(function (_coordinates) {\n\t return _coordinates.map(function (latlon) {\n\t point = _geoGeo2['default'].latLonToPoint(latlon)._subtract(originPoint);\n\t\n\t if (!pointScale) {\n\t pointScale = _geoGeo2['default'].pointScale(latlon);\n\t }\n\t\n\t return point;\n\t });\n\t });\n\t\n\t var polyline = {\n\t projected: projected,\n\t options: {\n\t pointScale: pointScale,\n\t style: style\n\t }\n\t };\n\t\n\t if (_properties) {\n\t polyline.properties = feature.properties;\n\t }\n\t\n\t polylines.push(polyline);\n\t }\n\t\n\t if (geometry.type === 'Point' || geometry.type === 'MultiPoint') {\n\t coordinates = _geometryPointLayer2['default'].isSingle(coordinates) ? [coordinates] : coordinates;\n\t\n\t var converted = coordinates.map(function (coordinate) {\n\t return (0, _geoLatLon.latLon)(coordinate[1], coordinate[0]);\n\t });\n\t\n\t var point;\n\t var projected = converted.map(function (latlon) {\n\t point = _geoGeo2['default'].latLonToPoint(latlon)._subtract(originPoint);\n\t\n\t if (!pointScale) {\n\t pointScale = _geoGeo2['default'].pointScale(latlon);\n\t }\n\t\n\t return point;\n\t });\n\t\n\t var point = {\n\t projected: projected,\n\t options: {\n\t pointGeometry: pointGeometry(feature),\n\t pointScale: pointScale,\n\t style: style\n\t }\n\t };\n\t\n\t if (_properties) {\n\t point.properties = feature.properties;\n\t }\n\t\n\t points.push(point);\n\t }\n\t };\n\t\n\t var polygonBufferPromises = [];\n\t var polylineBufferPromises = [];\n\t var pointBufferPromises = [];\n\t\n\t var polygon;\n\t for (var i = 0; i < polygons.length; i++) {\n\t polygon = polygons[i];\n\t polygonBufferPromises.push(_geometryPolygonLayer2['default'].SetBufferAttributes(polygon.projected, polygon.options));\n\t };\n\t\n\t var polyline;\n\t for (var i = 0; i < polylines.length; i++) {\n\t polyline = polylines[i];\n\t polylineBufferPromises.push(_geometryPolylineLayer2['default'].SetBufferAttributes(polyline.projected, polyline.options));\n\t };\n\t\n\t var point;\n\t for (var i = 0; i < points.length; i++) {\n\t point = points[i];\n\t pointBufferPromises.push(_geometryPointLayer2['default'].SetBufferAttributes(point.projected, point.options));\n\t };\n\t\n\t var data = {};\n\t var transferrables = [];\n\t\n\t // TODO: Make this work with polylines too\n\t // TODO: Make this so it's not a nest of promises\n\t GeoJSONWorkerLayer.ProcessPolygons(polygonBufferPromises, polygons, _properties).then(function (result) {\n\t data.polygons = result.data;\n\t transferrables = transferrables.concat(result.transferrables);\n\t\n\t GeoJSONWorkerLayer.ProcessPolylines(polylineBufferPromises, polylines, _properties).then(function (result) {\n\t data.polylines = result.data;\n\t transferrables = transferrables.concat(result.transferrables);\n\t\n\t GeoJSONWorkerLayer.ProcessPoints(pointBufferPromises, points, _properties).then(function (result) {\n\t data.points = result.data;\n\t transferrables = transferrables.concat(result.transferrables);\n\t\n\t resolve({\n\t data: data,\n\t transferrables: transferrables\n\t });\n\t });\n\t });\n\t });\n\t });\n\t });\n\t }\n\t }, {\n\t key: 'ProcessPolygons',\n\t value: function ProcessPolygons(polygonPromises, polygons, _properties) {\n\t return new Promise(function (resolve, reject) {\n\t Promise.all(polygonPromises).then(function (results) {\n\t var transferrables = [];\n\t\n\t var positions = [];\n\t var normals = [];\n\t var colors = [];\n\t var tops = [];\n\t\n\t var outlinePositions = [];\n\t var outlineColors = [];\n\t\n\t var properties = [];\n\t\n\t var flats = [];\n\t var polygon;\n\t\n\t var result;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\t\n\t polygon = polygons[i];\n\t\n\t // WORKERS: Making this a typed array will speed up transfer time\n\t // As things stand this adds on a few milliseconds\n\t flats.push(result.flat);\n\t\n\t // WORKERS: result.attributes is actually an array of polygons for each\n\t // feature, though the current logic isn't keeping these all together\n\t\n\t var attributes;\n\t for (var j = 0; j < result.attributes.length; j++) {\n\t attributes = result.attributes[j];\n\t\n\t positions.push(attributes.positions);\n\t normals.push(attributes.normals);\n\t colors.push(attributes.colors);\n\t tops.push(attributes.tops);\n\t\n\t if (_properties) {\n\t properties.push(_utilBuffer2['default'].stringToUint8Array(JSON.stringify(polygon.properties)));\n\t }\n\t };\n\t\n\t var outlineAttributes;\n\t for (var j = 0; j < result.outlineAttributes.length; j++) {\n\t outlineAttributes = result.outlineAttributes[j];\n\t\n\t outlinePositions.push(outlineAttributes.positions);\n\t outlineColors.push(outlineAttributes.colors);\n\t };\n\t };\n\t\n\t var mergedAttributes = {\n\t positions: _utilBuffer2['default'].mergeFloat32Arrays(positions),\n\t normals: _utilBuffer2['default'].mergeFloat32Arrays(normals),\n\t colors: _utilBuffer2['default'].mergeFloat32Arrays(colors),\n\t tops: _utilBuffer2['default'].mergeFloat32Arrays(tops)\n\t };\n\t\n\t var mergedOutlineAttributes = {\n\t positions: _utilBuffer2['default'].mergeFloat32Arrays(outlinePositions),\n\t colors: _utilBuffer2['default'].mergeFloat32Arrays(outlineColors)\n\t };\n\t\n\t transferrables.push(mergedAttributes.positions[0].buffer);\n\t transferrables.push(mergedAttributes.positions[1].buffer);\n\t\n\t transferrables.push(mergedAttributes.normals[0].buffer);\n\t transferrables.push(mergedAttributes.normals[1].buffer);\n\t\n\t transferrables.push(mergedAttributes.colors[0].buffer);\n\t transferrables.push(mergedAttributes.colors[1].buffer);\n\t\n\t transferrables.push(mergedAttributes.tops[0].buffer);\n\t transferrables.push(mergedAttributes.tops[1].buffer);\n\t\n\t transferrables.push(mergedOutlineAttributes.positions[0].buffer);\n\t transferrables.push(mergedOutlineAttributes.positions[1].buffer);\n\t\n\t transferrables.push(mergedOutlineAttributes.colors[0].buffer);\n\t transferrables.push(mergedOutlineAttributes.colors[1].buffer);\n\t\n\t var mergedProperties;\n\t if (_properties) {\n\t mergedProperties = _utilBuffer2['default'].mergeUint8Arrays(properties);\n\t\n\t transferrables.push(mergedProperties[0].buffer);\n\t transferrables.push(mergedProperties[1].buffer);\n\t }\n\t\n\t var output = {\n\t attributes: mergedAttributes,\n\t outlineAttributes: mergedOutlineAttributes,\n\t flats: flats\n\t };\n\t\n\t if (_properties) {\n\t output.properties = mergedProperties;\n\t }\n\t\n\t // TODO: Also return GeoJSON features that can be mapped to objects on\n\t // the main thread. Allow user to provide filter / toggles to only return\n\t // properties from the GeoJSON that they need (eg. don't return geometry,\n\t // or don't return properties.height)\n\t resolve({\n\t data: output,\n\t transferrables: transferrables\n\t });\n\t })['catch'](reject);\n\t });\n\t }\n\t }, {\n\t key: 'ProcessPolylines',\n\t value: function ProcessPolylines(polylinePromises, polylines, _properties) {\n\t return new Promise(function (resolve, reject) {\n\t Promise.all(polylinePromises).then(function (results) {\n\t var transferrables = [];\n\t\n\t var positions = [];\n\t var colors = [];\n\t\n\t var properties = [];\n\t\n\t var flats = [];\n\t var polyline;\n\t\n\t var result;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\t\n\t polyline = polylines[i];\n\t\n\t // WORKERS: Making this a typed array will speed up transfer time\n\t // As things stand this adds on a few milliseconds\n\t flats.push(result.flat);\n\t\n\t // WORKERS: result.attributes is actually an array of polygons for each\n\t // feature, though the current logic isn't keeping these all together\n\t\n\t var attributes;\n\t for (var j = 0; j < result.attributes.length; j++) {\n\t attributes = result.attributes[j];\n\t\n\t positions.push(attributes.positions);\n\t colors.push(attributes.colors);\n\t\n\t if (_properties) {\n\t properties.push(_utilBuffer2['default'].stringToUint8Array(JSON.stringify(polyline.properties)));\n\t }\n\t };\n\t };\n\t\n\t var mergedAttributes = {\n\t positions: _utilBuffer2['default'].mergeFloat32Arrays(positions),\n\t colors: _utilBuffer2['default'].mergeFloat32Arrays(colors)\n\t };\n\t\n\t transferrables.push(mergedAttributes.positions[0].buffer);\n\t transferrables.push(mergedAttributes.positions[1].buffer);\n\t\n\t transferrables.push(mergedAttributes.colors[0].buffer);\n\t transferrables.push(mergedAttributes.colors[1].buffer);\n\t\n\t var mergedProperties;\n\t if (_properties) {\n\t mergedProperties = _utilBuffer2['default'].mergeUint8Arrays(properties);\n\t\n\t transferrables.push(mergedProperties[0].buffer);\n\t transferrables.push(mergedProperties[1].buffer);\n\t }\n\t\n\t var output = {\n\t attributes: mergedAttributes,\n\t flats: flats\n\t };\n\t\n\t if (_properties) {\n\t output.properties = mergedProperties;\n\t }\n\t\n\t // TODO: Also return GeoJSON features that can be mapped to objects on\n\t // the main thread. Allow user to provide filter / toggles to only return\n\t // properties from the GeoJSON that they need (eg. don't return geometry,\n\t // or don't return properties.height)\n\t resolve({\n\t data: output,\n\t transferrables: transferrables\n\t });\n\t })['catch'](reject);\n\t });\n\t }\n\t\n\t // TODO: Dedupe with ProcessPolygons as they are identical\n\t }, {\n\t key: 'ProcessPoints',\n\t value: function ProcessPoints(pointPromises, points, _properties) {\n\t return new Promise(function (resolve, reject) {\n\t Promise.all(pointPromises).then(function (results) {\n\t var transferrables = [];\n\t\n\t var positions = [];\n\t var normals = [];\n\t var colors = [];\n\t\n\t var properties = [];\n\t\n\t var flats = [];\n\t var point;\n\t\n\t var result;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\t\n\t point = points[i];\n\t\n\t // WORKERS: Making this a typed array will speed up transfer time\n\t // As things stand this adds on a few milliseconds\n\t flats.push(result.flat);\n\t\n\t // WORKERS: result.attributes is actually an array of polygons for each\n\t // feature, though the current logic isn't keeping these all together\n\t\n\t var attributes;\n\t for (var j = 0; j < result.attributes.length; j++) {\n\t attributes = result.attributes[j];\n\t\n\t positions.push(attributes.positions);\n\t normals.push(attributes.normals);\n\t colors.push(attributes.colors);\n\t\n\t if (_properties) {\n\t properties.push(_utilBuffer2['default'].stringToUint8Array(JSON.stringify(polygon.properties)));\n\t }\n\t };\n\t };\n\t\n\t var mergedAttributes = {\n\t positions: _utilBuffer2['default'].mergeFloat32Arrays(positions),\n\t normals: _utilBuffer2['default'].mergeFloat32Arrays(normals),\n\t colors: _utilBuffer2['default'].mergeFloat32Arrays(colors)\n\t };\n\t\n\t transferrables.push(mergedAttributes.positions[0].buffer);\n\t transferrables.push(mergedAttributes.positions[1].buffer);\n\t\n\t transferrables.push(mergedAttributes.normals[0].buffer);\n\t transferrables.push(mergedAttributes.normals[1].buffer);\n\t\n\t transferrables.push(mergedAttributes.colors[0].buffer);\n\t transferrables.push(mergedAttributes.colors[1].buffer);\n\t\n\t var mergedProperties;\n\t if (_properties) {\n\t mergedProperties = _utilBuffer2['default'].mergeUint8Arrays(properties);\n\t\n\t transferrables.push(mergedProperties[0].buffer);\n\t transferrables.push(mergedProperties[1].buffer);\n\t }\n\t\n\t var output = {\n\t attributes: mergedAttributes,\n\t flats: flats\n\t };\n\t\n\t if (_properties) {\n\t output.properties = mergedProperties;\n\t }\n\t\n\t // TODO: Also return GeoJSON features that can be mapped to objects on\n\t // the main thread. Allow user to provide filter / toggles to only return\n\t // properties from the GeoJSON that they need (eg. don't return geometry,\n\t // or don't return properties.height)\n\t resolve({\n\t data: output,\n\t transferrables: transferrables\n\t });\n\t })['catch'](reject);\n\t });\n\t }\n\t }, {\n\t key: 'ProcessGeoJSON',\n\t value: function ProcessGeoJSON(geojson, headers) {\n\t if (typeof geojson === 'string') {\n\t return GeoJSONWorkerLayer.RequestGeoJSON(geojson, headers);\n\t } else {\n\t return Promise.resolve(JSON.parse(_utilBuffer2['default'].uint8ArrayToString(geojson)));\n\t }\n\t }\n\t }, {\n\t key: 'RequestGeoJSON',\n\t value: function RequestGeoJSON(path, headers) {\n\t return (0, _reqwest2['default'])({\n\t url: path,\n\t type: 'json',\n\t crossOrigin: true,\n\t headers: headers\n\t });\n\t }\n\t }]);\n\t\n\t return GeoJSONWorkerLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = GeoJSONWorkerLayer;\n\t\n\tvar noNew = function noNew(geojson, options) {\n\t return new GeoJSONWorkerLayer(geojson, options);\n\t};\n\t\n\texports.geoJSONWorkerLayer = noNew;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t * Reqwest! A general purpose XHR connection manager\n\t * license MIT (c) Dustin Diaz 2015\n\t * https://github.com/ded/reqwest\n\t */\n\t\n\t!function (name, context, definition) {\n\t if (typeof module != 'undefined' && module.exports) module.exports = definition()\n\t else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\t else context[name] = definition()\n\t}('reqwest', this, function () {\n\t\n\t var context = this\n\t\n\t if ('window' in context) {\n\t var doc = document\n\t , byTag = 'getElementsByTagName'\n\t , head = doc[byTag]('head')[0]\n\t } else {\n\t var XHR2\n\t try {\n\t XHR2 = __webpack_require__(24)\n\t } catch (ex) {\n\t throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n\t }\n\t }\n\t\n\t\n\t var httpsRe = /^http/\n\t , protocolRe = /(^\\w+):\\/\\//\n\t , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n\t , readyState = 'readyState'\n\t , contentType = 'Content-Type'\n\t , requestedWith = 'X-Requested-With'\n\t , uniqid = 0\n\t , callbackPrefix = 'reqwest_' + (+new Date())\n\t , lastValue // data stored by the most recent JSONP callback\n\t , xmlHttpRequest = 'XMLHttpRequest'\n\t , xDomainRequest = 'XDomainRequest'\n\t , noop = function () {}\n\t\n\t , isArray = typeof Array.isArray == 'function'\n\t ? Array.isArray\n\t : function (a) {\n\t return a instanceof Array\n\t }\n\t\n\t , defaultHeaders = {\n\t 'contentType': 'application/x-www-form-urlencoded'\n\t , 'requestedWith': xmlHttpRequest\n\t , 'accept': {\n\t '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n\t , 'xml': 'application/xml, text/xml'\n\t , 'html': 'text/html'\n\t , 'text': 'text/plain'\n\t , 'json': 'application/json, text/javascript'\n\t , 'js': 'application/javascript, text/javascript'\n\t }\n\t }\n\t\n\t , xhr = function(o) {\n\t // is it x-domain\n\t if (o['crossOrigin'] === true) {\n\t var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n\t if (xhr && 'withCredentials' in xhr) {\n\t return xhr\n\t } else if (context[xDomainRequest]) {\n\t return new XDomainRequest()\n\t } else {\n\t throw new Error('Browser does not support cross-origin requests')\n\t }\n\t } else if (context[xmlHttpRequest]) {\n\t return new XMLHttpRequest()\n\t } else if (XHR2) {\n\t return new XHR2()\n\t } else {\n\t return new ActiveXObject('Microsoft.XMLHTTP')\n\t }\n\t }\n\t , globalSetupOptions = {\n\t dataFilter: function (data) {\n\t return data\n\t }\n\t }\n\t\n\t function succeed(r) {\n\t var protocol = protocolRe.exec(r.url)\n\t protocol = (protocol && protocol[1]) || context.location.protocol\n\t return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n\t }\n\t\n\t function handleReadyState(r, success, error) {\n\t return function () {\n\t // use _aborted to mitigate against IE err c00c023f\n\t // (can't read props on aborted request objects)\n\t if (r._aborted) return error(r.request)\n\t if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n\t if (r.request && r.request[readyState] == 4) {\n\t r.request.onreadystatechange = noop\n\t if (succeed(r)) success(r.request)\n\t else\n\t error(r.request)\n\t }\n\t }\n\t }\n\t\n\t function setHeaders(http, o) {\n\t var headers = o['headers'] || {}\n\t , h\n\t\n\t headers['Accept'] = headers['Accept']\n\t || defaultHeaders['accept'][o['type']]\n\t || defaultHeaders['accept']['*']\n\t\n\t var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n\t // breaks cross-origin requests with legacy browsers\n\t if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n\t if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n\t for (h in headers)\n\t headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n\t }\n\t\n\t function setCredentials(http, o) {\n\t if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n\t http.withCredentials = !!o['withCredentials']\n\t }\n\t }\n\t\n\t function generalCallback(data) {\n\t lastValue = data\n\t }\n\t\n\t function urlappend (url, s) {\n\t return url + (/\\?/.test(url) ? '&' : '?') + s\n\t }\n\t\n\t function handleJsonp(o, fn, err, url) {\n\t var reqId = uniqid++\n\t , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n\t , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n\t , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n\t , match = url.match(cbreg)\n\t , script = doc.createElement('script')\n\t , loaded = 0\n\t , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\t\n\t if (match) {\n\t if (match[3] === '?') {\n\t url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n\t } else {\n\t cbval = match[3] // provided callback func name\n\t }\n\t } else {\n\t url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n\t }\n\t\n\t context[cbval] = generalCallback\n\t\n\t script.type = 'text/javascript'\n\t script.src = url\n\t script.async = true\n\t if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n\t // need this for IE due to out-of-order onreadystatechange(), binding script\n\t // execution to an event listener gives us control over when the script\n\t // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n\t script.htmlFor = script.id = '_reqwest_' + reqId\n\t }\n\t\n\t script.onload = script.onreadystatechange = function () {\n\t if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n\t return false\n\t }\n\t script.onload = script.onreadystatechange = null\n\t script.onclick && script.onclick()\n\t // Call the user callback with the last value stored and clean up values and scripts.\n\t fn(lastValue)\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t\n\t // Add the script to the DOM head\n\t head.appendChild(script)\n\t\n\t // Enable JSONP timeout\n\t return {\n\t abort: function () {\n\t script.onload = script.onreadystatechange = null\n\t err({}, 'Request is aborted: timeout', {})\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t }\n\t }\n\t\n\t function getRequest(fn, err) {\n\t var o = this.o\n\t , method = (o['method'] || 'GET').toUpperCase()\n\t , url = typeof o === 'string' ? o : o['url']\n\t // convert non-string objects to query-string form unless o['processData'] is false\n\t , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n\t ? reqwest.toQueryString(o['data'])\n\t : (o['data'] || null)\n\t , http\n\t , sendWait = false\n\t\n\t // if we're working on a GET request and we have data then we should append\n\t // query string to end of URL and not post data\n\t if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n\t url = urlappend(url, data)\n\t data = null\n\t }\n\t\n\t if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\t\n\t // get the xhr from the factory if passed\n\t // if the factory returns null, fall-back to ours\n\t http = (o.xhr && o.xhr(o)) || xhr(o)\n\t\n\t http.open(method, url, o['async'] === false ? false : true)\n\t setHeaders(http, o)\n\t setCredentials(http, o)\n\t if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n\t http.onload = fn\n\t http.onerror = err\n\t // NOTE: see\n\t // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n\t http.onprogress = function() {}\n\t sendWait = true\n\t } else {\n\t http.onreadystatechange = handleReadyState(this, fn, err)\n\t }\n\t o['before'] && o['before'](http)\n\t if (sendWait) {\n\t setTimeout(function () {\n\t http.send(data)\n\t }, 200)\n\t } else {\n\t http.send(data)\n\t }\n\t return http\n\t }\n\t\n\t function Reqwest(o, fn) {\n\t this.o = o\n\t this.fn = fn\n\t\n\t init.apply(this, arguments)\n\t }\n\t\n\t function setType(header) {\n\t // json, javascript, text/plain, text/html, xml\n\t if (header === null) return undefined; //In case of no content-type.\n\t if (header.match('json')) return 'json'\n\t if (header.match('javascript')) return 'js'\n\t if (header.match('text')) return 'html'\n\t if (header.match('xml')) return 'xml'\n\t }\n\t\n\t function init(o, fn) {\n\t\n\t this.url = typeof o == 'string' ? o : o['url']\n\t this.timeout = null\n\t\n\t // whether request has been fulfilled for purpose\n\t // of tracking the Promises\n\t this._fulfilled = false\n\t // success handlers\n\t this._successHandler = function(){}\n\t this._fulfillmentHandlers = []\n\t // error handlers\n\t this._errorHandlers = []\n\t // complete (both success and fail) handlers\n\t this._completeHandlers = []\n\t this._erred = false\n\t this._responseArgs = {}\n\t\n\t var self = this\n\t\n\t fn = fn || function () {}\n\t\n\t if (o['timeout']) {\n\t this.timeout = setTimeout(function () {\n\t timedOut()\n\t }, o['timeout'])\n\t }\n\t\n\t if (o['success']) {\n\t this._successHandler = function () {\n\t o['success'].apply(o, arguments)\n\t }\n\t }\n\t\n\t if (o['error']) {\n\t this._errorHandlers.push(function () {\n\t o['error'].apply(o, arguments)\n\t })\n\t }\n\t\n\t if (o['complete']) {\n\t this._completeHandlers.push(function () {\n\t o['complete'].apply(o, arguments)\n\t })\n\t }\n\t\n\t function complete (resp) {\n\t o['timeout'] && clearTimeout(self.timeout)\n\t self.timeout = null\n\t while (self._completeHandlers.length > 0) {\n\t self._completeHandlers.shift()(resp)\n\t }\n\t }\n\t\n\t function success (resp) {\n\t var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n\t resp = (type !== 'jsonp') ? self.request : resp\n\t // use global data filter on response text\n\t var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n\t , r = filteredResponse\n\t try {\n\t resp.responseText = r\n\t } catch (e) {\n\t // can't assign this in IE<=8, just ignore\n\t }\n\t if (r) {\n\t switch (type) {\n\t case 'json':\n\t try {\n\t resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n\t } catch (err) {\n\t return error(resp, 'Could not parse JSON in response', err)\n\t }\n\t break\n\t case 'js':\n\t resp = eval(r)\n\t break\n\t case 'html':\n\t resp = r\n\t break\n\t case 'xml':\n\t resp = resp.responseXML\n\t && resp.responseXML.parseError // IE trololo\n\t && resp.responseXML.parseError.errorCode\n\t && resp.responseXML.parseError.reason\n\t ? null\n\t : resp.responseXML\n\t break\n\t }\n\t }\n\t\n\t self._responseArgs.resp = resp\n\t self._fulfilled = true\n\t fn(resp)\n\t self._successHandler(resp)\n\t while (self._fulfillmentHandlers.length > 0) {\n\t resp = self._fulfillmentHandlers.shift()(resp)\n\t }\n\t\n\t complete(resp)\n\t }\n\t\n\t function timedOut() {\n\t self._timedOut = true\n\t self.request.abort()\n\t }\n\t\n\t function error(resp, msg, t) {\n\t resp = self.request\n\t self._responseArgs.resp = resp\n\t self._responseArgs.msg = msg\n\t self._responseArgs.t = t\n\t self._erred = true\n\t while (self._errorHandlers.length > 0) {\n\t self._errorHandlers.shift()(resp, msg, t)\n\t }\n\t complete(resp)\n\t }\n\t\n\t this.request = getRequest.call(this, success, error)\n\t }\n\t\n\t Reqwest.prototype = {\n\t abort: function () {\n\t this._aborted = true\n\t this.request.abort()\n\t }\n\t\n\t , retry: function () {\n\t init.call(this, this.o, this.fn)\n\t }\n\t\n\t /**\n\t * Small deviation from the Promises A CommonJs specification\n\t * http://wiki.commonjs.org/wiki/Promises/A\n\t */\n\t\n\t /**\n\t * `then` will execute upon successful requests\n\t */\n\t , then: function (success, fail) {\n\t success = success || function () {}\n\t fail = fail || function () {}\n\t if (this._fulfilled) {\n\t this._responseArgs.resp = success(this._responseArgs.resp)\n\t } else if (this._erred) {\n\t fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._fulfillmentHandlers.push(success)\n\t this._errorHandlers.push(fail)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `always` will execute whether the request succeeds or fails\n\t */\n\t , always: function (fn) {\n\t if (this._fulfilled || this._erred) {\n\t fn(this._responseArgs.resp)\n\t } else {\n\t this._completeHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `fail` will execute when the request fails\n\t */\n\t , fail: function (fn) {\n\t if (this._erred) {\n\t fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._errorHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t , 'catch': function (fn) {\n\t return this.fail(fn)\n\t }\n\t }\n\t\n\t function reqwest(o, fn) {\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t // normalize newline variants according to spec -> CRLF\n\t function normalize(s) {\n\t return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n\t }\n\t\n\t function serial(el, cb) {\n\t var n = el.name\n\t , t = el.tagName.toLowerCase()\n\t , optCb = function (o) {\n\t // IE gives value=\"\" even where there is no value attribute\n\t // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n\t if (o && !o['disabled'])\n\t cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n\t }\n\t , ch, ra, val, i\n\t\n\t // don't serialize elements that are disabled or without a name\n\t if (el.disabled || !n) return\n\t\n\t switch (t) {\n\t case 'input':\n\t if (!/reset|button|image|file/i.test(el.type)) {\n\t ch = /checkbox/i.test(el.type)\n\t ra = /radio/i.test(el.type)\n\t val = el.value\n\t // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n\t ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n\t }\n\t break\n\t case 'textarea':\n\t cb(n, normalize(el.value))\n\t break\n\t case 'select':\n\t if (el.type.toLowerCase() === 'select-one') {\n\t optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n\t } else {\n\t for (i = 0; el.length && i < el.length; i++) {\n\t el.options[i].selected && optCb(el.options[i])\n\t }\n\t }\n\t break\n\t }\n\t }\n\t\n\t // collect up all form elements found from the passed argument elements all\n\t // the way down to child elements; pass a '
' or form fields.\n\t // called with 'this'=callback to use for serial() on each element\n\t function eachFormElement() {\n\t var cb = this\n\t , e, i\n\t , serializeSubtags = function (e, tags) {\n\t var i, j, fa\n\t for (i = 0; i < tags.length; i++) {\n\t fa = e[byTag](tags[i])\n\t for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n\t }\n\t }\n\t\n\t for (i = 0; i < arguments.length; i++) {\n\t e = arguments[i]\n\t if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n\t serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n\t }\n\t }\n\t\n\t // standard query string style serialization\n\t function serializeQueryString() {\n\t return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n\t }\n\t\n\t // { 'name': 'value', ... } style serialization\n\t function serializeHash() {\n\t var hash = {}\n\t eachFormElement.apply(function (name, value) {\n\t if (name in hash) {\n\t hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n\t hash[name].push(value)\n\t } else hash[name] = value\n\t }, arguments)\n\t return hash\n\t }\n\t\n\t // [ { name: 'name', value: 'value' }, ... ] style serialization\n\t reqwest.serializeArray = function () {\n\t var arr = []\n\t eachFormElement.apply(function (name, value) {\n\t arr.push({name: name, value: value})\n\t }, arguments)\n\t return arr\n\t }\n\t\n\t reqwest.serialize = function () {\n\t if (arguments.length === 0) return ''\n\t var opt, fn\n\t , args = Array.prototype.slice.call(arguments, 0)\n\t\n\t opt = args.pop()\n\t opt && opt.nodeType && args.push(opt) && (opt = null)\n\t opt && (opt = opt.type)\n\t\n\t if (opt == 'map') fn = serializeHash\n\t else if (opt == 'array') fn = reqwest.serializeArray\n\t else fn = serializeQueryString\n\t\n\t return fn.apply(null, args)\n\t }\n\t\n\t reqwest.toQueryString = function (o, trad) {\n\t var prefix, i\n\t , traditional = trad || false\n\t , s = []\n\t , enc = encodeURIComponent\n\t , add = function (key, value) {\n\t // If value is a function, invoke it and return its value\n\t value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n\t s[s.length] = enc(key) + '=' + enc(value)\n\t }\n\t // If an array was passed in, assume that it is an array of form elements.\n\t if (isArray(o)) {\n\t for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n\t } else {\n\t // If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t // did it), otherwise encode params recursively.\n\t for (prefix in o) {\n\t if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n\t }\n\t }\n\t\n\t // spaces should be + according to spec\n\t return s.join('&').replace(/%20/g, '+')\n\t }\n\t\n\t function buildParams(prefix, obj, traditional, add) {\n\t var name, i, v\n\t , rbracket = /\\[\\]$/\n\t\n\t if (isArray(obj)) {\n\t // Serialize array item.\n\t for (i = 0; obj && i < obj.length; i++) {\n\t v = obj[i]\n\t if (traditional || rbracket.test(prefix)) {\n\t // Treat each array item as a scalar.\n\t add(prefix, v)\n\t } else {\n\t buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n\t }\n\t }\n\t } else if (obj && obj.toString() === '[object Object]') {\n\t // Serialize object item.\n\t for (name in obj) {\n\t buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n\t }\n\t\n\t } else {\n\t // Serialize scalar item.\n\t add(prefix, obj)\n\t }\n\t }\n\t\n\t reqwest.getcallbackPrefix = function () {\n\t return callbackPrefix\n\t }\n\t\n\t // jQuery and Zepto compatibility, differences can be remapped here so you can call\n\t // .ajax.compat(options, callback)\n\t reqwest.compat = function (o, fn) {\n\t if (o) {\n\t o['type'] && (o['method'] = o['type']) && delete o['type']\n\t o['dataType'] && (o['type'] = o['dataType'])\n\t o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n\t o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n\t }\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t reqwest.ajaxSetup = function (options) {\n\t options = options || {}\n\t for (var k in options) {\n\t globalSetupOptions[k] = options[k]\n\t }\n\t }\n\t\n\t return reqwest\n\t});\n\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\t/* (ignored) */\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * GeoJSON helpers for handling data and generating objects\n\t */\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _topojson2 = __webpack_require__(26);\n\t\n\tvar topojson = _interopRequireWildcard(_topojson2);\n\t\n\tvar _geojsonMerge = __webpack_require__(27);\n\t\n\tvar _geojsonMerge2 = _interopRequireDefault(_geojsonMerge);\n\t\n\tvar _earcut = __webpack_require__(29);\n\t\n\tvar _earcut2 = _interopRequireDefault(_earcut);\n\t\n\tvar _extrudePolygon = __webpack_require__(30);\n\t\n\tvar _extrudePolygon2 = _interopRequireDefault(_extrudePolygon);\n\t\n\t// TODO: Make it so height can be per-coordinate / point but connected together\n\t// as a linestring (eg. GPS points with an elevation at each point)\n\t//\n\t// This isn't really valid GeoJSON so perhaps something best left to an external\n\t// component for now, until a better approach can be considered\n\t//\n\t// See: http://lists.geojson.org/pipermail/geojson-geojson.org/2009-June/000489.html\n\t\n\t// Light and dark colours used for poor-mans AO gradient on object sides\n\tvar light = new _three2['default'].Color(0xffffff);\n\tvar shadow = new _three2['default'].Color(0x666666);\n\t\n\tvar GeoJSON = (function () {\n\t var defaultStyle = {\n\t color: '#ffffff',\n\t outline: false,\n\t outlineColor: '#000000',\n\t transparent: false,\n\t opacity: 1,\n\t blending: _three2['default'].NormalBlending,\n\t height: 0,\n\t lineOpacity: 1,\n\t lineTransparent: false,\n\t lineColor: '#ffffff',\n\t lineWidth: 1,\n\t lineBlending: _three2['default'].NormalBlending\n\t };\n\t\n\t // Attempts to merge together multiple GeoJSON Features or FeatureCollections\n\t // into a single FeatureCollection\n\t var collectFeatures = function collectFeatures(data, _topojson) {\n\t var collections = [];\n\t\n\t if (_topojson) {\n\t // TODO: Allow TopoJSON objects to be overridden as an option\n\t\n\t // If not overridden, merge all features from all objects\n\t for (var tk in data.objects) {\n\t collections.push(topojson.feature(data, data.objects[tk]));\n\t }\n\t\n\t return (0, _geojsonMerge2['default'])(collections);\n\t } else {\n\t // If root doesn't have a type then let's see if there are features in the\n\t // next step down\n\t if (!data.type) {\n\t // TODO: Allow GeoJSON objects to be overridden as an option\n\t\n\t // If not overridden, merge all features from all objects\n\t for (var gk in data) {\n\t if (!data[gk].type) {\n\t continue;\n\t }\n\t\n\t collections.push(data[gk]);\n\t }\n\t\n\t return (0, _geojsonMerge2['default'])(collections);\n\t } else if (Array.isArray(data)) {\n\t return (0, _geojsonMerge2['default'])(data);\n\t } else {\n\t return data;\n\t }\n\t }\n\t };\n\t\n\t // TODO: This is only used by GeoJSONTile so either roll it into that or\n\t // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n\t var lineStringAttributes = function lineStringAttributes(coordinates, colour, height) {\n\t var _coords = [];\n\t var _colours = [];\n\t\n\t var nextCoord;\n\t\n\t // Connect coordinate with the next to make a pair\n\t //\n\t // LineSegments requires pairs of vertices so repeat the last point if\n\t // there's an odd number of vertices\n\t coordinates.forEach(function (coordinate, index) {\n\t _colours.push([colour.r, colour.g, colour.b]);\n\t _coords.push([coordinate[0], height, coordinate[1]]);\n\t\n\t nextCoord = coordinates[index + 1] ? coordinates[index + 1] : coordinate;\n\t\n\t _colours.push([colour.r, colour.g, colour.b]);\n\t _coords.push([nextCoord[0], height, nextCoord[1]]);\n\t });\n\t\n\t return {\n\t vertices: _coords,\n\t colours: _colours\n\t };\n\t };\n\t\n\t // TODO: This is only used by GeoJSONTile so either roll it into that or\n\t // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n\t var multiLineStringAttributes = function multiLineStringAttributes(coordinates, colour, height) {\n\t var _coords = [];\n\t var _colours = [];\n\t\n\t var result;\n\t coordinates.forEach(function (coordinate) {\n\t result = lineStringAttributes(coordinate, colour, height);\n\t\n\t result.vertices.forEach(function (coord) {\n\t _coords.push(coord);\n\t });\n\t\n\t result.colours.forEach(function (colour) {\n\t _colours.push(colour);\n\t });\n\t });\n\t\n\t return {\n\t vertices: _coords,\n\t colours: _colours\n\t };\n\t };\n\t\n\t // TODO: This is only used by GeoJSONTile so either roll it into that or\n\t // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n\t var polygonAttributes = function polygonAttributes(coordinates, colour, height) {\n\t var earcutData = _toEarcut(coordinates);\n\t\n\t var faces = _triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\t\n\t var groupedVertices = [];\n\t for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) {\n\t groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions));\n\t }\n\t\n\t var extruded = (0, _extrudePolygon2['default'])(groupedVertices, faces, {\n\t bottom: 0,\n\t top: height\n\t });\n\t\n\t var topColor = colour.clone().multiply(light);\n\t var bottomColor = colour.clone().multiply(shadow);\n\t\n\t var _vertices = extruded.positions;\n\t var _faces = [];\n\t var _colours = [];\n\t\n\t var _colour;\n\t extruded.top.forEach(function (face, fi) {\n\t _colour = [];\n\t\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t\n\t _faces.push(face);\n\t _colours.push(_colour);\n\t });\n\t\n\t var allFlat = true;\n\t\n\t if (extruded.sides) {\n\t if (allFlat) {\n\t allFlat = false;\n\t }\n\t\n\t // Set up colours for every vertex with poor-mans AO on the sides\n\t extruded.sides.forEach(function (face, fi) {\n\t _colour = [];\n\t\n\t // First face is always bottom-bottom-top\n\t if (fi % 2 === 0) {\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t // Reverse winding for the second face\n\t // top-top-bottom\n\t } else {\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t }\n\t\n\t _faces.push(face);\n\t _colours.push(_colour);\n\t });\n\t }\n\t\n\t // Skip bottom as there's no point rendering it\n\t // allFaces.push(extruded.faces);\n\t\n\t return {\n\t vertices: _vertices,\n\t faces: _faces,\n\t colours: _colours,\n\t flat: allFlat\n\t };\n\t };\n\t\n\t // TODO: This is only used by GeoJSONTile so either roll it into that or\n\t // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n\t var _toEarcut = function _toEarcut(data) {\n\t var dim = data[0][0].length;\n\t var result = { vertices: [], holes: [], dimensions: dim };\n\t var holeIndex = 0;\n\t\n\t for (var i = 0; i < data.length; i++) {\n\t for (var j = 0; j < data[i].length; j++) {\n\t for (var d = 0; d < dim; d++) {\n\t result.vertices.push(data[i][j][d]);\n\t }\n\t }\n\t if (i > 0) {\n\t holeIndex += data[i - 1].length;\n\t result.holes.push(holeIndex);\n\t }\n\t }\n\t\n\t return result;\n\t };\n\t\n\t // TODO: This is only used by GeoJSONTile so either roll it into that or\n\t // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n\t var _triangulate = function _triangulate(contour, holes, dim) {\n\t // console.time('earcut');\n\t\n\t var faces = (0, _earcut2['default'])(contour, holes, dim);\n\t var result = [];\n\t\n\t for (i = 0, il = faces.length; i < il; i += 3) {\n\t result.push(faces.slice(i, i + 3));\n\t }\n\t\n\t // console.timeEnd('earcut');\n\t\n\t return result;\n\t };\n\t\n\t return {\n\t defaultStyle: defaultStyle,\n\t collectFeatures: collectFeatures,\n\t lineStringAttributes: lineStringAttributes,\n\t multiLineStringAttributes: multiLineStringAttributes,\n\t polygonAttributes: polygonAttributes\n\t };\n\t})();\n\t\n\texports['default'] = GeoJSON;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function (global, factory) {\n\t true ? factory(exports) :\n\t typeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t (factory((global.topojson = global.topojson || {})));\n\t}(this, (function (exports) { 'use strict';\n\t\n\tfunction noop() {}\n\t\n\tfunction transformAbsolute(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t point[0] = (x0 += point[0]) * kx + dx;\n\t point[1] = (y0 += point[1]) * ky + dy;\n\t };\n\t}\n\t\n\tfunction transformRelative(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t var x1 = Math.round((point[0] - dx) / kx),\n\t y1 = Math.round((point[1] - dy) / ky);\n\t point[0] = x1 - x0;\n\t point[1] = y1 - y0;\n\t x0 = x1;\n\t y0 = y1;\n\t };\n\t}\n\t\n\tfunction reverse(array, n) {\n\t var t, j = array.length, i = j - n;\n\t while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n\t}\n\t\n\tfunction bisect(a, x) {\n\t var lo = 0, hi = a.length;\n\t while (lo < hi) {\n\t var mid = lo + hi >>> 1;\n\t if (a[mid] < x) lo = mid + 1;\n\t else hi = mid;\n\t }\n\t return lo;\n\t}\n\t\n\tfunction feature(topology, o) {\n\t return o.type === \"GeometryCollection\" ? {\n\t type: \"FeatureCollection\",\n\t features: o.geometries.map(function(o) { return feature$1(topology, o); })\n\t } : feature$1(topology, o);\n\t}\n\t\n\tfunction feature$1(topology, o) {\n\t var f = {\n\t type: \"Feature\",\n\t id: o.id,\n\t properties: o.properties || {},\n\t geometry: object(topology, o)\n\t };\n\t if (o.id == null) delete f.id;\n\t return f;\n\t}\n\t\n\tfunction object(topology, o) {\n\t var absolute = transformAbsolute(topology.transform),\n\t arcs = topology.arcs;\n\t\n\t function arc(i, points) {\n\t if (points.length) points.pop();\n\t for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n\t points.push(p = a[k].slice());\n\t absolute(p, k);\n\t }\n\t if (i < 0) reverse(points, n);\n\t }\n\t\n\t function point(p) {\n\t p = p.slice();\n\t absolute(p, 0);\n\t return p;\n\t }\n\t\n\t function line(arcs) {\n\t var points = [];\n\t for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n\t if (points.length < 2) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function ring(arcs) {\n\t var points = line(arcs);\n\t while (points.length < 4) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function polygon(arcs) {\n\t return arcs.map(ring);\n\t }\n\t\n\t function geometry(o) {\n\t var t = o.type;\n\t return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n\t : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n\t : null;\n\t }\n\t\n\t var geometryType = {\n\t Point: function(o) { return point(o.coordinates); },\n\t MultiPoint: function(o) { return o.coordinates.map(point); },\n\t LineString: function(o) { return line(o.arcs); },\n\t MultiLineString: function(o) { return o.arcs.map(line); },\n\t Polygon: function(o) { return polygon(o.arcs); },\n\t MultiPolygon: function(o) { return o.arcs.map(polygon); }\n\t };\n\t\n\t return geometry(o);\n\t}\n\t\n\tfunction stitchArcs(topology, arcs) {\n\t var stitchedArcs = {},\n\t fragmentByStart = {},\n\t fragmentByEnd = {},\n\t fragments = [],\n\t emptyIndex = -1;\n\t\n\t // Stitch empty arcs first, since they may be subsumed by other arcs.\n\t arcs.forEach(function(i, j) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], t;\n\t if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n\t t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n\t }\n\t });\n\t\n\t arcs.forEach(function(i) {\n\t var e = ends(i),\n\t start = e[0],\n\t end = e[1],\n\t f, g;\n\t\n\t if (f = fragmentByEnd[start]) {\n\t delete fragmentByEnd[f.end];\n\t f.push(i);\n\t f.end = end;\n\t if (g = fragmentByStart[end]) {\n\t delete fragmentByStart[g.start];\n\t var fg = g === f ? f : f.concat(g);\n\t fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else if (f = fragmentByStart[end]) {\n\t delete fragmentByStart[f.start];\n\t f.unshift(i);\n\t f.start = start;\n\t if (g = fragmentByEnd[start]) {\n\t delete fragmentByEnd[g.end];\n\t var gf = g === f ? f : g.concat(f);\n\t fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else {\n\t f = [i];\n\t fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n\t }\n\t });\n\t\n\t function ends(i) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n\t if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n\t else p1 = arc[arc.length - 1];\n\t return i < 0 ? [p1, p0] : [p0, p1];\n\t }\n\t\n\t function flush(fragmentByEnd, fragmentByStart) {\n\t for (var k in fragmentByEnd) {\n\t var f = fragmentByEnd[k];\n\t delete fragmentByStart[f.start];\n\t delete f.start;\n\t delete f.end;\n\t f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n\t fragments.push(f);\n\t }\n\t }\n\t\n\t flush(fragmentByEnd, fragmentByStart);\n\t flush(fragmentByStart, fragmentByEnd);\n\t arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\t\n\t return fragments;\n\t}\n\t\n\tfunction mesh(topology) {\n\t return object(topology, meshArcs.apply(this, arguments));\n\t}\n\t\n\tfunction meshArcs(topology, o, filter) {\n\t var arcs = [];\n\t\n\t function arc(i) {\n\t var j = i < 0 ? ~i : i;\n\t (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n\t }\n\t\n\t function line(arcs) {\n\t arcs.forEach(arc);\n\t }\n\t\n\t function polygon(arcs) {\n\t arcs.forEach(line);\n\t }\n\t\n\t function geometry(o) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n\t else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n\t }\n\t\n\t if (arguments.length > 1) {\n\t var geomsByArc = [],\n\t geom;\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n\t };\n\t\n\t geometry(o);\n\t\n\t geomsByArc.forEach(arguments.length < 3\n\t ? function(geoms) { arcs.push(geoms[0].i); }\n\t : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n\t } else {\n\t for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n\t }\n\t\n\t return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n\t}\n\t\n\tfunction cartesianTriangleArea(triangle) {\n\t var a = triangle[0], b = triangle[1], c = triangle[2];\n\t return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n\t}\n\t\n\tfunction ring(ring) {\n\t var i = -1,\n\t n = ring.length,\n\t a,\n\t b = ring[n - 1],\n\t area = 0;\n\t\n\t while (++i < n) {\n\t a = b;\n\t b = ring[i];\n\t area += a[0] * b[1] - a[1] * b[0];\n\t }\n\t\n\t return area / 2;\n\t}\n\t\n\tfunction merge(topology) {\n\t return object(topology, mergeArcs.apply(this, arguments));\n\t}\n\t\n\tfunction mergeArcs(topology, objects) {\n\t var polygonsByArc = {},\n\t polygons = [],\n\t components = [];\n\t\n\t objects.forEach(function(o) {\n\t if (o.type === \"Polygon\") register(o.arcs);\n\t else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n\t });\n\t\n\t function register(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n\t });\n\t });\n\t polygons.push(polygon);\n\t }\n\t\n\t function area(ring$$) {\n\t return Math.abs(ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]));\n\t }\n\t\n\t polygons.forEach(function(polygon) {\n\t if (!polygon._) {\n\t var component = [],\n\t neighbors = [polygon];\n\t polygon._ = 1;\n\t components.push(component);\n\t while (polygon = neighbors.pop()) {\n\t component.push(polygon);\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n\t if (!polygon._) {\n\t polygon._ = 1;\n\t neighbors.push(polygon);\n\t }\n\t });\n\t });\n\t });\n\t }\n\t }\n\t });\n\t\n\t polygons.forEach(function(polygon) {\n\t delete polygon._;\n\t });\n\t\n\t return {\n\t type: \"MultiPolygon\",\n\t arcs: components.map(function(polygons) {\n\t var arcs = [], n;\n\t\n\t // Extract the exterior (unique) arcs.\n\t polygons.forEach(function(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n\t arcs.push(arc);\n\t }\n\t });\n\t });\n\t });\n\t\n\t // Stitch the arcs into one or more rings.\n\t arcs = stitchArcs(topology, arcs);\n\t\n\t // If more than one ring is returned,\n\t // at most one of these rings can be the exterior;\n\t // choose the one with the greatest absolute area.\n\t if ((n = arcs.length) > 1) {\n\t for (var i = 1, k = area(arcs[0]), ki, t; i < n; ++i) {\n\t if ((ki = area(arcs[i])) > k) {\n\t t = arcs[0], arcs[0] = arcs[i], arcs[i] = t, k = ki;\n\t }\n\t }\n\t }\n\t\n\t return arcs;\n\t })\n\t };\n\t}\n\t\n\tfunction neighbors(objects) {\n\t var indexesByArc = {}, // arc index -> array of object indexes\n\t neighbors = objects.map(function() { return []; });\n\t\n\t function line(arcs, i) {\n\t arcs.forEach(function(a) {\n\t if (a < 0) a = ~a;\n\t var o = indexesByArc[a];\n\t if (o) o.push(i);\n\t else indexesByArc[a] = [i];\n\t });\n\t }\n\t\n\t function polygon(arcs, i) {\n\t arcs.forEach(function(arc) { line(arc, i); });\n\t }\n\t\n\t function geometry(o, i) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n\t else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n\t }\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n\t };\n\t\n\t objects.forEach(geometry);\n\t\n\t for (var i in indexesByArc) {\n\t for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n\t for (var k = j + 1; k < m; ++k) {\n\t var ij = indexes[j], ik = indexes[k], n;\n\t if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n\t if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n\t }\n\t }\n\t }\n\t\n\t return neighbors;\n\t}\n\t\n\tfunction compareArea(a, b) {\n\t return a[1][2] - b[1][2];\n\t}\n\t\n\tfunction minAreaHeap() {\n\t var heap = {},\n\t array = [],\n\t size = 0;\n\t\n\t heap.push = function(object) {\n\t up(array[object._ = size] = object, size++);\n\t return size;\n\t };\n\t\n\t heap.pop = function() {\n\t if (size <= 0) return;\n\t var removed = array[0], object;\n\t if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n\t return removed;\n\t };\n\t\n\t heap.remove = function(removed) {\n\t var i = removed._, object;\n\t if (array[i] !== removed) return; // invalid request\n\t if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n\t return i;\n\t };\n\t\n\t function up(object, i) {\n\t while (i > 0) {\n\t var j = ((i + 1) >> 1) - 1,\n\t parent = array[j];\n\t if (compareArea(object, parent) >= 0) break;\n\t array[parent._ = i] = parent;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t function down(object, i) {\n\t while (true) {\n\t var r = (i + 1) << 1,\n\t l = r - 1,\n\t j = i,\n\t child = array[j];\n\t if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n\t if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n\t if (j === i) break;\n\t array[child._ = i] = child;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t return heap;\n\t}\n\t\n\tfunction presimplify(topology, triangleArea) {\n\t var absolute = transformAbsolute(topology.transform),\n\t relative = transformRelative(topology.transform),\n\t heap = minAreaHeap();\n\t\n\t if (!triangleArea) triangleArea = cartesianTriangleArea;\n\t\n\t topology.arcs.forEach(function(arc) {\n\t var triangles = [],\n\t maxArea = 0,\n\t triangle,\n\t i,\n\t n,\n\t p;\n\t\n\t // To store each point’s effective area, we create a new array rather than\n\t // extending the passed-in point to workaround a Chrome/V8 bug (getting\n\t // stuck in smi mode). For midpoints, the initial effective area of\n\t // Infinity will be computed in the next step.\n\t for (i = 0, n = arc.length; i < n; ++i) {\n\t p = arc[i];\n\t absolute(arc[i] = [p[0], p[1], Infinity], i);\n\t }\n\t\n\t for (i = 1, n = arc.length - 1; i < n; ++i) {\n\t triangle = arc.slice(i - 1, i + 2);\n\t triangle[1][2] = triangleArea(triangle);\n\t triangles.push(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t for (i = 0, n = triangles.length; i < n; ++i) {\n\t triangle = triangles[i];\n\t triangle.previous = triangles[i - 1];\n\t triangle.next = triangles[i + 1];\n\t }\n\t\n\t while (triangle = heap.pop()) {\n\t var previous = triangle.previous,\n\t next = triangle.next;\n\t\n\t // If the area of the current point is less than that of the previous point\n\t // to be eliminated, use the latter's area instead. This ensures that the\n\t // current point cannot be eliminated without eliminating previously-\n\t // eliminated points.\n\t if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n\t else maxArea = triangle[1][2];\n\t\n\t if (previous) {\n\t previous.next = next;\n\t previous[2] = triangle[2];\n\t update(previous);\n\t }\n\t\n\t if (next) {\n\t next.previous = previous;\n\t next[0] = triangle[0];\n\t update(next);\n\t }\n\t }\n\t\n\t arc.forEach(relative);\n\t });\n\t\n\t function update(triangle) {\n\t heap.remove(triangle);\n\t triangle[1][2] = triangleArea(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t return topology;\n\t}\n\t\n\tvar version = \"1.6.27\";\n\t\n\texports.version = version;\n\texports.mesh = mesh;\n\texports.meshArcs = meshArcs;\n\texports.merge = merge;\n\texports.mergeArcs = mergeArcs;\n\texports.feature = feature;\n\texports.neighbors = neighbors;\n\texports.presimplify = presimplify;\n\t\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\t\n\t})));\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar normalize = __webpack_require__(28);\n\t\n\tmodule.exports = function(inputs) {\n\t return {\n\t type: 'FeatureCollection',\n\t features: inputs.reduce(function(memo, input) {\n\t return memo.concat(normalize(input).features);\n\t }, [])\n\t };\n\t};\n\n\n/***/ },\n/* 28 */\n/***/ function(module, exports) {\n\n\tmodule.exports = normalize;\n\t\n\tvar types = {\n\t Point: 'geometry',\n\t MultiPoint: 'geometry',\n\t LineString: 'geometry',\n\t MultiLineString: 'geometry',\n\t Polygon: 'geometry',\n\t MultiPolygon: 'geometry',\n\t GeometryCollection: 'geometry',\n\t Feature: 'feature',\n\t FeatureCollection: 'featurecollection'\n\t};\n\t\n\t/**\n\t * Normalize a GeoJSON feature into a FeatureCollection.\n\t *\n\t * @param {object} gj geojson data\n\t * @returns {object} normalized geojson data\n\t */\n\tfunction normalize(gj) {\n\t if (!gj || !gj.type) return null;\n\t var type = types[gj.type];\n\t if (!type) return null;\n\t\n\t if (type === 'geometry') {\n\t return {\n\t type: 'FeatureCollection',\n\t features: [{\n\t type: 'Feature',\n\t properties: {},\n\t geometry: gj\n\t }]\n\t };\n\t } else if (type === 'feature') {\n\t return {\n\t type: 'FeatureCollection',\n\t features: [gj]\n\t };\n\t } else if (type === 'featurecollection') {\n\t return gj;\n\t }\n\t}\n\n\n/***/ },\n/* 29 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = earcut;\n\t\n\tfunction earcut(data, holeIndices, dim) {\n\t\n\t dim = dim || 2;\n\t\n\t var hasHoles = holeIndices && holeIndices.length,\n\t outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n\t outerNode = linkedList(data, 0, outerLen, dim, true),\n\t triangles = [];\n\t\n\t if (!outerNode) return triangles;\n\t\n\t var minX, minY, maxX, maxY, x, y, size;\n\t\n\t if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\t\n\t // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t if (data.length > 80 * dim) {\n\t minX = maxX = data[0];\n\t minY = maxY = data[1];\n\t\n\t for (var i = dim; i < outerLen; i += dim) {\n\t x = data[i];\n\t y = data[i + 1];\n\t if (x < minX) minX = x;\n\t if (y < minY) minY = y;\n\t if (x > maxX) maxX = x;\n\t if (y > maxY) maxY = y;\n\t }\n\t\n\t // minX, minY and size are later used to transform coords into integers for z-order calculation\n\t size = Math.max(maxX - minX, maxY - minY);\n\t }\n\t\n\t earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\t\n\t return triangles;\n\t}\n\t\n\t// create a circular doubly linked list from polygon points in the specified winding order\n\tfunction linkedList(data, start, end, dim, clockwise) {\n\t var i, last;\n\t\n\t if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n\t for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n\t } else {\n\t for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n\t }\n\t\n\t if (last && equals(last, last.next)) {\n\t removeNode(last);\n\t last = last.next;\n\t }\n\t\n\t return last;\n\t}\n\t\n\t// eliminate colinear or duplicate points\n\tfunction filterPoints(start, end) {\n\t if (!start) return start;\n\t if (!end) end = start;\n\t\n\t var p = start,\n\t again;\n\t do {\n\t again = false;\n\t\n\t if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n\t removeNode(p);\n\t p = end = p.prev;\n\t if (p === p.next) return null;\n\t again = true;\n\t\n\t } else {\n\t p = p.next;\n\t }\n\t } while (again || p !== end);\n\t\n\t return end;\n\t}\n\t\n\t// main ear slicing loop which triangulates a polygon (given as a linked list)\n\tfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n\t if (!ear) return;\n\t\n\t // interlink polygon nodes in z-order\n\t if (!pass && size) indexCurve(ear, minX, minY, size);\n\t\n\t var stop = ear,\n\t prev, next;\n\t\n\t // iterate through ears, slicing them one by one\n\t while (ear.prev !== ear.next) {\n\t prev = ear.prev;\n\t next = ear.next;\n\t\n\t if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n\t // cut off the triangle\n\t triangles.push(prev.i / dim);\n\t triangles.push(ear.i / dim);\n\t triangles.push(next.i / dim);\n\t\n\t removeNode(ear);\n\t\n\t // skipping the next vertice leads to less sliver triangles\n\t ear = next.next;\n\t stop = next.next;\n\t\n\t continue;\n\t }\n\t\n\t ear = next;\n\t\n\t // if we looped through the whole remaining polygon and can't find any more ears\n\t if (ear === stop) {\n\t // try filtering points and slicing again\n\t if (!pass) {\n\t earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\t\n\t // if this didn't work, try curing all small self-intersections locally\n\t } else if (pass === 1) {\n\t ear = cureLocalIntersections(ear, triangles, dim);\n\t earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\t\n\t // as a last resort, try splitting the remaining polygon into two\n\t } else if (pass === 2) {\n\t splitEarcut(ear, triangles, dim, minX, minY, size);\n\t }\n\t\n\t break;\n\t }\n\t }\n\t}\n\t\n\t// check whether a polygon node forms a valid ear with adjacent nodes\n\tfunction isEar(ear) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // now make sure we don't have other points inside the potential ear\n\t var p = ear.next.next;\n\t\n\t while (p !== ear.prev) {\n\t if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.next;\n\t }\n\t\n\t return true;\n\t}\n\t\n\tfunction isEarHashed(ear, minX, minY, size) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // triangle bbox; min & max are calculated like this for speed\n\t var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n\t minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n\t maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n\t maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\t\n\t // z-order range for the current triangle bbox;\n\t var minZ = zOrder(minTX, minTY, minX, minY, size),\n\t maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\t\n\t // first look for points inside the triangle in increasing z-order\n\t var p = ear.nextZ;\n\t\n\t while (p && p.z <= maxZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.nextZ;\n\t }\n\t\n\t // then look for points in decreasing z-order\n\t p = ear.prevZ;\n\t\n\t while (p && p.z >= minZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.prevZ;\n\t }\n\t\n\t return true;\n\t}\n\t\n\t// go through all polygon nodes and cure small local self-intersections\n\tfunction cureLocalIntersections(start, triangles, dim) {\n\t var p = start;\n\t do {\n\t var a = p.prev,\n\t b = p.next.next;\n\t\n\t if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\t\n\t triangles.push(a.i / dim);\n\t triangles.push(p.i / dim);\n\t triangles.push(b.i / dim);\n\t\n\t // remove two nodes involved\n\t removeNode(p);\n\t removeNode(p.next);\n\t\n\t p = start = b;\n\t }\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return p;\n\t}\n\t\n\t// try splitting polygon into two and triangulate them independently\n\tfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n\t // look for a valid diagonal that divides the polygon into two\n\t var a = start;\n\t do {\n\t var b = a.next.next;\n\t while (b !== a.prev) {\n\t if (a.i !== b.i && isValidDiagonal(a, b)) {\n\t // split the polygon in two by the diagonal\n\t var c = splitPolygon(a, b);\n\t\n\t // filter colinear points around the cuts\n\t a = filterPoints(a, a.next);\n\t c = filterPoints(c, c.next);\n\t\n\t // run earcut on each half\n\t earcutLinked(a, triangles, dim, minX, minY, size);\n\t earcutLinked(c, triangles, dim, minX, minY, size);\n\t return;\n\t }\n\t b = b.next;\n\t }\n\t a = a.next;\n\t } while (a !== start);\n\t}\n\t\n\t// link every hole into the outer loop, producing a single-ring polygon without holes\n\tfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n\t var queue = [],\n\t i, len, start, end, list;\n\t\n\t for (i = 0, len = holeIndices.length; i < len; i++) {\n\t start = holeIndices[i] * dim;\n\t end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t list = linkedList(data, start, end, dim, false);\n\t if (list === list.next) list.steiner = true;\n\t queue.push(getLeftmost(list));\n\t }\n\t\n\t queue.sort(compareX);\n\t\n\t // process holes from left to right\n\t for (i = 0; i < queue.length; i++) {\n\t eliminateHole(queue[i], outerNode);\n\t outerNode = filterPoints(outerNode, outerNode.next);\n\t }\n\t\n\t return outerNode;\n\t}\n\t\n\tfunction compareX(a, b) {\n\t return a.x - b.x;\n\t}\n\t\n\t// find a bridge between vertices that connects hole with an outer ring and and link it\n\tfunction eliminateHole(hole, outerNode) {\n\t outerNode = findHoleBridge(hole, outerNode);\n\t if (outerNode) {\n\t var b = splitPolygon(outerNode, hole);\n\t filterPoints(b, b.next);\n\t }\n\t}\n\t\n\t// David Eberly's algorithm for finding a bridge between hole and outer polygon\n\tfunction findHoleBridge(hole, outerNode) {\n\t var p = outerNode,\n\t hx = hole.x,\n\t hy = hole.y,\n\t qx = -Infinity,\n\t m;\n\t\n\t // find a segment intersected by a ray from the hole's leftmost point to the left;\n\t // segment's endpoint with lesser x will be potential connection point\n\t do {\n\t if (hy <= p.y && hy >= p.next.y) {\n\t var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n\t if (x <= hx && x > qx) {\n\t qx = x;\n\t if (x === hx) {\n\t if (hy === p.y) return p;\n\t if (hy === p.next.y) return p.next;\n\t }\n\t m = p.x < p.next.x ? p : p.next;\n\t }\n\t }\n\t p = p.next;\n\t } while (p !== outerNode);\n\t\n\t if (!m) return null;\n\t\n\t if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint\n\t\n\t // look for points inside the triangle of hole point, segment intersection and endpoint;\n\t // if there are no points found, we have a valid connection;\n\t // otherwise choose the point of the minimum angle with the ray as connection point\n\t\n\t var stop = m,\n\t mx = m.x,\n\t my = m.y,\n\t tanMin = Infinity,\n\t tan;\n\t\n\t p = m.next;\n\t\n\t while (p !== stop) {\n\t if (hx >= p.x && p.x >= mx &&\n\t pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\t\n\t tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\t\n\t if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n\t m = p;\n\t tanMin = tan;\n\t }\n\t }\n\t\n\t p = p.next;\n\t }\n\t\n\t return m;\n\t}\n\t\n\t// interlink polygon nodes in z-order\n\tfunction indexCurve(start, minX, minY, size) {\n\t var p = start;\n\t do {\n\t if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n\t p.prevZ = p.prev;\n\t p.nextZ = p.next;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t p.prevZ.nextZ = null;\n\t p.prevZ = null;\n\t\n\t sortLinked(p);\n\t}\n\t\n\t// Simon Tatham's linked list merge sort algorithm\n\t// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\n\tfunction sortLinked(list) {\n\t var i, p, q, e, tail, numMerges, pSize, qSize,\n\t inSize = 1;\n\t\n\t do {\n\t p = list;\n\t list = null;\n\t tail = null;\n\t numMerges = 0;\n\t\n\t while (p) {\n\t numMerges++;\n\t q = p;\n\t pSize = 0;\n\t for (i = 0; i < inSize; i++) {\n\t pSize++;\n\t q = q.nextZ;\n\t if (!q) break;\n\t }\n\t\n\t qSize = inSize;\n\t\n\t while (pSize > 0 || (qSize > 0 && q)) {\n\t\n\t if (pSize === 0) {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t } else if (qSize === 0 || !q) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else if (p.z <= q.z) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t }\n\t\n\t if (tail) tail.nextZ = e;\n\t else list = e;\n\t\n\t e.prevZ = tail;\n\t tail = e;\n\t }\n\t\n\t p = q;\n\t }\n\t\n\t tail.nextZ = null;\n\t inSize *= 2;\n\t\n\t } while (numMerges > 1);\n\t\n\t return list;\n\t}\n\t\n\t// z-order of a point given coords and size of the data bounding box\n\tfunction zOrder(x, y, minX, minY, size) {\n\t // coords are transformed into non-negative 15-bit integer range\n\t x = 32767 * (x - minX) / size;\n\t y = 32767 * (y - minY) / size;\n\t\n\t x = (x | (x << 8)) & 0x00FF00FF;\n\t x = (x | (x << 4)) & 0x0F0F0F0F;\n\t x = (x | (x << 2)) & 0x33333333;\n\t x = (x | (x << 1)) & 0x55555555;\n\t\n\t y = (y | (y << 8)) & 0x00FF00FF;\n\t y = (y | (y << 4)) & 0x0F0F0F0F;\n\t y = (y | (y << 2)) & 0x33333333;\n\t y = (y | (y << 1)) & 0x55555555;\n\t\n\t return x | (y << 1);\n\t}\n\t\n\t// find the leftmost node of a polygon ring\n\tfunction getLeftmost(start) {\n\t var p = start,\n\t leftmost = start;\n\t do {\n\t if (p.x < leftmost.x) leftmost = p;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return leftmost;\n\t}\n\t\n\t// check if a point lies within a convex triangle\n\tfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n\t return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n\t (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n\t (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n\t}\n\t\n\t// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n\tfunction isValidDiagonal(a, b) {\n\t return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n\t locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n\t}\n\t\n\t// signed area of a triangle\n\tfunction area(p, q, r) {\n\t return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n\t}\n\t\n\t// check if two points are equal\n\tfunction equals(p1, p2) {\n\t return p1.x === p2.x && p1.y === p2.y;\n\t}\n\t\n\t// check if two segments intersect\n\tfunction intersects(p1, q1, p2, q2) {\n\t if ((equals(p1, q1) && equals(p2, q2)) ||\n\t (equals(p1, q2) && equals(p2, q1))) return true;\n\t return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n\t area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n\t}\n\t\n\t// check if a polygon diagonal intersects any polygon segments\n\tfunction intersectsPolygon(a, b) {\n\t var p = a;\n\t do {\n\t if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t intersects(p, p.next, a, b)) return true;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return false;\n\t}\n\t\n\t// check if a polygon diagonal is locally inside the polygon\n\tfunction locallyInside(a, b) {\n\t return area(a.prev, a, a.next) < 0 ?\n\t area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n\t area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n\t}\n\t\n\t// check if the middle point of a polygon diagonal is inside the polygon\n\tfunction middleInside(a, b) {\n\t var p = a,\n\t inside = false,\n\t px = (a.x + b.x) / 2,\n\t py = (a.y + b.y) / 2;\n\t do {\n\t if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n\t inside = !inside;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return inside;\n\t}\n\t\n\t// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n\t// if one belongs to the outer ring and another to a hole, it merges it into a single ring\n\tfunction splitPolygon(a, b) {\n\t var a2 = new Node(a.i, a.x, a.y),\n\t b2 = new Node(b.i, b.x, b.y),\n\t an = a.next,\n\t bp = b.prev;\n\t\n\t a.next = b;\n\t b.prev = a;\n\t\n\t a2.next = an;\n\t an.prev = a2;\n\t\n\t b2.next = a2;\n\t a2.prev = b2;\n\t\n\t bp.next = b2;\n\t b2.prev = bp;\n\t\n\t return b2;\n\t}\n\t\n\t// create a node and optionally link it with previous one (in a circular doubly linked list)\n\tfunction insertNode(i, x, y, last) {\n\t var p = new Node(i, x, y);\n\t\n\t if (!last) {\n\t p.prev = p;\n\t p.next = p;\n\t\n\t } else {\n\t p.next = last.next;\n\t p.prev = last;\n\t last.next.prev = p;\n\t last.next = p;\n\t }\n\t return p;\n\t}\n\t\n\tfunction removeNode(p) {\n\t p.next.prev = p.prev;\n\t p.prev.next = p.next;\n\t\n\t if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n\t if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n\t}\n\t\n\tfunction Node(i, x, y) {\n\t // vertice index in coordinates array\n\t this.i = i;\n\t\n\t // vertex coordinates\n\t this.x = x;\n\t this.y = y;\n\t\n\t // previous and next vertice nodes in a polygon ring\n\t this.prev = null;\n\t this.next = null;\n\t\n\t // z-order curve value\n\t this.z = null;\n\t\n\t // previous and next nodes in z-order\n\t this.prevZ = null;\n\t this.nextZ = null;\n\t\n\t // indicates whether this is a steiner point\n\t this.steiner = false;\n\t}\n\t\n\t// return a percentage difference between the polygon area and its triangulation area;\n\t// used to verify correctness of triangulation\n\tearcut.deviation = function (data, holeIndices, dim, triangles) {\n\t var hasHoles = holeIndices && holeIndices.length;\n\t var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\t\n\t var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n\t if (hasHoles) {\n\t for (var i = 0, len = holeIndices.length; i < len; i++) {\n\t var start = holeIndices[i] * dim;\n\t var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t polygonArea -= Math.abs(signedArea(data, start, end, dim));\n\t }\n\t }\n\t\n\t var trianglesArea = 0;\n\t for (i = 0; i < triangles.length; i += 3) {\n\t var a = triangles[i] * dim;\n\t var b = triangles[i + 1] * dim;\n\t var c = triangles[i + 2] * dim;\n\t trianglesArea += Math.abs(\n\t (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n\t (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n\t }\n\t\n\t return polygonArea === 0 && trianglesArea === 0 ? 0 :\n\t Math.abs((trianglesArea - polygonArea) / polygonArea);\n\t};\n\t\n\tfunction signedArea(data, start, end, dim) {\n\t var sum = 0;\n\t for (var i = start, j = end - dim; i < end; i += dim) {\n\t sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n\t j = i;\n\t }\n\t return sum;\n\t}\n\t\n\t// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\n\tearcut.flatten = function (data) {\n\t var dim = data[0][0].length,\n\t result = {vertices: [], holes: [], dimensions: dim},\n\t holeIndex = 0;\n\t\n\t for (var i = 0; i < data.length; i++) {\n\t for (var j = 0; j < data[i].length; j++) {\n\t for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n\t }\n\t if (i > 0) {\n\t holeIndex += data[i - 1].length;\n\t result.holes.push(holeIndex);\n\t }\n\t }\n\t return result;\n\t};\n\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Extrude a polygon given its vertices and triangulated faces\n\t *\n\t * Based on:\n\t * https://github.com/freeman-lab/extrude\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(6);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar extrudePolygon = function extrudePolygon(points, faces, _options) {\n\t var defaults = {\n\t top: 1,\n\t bottom: 0,\n\t closed: true\n\t };\n\t\n\t var options = (0, _lodashAssign2['default'])({}, defaults, _options);\n\t\n\t var n = points.length;\n\t var positions;\n\t var cells;\n\t var topCells;\n\t var bottomCells;\n\t var sideCells;\n\t\n\t // If bottom and top values are identical then return the flat shape\n\t options.top === options.bottom ? flat() : full();\n\t\n\t function flat() {\n\t positions = points.map(function (p) {\n\t return [p[0], options.top, p[1]];\n\t });\n\t cells = faces;\n\t topCells = faces;\n\t }\n\t\n\t function full() {\n\t positions = [];\n\t points.forEach(function (p) {\n\t positions.push([p[0], options.top, p[1]]);\n\t });\n\t points.forEach(function (p) {\n\t positions.push([p[0], options.bottom, p[1]]);\n\t });\n\t\n\t cells = [];\n\t for (var i = 0; i < n; i++) {\n\t if (i === n - 1) {\n\t cells.push([i + n, n, i]);\n\t cells.push([0, i, n]);\n\t } else {\n\t cells.push([i + n, i + n + 1, i]);\n\t cells.push([i + 1, i, i + n + 1]);\n\t }\n\t }\n\t\n\t sideCells = [].concat(cells);\n\t\n\t if (options.closed) {\n\t var top = faces;\n\t var bottom = top.map(function (p) {\n\t return p.map(function (v) {\n\t return v + n;\n\t });\n\t });\n\t bottom = bottom.map(function (p) {\n\t return [p[0], p[2], p[1]];\n\t });\n\t cells = cells.concat(top).concat(bottom);\n\t\n\t topCells = top;\n\t bottomCells = bottom;\n\t }\n\t }\n\t\n\t return {\n\t positions: positions,\n\t faces: cells,\n\t top: topCells,\n\t bottom: bottomCells,\n\t sides: sideCells\n\t };\n\t};\n\t\n\texports['default'] = extrudePolygon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _WorkerPool = __webpack_require__(32);\n\t\n\tvar _WorkerPool2 = _interopRequireDefault(_WorkerPool);\n\t\n\tvar Worker = (function () {\n\t var _maxWorkers = 2;\n\t var pool;\n\t\n\t var createWorkers = function createWorkers(maxWorkers, workerScript) {\n\t pool = new _WorkerPool2['default']({\n\t numThreads: maxWorkers ? maxWorkers : _maxWorkers,\n\t workerScript: workerScript ? workerScript : 'vizicities-worker.js'\n\t });\n\t\n\t return pool.createWorkers();\n\t };\n\t\n\t var exec = function exec(method, args, transferrables) {\n\t return pool.exec(method, args, transferrables);\n\t };\n\t\n\t return {\n\t createWorkers: createWorkers,\n\t exec: exec\n\t };\n\t})();\n\t\n\texports['default'] = Worker;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _WorkerPoolWorker = __webpack_require__(33);\n\t\n\tvar _WorkerPoolWorker2 = _interopRequireDefault(_WorkerPoolWorker);\n\t\n\tvar DEBUG = false;\n\t\n\tvar WorkerPool = (function () {\n\t function WorkerPool(options) {\n\t _classCallCheck(this, WorkerPool);\n\t\n\t this.numThreads = options.numThreads || 2;\n\t this.workerScript = options.workerScript;\n\t\n\t this.workers = [];\n\t this.tasks = [];\n\t }\n\t\n\t _createClass(WorkerPool, [{\n\t key: 'createWorkers',\n\t value: function createWorkers() {\n\t var _this = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t var workerPromises = [];\n\t\n\t for (var i = 0; i < _this.numThreads; i++) {\n\t workerPromises.push(_this.createWorker());\n\t }\n\t\n\t Promise.all(workerPromises).then(function () {\n\t if (DEBUG) {\n\t console.log('All workers ready', performance.now());\n\t }\n\t resolve();\n\t })['catch'](reject);\n\t });\n\t }\n\t }, {\n\t key: 'createWorker',\n\t value: function createWorker() {\n\t var _this2 = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t // Initialise worker\n\t var worker = new _WorkerPoolWorker2['default']({\n\t workerScript: _this2.workerScript\n\t });\n\t\n\t // Start worker and wait for it to be ready\n\t return worker.start().then(function () {\n\t if (DEBUG) {\n\t console.log('Worker ready', performance.now());\n\t }\n\t\n\t // Add worker to pool\n\t _this2.workers.push(worker);\n\t\n\t resolve();\n\t })['catch'](reject);\n\t });\n\t }\n\t }, {\n\t key: 'getFreeWorker',\n\t value: function getFreeWorker() {\n\t return this.workers.find(function (worker) {\n\t return !worker.busy;\n\t });\n\t }\n\t\n\t // Execute task on a worker\n\t }, {\n\t key: 'exec',\n\t value: function exec(method, args, transferrables) {\n\t var deferred = Promise.deferred();\n\t\n\t // Create task\n\t var task = {\n\t method: method,\n\t args: args,\n\t transferrables: transferrables,\n\t deferred: deferred\n\t };\n\t\n\t // Add task to queue\n\t this.tasks.push(task);\n\t\n\t // Trigger task processing\n\t this.processTasks();\n\t\n\t // Return task promise\n\t return task.deferred.promise;\n\t }\n\t }, {\n\t key: 'processTasks',\n\t value: function processTasks() {\n\t var _this3 = this;\n\t\n\t if (DEBUG) {\n\t console.log('Processing tasks');\n\t }\n\t\n\t if (this.tasks.length === 0) {\n\t return;\n\t }\n\t\n\t // Find free worker\n\t var worker = this.getFreeWorker();\n\t\n\t if (!worker) {\n\t if (DEBUG) {\n\t console.log('No workers free');\n\t }\n\t return;\n\t }\n\t\n\t // Get oldest task\n\t var task = this.tasks.shift();\n\t\n\t // Execute task on worker\n\t worker.exec(task.method, task.args, task.transferrables).then(function (result) {\n\t // Trigger task processing\n\t _this3.processTasks();\n\t\n\t // Return result in deferred task promise\n\t task.deferred.resolve(result);\n\t });\n\t }\n\t }]);\n\t\n\t return WorkerPool;\n\t})();\n\t\n\texports['default'] = WorkerPool;\n\t\n\t// Quick shim to create deferred native promises\n\tPromise.deferred = function () {\n\t var result = {};\n\t\n\t result.promise = new Promise(function (resolve, reject) {\n\t result.resolve = resolve;\n\t result.reject = reject;\n\t });\n\t\n\t return result;\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 33 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar DEBUG = false;\n\t\n\tvar WorkerPoolWorker = (function () {\n\t function WorkerPoolWorker(options) {\n\t _classCallCheck(this, WorkerPoolWorker);\n\t\n\t this.workerScript = options.workerScript;\n\t\n\t this.ready = false;\n\t this.busy = false;\n\t this.deferred = null;\n\t }\n\t\n\t _createClass(WorkerPoolWorker, [{\n\t key: 'start',\n\t value: function start() {\n\t var _this = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t _this.worker = new Worker(_this.workerScript);\n\t\n\t var onStartup = function onStartup(event) {\n\t if (!event.data || event.data.type !== 'startup') {\n\t reject();\n\t return;\n\t }\n\t\n\t _this.ready = true;\n\t\n\t // Remove temporary message handler\n\t _this.worker.removeEventListener('message', onStartup);\n\t\n\t // Set up listener to respond to normal events now\n\t _this.worker.addEventListener('message', function (event) {\n\t _this.onMessage(event);\n\t });\n\t\n\t // Resolve once worker is ready\n\t resolve();\n\t };\n\t\n\t // Set up temporary event listener for warmup\n\t _this.worker.addEventListener('message', onStartup);\n\t });\n\t }\n\t }, {\n\t key: 'exec',\n\t value: function exec(method, args, transferrables) {\n\t if (DEBUG) {\n\t console.log('Execute', method, args, transferrables);\n\t }\n\t\n\t var deferred = Promise.deferred();\n\t\n\t this.busy = true;\n\t this.deferred = deferred;\n\t\n\t this.worker.postMessage({\n\t method: method,\n\t args: args\n\t }, transferrables);\n\t\n\t return deferred.promise;\n\t }\n\t }, {\n\t key: 'onMessage',\n\t value: function onMessage(event) {\n\t console.log('Message received from worker', performance.now());\n\t\n\t this.busy = false;\n\t\n\t if (!event.data || event.data.type === 'error' || event.data.type !== 'result') {\n\t this.deferred.reject(event.data.payload);\n\t return;\n\t }\n\t\n\t this.deferred.resolve(event.data.payload);\n\t }\n\t }]);\n\t\n\t return WorkerPoolWorker;\n\t})();\n\t\n\texports['default'] = WorkerPoolWorker;\n\t\n\t// Quick shim to create deferred native promises\n\tPromise.deferred = function () {\n\t var result = {};\n\t\n\t result.promise = new Promise(function (resolve, reject) {\n\t result.resolve = resolve;\n\t result.reject = reject;\n\t });\n\t\n\t return result;\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * BufferGeometry helpers\n\t */\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar Buffer = (function () {\n\t // Merge TypedArrays of the same type\n\t // Returns merged array as well as indexes for splitting the array\n\t var mergeFloat32Arrays = function mergeFloat32Arrays(arrays) {\n\t var size = 0;\n\t var map = new Int32Array(arrays.length * 2);\n\t\n\t var lastIndex = 0;\n\t var length;\n\t\n\t // Find size of each array\n\t arrays.forEach(function (_array, index) {\n\t length = _array.length;\n\t size += length;\n\t map.set([lastIndex, lastIndex + length], index * 2);\n\t lastIndex += length;\n\t });\n\t\n\t // Create a new array of total size\n\t var mergedArray = new Float32Array(size);\n\t\n\t // Add each array to the new array\n\t arrays.forEach(function (_array, index) {\n\t mergedArray.set(_array, map[index * 2]);\n\t });\n\t\n\t return [mergedArray, map];\n\t };\n\t\n\t var splitFloat32Array = function splitFloat32Array(data) {\n\t var arr = data[0];\n\t var map = data[1];\n\t\n\t var start;\n\t var arrays = [];\n\t\n\t // Iterate over map\n\t for (var i = 0; i < map.length / 2; i++) {\n\t start = i * 2;\n\t arrays.push(arr.subarray(map[start], map[start + 1]));\n\t }\n\t\n\t return arrays;\n\t };\n\t\n\t // TODO: Create a generic method that can work for any typed array\n\t var mergeUint8Arrays = function mergeUint8Arrays(arrays) {\n\t var size = 0;\n\t var map = new Int32Array(arrays.length * 2);\n\t\n\t var lastIndex = 0;\n\t var length;\n\t\n\t // Find size of each array\n\t arrays.forEach(function (_array, index) {\n\t length = _array.length;\n\t size += length;\n\t map.set([lastIndex, lastIndex + length], index * 2);\n\t lastIndex += length;\n\t });\n\t\n\t // Create a new array of total size\n\t var mergedArray = new Uint8Array(size);\n\t\n\t // Add each array to the new array\n\t arrays.forEach(function (_array, index) {\n\t mergedArray.set(_array, map[index * 2]);\n\t });\n\t\n\t return [mergedArray, map];\n\t };\n\t\n\t // TODO: Dedupe with splitFloat32Array\n\t var splitUint8Array = function splitUint8Array(data) {\n\t var arr = data[0];\n\t var map = data[1];\n\t\n\t var start;\n\t var arrays = [];\n\t\n\t // Iterate over map\n\t for (var i = 0; i < map.length / 2; i++) {\n\t start = i * 2;\n\t arrays.push(arr.subarray(map[start], map[start + 1]));\n\t }\n\t\n\t return arrays;\n\t };\n\t\n\t // Merge multiple attribute objects into a single attribute object\n\t //\n\t // Attribute objects must all use the same attribute keys\n\t var mergeAttributes = function mergeAttributes(attributes) {\n\t var lengths = {};\n\t\n\t // Find array lengths\n\t attributes.forEach(function (_attributes) {\n\t for (var k in _attributes) {\n\t if (!lengths[k]) {\n\t lengths[k] = 0;\n\t }\n\t\n\t lengths[k] += _attributes[k].length;\n\t }\n\t });\n\t\n\t var mergedAttributes = {};\n\t\n\t // Set up arrays to merge into\n\t for (var k in lengths) {\n\t mergedAttributes[k] = new Float32Array(lengths[k]);\n\t }\n\t\n\t var lastLengths = {};\n\t\n\t attributes.forEach(function (_attributes) {\n\t for (var k in _attributes) {\n\t if (!lastLengths[k]) {\n\t lastLengths[k] = 0;\n\t }\n\t\n\t mergedAttributes[k].set(_attributes[k], lastLengths[k]);\n\t\n\t lastLengths[k] += _attributes[k].length;\n\t }\n\t });\n\t\n\t return mergedAttributes;\n\t };\n\t\n\t var createLineGeometry = function createLineGeometry(lines, offset) {\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t var vertices = new Float32Array(lines.verticesCount * 3);\n\t var colours = new Float32Array(lines.verticesCount * 3);\n\t\n\t var pickingIds;\n\t if (lines.pickingIds) {\n\t // One component per vertex (1)\n\t pickingIds = new Float32Array(lines.verticesCount);\n\t }\n\t\n\t var _vertices;\n\t var _colour;\n\t var _pickingId;\n\t\n\t var lastIndex = 0;\n\t\n\t for (var i = 0; i < lines.vertices.length; i++) {\n\t _vertices = lines.vertices[i];\n\t _colour = lines.colours[i];\n\t\n\t if (pickingIds) {\n\t _pickingId = lines.pickingIds[i];\n\t }\n\t\n\t for (var j = 0; j < _vertices.length; j++) {\n\t var ax = _vertices[j][0] + offset.x;\n\t var ay = _vertices[j][1];\n\t var az = _vertices[j][2] + offset.y;\n\t\n\t var c1 = _colour[j];\n\t\n\t vertices[lastIndex * 3 + 0] = ax;\n\t vertices[lastIndex * 3 + 1] = ay;\n\t vertices[lastIndex * 3 + 2] = az;\n\t\n\t colours[lastIndex * 3 + 0] = c1[0];\n\t colours[lastIndex * 3 + 1] = c1[1];\n\t colours[lastIndex * 3 + 2] = c1[2];\n\t\n\t if (pickingIds) {\n\t pickingIds[lastIndex] = _pickingId;\n\t }\n\t\n\t lastIndex++;\n\t }\n\t }\n\t\n\t // itemSize = 3 because there are 3 values (components) per vertex\n\t geometry.addAttribute('position', new _three2['default'].BufferAttribute(vertices, 3));\n\t geometry.addAttribute('color', new _three2['default'].BufferAttribute(colours, 3));\n\t\n\t if (pickingIds) {\n\t geometry.addAttribute('pickingId', new _three2['default'].BufferAttribute(pickingIds, 1));\n\t }\n\t\n\t geometry.computeBoundingBox();\n\t\n\t return geometry;\n\t };\n\t\n\t // TODO: Make picking IDs optional\n\t var createGeometry = function createGeometry(attributes, offset) {\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t // Three components per vertex per face (3 x 3 = 9)\n\t var vertices = new Float32Array(attributes.facesCount * 9);\n\t var normals = new Float32Array(attributes.facesCount * 9);\n\t var colours = new Float32Array(attributes.facesCount * 9);\n\t\n\t var pickingIds;\n\t if (attributes.pickingIds) {\n\t // One component per vertex per face (1 x 3 = 3)\n\t pickingIds = new Float32Array(attributes.facesCount * 3);\n\t }\n\t\n\t var pA = new _three2['default'].Vector3();\n\t var pB = new _three2['default'].Vector3();\n\t var pC = new _three2['default'].Vector3();\n\t\n\t var cb = new _three2['default'].Vector3();\n\t var ab = new _three2['default'].Vector3();\n\t\n\t var index;\n\t var _faces;\n\t var _vertices;\n\t var _colour;\n\t var _pickingId;\n\t var lastIndex = 0;\n\t for (var i = 0; i < attributes.faces.length; i++) {\n\t _faces = attributes.faces[i];\n\t _vertices = attributes.vertices[i];\n\t _colour = attributes.colours[i];\n\t\n\t if (pickingIds) {\n\t _pickingId = attributes.pickingIds[i];\n\t }\n\t\n\t for (var j = 0; j < _faces.length; j++) {\n\t // Array of vertex indexes for the face\n\t index = _faces[j][0];\n\t\n\t var ax = _vertices[index][0] + offset.x;\n\t var ay = _vertices[index][1];\n\t var az = _vertices[index][2] + offset.y;\n\t\n\t var c1 = _colour[j][0];\n\t\n\t index = _faces[j][1];\n\t\n\t var bx = _vertices[index][0] + offset.x;\n\t var by = _vertices[index][1];\n\t var bz = _vertices[index][2] + offset.y;\n\t\n\t var c2 = _colour[j][1];\n\t\n\t index = _faces[j][2];\n\t\n\t var cx = _vertices[index][0] + offset.x;\n\t var cy = _vertices[index][1];\n\t var cz = _vertices[index][2] + offset.y;\n\t\n\t var c3 = _colour[j][2];\n\t\n\t // Flat face normals\n\t // From: http://threejs.org/examples/webgl_buffergeometry.html\n\t pA.set(ax, ay, az);\n\t pB.set(bx, by, bz);\n\t pC.set(cx, cy, cz);\n\t\n\t cb.subVectors(pC, pB);\n\t ab.subVectors(pA, pB);\n\t cb.cross(ab);\n\t\n\t cb.normalize();\n\t\n\t var nx = cb.x;\n\t var ny = cb.y;\n\t var nz = cb.z;\n\t\n\t vertices[lastIndex * 9 + 0] = ax;\n\t vertices[lastIndex * 9 + 1] = ay;\n\t vertices[lastIndex * 9 + 2] = az;\n\t\n\t normals[lastIndex * 9 + 0] = nx;\n\t normals[lastIndex * 9 + 1] = ny;\n\t normals[lastIndex * 9 + 2] = nz;\n\t\n\t colours[lastIndex * 9 + 0] = c1[0];\n\t colours[lastIndex * 9 + 1] = c1[1];\n\t colours[lastIndex * 9 + 2] = c1[2];\n\t\n\t vertices[lastIndex * 9 + 3] = bx;\n\t vertices[lastIndex * 9 + 4] = by;\n\t vertices[lastIndex * 9 + 5] = bz;\n\t\n\t normals[lastIndex * 9 + 3] = nx;\n\t normals[lastIndex * 9 + 4] = ny;\n\t normals[lastIndex * 9 + 5] = nz;\n\t\n\t colours[lastIndex * 9 + 3] = c2[0];\n\t colours[lastIndex * 9 + 4] = c2[1];\n\t colours[lastIndex * 9 + 5] = c2[2];\n\t\n\t vertices[lastIndex * 9 + 6] = cx;\n\t vertices[lastIndex * 9 + 7] = cy;\n\t vertices[lastIndex * 9 + 8] = cz;\n\t\n\t normals[lastIndex * 9 + 6] = nx;\n\t normals[lastIndex * 9 + 7] = ny;\n\t normals[lastIndex * 9 + 8] = nz;\n\t\n\t colours[lastIndex * 9 + 6] = c3[0];\n\t colours[lastIndex * 9 + 7] = c3[1];\n\t colours[lastIndex * 9 + 8] = c3[2];\n\t\n\t if (pickingIds) {\n\t pickingIds[lastIndex * 3 + 0] = _pickingId;\n\t pickingIds[lastIndex * 3 + 1] = _pickingId;\n\t pickingIds[lastIndex * 3 + 2] = _pickingId;\n\t }\n\t\n\t lastIndex++;\n\t }\n\t }\n\t\n\t // itemSize = 3 because there are 3 values (components) per vertex\n\t geometry.addAttribute('position', new _three2['default'].BufferAttribute(vertices, 3));\n\t geometry.addAttribute('normal', new _three2['default'].BufferAttribute(normals, 3));\n\t geometry.addAttribute('color', new _three2['default'].BufferAttribute(colours, 3));\n\t\n\t if (pickingIds) {\n\t geometry.addAttribute('pickingId', new _three2['default'].BufferAttribute(pickingIds, 1));\n\t }\n\t\n\t geometry.computeBoundingBox();\n\t\n\t return geometry;\n\t };\n\t\n\t var textEncoder = new TextEncoder('utf-8');\n\t var textDecoder = new TextDecoder('utf-8');\n\t\n\t var stringToUint8Array = function stringToUint8Array(str) {\n\t return textEncoder.encode(str);\n\t };\n\t\n\t var uint8ArrayToString = function uint8ArrayToString(ab) {\n\t return textDecoder.decode(ab);\n\t };\n\t\n\t return {\n\t mergeFloat32Arrays: mergeFloat32Arrays,\n\t splitFloat32Array: splitFloat32Array,\n\t mergeUint8Arrays: mergeUint8Arrays,\n\t splitUint8Array: splitUint8Array,\n\t mergeAttributes: mergeAttributes,\n\t createLineGeometry: createLineGeometry,\n\t createGeometry: createGeometry,\n\t stringToUint8Array: stringToUint8Array,\n\t uint8ArrayToString: uint8ArrayToString\n\t };\n\t})();\n\t\n\texports['default'] = Buffer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 35 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\tvar Stringify = (function () {\n\t var functionToString = function functionToString(f) {\n\t return f.toString();\n\t };\n\t\n\t // Based on https://github.com/tangrams/tangram/blob/2a31893c814cf15d5077f87ffa10af20160716b9/src/utils/utils.js#L245\n\t var stringToFunction = function stringToFunction(str) {\n\t if (typeof str === 'string' && str.match(/^\\s*function\\s*\\w*\\s*\\([\\s\\S]*\\)\\s*\\{[\\s\\S]*\\}/m) != null) {\n\t var f;\n\t\n\t try {\n\t eval('f = ' + str);\n\t return f;\n\t } catch (err) {\n\t return str;\n\t }\n\t }\n\t };\n\t\n\t return {\n\t functionToString: functionToString,\n\t stringToFunction: stringToFunction\n\t };\n\t})();\n\t\n\texports['default'] = Stringify;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t// TODO: Move duplicated logic between geometry layrs into GeometryLayer\n\t\n\t// TODO: Look at ways to drop unneeded references to array buffers, etc to\n\t// reduce memory footprint\n\t\n\t// TODO: Support dynamic updating / hiding / animation of geometry\n\t//\n\t// This could be pretty hard as it's all packed away within BufferGeometry and\n\t// may even be merged by another layer (eg. GeoJSONLayer)\n\t//\n\t// How much control should this layer support? Perhaps a different or custom\n\t// layer would be better suited for animation, for example.\n\t\n\t// TODO: Allow _setBufferAttributes to use a custom function passed in to\n\t// generate a custom mesh\n\t\n\tvar _Layer2 = __webpack_require__(4);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(6);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _geoGeo = __webpack_require__(1);\n\t\n\tvar _geoGeo2 = _interopRequireDefault(_geoGeo);\n\t\n\tvar _geoLatLon = __webpack_require__(2);\n\t\n\tvar _geoPoint = __webpack_require__(3);\n\t\n\tvar _earcut2 = __webpack_require__(29);\n\t\n\tvar _earcut3 = _interopRequireDefault(_earcut2);\n\t\n\tvar _utilExtrudePolygon = __webpack_require__(30);\n\t\n\tvar _utilExtrudePolygon2 = _interopRequireDefault(_utilExtrudePolygon);\n\t\n\tvar _enginePickingMaterial = __webpack_require__(37);\n\t\n\tvar _enginePickingMaterial2 = _interopRequireDefault(_enginePickingMaterial);\n\t\n\tvar _utilBuffer = __webpack_require__(34);\n\t\n\tvar _utilBuffer2 = _interopRequireDefault(_utilBuffer);\n\t\n\tvar PolygonLayer = (function (_Layer) {\n\t _inherits(PolygonLayer, _Layer);\n\t\n\t function PolygonLayer(coordinates, options) {\n\t _classCallCheck(this, PolygonLayer);\n\t\n\t var defaults = {\n\t output: true,\n\t interactive: false,\n\t // Custom material override\n\t //\n\t // TODO: Should this be in the style object?\n\t polygonMaterial: null,\n\t onPolygonMesh: null,\n\t onBufferAttributes: null,\n\t // This default style is separate to Util.GeoJSON.defaultStyle\n\t style: {\n\t color: '#ffffff',\n\t transparent: false,\n\t opacity: 1,\n\t blending: _three2['default'].NormalBlending,\n\t height: 0\n\t }\n\t };\n\t\n\t var _options = (0, _lodashAssign2['default'])({}, defaults, options);\n\t\n\t _get(Object.getPrototypeOf(PolygonLayer.prototype), 'constructor', this).call(this, _options);\n\t\n\t // Return coordinates as array of polygons so it's easy to support\n\t // MultiPolygon features (a single polygon would be a MultiPolygon with a\n\t // single polygon in the array)\n\t this._coordinates = PolygonLayer.isSingle(coordinates) ? [coordinates] : coordinates;\n\t }\n\t\n\t _createClass(PolygonLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t _this._setCoordinates();\n\t\n\t if (_this._options.interactive) {\n\t // Only add to picking mesh if this layer is controlling output\n\t //\n\t // Otherwise, assume another component will eventually add a mesh to\n\t // the picking scene\n\t if (_this.isOutput()) {\n\t _this._pickingMesh = new _three2['default'].Object3D();\n\t _this.addToPicking(_this._pickingMesh);\n\t }\n\t\n\t _this._setPickingId();\n\t _this._addPickingEvents();\n\t }\n\t\n\t PolygonLayer.SetBufferAttributes(_this._projectedCoordinates, _this._options).then(function (result) {\n\t _this._bufferAttributes = _utilBuffer2['default'].mergeAttributes(result.attributes);\n\t\n\t if (result.outlineAttributes.length > 0) {\n\t _this._outlineBufferAttributes = _utilBuffer2['default'].mergeAttributes(result.outlineAttributes);\n\t }\n\t\n\t _this._flat = result.flat;\n\t\n\t if (_this.isOutput()) {\n\t var attributeLengths = {\n\t positions: 3,\n\t normals: 3,\n\t colors: 3,\n\t tops: 1\n\t };\n\t\n\t if (_this._options.interactive) {\n\t attributeLengths.pickingIds = 1;\n\t }\n\t\n\t var style = _this._options.style;\n\t\n\t // Set mesh if not merging elsewhere\n\t PolygonLayer.SetMesh(_this._bufferAttributes, attributeLengths, _this._flat, style, _this._options, _this._world._environment._skybox).then(function (result) {\n\t // Output mesh\n\t _this.add(result.mesh);\n\t\n\t if (result.pickingMesh) {\n\t _this._pickingMesh.add(result.pickingMesh);\n\t }\n\t });\n\t }\n\t\n\t result.attributes = null;\n\t result.outlineAttributes = null;\n\t result = null;\n\t\n\t resolve(_this);\n\t })['catch'](reject);\n\t });\n\t }\n\t\n\t // Return center of polygon as a LatLon\n\t //\n\t // This is used for things like placing popups / UI elements on the layer\n\t //\n\t // TODO: Find proper center position instead of returning first coordinate\n\t // SEE: https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Polygon.js#L15\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t\n\t // Return polygon bounds in geographic coordinates\n\t //\n\t // TODO: Implement getBounds()\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {}\n\t\n\t // Get unique ID for picking interaction\n\t }, {\n\t key: '_setPickingId',\n\t value: function _setPickingId() {\n\t this._pickingId = this.getPickingId();\n\t }\n\t\n\t // Set up and re-emit interaction events\n\t }, {\n\t key: '_addPickingEvents',\n\t value: function _addPickingEvents() {\n\t var _this2 = this;\n\t\n\t // TODO: Find a way to properly remove this listener on destroy\n\t this._world.on('pick-' + this._pickingId, function (point2d, point3d, intersects) {\n\t // Re-emit click event from the layer\n\t _this2.emit('click', _this2, point2d, point3d, intersects);\n\t });\n\t }\n\t\n\t // Create and store reference to THREE.BufferAttribute data for this layer\n\t }, {\n\t key: 'getBufferAttributes',\n\t value: function getBufferAttributes() {\n\t return this._bufferAttributes;\n\t }\n\t }, {\n\t key: 'getOutlineBufferAttributes',\n\t value: function getOutlineBufferAttributes() {\n\t return this._outlineBufferAttributes;\n\t }\n\t\n\t // Used by external components to clear some memory when the attributes\n\t // are no longer required to be stored in this layer\n\t //\n\t // For example, you would want to clear the attributes here after merging them\n\t // using something like the GeoJSONLayer\n\t }, {\n\t key: 'clearBufferAttributes',\n\t value: function clearBufferAttributes() {\n\t this._bufferAttributes = null;\n\t this._outlineBufferAttributes = null;\n\t }\n\t\n\t // Threshold angle is currently in rads\n\t }, {\n\t key: 'clearCoordinates',\n\t\n\t // Used by external components to clear some memory when the coordinates\n\t // are no longer required to be stored in this layer\n\t //\n\t // For example, you would want to clear the coordinates here after this\n\t // layer is merged in something like the GeoJSONLayer\n\t value: function clearCoordinates() {\n\t this._coordinates = null;\n\t this._projectedCoordinates = null;\n\t }\n\t }, {\n\t key: '_setCoordinates',\n\t\n\t // Convert and project coordinates\n\t //\n\t // TODO: Calculate bounds\n\t value: function _setCoordinates() {\n\t this._bounds = [];\n\t this._coordinates = this._convertCoordinates(this._coordinates);\n\t\n\t this._projectedBounds = [];\n\t this._projectedCoordinates = this._projectCoordinates();\n\t\n\t this._center = this._coordinates[0][0][0];\n\t }\n\t\n\t // Recursively convert input coordinates into LatLon objects\n\t //\n\t // Calculate geographic bounds at the same time\n\t //\n\t // TODO: Calculate geographic bounds\n\t }, {\n\t key: '_convertCoordinates',\n\t value: function _convertCoordinates(coordinates) {\n\t return coordinates.map(function (_coordinates) {\n\t return _coordinates.map(function (ring) {\n\t return ring.map(function (coordinate) {\n\t return (0, _geoLatLon.latLon)(coordinate[1], coordinate[0]);\n\t });\n\t });\n\t });\n\t }\n\t\n\t // Recursively project coordinates into world positions\n\t //\n\t // Calculate world bounds, offset and pointScale at the same time\n\t //\n\t // TODO: Calculate world bounds\n\t }, {\n\t key: '_projectCoordinates',\n\t value: function _projectCoordinates() {\n\t var _this3 = this;\n\t\n\t var point;\n\t return this._coordinates.map(function (_coordinates) {\n\t return _coordinates.map(function (ring) {\n\t return ring.map(function (latlon) {\n\t point = _this3._world.latLonToPoint(latlon);\n\t\n\t // TODO: Is offset ever being used or needed?\n\t if (!_this3._offset) {\n\t _this3._offset = (0, _geoPoint.point)(0, 0);\n\t _this3._offset.x = -1 * point.x;\n\t _this3._offset.y = -1 * point.y;\n\t\n\t _this3._options.pointScale = _this3._world.pointScale(latlon);\n\t }\n\t\n\t return point;\n\t });\n\t });\n\t });\n\t }\n\t\n\t // Convert coordinates array to something earcut can understand\n\t }, {\n\t key: 'isFlat',\n\t\n\t // Returns true if the polygon is flat (has no height)\n\t value: function isFlat() {\n\t return this._flat;\n\t }\n\t\n\t // Returns true if coordinates refer to a single geometry\n\t //\n\t // For example, not coordinates for a MultiPolygon GeoJSON feature\n\t }, {\n\t key: 'destroy',\n\t\n\t // TODO: Make sure this is cleaning everything\n\t value: function destroy() {\n\t if (this._pickingMesh) {\n\t // TODO: Properly dispose of picking mesh\n\t this._pickingMesh = null;\n\t }\n\t\n\t this.clearCoordinates();\n\t this.clearBufferAttributes();\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(PolygonLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }], [{\n\t key: 'SetBufferAttributes',\n\t value: function SetBufferAttributes(coordinates, options) {\n\t return new Promise(function (resolve) {\n\t var height = 0;\n\t\n\t // Convert height into world units\n\t if (options.style.height && options.style.height !== 0) {\n\t height = _geoGeo2['default'].metresToWorld(options.style.height, options.pointScale);\n\t }\n\t\n\t var colour = new _three2['default'].Color();\n\t colour.set(options.style.color);\n\t\n\t // Light and dark colours used for poor-mans AO gradient on object sides\n\t var light = new _three2['default'].Color(0xffffff);\n\t var shadow = new _three2['default'].Color(0x666666);\n\t\n\t var flat = true;\n\t\n\t var outlineAttributes = [];\n\t\n\t // For each polygon\n\t var attributes = coordinates.map(function (_coordinates) {\n\t // Convert coordinates to earcut format\n\t var _earcut = PolygonLayer.ToEarcut(_coordinates);\n\t\n\t // Triangulate faces using earcut\n\t var faces = PolygonLayer.Triangulate(_earcut.vertices, _earcut.holes, _earcut.dimensions);\n\t\n\t var groupedVertices = [];\n\t for (i = 0, il = _earcut.vertices.length; i < il; i += _earcut.dimensions) {\n\t groupedVertices.push(_earcut.vertices.slice(i, i + _earcut.dimensions));\n\t }\n\t\n\t var extruded = (0, _utilExtrudePolygon2['default'])(groupedVertices, faces, {\n\t bottom: 0,\n\t top: height\n\t });\n\t\n\t var topColor = colour.clone().multiply(light);\n\t var bottomColor = colour.clone().multiply(shadow);\n\t\n\t var _vertices = extruded.positions;\n\t var _faces = [];\n\t var _colours = [];\n\t var _tops = [];\n\t\n\t var _colour;\n\t extruded.top.forEach(function (face, fi) {\n\t _colour = [];\n\t\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t\n\t _tops.push([true, true, true]);\n\t\n\t _faces.push(face);\n\t _colours.push(_colour);\n\t });\n\t\n\t if (extruded.sides) {\n\t flat = false;\n\t\n\t // Set up colours for every vertex with poor-mans AO on the sides\n\t extruded.sides.forEach(function (face, fi) {\n\t _colour = [];\n\t\n\t // First face is always bottom-bottom-top\n\t if (fi % 2 === 0) {\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t\n\t _tops.push([false, false, true]);\n\t // Reverse winding for the second face\n\t // top-top-bottom\n\t } else {\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t\n\t _tops.push([true, true, false]);\n\t }\n\t\n\t _faces.push(face);\n\t _colours.push(_colour);\n\t });\n\t }\n\t\n\t // Skip bottom as there's no point rendering it\n\t // allFaces.push(extruded.faces);\n\t\n\t var polygon = {\n\t vertices: _vertices,\n\t faces: _faces,\n\t colours: _colours,\n\t tops: _tops,\n\t facesCount: _faces.length\n\t };\n\t\n\t if (options.style.outline) {\n\t var outlineColour = new _three2['default'].Color();\n\t outlineColour.set(options.style.outlineColor || 0x000000);\n\t\n\t outlineAttributes.push(PolygonLayer.Set2DOutline(_coordinates, outlineColour));\n\t }\n\t\n\t if (options.interactive && options.pickingId) {\n\t // Inject picking ID\n\t polygon.pickingId = options.pickingId;\n\t }\n\t\n\t // Convert polygon representation to proper attribute arrays\n\t return PolygonLayer.ToAttributes(polygon);\n\t });\n\t\n\t resolve({\n\t attributes: attributes,\n\t outlineAttributes: outlineAttributes,\n\t flat: flat\n\t });\n\t });\n\t }\n\t }, {\n\t key: 'Set2DOutline',\n\t value: function Set2DOutline(coordinates, colour) {\n\t var _vertices = [];\n\t\n\t coordinates.forEach(function (ring) {\n\t var _ring = ring.map(function (coordinate) {\n\t return [coordinate.x, 0, coordinate.y];\n\t });\n\t\n\t // Add in duplicate vertices for line segments to work\n\t var verticeCount = _ring.length;\n\t var first = true;\n\t while (--verticeCount) {\n\t if (first || verticeCount === 0) {\n\t first = false;\n\t continue;\n\t }\n\t\n\t _ring.splice(verticeCount + 1, 0, _ring[verticeCount]);\n\t }\n\t\n\t _vertices = _vertices.concat(_ring);\n\t });\n\t\n\t _colour = [colour.r, colour.g, colour.b];\n\t\n\t var vertices = new Float32Array(_vertices.length * 3);\n\t var colours = new Float32Array(_vertices.length * 3);\n\t\n\t var lastIndex = 0;\n\t\n\t for (var i = 0; i < _vertices.length; i++) {\n\t var ax = _vertices[i][0];\n\t var ay = _vertices[i][1];\n\t var az = _vertices[i][2];\n\t\n\t var c1 = _colour;\n\t\n\t vertices[lastIndex * 3 + 0] = ax;\n\t vertices[lastIndex * 3 + 1] = ay;\n\t vertices[lastIndex * 3 + 2] = az;\n\t\n\t colours[lastIndex * 3 + 0] = c1[0];\n\t colours[lastIndex * 3 + 1] = c1[1];\n\t colours[lastIndex * 3 + 2] = c1[2];\n\t\n\t lastIndex++;\n\t }\n\t\n\t var attributes = {\n\t positions: vertices,\n\t colors: colours\n\t };\n\t\n\t return attributes;\n\t }\n\t }, {\n\t key: 'SetMesh',\n\t value: function SetMesh(attributes, attributeLengths, flat, style, options, skybox) {\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t for (var key in attributes) {\n\t geometry.addAttribute(key.slice(0, -1), new _three2['default'].BufferAttribute(attributes[key], attributeLengths[key]));\n\t }\n\t\n\t geometry.computeBoundingBox();\n\t\n\t var material;\n\t if (options.polygonMaterial && options.polygonMaterial instanceof _three2['default'].Material) {\n\t material = options.polygonMaterial;\n\t } else if (!skybox) {\n\t material = new _three2['default'].MeshPhongMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t side: _three2['default'].BackSide,\n\t transparent: style.transparent,\n\t opacity: style.opacity,\n\t blending: style.blending\n\t });\n\t } else {\n\t material = new _three2['default'].MeshStandardMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t side: _three2['default'].BackSide,\n\t transparent: style.transparent,\n\t opacity: style.opacity,\n\t blending: style.blending\n\t });\n\t material.roughness = 1;\n\t material.metalness = 0.1;\n\t material.envMapIntensity = 3;\n\t material.envMap = skybox.getRenderTarget();\n\t }\n\t\n\t var mesh;\n\t\n\t // Pass mesh through callback, if defined\n\t if (typeof options.onPolygonMesh === 'function') {\n\t mesh = options.onPolygonMesh(geometry, material);\n\t } else {\n\t mesh = new _three2['default'].Mesh(geometry, material);\n\t\n\t mesh.castShadow = true;\n\t mesh.receiveShadow = true;\n\t }\n\t\n\t if (flat) {\n\t material.depthWrite = false;\n\t\n\t var renderOrder = style.renderOrder !== undefined ? style.renderOrder : 3;\n\t mesh.renderOrder = renderOrder;\n\t }\n\t\n\t if (options.interactive) {\n\t material = new _enginePickingMaterial2['default']();\n\t material.side = _three2['default'].BackSide;\n\t\n\t var pickingMesh = new _three2['default'].Mesh(geometry, material);\n\t }\n\t\n\t return Promise.resolve({\n\t mesh: mesh,\n\t pickingMesh: pickingMesh\n\t });\n\t }\n\t }, {\n\t key: 'ToEarcut',\n\t value: function ToEarcut(coordinates) {\n\t var dim = 2;\n\t var result = { vertices: [], holes: [], dimensions: dim };\n\t var holeIndex = 0;\n\t\n\t for (var i = 0; i < coordinates.length; i++) {\n\t for (var j = 0; j < coordinates[i].length; j++) {\n\t // for (var d = 0; d < dim; d++) {\n\t result.vertices.push(coordinates[i][j].x);\n\t result.vertices.push(coordinates[i][j].y);\n\t // }\n\t }\n\t if (i > 0) {\n\t holeIndex += coordinates[i - 1].length;\n\t result.holes.push(holeIndex);\n\t }\n\t }\n\t\n\t return result;\n\t }\n\t\n\t // Triangulate earcut-based input using earcut\n\t }, {\n\t key: 'Triangulate',\n\t value: function Triangulate(contour, holes, dim) {\n\t // console.time('earcut');\n\t\n\t var faces = (0, _earcut3['default'])(contour, holes, dim);\n\t var result = [];\n\t\n\t for (i = 0, il = faces.length; i < il; i += 3) {\n\t result.push(faces.slice(i, i + 3));\n\t }\n\t\n\t // console.timeEnd('earcut');\n\t\n\t return result;\n\t }\n\t\n\t // Transform polygon representation into attribute arrays that can be used by\n\t // THREE.BufferGeometry\n\t //\n\t // TODO: Can this be simplified? It's messy and huge\n\t }, {\n\t key: 'ToAttributes',\n\t value: function ToAttributes(polygon) {\n\t // Three components per vertex per face (3 x 3 = 9)\n\t var positions = new Float32Array(polygon.facesCount * 9);\n\t var normals = new Float32Array(polygon.facesCount * 9);\n\t var colours = new Float32Array(polygon.facesCount * 9);\n\t\n\t // One component per vertex per face (1 x 3 = 3)\n\t var tops = new Float32Array(polygon.facesCount * 3);\n\t\n\t var pickingIds;\n\t if (polygon.pickingId) {\n\t // One component per vertex per face (1 x 3 = 3)\n\t pickingIds = new Float32Array(polygon.facesCount * 3);\n\t }\n\t\n\t var pA = new _three2['default'].Vector3();\n\t var pB = new _three2['default'].Vector3();\n\t var pC = new _three2['default'].Vector3();\n\t\n\t var cb = new _three2['default'].Vector3();\n\t var ab = new _three2['default'].Vector3();\n\t\n\t var index;\n\t\n\t var _faces = polygon.faces;\n\t var _vertices = polygon.vertices;\n\t var _colour = polygon.colours;\n\t var _tops = polygon.tops;\n\t\n\t var _pickingId;\n\t if (pickingIds) {\n\t _pickingId = polygon.pickingId;\n\t }\n\t\n\t var lastIndex = 0;\n\t\n\t for (var i = 0; i < _faces.length; i++) {\n\t // Array of vertex indexes for the face\n\t index = _faces[i][0];\n\t\n\t var ax = _vertices[index][0];\n\t var ay = _vertices[index][1];\n\t var az = _vertices[index][2];\n\t\n\t var c1 = _colour[i][0];\n\t var t1 = _tops[i][0];\n\t\n\t index = _faces[i][1];\n\t\n\t var bx = _vertices[index][0];\n\t var by = _vertices[index][1];\n\t var bz = _vertices[index][2];\n\t\n\t var c2 = _colour[i][1];\n\t var t2 = _tops[i][1];\n\t\n\t index = _faces[i][2];\n\t\n\t var cx = _vertices[index][0];\n\t var cy = _vertices[index][1];\n\t var cz = _vertices[index][2];\n\t\n\t var c3 = _colour[i][2];\n\t var t3 = _tops[i][2];\n\t\n\t // Flat face normals\n\t // From: http://threejs.org/examples/webgl_buffergeometry.html\n\t pA.set(ax, ay, az);\n\t pB.set(bx, by, bz);\n\t pC.set(cx, cy, cz);\n\t\n\t cb.subVectors(pC, pB);\n\t ab.subVectors(pA, pB);\n\t cb.cross(ab);\n\t\n\t cb.normalize();\n\t\n\t var nx = cb.x;\n\t var ny = cb.y;\n\t var nz = cb.z;\n\t\n\t positions[lastIndex * 9 + 0] = ax;\n\t positions[lastIndex * 9 + 1] = ay;\n\t positions[lastIndex * 9 + 2] = az;\n\t\n\t normals[lastIndex * 9 + 0] = nx;\n\t normals[lastIndex * 9 + 1] = ny;\n\t normals[lastIndex * 9 + 2] = nz;\n\t\n\t colours[lastIndex * 9 + 0] = c1[0];\n\t colours[lastIndex * 9 + 1] = c1[1];\n\t colours[lastIndex * 9 + 2] = c1[2];\n\t\n\t positions[lastIndex * 9 + 3] = bx;\n\t positions[lastIndex * 9 + 4] = by;\n\t positions[lastIndex * 9 + 5] = bz;\n\t\n\t normals[lastIndex * 9 + 3] = nx;\n\t normals[lastIndex * 9 + 4] = ny;\n\t normals[lastIndex * 9 + 5] = nz;\n\t\n\t colours[lastIndex * 9 + 3] = c2[0];\n\t colours[lastIndex * 9 + 4] = c2[1];\n\t colours[lastIndex * 9 + 5] = c2[2];\n\t\n\t positions[lastIndex * 9 + 6] = cx;\n\t positions[lastIndex * 9 + 7] = cy;\n\t positions[lastIndex * 9 + 8] = cz;\n\t\n\t normals[lastIndex * 9 + 6] = nx;\n\t normals[lastIndex * 9 + 7] = ny;\n\t normals[lastIndex * 9 + 8] = nz;\n\t\n\t colours[lastIndex * 9 + 6] = c3[0];\n\t colours[lastIndex * 9 + 7] = c3[1];\n\t colours[lastIndex * 9 + 8] = c3[2];\n\t\n\t tops[lastIndex * 3 + 0] = t1;\n\t tops[lastIndex * 3 + 1] = t2;\n\t tops[lastIndex * 3 + 2] = t3;\n\t\n\t if (pickingIds) {\n\t pickingIds[lastIndex * 3 + 0] = _pickingId;\n\t pickingIds[lastIndex * 3 + 1] = _pickingId;\n\t pickingIds[lastIndex * 3 + 2] = _pickingId;\n\t }\n\t\n\t lastIndex++;\n\t }\n\t\n\t var attributes = {\n\t positions: positions,\n\t normals: normals,\n\t colors: colours,\n\t tops: tops\n\t };\n\t\n\t if (pickingIds) {\n\t attributes.pickingIds = pickingIds;\n\t }\n\t\n\t return attributes;\n\t }\n\t }, {\n\t key: 'isSingle',\n\t value: function isSingle(coordinates) {\n\t return !Array.isArray(coordinates[0][0][0]);\n\t }\n\t }]);\n\t\n\t return PolygonLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = PolygonLayer;\n\t\n\tvar noNew = function noNew(coordinates, options) {\n\t return new PolygonLayer(coordinates, options);\n\t};\n\t\n\texports.polygonLayer = noNew;\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _PickingShader = __webpack_require__(38);\n\t\n\tvar _PickingShader2 = _interopRequireDefault(_PickingShader);\n\t\n\t// FROM: https://github.com/brianxu/GPUPicker/blob/master/GPUPicker.js\n\t\n\tvar PickingMaterial = function PickingMaterial() {\n\t _three2['default'].ShaderMaterial.call(this, {\n\t uniforms: {\n\t size: {\n\t type: 'f',\n\t value: 0.01\n\t },\n\t scale: {\n\t type: 'f',\n\t value: 400\n\t }\n\t },\n\t // attributes: ['position', 'id'],\n\t vertexShader: _PickingShader2['default'].vertexShader,\n\t fragmentShader: _PickingShader2['default'].fragmentShader\n\t });\n\t\n\t this.linePadding = 2;\n\t};\n\t\n\tPickingMaterial.prototype = Object.create(_three2['default'].ShaderMaterial.prototype);\n\t\n\tPickingMaterial.prototype.constructor = PickingMaterial;\n\t\n\tPickingMaterial.prototype.setPointSize = function (size) {\n\t this.uniforms.size.value = size;\n\t};\n\t\n\tPickingMaterial.prototype.setPointScale = function (scale) {\n\t this.uniforms.scale.value = scale;\n\t};\n\t\n\texports['default'] = PickingMaterial;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 38 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t// FROM: https://github.com/brianxu/GPUPicker/blob/master/GPUPicker.js\n\t\n\tvar PickingShader = {\n\t\tvertexShader: ['attribute float pickingId;',\n\t\t// '',\n\t\t// 'uniform float size;',\n\t\t// 'uniform float scale;',\n\t\t'', 'varying vec4 worldId;', '', 'void main() {', ' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );',\n\t\t// ' gl_PointSize = size * ( scale / length( mvPosition.xyz ) );',\n\t\t' vec3 a = fract(vec3(1.0/255.0, 1.0/(255.0*255.0), 1.0/(255.0*255.0*255.0)) * pickingId);', ' a -= a.xxy * vec3(0.0, 1.0/255.0, 1.0/255.0);', ' worldId = vec4(a,1);', ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', '}'].join('\\n'),\n\t\n\t\tfragmentShader: ['#ifdef GL_ES\\n', 'precision highp float;\\n', '#endif\\n', '', 'varying vec4 worldId;', '', 'void main() {', ' gl_FragColor = worldId;', '}'].join('\\n')\n\t};\n\t\n\texports['default'] = PickingShader;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t// TODO: Move duplicated logic between geometry layrs into GeometryLayer\n\t\n\t// TODO: Look at ways to drop unneeded references to array buffers, etc to\n\t// reduce memory footprint\n\t\n\t// TODO: Provide alternative output using tubes and splines / curves\n\t\n\t// TODO: Support dynamic updating / hiding / animation of geometry\n\t//\n\t// This could be pretty hard as it's all packed away within BufferGeometry and\n\t// may even be merged by another layer (eg. GeoJSONLayer)\n\t//\n\t// How much control should this layer support? Perhaps a different or custom\n\t// layer would be better suited for animation, for example.\n\t\n\t// TODO: Allow _setBufferAttributes to use a custom function passed in to\n\t// generate a custom mesh\n\t\n\tvar _Layer2 = __webpack_require__(4);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(6);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _geoGeo = __webpack_require__(1);\n\t\n\tvar _geoGeo2 = _interopRequireDefault(_geoGeo);\n\t\n\tvar _geoLatLon = __webpack_require__(2);\n\t\n\tvar _geoPoint = __webpack_require__(3);\n\t\n\tvar _enginePickingMaterial = __webpack_require__(37);\n\t\n\tvar _enginePickingMaterial2 = _interopRequireDefault(_enginePickingMaterial);\n\t\n\tvar _utilBuffer = __webpack_require__(34);\n\t\n\tvar _utilBuffer2 = _interopRequireDefault(_utilBuffer);\n\t\n\tvar PolylineLayer = (function (_Layer) {\n\t _inherits(PolylineLayer, _Layer);\n\t\n\t function PolylineLayer(coordinates, options) {\n\t _classCallCheck(this, PolylineLayer);\n\t\n\t var defaults = {\n\t output: true,\n\t interactive: false,\n\t // Custom material override\n\t //\n\t // TODO: Should this be in the style object?\n\t polylineMaterial: null,\n\t onPolylineMesh: null,\n\t onBufferAttributes: null,\n\t // This default style is separate to Util.GeoJSON.defaultStyle\n\t style: {\n\t lineOpacity: 1,\n\t lineTransparent: false,\n\t lineColor: '#ffffff',\n\t lineWidth: 1,\n\t lineBlending: _three2['default'].NormalBlending\n\t }\n\t };\n\t\n\t var _options = (0, _lodashAssign2['default'])({}, defaults, options);\n\t\n\t _get(Object.getPrototypeOf(PolylineLayer.prototype), 'constructor', this).call(this, _options);\n\t\n\t // Return coordinates as array of lines so it's easy to support\n\t // MultiLineString features (a single line would be a MultiLineString with a\n\t // single line in the array)\n\t this._coordinates = PolylineLayer.isSingle(coordinates) ? [coordinates] : coordinates;\n\t\n\t // Polyline features are always flat (for now at least)\n\t this._flat = true;\n\t }\n\t\n\t _createClass(PolylineLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t _this._setCoordinates();\n\t\n\t if (_this._options.interactive) {\n\t // Only add to picking mesh if this layer is controlling output\n\t //\n\t // Otherwise, assume another component will eventually add a mesh to\n\t // the picking scene\n\t if (_this.isOutput()) {\n\t _this._pickingMesh = new _three2['default'].Object3D();\n\t _this.addToPicking(_this._pickingMesh);\n\t }\n\t\n\t _this._setPickingId();\n\t _this._addPickingEvents();\n\t }\n\t\n\t // Store geometry representation as instances of THREE.BufferAttribute\n\t PolylineLayer.SetBufferAttributes(_this._projectedCoordinates, _this._options).then(function (result) {\n\t _this._bufferAttributes = _utilBuffer2['default'].mergeAttributes(result.attributes);\n\t _this._flat = result.flat;\n\t\n\t var attributeLengths = {\n\t positions: 3,\n\t colors: 3\n\t };\n\t\n\t if (_this._options.interactive) {\n\t attributeLengths.pickingIds = 1;\n\t }\n\t\n\t if (_this.isOutput()) {\n\t var style = _this._options.style;\n\t\n\t // Set mesh if not merging elsewhere\n\t PolylineLayer.SetMesh(_this._bufferAttributes, attributeLengths, _this._flat, style, _this._options).then(function (result) {\n\t // Output mesh\n\t _this.add(result.mesh);\n\t\n\t if (result.pickingMesh) {\n\t _this._pickingMesh.add(result.pickingMesh);\n\t }\n\t });\n\t }\n\t\n\t result.attributes = null;\n\t result = null;\n\t\n\t resolve(_this);\n\t });\n\t });\n\t }\n\t\n\t // Return center of polyline as a LatLon\n\t //\n\t // This is used for things like placing popups / UI elements on the layer\n\t //\n\t // TODO: Find proper center position instead of returning first coordinate\n\t // SEE: https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Polyline.js#L59\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t\n\t // Return line bounds in geographic coordinates\n\t //\n\t // TODO: Implement getBounds()\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {}\n\t\n\t // Get unique ID for picking interaction\n\t }, {\n\t key: '_setPickingId',\n\t value: function _setPickingId() {\n\t this._pickingId = this.getPickingId();\n\t }\n\t\n\t // Set up and re-emit interaction events\n\t }, {\n\t key: '_addPickingEvents',\n\t value: function _addPickingEvents() {\n\t var _this2 = this;\n\t\n\t // TODO: Find a way to properly remove this listener on destroy\n\t this._world.on('pick-' + this._pickingId, function (point2d, point3d, intersects) {\n\t // Re-emit click event from the layer\n\t _this2.emit('click', _this2, point2d, point3d, intersects);\n\t });\n\t }\n\t }, {\n\t key: 'getBufferAttributes',\n\t value: function getBufferAttributes() {\n\t return this._bufferAttributes;\n\t }\n\t\n\t // Used by external components to clear some memory when the attributes\n\t // are no longer required to be stored in this layer\n\t //\n\t // For example, you would want to clear the attributes here after merging them\n\t // using something like the GeoJSONLayer\n\t }, {\n\t key: 'clearBufferAttributes',\n\t value: function clearBufferAttributes() {\n\t this._bufferAttributes = null;\n\t }\n\t\n\t // Used by external components to clear some memory when the coordinates\n\t // are no longer required to be stored in this layer\n\t //\n\t // For example, you would want to clear the coordinates here after this\n\t // layer is merged in something like the GeoJSONLayer\n\t }, {\n\t key: 'clearCoordinates',\n\t value: function clearCoordinates() {\n\t this._coordinates = null;\n\t this._projectedCoordinates = null;\n\t }\n\t }, {\n\t key: '_setCoordinates',\n\t\n\t // Convert and project coordinates\n\t //\n\t // TODO: Calculate bounds\n\t value: function _setCoordinates() {\n\t this._bounds = [];\n\t this._coordinates = this._convertCoordinates(this._coordinates);\n\t\n\t this._projectedBounds = [];\n\t this._projectedCoordinates = this._projectCoordinates();\n\t\n\t this._center = this._coordinates[0][0];\n\t }\n\t\n\t // Recursively convert input coordinates into LatLon objects\n\t //\n\t // Calculate geographic bounds at the same time\n\t //\n\t // TODO: Calculate geographic bounds\n\t }, {\n\t key: '_convertCoordinates',\n\t value: function _convertCoordinates(coordinates) {\n\t return coordinates.map(function (_coordinates) {\n\t return _coordinates.map(function (coordinate) {\n\t return (0, _geoLatLon.latLon)(coordinate[1], coordinate[0]);\n\t });\n\t });\n\t }\n\t\n\t // Recursively project coordinates into world positions\n\t //\n\t // Calculate world bounds, offset and pointScale at the same time\n\t //\n\t // TODO: Calculate world bounds\n\t }, {\n\t key: '_projectCoordinates',\n\t value: function _projectCoordinates() {\n\t var _this3 = this;\n\t\n\t var point;\n\t return this._coordinates.map(function (_coordinates) {\n\t return _coordinates.map(function (latlon) {\n\t point = _this3._world.latLonToPoint(latlon);\n\t\n\t // TODO: Is offset ever being used or needed?\n\t if (!_this3._offset) {\n\t _this3._offset = (0, _geoPoint.point)(0, 0);\n\t _this3._offset.x = -1 * point.x;\n\t _this3._offset.y = -1 * point.y;\n\t\n\t _this3._options.pointScale = _this3._world.pointScale(latlon);\n\t }\n\t\n\t return point;\n\t });\n\t });\n\t }\n\t }, {\n\t key: 'isFlat',\n\t\n\t // Returns true if the line is flat (has no height)\n\t value: function isFlat() {\n\t return this._flat;\n\t }\n\t\n\t // Returns true if coordinates refer to a single geometry\n\t //\n\t // For example, not coordinates for a MultiLineString GeoJSON feature\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t if (this._pickingMesh) {\n\t // TODO: Properly dispose of picking mesh\n\t this._pickingMesh = null;\n\t }\n\t\n\t this.clearCoordinates();\n\t this.clearBufferAttributes();\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(PolylineLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }], [{\n\t key: 'SetBufferAttributes',\n\t value: function SetBufferAttributes(coordinates, options) {\n\t return new Promise(function (resolve) {\n\t var height = 0;\n\t\n\t // Convert height into world units\n\t if (options.style.lineHeight) {\n\t height = _geoGeo2['default'].metresToWorld(options.style.lineHeight, options.pointScale);\n\t }\n\t\n\t var colour = new _three2['default'].Color();\n\t colour.set(options.style.lineColor);\n\t\n\t var flat = true;\n\t\n\t // For each line\n\t var attributes = coordinates.map(function (_projectedCoordinates) {\n\t var _vertices = [];\n\t var _colours = [];\n\t\n\t // Connect coordinate with the next to make a pair\n\t //\n\t // LineSegments requires pairs of vertices so repeat the last point if\n\t // there's an odd number of vertices\n\t var nextCoord;\n\t _projectedCoordinates.forEach(function (coordinate, index) {\n\t _colours.push([colour.r, colour.g, colour.b]);\n\t _vertices.push([coordinate.x, height, coordinate.y]);\n\t\n\t nextCoord = _projectedCoordinates[index + 1] ? _projectedCoordinates[index + 1] : coordinate;\n\t\n\t _colours.push([colour.r, colour.g, colour.b]);\n\t _vertices.push([nextCoord.x, height, nextCoord.y]);\n\t });\n\t\n\t var line = {\n\t vertices: _vertices,\n\t colours: _colours,\n\t verticesCount: _vertices.length\n\t };\n\t\n\t if (options.interactive && options.pickingId) {\n\t // Inject picking ID\n\t line.pickingId = options.pickingId;\n\t }\n\t\n\t // Convert line representation to proper attribute arrays\n\t return PolylineLayer.ToAttributes(line);\n\t });\n\t\n\t resolve({\n\t attributes: attributes,\n\t flat: flat\n\t });\n\t });\n\t }\n\t }, {\n\t key: 'SetMesh',\n\t value: function SetMesh(attributes, attributeLengths, flat, style, options) {\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t for (var key in attributes) {\n\t geometry.addAttribute(key.slice(0, -1), new _three2['default'].BufferAttribute(attributes[key], attributeLengths[key]));\n\t }\n\t\n\t geometry.computeBoundingBox();\n\t\n\t var material;\n\t if (options.polylineMaterial && options.polylineMaterial instanceof _three2['default'].Material) {\n\t material = options.polylineMaterial;\n\t } else {\n\t material = new _three2['default'].LineBasicMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t linewidth: style.lineWidth,\n\t transparent: style.lineTransparent,\n\t opacity: style.lineOpacity,\n\t blending: style.lineBlending\n\t });\n\t }\n\t\n\t var mesh;\n\t\n\t // Pass mesh through callback, if defined\n\t if (typeof options.onPolylineMesh === 'function') {\n\t mesh = options.onPolylineMesh(geometry, material);\n\t } else {\n\t mesh = new _three2['default'].LineSegments(geometry, material);\n\t\n\t if (style.lineRenderOrder !== undefined) {\n\t material.depthWrite = false;\n\t mesh.renderOrder = style.lineRenderOrder;\n\t }\n\t\n\t mesh.castShadow = true;\n\t // mesh.receiveShadow = true;\n\t }\n\t\n\t if (options.interactive) {\n\t material = new _enginePickingMaterial2['default']();\n\t // material.side = THREE.BackSide;\n\t\n\t // Make the line wider / easier to pick\n\t material.linewidth = style.lineWidth + material.linePadding;\n\t\n\t var pickingMesh = new _three2['default'].LineSegments(geometry, material);\n\t }\n\t\n\t return Promise.resolve({\n\t mesh: mesh,\n\t pickingMesh: pickingMesh\n\t });\n\t }\n\t }, {\n\t key: 'ToAttributes',\n\t value: function ToAttributes(line) {\n\t // Three components per vertex\n\t var vertices = new Float32Array(line.verticesCount * 3);\n\t var colours = new Float32Array(line.verticesCount * 3);\n\t\n\t var pickingIds;\n\t if (line.pickingId) {\n\t // One component per vertex\n\t pickingIds = new Float32Array(line.verticesCount);\n\t }\n\t\n\t var _vertices = line.vertices;\n\t var _colour = line.colours;\n\t\n\t var _pickingId;\n\t if (pickingIds) {\n\t _pickingId = line.pickingId;\n\t }\n\t\n\t var lastIndex = 0;\n\t\n\t for (var i = 0; i < _vertices.length; i++) {\n\t var ax = _vertices[i][0];\n\t var ay = _vertices[i][1];\n\t var az = _vertices[i][2];\n\t\n\t var c1 = _colour[i];\n\t\n\t vertices[lastIndex * 3 + 0] = ax;\n\t vertices[lastIndex * 3 + 1] = ay;\n\t vertices[lastIndex * 3 + 2] = az;\n\t\n\t colours[lastIndex * 3 + 0] = c1[0];\n\t colours[lastIndex * 3 + 1] = c1[1];\n\t colours[lastIndex * 3 + 2] = c1[2];\n\t\n\t if (pickingIds) {\n\t pickingIds[lastIndex] = _pickingId;\n\t }\n\t\n\t lastIndex++;\n\t }\n\t\n\t var attributes = {\n\t positions: vertices,\n\t colors: colours\n\t };\n\t\n\t if (pickingIds) {\n\t attributes.pickingIds = pickingIds;\n\t }\n\t\n\t return attributes;\n\t }\n\t }, {\n\t key: 'isSingle',\n\t value: function isSingle(coordinates) {\n\t return !Array.isArray(coordinates[0][0]);\n\t }\n\t }]);\n\t\n\t return PolylineLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = PolylineLayer;\n\t\n\tvar noNew = function noNew(coordinates, options) {\n\t return new PolylineLayer(coordinates, options);\n\t};\n\t\n\texports.polylineLayer = noNew;\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\t// TODO: Move duplicated logic between geometry layrs into GeometryLayer\n\t\n\t// TODO: Look at ways to drop unneeded references to array buffers, etc to\n\t// reduce memory footprint\n\t\n\t// TODO: Point features may be using custom models / meshes and so an approach\n\t// needs to be found to allow these to be brokwn down into buffer attributes for\n\t// merging\n\t//\n\t// Can probably use fromGeometry() or setFromObject() from THREE.BufferGeometry\n\t// and pull out the attributes\n\t\n\t// TODO: Support sprite objects using textures\n\t\n\t// TODO: Provide option to billboard geometry so it always faces the camera\n\t\n\t// TODO: Support dynamic updating / hiding / animation of geometry\n\t//\n\t// This could be pretty hard as it's all packed away within BufferGeometry and\n\t// may even be merged by another layer (eg. GeoJSONLayer)\n\t//\n\t// How much control should this layer support? Perhaps a different or custom\n\t// layer would be better suited for animation, for example.\n\t\n\tvar _Layer2 = __webpack_require__(4);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(6);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _three = __webpack_require__(18);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _geoGeo = __webpack_require__(1);\n\t\n\tvar _geoGeo2 = _interopRequireDefault(_geoGeo);\n\t\n\tvar _geoLatLon = __webpack_require__(2);\n\t\n\tvar _geoPoint = __webpack_require__(3);\n\t\n\tvar _enginePickingMaterial = __webpack_require__(37);\n\t\n\tvar _enginePickingMaterial2 = _interopRequireDefault(_enginePickingMaterial);\n\t\n\tvar _utilBuffer = __webpack_require__(34);\n\t\n\tvar _utilBuffer2 = _interopRequireDefault(_utilBuffer);\n\t\n\tvar _PolygonLayer = __webpack_require__(36);\n\t\n\tvar _PolygonLayer2 = _interopRequireDefault(_PolygonLayer);\n\t\n\tvar PointLayer = (function (_Layer) {\n\t _inherits(PointLayer, _Layer);\n\t\n\t function PointLayer(coordinates, options) {\n\t _classCallCheck(this, PointLayer);\n\t\n\t var defaults = {\n\t output: true,\n\t interactive: false,\n\t // THREE.Geometry or THREE.BufferGeometry to use for point output\n\t pointGeometry: null,\n\t // Custom material override\n\t //\n\t // TODO: Should this be in the style object?\n\t pointMaterial: null,\n\t onPointMesh: null,\n\t // This default style is separate to Util.GeoJSON.defaultStyle\n\t style: {\n\t pointColor: '#ff0000'\n\t }\n\t };\n\t\n\t var _options = (0, _lodashAssign2['default'])({}, defaults, options);\n\t\n\t _get(Object.getPrototypeOf(PointLayer.prototype), 'constructor', this).call(this, _options);\n\t\n\t // Return coordinates as array of points so it's easy to support\n\t // MultiPoint features (a single point would be a MultiPoint with a\n\t // single point in the array)\n\t this._coordinates = PointLayer.isSingle(coordinates) ? [coordinates] : coordinates;\n\t\n\t this._flat = false;\n\t }\n\t\n\t _createClass(PointLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t return new Promise(function (resolve, reject) {\n\t _this._setCoordinates();\n\t\n\t if (_this._options.interactive) {\n\t // Only add to picking mesh if this layer is controlling output\n\t //\n\t // Otherwise, assume another component will eventually add a mesh to\n\t // the picking scene\n\t if (_this.isOutput()) {\n\t _this._pickingMesh = new _three2['default'].Object3D();\n\t _this.addToPicking(_this._pickingMesh);\n\t }\n\t\n\t _this._setPickingId();\n\t _this._addPickingEvents();\n\t }\n\t\n\t // Store geometry representation as instances of THREE.BufferAttribute\n\t PointLayer.SetBufferAttributes(_this._projectedCoordinates, _this._options).then(function (result) {\n\t _this._bufferAttributes = _utilBuffer2['default'].mergeAttributes(result.attributes);\n\t _this._flat = result.flat;\n\t\n\t var attributeLengths = {\n\t positions: 3,\n\t normals: 3,\n\t colors: 3\n\t };\n\t\n\t if (_this._options.interactive) {\n\t attributeLengths.pickingIds = 1;\n\t }\n\t\n\t if (_this.isOutput()) {\n\t var style = _this._options.style;\n\t\n\t // Set mesh if not merging elsewhere\n\t // TODO: Dedupe with PolygonLayer as they are identical\n\t PointLayer.SetMesh(_this._bufferAttributes, attributeLengths, _this._flat, style, _this._options, _this._world._environment._skybox).then(function (result) {\n\t // Output mesh\n\t _this.add(result.mesh);\n\t\n\t if (result.pickingMesh) {\n\t _this._pickingMesh.add(result.pickingMesh);\n\t }\n\t });\n\t }\n\t\n\t result.attributes = null;\n\t result = null;\n\t\n\t resolve(_this);\n\t })['catch'](reject);\n\t });\n\t }\n\t\n\t // Return center of point as a LatLon\n\t //\n\t // This is used for things like placing popups / UI elements on the layer\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t\n\t // Return point bounds in geographic coordinates\n\t //\n\t // While not useful for single points, it could be useful for MultiPoint\n\t //\n\t // TODO: Implement getBounds()\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {}\n\t\n\t // Get unique ID for picking interaction\n\t }, {\n\t key: '_setPickingId',\n\t value: function _setPickingId() {\n\t this._pickingId = this.getPickingId();\n\t }\n\t\n\t // Set up and re-emit interaction events\n\t }, {\n\t key: '_addPickingEvents',\n\t value: function _addPickingEvents() {\n\t var _this2 = this;\n\t\n\t // TODO: Find a way to properly remove this listener on destroy\n\t this._world.on('pick-' + this._pickingId, function (point2d, point3d, intersects) {\n\t // Re-emit click event from the layer\n\t _this2.emit('click', _this2, point2d, point3d, intersects);\n\t });\n\t }\n\t }, {\n\t key: 'getBufferAttributes',\n\t value: function getBufferAttributes() {\n\t return this._bufferAttributes;\n\t }\n\t\n\t // Used by external components to clear some memory when the attributes\n\t // are no longer required to be stored in this layer\n\t //\n\t // For example, you would want to clear the attributes here after merging them\n\t // using something like the GeoJSONLayer\n\t }, {\n\t key: 'clearBufferAttributes',\n\t value: function clearBufferAttributes() {\n\t this._bufferAttributes = null;\n\t }\n\t\n\t // Used by external components to clear some memory when the coordinates\n\t // are no longer required to be stored in this layer\n\t //\n\t // For example, you would want to clear the coordinates here after this\n\t // layer is merged in something like the GeoJSONLayer\n\t }, {\n\t key: 'clearCoordinates',\n\t value: function clearCoordinates() {\n\t this._coordinates = null;\n\t this._projectedCoordinates = null;\n\t }\n\t }, {\n\t key: '_setCoordinates',\n\t\n\t // Convert and project coordinates\n\t //\n\t // TODO: Calculate bounds\n\t value: function _setCoordinates() {\n\t this._bounds = [];\n\t this._coordinates = this._convertCoordinates(this._coordinates);\n\t\n\t this._projectedBounds = [];\n\t this._projectedCoordinates = this._projectCoordinates();\n\t\n\t this._center = this._coordinates;\n\t }\n\t\n\t // Recursively convert input coordinates into LatLon objects\n\t //\n\t // Calculate geographic bounds at the same time\n\t //\n\t // TODO: Calculate geographic bounds\n\t }, {\n\t key: '_convertCoordinates',\n\t value: function _convertCoordinates(coordinates) {\n\t return coordinates.map(function (coordinate) {\n\t return (0, _geoLatLon.latLon)(coordinate[1], coordinate[0]);\n\t });\n\t }\n\t\n\t // Recursively project coordinates into world positions\n\t //\n\t // Calculate world bounds, offset and pointScale at the same time\n\t //\n\t // TODO: Calculate world bounds\n\t }, {\n\t key: '_projectCoordinates',\n\t value: function _projectCoordinates() {\n\t var _this3 = this;\n\t\n\t var _point;\n\t return this._coordinates.map(function (latlon) {\n\t _point = _this3._world.latLonToPoint(latlon);\n\t\n\t // TODO: Is offset ever being used or needed?\n\t if (!_this3._offset) {\n\t _this3._offset = (0, _geoPoint.point)(0, 0);\n\t _this3._offset.x = -1 * _point.x;\n\t _this3._offset.y = -1 * _point.y;\n\t\n\t _this3._options.pointScale = _this3._world.pointScale(latlon);\n\t }\n\t\n\t return _point;\n\t });\n\t }\n\t\n\t // Returns true if the line is flat (has no height)\n\t }, {\n\t key: 'isFlat',\n\t value: function isFlat() {\n\t return this._flat;\n\t }\n\t\n\t // Returns true if coordinates refer to a single geometry\n\t //\n\t // For example, not coordinates for a MultiPoint GeoJSON feature\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t if (this._pickingMesh) {\n\t // TODO: Properly dispose of picking mesh\n\t this._pickingMesh = null;\n\t }\n\t\n\t this.clearCoordinates();\n\t this.clearBufferAttributes();\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(PointLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }], [{\n\t key: 'SetBufferAttributes',\n\t value: function SetBufferAttributes(coordinates, options) {\n\t return new Promise(function (resolve) {\n\t var height = 0;\n\t\n\t // Convert height into world units\n\t if (options.style.pointHeight) {\n\t height = _geoGeo2['default'].metresToWorld(options.style.pointHeight, options.pointScale);\n\t }\n\t\n\t var colour = new _three2['default'].Color();\n\t colour.set(options.style.pointColor);\n\t\n\t // Use default geometry if none has been provided or the provided geometry\n\t // isn't valid\n\t if (!options.pointGeometry || !options.pointGeometry instanceof _three2['default'].Geometry || !options.pointGeometry instanceof _three2['default'].BufferGeometry) {\n\t // Debug geometry for points is a thin bar\n\t //\n\t // TODO: Allow point geometry to be customised / overridden\n\t var geometryWidth = _geoGeo2['default'].metresToWorld(25, options.pointScale);\n\t var geometryHeight = _geoGeo2['default'].metresToWorld(200, options.pointScale);\n\t var _geometry = new _three2['default'].BoxGeometry(geometryWidth, geometryHeight, geometryWidth);\n\t\n\t // Shift geometry up so it sits on the ground\n\t _geometry.translate(0, geometryHeight * 0.5, 0);\n\t\n\t // Pull attributes out of debug geometry\n\t geometry = new _three2['default'].BufferGeometry().fromGeometry(_geometry);\n\t } else {\n\t if (options.geometry instanceof _three2['default'].BufferGeometry) {\n\t geometry = options.pointGeometry;\n\t } else {\n\t geometry = new _three2['default'].BufferGeometry().fromGeometry(options.pointGeometry);\n\t }\n\t }\n\t\n\t var attributes = coordinates.map(function (coordinate) {\n\t var _vertices = [];\n\t var _normals = [];\n\t var _colours = [];\n\t\n\t var _geometry = geometry.clone();\n\t _geometry.translate(coordinate.x, height, coordinate.y);\n\t\n\t var _vertices = _geometry.attributes.position.clone().array;\n\t var _normals = _geometry.attributes.normal.clone().array;\n\t var _colours = _geometry.attributes.color.clone().array;\n\t\n\t for (var i = 0; i < _colours.length; i += 3) {\n\t _colours[i] = colour.r;\n\t _colours[i + 1] = colour.g;\n\t _colours[i + 2] = colour.b;\n\t }\n\t\n\t var _point = {\n\t positions: _vertices,\n\t normals: _normals,\n\t colors: _colours\n\t };\n\t\n\t if (options.interactive && options.pickingId) {\n\t // Inject picking ID\n\t _point.pickingId = options.pickingId;\n\t }\n\t\n\t return _point;\n\t });\n\t\n\t resolve({\n\t attributes: attributes,\n\t flat: false\n\t });\n\t });\n\t }\n\t }, {\n\t key: 'SetMesh',\n\t value: function SetMesh(attributes, attributeLengths, flat, style, options, skybox) {\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t for (var key in attributes) {\n\t geometry.addAttribute(key.slice(0, -1), new _three2['default'].BufferAttribute(attributes[key], attributeLengths[key]));\n\t }\n\t\n\t geometry.computeBoundingBox();\n\t\n\t var material;\n\t if (options.pointMaterial && options.pointMaterial instanceof _three2['default'].Material) {\n\t material = options.pointMaterial;\n\t } else if (!skybox) {\n\t material = new _three2['default'].MeshPhongMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t // side: THREE.BackSide,\n\t transparent: style.transparent,\n\t opacity: style.opacity,\n\t blending: style.blending\n\t });\n\t } else {\n\t material = new _three2['default'].MeshStandardMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t // side: THREE.BackSide,\n\t transparent: style.transparent,\n\t opacity: style.opacity,\n\t blending: style.blending\n\t });\n\t material.roughness = 1;\n\t material.metalness = 0.1;\n\t material.envMapIntensity = 3;\n\t material.envMap = skybox.getRenderTarget();\n\t }\n\t\n\t var mesh;\n\t\n\t // Pass mesh through callback, if defined\n\t if (typeof options.onPolygonMesh === 'function') {\n\t mesh = options.onPolygonMesh(geometry, material);\n\t } else {\n\t mesh = new _three2['default'].Mesh(geometry, material);\n\t\n\t mesh.castShadow = true;\n\t mesh.receiveShadow = true;\n\t }\n\t\n\t if (flat) {\n\t material.depthWrite = false;\n\t mesh.renderOrder = 4;\n\t }\n\t\n\t if (options.interactive) {\n\t material = new _enginePickingMaterial2['default']();\n\t material.side = _three2['default'].BackSide;\n\t\n\t var pickingMesh = new _three2['default'].Mesh(geometry, material);\n\t }\n\t\n\t return Promise.resolve({\n\t mesh: mesh,\n\t pickingMesh: pickingMesh\n\t });\n\t }\n\t }, {\n\t key: 'isSingle',\n\t value: function isSingle(coordinates) {\n\t return !Array.isArray(coordinates[0]);\n\t }\n\t }]);\n\t\n\t return PointLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = PointLayer;\n\t\n\tvar noNew = function noNew(coordinates, options) {\n\t return new PointLayer(coordinates, options);\n\t};\n\t\n\texports.pointLayer = noNew;\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// TODO: A lot of these utils don't need to be in separate, tiny files\n\t\n\tvar _wrapNum = __webpack_require__(42);\n\t\n\tvar _wrapNum2 = _interopRequireDefault(_wrapNum);\n\t\n\tvar _extrudePolygon = __webpack_require__(30);\n\t\n\tvar _extrudePolygon2 = _interopRequireDefault(_extrudePolygon);\n\t\n\tvar _GeoJSON = __webpack_require__(25);\n\t\n\tvar _GeoJSON2 = _interopRequireDefault(_GeoJSON);\n\t\n\tvar _Buffer = __webpack_require__(34);\n\t\n\tvar _Buffer2 = _interopRequireDefault(_Buffer);\n\t\n\tvar _Worker = __webpack_require__(31);\n\t\n\tvar _Worker2 = _interopRequireDefault(_Worker);\n\t\n\tvar _Stringify = __webpack_require__(35);\n\t\n\tvar _Stringify2 = _interopRequireDefault(_Stringify);\n\t\n\tvar Util = {};\n\t\n\tUtil.wrapNum = _wrapNum2['default'];\n\tUtil.extrudePolygon = _extrudePolygon2['default'];\n\tUtil.GeoJSON = _GeoJSON2['default'];\n\tUtil.Buffer = _Buffer2['default'];\n\tUtil.Worker = _Worker2['default'];\n\tUtil.Stringify = _Stringify2['default'];\n\t\n\texports['default'] = Util;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 42 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/*\n\t * Wrap the given number to lie within a certain range (eg. longitude)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n\t */\n\t\n\tvar wrapNum = function wrapNum(x, range, includeMax) {\n\t var max = range[1];\n\t var min = range[0];\n\t var d = max - min;\n\t return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n\t};\n\t\n\texports[\"default\"] = wrapNum;\n\tmodule.exports = exports[\"default\"];\n\n/***/ }\n/******/ ])\n});\n;"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 8912944b678b5a293f37\n **/","import Geo from './geo/Geo.js';\nimport Layer, {layer} from './layer/Layer';\nimport GeoJSONWorkerLayer, {geoJSONWorkerLayer} from './layer/GeoJSONWorkerLayer';\nimport PolygonLayer, {polygonLayer} from './layer/geometry/PolygonLayer';\n\nimport Point, {point} from './geo/Point';\nimport LatLon, {latLon} from './geo/LatLon';\n\nimport Util from './util/index';\n\nconst VIZI = {\n version: '0.3',\n\n Geo: Geo,\n Layer: Layer,\n layer: layer,\n GeoJSONWorkerLayer: GeoJSONWorkerLayer,\n geoJSONWorkerLayer: geoJSONWorkerLayer,\n PolygonLayer: PolygonLayer,\n polygonLayer: polygonLayer,\n Point: Point,\n point: point,\n LatLon: LatLon,\n latLon: latLon,\n Util: Util\n};\n\nexport default VIZI;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vizicities-worker.js\n **/","import {latLon as LatLon} from './LatLon';\nimport {point as Point} from './Point';\n\nvar Geo = {};\n\n// Radius / WGS84 semi-major axis\nGeo.R = 6378137;\nGeo.MAX_LATITUDE = 85.0511287798;\n\n// WGS84 eccentricity\nGeo.ECC = 0.081819191;\nGeo.ECC2 = 0.081819191 * 0.081819191;\n\nGeo.project = function(latlon) {\n var d = Math.PI / 180;\n var max = Geo.MAX_LATITUDE;\n var lat = Math.max(Math.min(max, latlon.lat), -max);\n var sin = Math.sin(lat * d);\n\n return Point(\n Geo.R * latlon.lon * d,\n Geo.R * Math.log((1 + sin) / (1 - sin)) / 2\n );\n},\n\nGeo.unproject = function(point) {\n var d = 180 / Math.PI;\n\n return LatLon(\n (2 * Math.atan(Math.exp(point.y / Geo.R)) - (Math.PI / 2)) * d,\n point.x * d / Geo.R\n );\n};\n\n// Converts geo coords to pixel / WebGL ones\n// This just reverses the Y axis to match WebGL\nGeo.latLonToPoint = function(latlon) {\n var projected = Geo.project(latlon);\n projected.y *= -1;\n\n return projected;\n};\n\n// Converts pixel / WebGL coords to geo coords\n// This just reverses the Y axis to match WebGL\nGeo.pointToLatLon = function(point) {\n var _point = Point(point.x, point.y * -1);\n return Geo.unproject(_point);\n};\n\n// Scale factor for converting between real metres and projected metres\n//\n// projectedMetres = realMetres * pointScale\n// realMetres = projectedMetres / pointScale\n//\n// Accurate scale factor uses proper Web Mercator scaling\n// See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n// See: http://jsfiddle.net/robhawkes/yws924cf/\nGeo.pointScale = function(latlon, accurate) {\n var rad = Math.PI / 180;\n\n var k;\n\n if (!accurate) {\n k = 1 / Math.cos(latlon.lat * rad);\n\n // [scaleX, scaleY]\n return [k, k];\n } else {\n var lat = latlon.lat * rad;\n var lon = latlon.lon * rad;\n\n var a = Geo.R;\n\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n\n var cosLat = Math.cos(lat);\n\n // Radius meridian\n var p = a * (1 - Geo.ECC2) / Math.pow(1 - Geo.ECC2 * sinLat2, 3 / 2);\n\n // Radius prime meridian\n var v = a / Math.sqrt(1 - Geo.ECC2 * sinLat2);\n\n // Scale N/S\n var h = (a / p) / cosLat;\n\n // Scale E/W\n k = (a / v) / cosLat;\n\n // [scaleX, scaleY]\n return [k, h];\n }\n};\n\n// Convert real metres to projected units\n//\n// Latitude scale is chosen because it fluctuates more than longitude\nGeo.metresToProjected = function(metres, pointScale) {\n return metres * pointScale[1];\n};\n\n// Convert projected units to real metres\n//\n// Latitude scale is chosen because it fluctuates more than longitude\nGeo.projectedToMetres = function(projectedUnits, pointScale) {\n return projectedUnits / pointScale[1];\n};\n\n// Convert real metres to a value in world (WebGL) units\nGeo.metresToWorld = function(metres, pointScale) {\n // Transform metres to projected metres using the latitude point scale\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n var projectedMetres = Geo.metresToProjected(metres, pointScale);\n\n var scale = Geo.scale();\n\n // Scale projected metres\n var scaledMetres = (scale * projectedMetres);\n\n return scaledMetres;\n};\n\n// Convert world (WebGL) units to a value in real metres\nGeo.worldToMetres = function(worldUnits, pointScale) {\n var scale = Geo.scale();\n\n var projectedUnits = worldUnits / scale;\n var realMetres = Geo.projectedToMetres(projectedUnits, pointScale);\n\n return realMetres;\n};\n\n// If zoom is provided, returns the map width in pixels for a given zoom\n// Else, provides fixed scale value\nGeo.scale = function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom >= 0) {\n return 256 * Math.pow(2, zoom);\n // Else, return fixed scale value to expand projected coordinates from\n // their 0 to 1 range into something more practical\n } else {\n return 1;\n }\n};\n\n// Returns zoom level for a given scale value\n// This only works with a scale value that is based on map pixel width\nGeo.zoom = function(scale) {\n return Math.log(scale / 256) / Math.LN2;\n};\n\n// Distance between two geographical points using spherical law of cosines\n// approximation or Haversine\n//\n// See: http://www.movable-type.co.uk/scripts/latlong.html\nGeo.distance = function(latlon1, latlon2, accurate) {\n var rad = Math.PI / 180;\n\n var lat1;\n var lat2;\n\n var a;\n\n if (!accurate) {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\n return Geo.R * Math.acos(Math.min(a, 1));\n } else {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n var lon1 = latlon1.lon * rad;\n var lon2 = latlon2.lon * rad;\n\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n\n var halfDeltaLat = deltaLat / 2;\n var halfDeltaLon = deltaLon / 2;\n\n a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return Geo.R * c;\n }\n};\n\nGeo.bounds = (function() {\n var d = Geo.R * Math.PI;\n return [[-d, -d], [d, d]];\n})();\n\nexport default Geo;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Geo.js\n **/","/*\n * LatLon is a helper class for ensuring consistent geographic coordinates.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n */\n\nclass LatLon {\n constructor(lat, lon, alt) {\n if (isNaN(lat) || isNaN(lon)) {\n throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n }\n\n this.lat = +lat;\n this.lon = +lon;\n\n if (alt !== undefined) {\n this.alt = +alt;\n }\n }\n\n clone() {\n return new LatLon(this.lat, this.lon, this.alt);\n }\n}\n\nexport default LatLon;\n\n// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n// Also converts between lng and lon\nvar noNew = function(a, b, c) {\n if (a instanceof LatLon) {\n return a;\n }\n if (Array.isArray(a) && typeof a[0] !== 'object') {\n if (a.length === 3) {\n return new LatLon(a[0], a[1], a[2]);\n }\n if (a.length === 2) {\n return new LatLon(a[0], a[1]);\n }\n return null;\n }\n if (a === undefined || a === null) {\n return a;\n }\n if (typeof a === 'object' && 'lat' in a) {\n return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n }\n if (b === undefined) {\n return null;\n }\n return new LatLon(a, b, c);\n};\n\n// Initialise without requiring new keyword\nexport {noNew as latLon};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/LatLon.js\n **/","/*\n * Point is a helper class for ensuring consistent world positions.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n */\n\nclass Point {\n constructor(x, y, round) {\n this.x = (round ? Math.round(x) : x);\n this.y = (round ? Math.round(y) : y);\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n // Non-destructive\n add(point) {\n return this.clone()._add(_point(point));\n }\n\n // Destructive\n _add(point) {\n this.x += point.x;\n this.y += point.y;\n return this;\n }\n\n // Non-destructive\n subtract(point) {\n return this.clone()._subtract(_point(point));\n }\n\n // Destructive\n _subtract(point) {\n this.x -= point.x;\n this.y -= point.y;\n return this;\n }\n}\n\nexport default Point;\n\n// Accepts (point), ([x, y]) and (x, y, round)\nvar _point = function(x, y, round) {\n if (x instanceof Point) {\n return x;\n }\n if (Array.isArray(x)) {\n return new Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n return new Point(x, y, round);\n};\n\n// Initialise without requiring new keyword\nexport {_point as point};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Point.js\n **/","import EventEmitter from 'eventemitter3';\nimport extend from 'lodash.assign';\nimport shortid from 'shortid';\nimport THREE from 'three';\nimport Scene from '../engine/Scene';\nimport {CSS3DObject} from '../vendor/CSS3DRenderer';\nimport {CSS2DObject} from '../vendor/CSS2DRenderer';\n\n// TODO: Make sure nothing is left behind in the heap after calling destroy()\n\n// TODO: Need a single move method that handles moving all the various object\n// layers so that the DOM layers stay in sync with the 3D layer\n\n// TODO: Double check that objects within the _object3D Object3D parent are frustum\n// culled even if the layer position stays at the default (0,0,0) and the child\n// objects are positioned much further away\n//\n// Or does the layer being at (0,0,0) prevent the child objects from being\n// culled because the layer parent is effectively always in view even if the\n// child is actually out of camera\n\nclass Layer extends EventEmitter {\n constructor(options) {\n super();\n\n var defaults = {\n id: shortid.generate(),\n output: true,\n outputToScene: true\n };\n\n this._options = extend({}, defaults, options);\n\n if (this.isOutput()) {\n this._object3D = new THREE.Object3D();\n\n this._dom3D = document.createElement('div');\n this._domObject3D = new CSS3DObject(this._dom3D);\n\n this._dom2D = document.createElement('div');\n this._domObject2D = new CSS2DObject(this._dom2D);\n }\n }\n\n // Add THREE object directly to layer\n add(object) {\n this._object3D.add(object);\n }\n\n // Remove THREE object from to layer\n remove(object) {\n this._object3D.remove(object);\n }\n\n addDOM3D(object) {\n this._domObject3D.add(object);\n }\n\n removeDOM3D(object) {\n this._domObject3D.remove(object);\n }\n\n addDOM2D(object) {\n this._domObject2D.add(object);\n }\n\n removeDOM2D(object) {\n this._domObject2D.remove(object);\n }\n\n // Add layer to world instance and store world reference\n addTo(world) {\n return world.addLayer(this);\n }\n\n // Internal method called by World.addLayer to actually add the layer\n _addToWorld(world) {\n this._world = world;\n\n return new Promise((resolve, reject) => {\n this._onAdd(world).then(() => {\n this.emit('added');\n resolve(this);\n }).catch(reject);\n });\n }\n\n // Must return a promise\n _onAdd(world) {\n return Promise.resolve(this);\n }\n\n getPickingId() {\n if (this._world._engine._picking) {\n return this._world._engine._picking.getNextId();\n }\n\n return false;\n }\n\n // TODO: Tidy this up and don't access so many private properties to work\n addToPicking(object) {\n if (!this._world._engine._picking) {\n return;\n }\n\n this._world._engine._picking.add(object);\n }\n\n removeFromPicking(object) {\n if (!this._world._engine._picking) {\n return;\n }\n\n this._world._engine._picking.remove(object);\n }\n\n isOutput() {\n return this._options.output;\n }\n\n isOutputToScene() {\n return this._options.outputToScene;\n }\n\n // TODO: Also hide any attached DOM layers\n hide() {\n this._object3D.visible = false;\n\n if (this._pickingMesh) {\n this._pickingMesh.visible = false;\n }\n }\n\n // TODO: Also show any attached DOM layers\n show() {\n this._object3D.visible = true;\n\n if (this._pickingMesh) {\n this._pickingMesh.visible = true;\n }\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n if (this._object3D && this._object3D.children) {\n // Remove everything else in the layer\n var child;\n for (var i = this._object3D.children.length - 1; i >= 0; i--) {\n child = this._object3D.children[i];\n\n if (!child) {\n continue;\n }\n\n this.remove(child);\n\n if (child.geometry) {\n // Dispose of mesh and materials\n child.geometry.dispose();\n child.geometry = null;\n }\n\n if (child.material) {\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n }\n }\n }\n\n if (this._domObject3D && this._domObject3D.children) {\n // Remove everything else in the layer\n var child;\n for (var i = this._domObject3D.children.length - 1; i >= 0; i--) {\n child = this._domObject3D.children[i];\n\n if (!child) {\n continue;\n }\n\n this.removeDOM3D(child);\n }\n }\n\n if (this._domObject2D && this._domObject2D.children) {\n // Remove everything else in the layer\n var child;\n for (var i = this._domObject2D.children.length - 1; i >= 0; i--) {\n child = this._domObject2D.children[i];\n\n if (!child) {\n continue;\n }\n\n this.removeDOM2D(child);\n }\n }\n\n this._domObject3D = null;\n this._domObject2D = null;\n\n this._world = null;\n this._object3D = null;\n }\n}\n\nexport default Layer;\n\nvar noNew = function(options) {\n return new Layer(options);\n};\n\nexport {noNew as layer};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/Layer.js\n **/","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} [once=false] Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Hold the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var events = this._events\n , names = []\n , name;\n\n if (!events) return names;\n\n for (name in events) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events && this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if ('function' === typeof listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} [context=this] The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} [context=this] The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return this;\n\n var listeners = this._events[evt]\n , events = [];\n\n if (fn) {\n if (listeners.fn) {\n if (\n listeners.fn !== fn\n || (once && !listeners.once)\n || (context && listeners.context !== context)\n ) {\n events.push(listeners);\n }\n } else {\n for (var i = 0, length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) {\n this._events[evt] = events.length === 1 ? events[0] : events;\n } else {\n delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n if (!this._events) return this;\n\n if (event) delete this._events[prefix ? prefix + event : event];\n else this._events = prefix ? {} : Object.create(null);\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/eventemitter3/index.js\n ** module id = 5\n ** module chunks = 0\n **/","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\nvar keys = require('lodash.keys'),\n rest = require('lodash.rest');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */\nvar nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : source[key];\n\n assignValue(object, key, newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return rest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a\n * [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects\n * Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value)) && !isFunction(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array and weak map constructors,\n // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length,\n * else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.c = 3;\n * }\n *\n * function Bar() {\n * this.e = 5;\n * }\n *\n * Foo.prototype.d = 4;\n * Bar.prototype.f = 6;\n *\n * _.assign({ 'a': 1 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3, 'e': 5 }\n */\nvar assign = createAssigner(function(object, source) {\n if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nmodule.exports = assign;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.assign/index.js\n ** module id = 6\n ** module chunks = 0\n **/","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n stringTag = '[object String]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetPrototype = Object.getPrototypeOf,\n nativeKeys = Object.keys;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n // that are composed entirely of index properties, return `false` for\n // `hasOwnProperty` checks of them.\n return hasOwnProperty.call(object, key) ||\n (typeof object == 'object' && key in object && getPrototype(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a\n * [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects\n * Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Gets the `[[Prototype]]` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {null|Object} Returns the `[[Prototype]]`.\n */\nfunction getPrototype(value) {\n return nativeGetPrototype(Object(value));\n}\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n var length = object ? object.length : undefined;\n if (isLength(length) &&\n (isArray(object) || isString(object) || isArguments(object))) {\n return baseTimes(length, String);\n }\n return null;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @type {Function}\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(getLength(value)) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array and weak map constructors,\n // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length,\n * else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n var isProto = isPrototype(object);\n if (!(isProto || isArrayLike(object))) {\n return baseKeys(object);\n }\n var indexes = indexKeys(object),\n skipIndexes = !!indexes,\n result = indexes || [],\n length = result.length;\n\n for (var key in object) {\n if (baseHas(object, key) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n !(isProto && key == 'constructor')) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.keys/index.js\n ** module id = 7\n ** module chunks = 0\n **/","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n var length = args.length;\n switch (length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as\n * an array.\n *\n * **Note:** This method is based on the\n * [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array and weak map constructors,\n // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n * else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = rest;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.rest/index.js\n ** module id = 8\n ** module chunks = 0\n **/","'use strict';\nmodule.exports = require('./lib/index');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/index.js\n ** module id = 9\n ** module chunks = 0\n **/","'use strict';\n\nvar alphabet = require('./alphabet');\nvar encode = require('./encode');\nvar decode = require('./decode');\nvar isValid = require('./is-valid');\n\n// Ignore all milliseconds before a certain time to reduce the size of the date entropy without sacrificing uniqueness.\n// This number should be updated every year or so to keep the generated id short.\n// To regenerate `new Date() - 0` and bump the version. Always bump the version!\nvar REDUCE_TIME = 1459707606518;\n\n// don't change unless we change the algos or REDUCE_TIME\n// must be an integer and less than 16\nvar version = 6;\n\n// if you are using cluster or multiple servers use this to make each instance\n// has a unique value for worker\n// Note: I don't know if this is automatically set when using third\n// party cluster solutions such as pm2.\nvar clusterWorkerId = require('./util/cluster-worker-id') || 0;\n\n// Counter is used when shortid is called multiple times in one second.\nvar counter;\n\n// Remember the last time shortid was called in case counter is needed.\nvar previousSeconds;\n\n/**\n * Generate unique id\n * Returns string id\n */\nfunction generate() {\n\n var str = '';\n\n var seconds = Math.floor((Date.now() - REDUCE_TIME) * 0.001);\n\n if (seconds === previousSeconds) {\n counter++;\n } else {\n counter = 0;\n previousSeconds = seconds;\n }\n\n str = str + encode(alphabet.lookup, version);\n str = str + encode(alphabet.lookup, clusterWorkerId);\n if (counter > 0) {\n str = str + encode(alphabet.lookup, counter);\n }\n str = str + encode(alphabet.lookup, seconds);\n\n return str;\n}\n\n\n/**\n * Set the seed.\n * Highly recommended if you don't want people to try to figure out your id schema.\n * exposed as shortid.seed(int)\n * @param seed Integer value to seed the random alphabet. ALWAYS USE THE SAME SEED or you might get overlaps.\n */\nfunction seed(seedValue) {\n alphabet.seed(seedValue);\n return module.exports;\n}\n\n/**\n * Set the cluster worker or machine id\n * exposed as shortid.worker(int)\n * @param workerId worker must be positive integer. Number less than 16 is recommended.\n * returns shortid module so it can be chained.\n */\nfunction worker(workerId) {\n clusterWorkerId = workerId;\n return module.exports;\n}\n\n/**\n *\n * sets new characters to use in the alphabet\n * returns the shuffled alphabet\n */\nfunction characters(newCharacters) {\n if (newCharacters !== undefined) {\n alphabet.characters(newCharacters);\n }\n\n return alphabet.shuffled();\n}\n\n\n// Export all other functions as properties of the generate function\nmodule.exports = generate;\nmodule.exports.generate = generate;\nmodule.exports.seed = seed;\nmodule.exports.worker = worker;\nmodule.exports.characters = characters;\nmodule.exports.decode = decode;\nmodule.exports.isValid = isValid;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/index.js\n ** module id = 10\n ** module chunks = 0\n **/","'use strict';\n\nvar randomFromSeed = require('./random/random-from-seed');\n\nvar ORIGINAL = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-';\nvar alphabet;\nvar previousSeed;\n\nvar shuffled;\n\nfunction reset() {\n shuffled = false;\n}\n\nfunction setCharacters(_alphabet_) {\n if (!_alphabet_) {\n if (alphabet !== ORIGINAL) {\n alphabet = ORIGINAL;\n reset();\n }\n return;\n }\n\n if (_alphabet_ === alphabet) {\n return;\n }\n\n if (_alphabet_.length !== ORIGINAL.length) {\n throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. You submitted ' + _alphabet_.length + ' characters: ' + _alphabet_);\n }\n\n var unique = _alphabet_.split('').filter(function(item, ind, arr){\n return ind !== arr.lastIndexOf(item);\n });\n\n if (unique.length) {\n throw new Error('Custom alphabet for shortid must be ' + ORIGINAL.length + ' unique characters. These characters were not unique: ' + unique.join(', '));\n }\n\n alphabet = _alphabet_;\n reset();\n}\n\nfunction characters(_alphabet_) {\n setCharacters(_alphabet_);\n return alphabet;\n}\n\nfunction setSeed(seed) {\n randomFromSeed.seed(seed);\n if (previousSeed !== seed) {\n reset();\n previousSeed = seed;\n }\n}\n\nfunction shuffle() {\n if (!alphabet) {\n setCharacters(ORIGINAL);\n }\n\n var sourceArray = alphabet.split('');\n var targetArray = [];\n var r = randomFromSeed.nextValue();\n var characterIndex;\n\n while (sourceArray.length > 0) {\n r = randomFromSeed.nextValue();\n characterIndex = Math.floor(r * sourceArray.length);\n targetArray.push(sourceArray.splice(characterIndex, 1)[0]);\n }\n return targetArray.join('');\n}\n\nfunction getShuffled() {\n if (shuffled) {\n return shuffled;\n }\n shuffled = shuffle();\n return shuffled;\n}\n\n/**\n * lookup shuffled letter\n * @param index\n * @returns {string}\n */\nfunction lookup(index) {\n var alphabetShuffled = getShuffled();\n return alphabetShuffled[index];\n}\n\nmodule.exports = {\n characters: characters,\n seed: setSeed,\n lookup: lookup,\n shuffled: getShuffled\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/alphabet.js\n ** module id = 11\n ** module chunks = 0\n **/","'use strict';\n\n// Found this seed-based random generator somewhere\n// Based on The Central Randomizer 1.3 (C) 1997 by Paul Houle (houle@msc.cornell.edu)\n\nvar seed = 1;\n\n/**\n * return a random number based on a seed\n * @param seed\n * @returns {number}\n */\nfunction getNextValue() {\n seed = (seed * 9301 + 49297) % 233280;\n return seed/(233280.0);\n}\n\nfunction setSeed(_seed_) {\n seed = _seed_;\n}\n\nmodule.exports = {\n nextValue: getNextValue,\n seed: setSeed\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/random/random-from-seed.js\n ** module id = 12\n ** module chunks = 0\n **/","'use strict';\n\nvar randomByte = require('./random/random-byte');\n\nfunction encode(lookup, number) {\n var loopCounter = 0;\n var done;\n\n var str = '';\n\n while (!done) {\n str = str + lookup( ( (number >> (4 * loopCounter)) & 0x0f ) | randomByte() );\n done = number < (Math.pow(16, loopCounter + 1 ) );\n loopCounter++;\n }\n return str;\n}\n\nmodule.exports = encode;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/encode.js\n ** module id = 13\n ** module chunks = 0\n **/","'use strict';\n\nvar crypto = typeof window === 'object' && (window.crypto || window.msCrypto); // IE 11 uses window.msCrypto\n\nfunction randomByte() {\n if (!crypto || !crypto.getRandomValues) {\n return Math.floor(Math.random() * 256) & 0x30;\n }\n var dest = new Uint8Array(1);\n crypto.getRandomValues(dest);\n return dest[0] & 0x30;\n}\n\nmodule.exports = randomByte;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/random/random-byte-browser.js\n ** module id = 14\n ** module chunks = 0\n **/","'use strict';\nvar alphabet = require('./alphabet');\n\n/**\n * Decode the id to get the version and worker\n * Mainly for debugging and testing.\n * @param id - the shortid-generated id.\n */\nfunction decode(id) {\n var characters = alphabet.shuffled();\n return {\n version: characters.indexOf(id.substr(0, 1)) & 0x0f,\n worker: characters.indexOf(id.substr(1, 1)) & 0x0f\n };\n}\n\nmodule.exports = decode;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/decode.js\n ** module id = 15\n ** module chunks = 0\n **/","'use strict';\nvar alphabet = require('./alphabet');\n\nfunction isShortId(id) {\n if (!id || typeof id !== 'string' || id.length < 6 ) {\n return false;\n }\n\n var characters = alphabet.characters();\n var len = id.length;\n for(var i = 0; i < len;i++) {\n if (characters.indexOf(id[i]) === -1) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isShortId;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/is-valid.js\n ** module id = 16\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = 0;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/shortid/lib/util/cluster-worker-id-browser.js\n ** module id = 17\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_18__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"THREE\"\n ** module id = 18\n ** module chunks = 0\n **/","import THREE from 'three';\n\n// This can be imported from anywhere and will still reference the same scene,\n// though there is a helper reference in Engine.scene\n\nexport default (function() {\n var scene = new THREE.Scene();\n\n // TODO: Re-enable when this works with the skybox\n // scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n return scene;\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Scene.js\n **/","// jscs:disable\n/* eslint-disable */\n\n/**\n * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n * @author mrdoob / http://mrdoob.com/\n */\n\nimport THREE from 'three';\n\nvar CSS3DObject = function ( element ) {\n\n\tTHREE.Object3D.call( this );\n\n\tthis.element = element;\n\tthis.element.style.position = 'absolute';\n\n\tthis.addEventListener( 'removed', function ( event ) {\n\n\t\tif ( this.element.parentNode !== null ) {\n\n\t\t\tthis.element.parentNode.removeChild( this.element );\n\n\t\t}\n\n\t} );\n\n};\n\nCSS3DObject.prototype = Object.create( THREE.Object3D.prototype );\nCSS3DObject.prototype.constructor = CSS3DObject;\n\nvar CSS3DSprite = function ( element ) {\n\n\tCSS3DObject.call( this, element );\n\n};\n\nCSS3DSprite.prototype = Object.create( CSS3DObject.prototype );\nCSS3DSprite.prototype.constructor = CSS3DSprite;\n\n//\n\nvar CSS3DRenderer = function () {\n\n\tconsole.log( 'THREE.CSS3DRenderer', THREE.REVISION );\n\n\tvar _width, _height;\n\tvar _widthHalf, _heightHalf;\n\n\tvar matrix = new THREE.Matrix4();\n\n\tvar cache = {\n\t\tcamera: { fov: 0, style: '' },\n\t\tobjects: {}\n\t};\n\n\tvar domElement = document.createElement( 'div' );\n\tdomElement.style.overflow = 'hidden';\n\n\tdomElement.style.WebkitTransformStyle = 'preserve-3d';\n\tdomElement.style.MozTransformStyle = 'preserve-3d';\n\tdomElement.style.oTransformStyle = 'preserve-3d';\n\tdomElement.style.transformStyle = 'preserve-3d';\n\n\tthis.domElement = domElement;\n\n\tvar cameraElement = document.createElement( 'div' );\n\n\tcameraElement.style.WebkitTransformStyle = 'preserve-3d';\n\tcameraElement.style.MozTransformStyle = 'preserve-3d';\n\tcameraElement.style.oTransformStyle = 'preserve-3d';\n\tcameraElement.style.transformStyle = 'preserve-3d';\n\n\tdomElement.appendChild( cameraElement );\n\n\tthis.setClearColor = function () {};\n\n\tthis.getSize = function() {\n\n\t\treturn {\n\t\t\twidth: _width,\n\t\t\theight: _height\n\t\t};\n\n\t};\n\n\tthis.setSize = function ( width, height ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_widthHalf = _width / 2;\n\t\t_heightHalf = _height / 2;\n\n\t\tdomElement.style.width = width + 'px';\n\t\tdomElement.style.height = height + 'px';\n\n\t\tcameraElement.style.width = width + 'px';\n\t\tcameraElement.style.height = height + 'px';\n\n\t};\n\n\tvar epsilon = function ( value ) {\n\n\t\treturn Math.abs( value ) < Number.EPSILON ? 0 : value;\n\n\t};\n\n\tvar getCameraCSSMatrix = function ( matrix ) {\n\n\t\tvar elements = matrix.elements;\n\n\t\treturn 'matrix3d(' +\n\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\tepsilon( - elements[ 1 ] ) + ',' +\n\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\tepsilon( elements[ 4 ] ) + ',' +\n\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\tepsilon( elements[ 6 ] ) + ',' +\n\t\t\tepsilon( elements[ 7 ] ) + ',' +\n\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\tepsilon( - elements[ 9 ] ) + ',' +\n\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\tepsilon( - elements[ 13 ] ) + ',' +\n\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\tepsilon( elements[ 15 ] ) +\n\t\t')';\n\n\t};\n\n\tvar getObjectCSSMatrix = function ( matrix ) {\n\n\t\tvar elements = matrix.elements;\n\n\t\treturn 'translate3d(-50%,-50%,0) matrix3d(' +\n\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\tepsilon( elements[ 1 ] ) + ',' +\n\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\tepsilon( - elements[ 4 ] ) + ',' +\n\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\tepsilon( - elements[ 6 ] ) + ',' +\n\t\t\tepsilon( - elements[ 7 ] ) + ',' +\n\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\tepsilon( elements[ 9 ] ) + ',' +\n\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\tepsilon( elements[ 13 ] ) + ',' +\n\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\tepsilon( elements[ 15 ] ) +\n\t\t')';\n\n\t};\n\n\tvar renderObject = function ( object, camera ) {\n\n\t\tif ( object instanceof CSS3DObject ) {\n\n\t\t\tvar style;\n\n\t\t\tif ( object instanceof CSS3DSprite ) {\n\n\t\t\t\t// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n\t\t\t\tmatrix.copy( camera.matrixWorldInverse );\n\t\t\t\tmatrix.transpose();\n\t\t\t\tmatrix.copyPosition( object.matrixWorld );\n\t\t\t\tmatrix.scale( object.scale );\n\n\t\t\t\tmatrix.elements[ 3 ] = 0;\n\t\t\t\tmatrix.elements[ 7 ] = 0;\n\t\t\t\tmatrix.elements[ 11 ] = 0;\n\t\t\t\tmatrix.elements[ 15 ] = 1;\n\n\t\t\t\tstyle = getObjectCSSMatrix( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tstyle = getObjectCSSMatrix( object.matrixWorld );\n\n\t\t\t}\n\n\t\t\tvar element = object.element;\n\t\t\tvar cachedStyle = cache.objects[ object.id ];\n\n\t\t\tif ( cachedStyle === undefined || cachedStyle !== style ) {\n\n\t\t\t\telement.style.WebkitTransform = style;\n\t\t\t\telement.style.MozTransform = style;\n\t\t\t\telement.style.oTransform = style;\n\t\t\t\telement.style.transform = style;\n\n\t\t\t\tcache.objects[ object.id ] = style;\n\n\t\t\t}\n\n\t\t\tif ( element.parentNode !== cameraElement ) {\n\n\t\t\t\tcameraElement.appendChild( element );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( object.children[ i ], camera );\n\n\t\t}\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tvar fov = 0.5 / Math.tan( THREE.Math.degToRad( camera.fov * 0.5 ) ) * _height;\n\n\t\tif ( cache.camera.fov !== fov ) {\n\n\t\t\tdomElement.style.WebkitPerspective = fov + 'px';\n\t\t\tdomElement.style.MozPerspective = fov + 'px';\n\t\t\tdomElement.style.oPerspective = fov + 'px';\n\t\t\tdomElement.style.perspective = fov + 'px';\n\n\t\t\tcache.camera.fov = fov;\n\n\t\t}\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\tvar style = 'translate3d(0,0,' + fov + 'px)' + getCameraCSSMatrix( camera.matrixWorldInverse ) +\n\t\t\t' translate3d(' + _widthHalf + 'px,' + _heightHalf + 'px, 0)';\n\n\t\tif ( cache.camera.style !== style ) {\n\n\t\t\tcameraElement.style.WebkitTransform = style;\n\t\t\tcameraElement.style.MozTransform = style;\n\t\t\tcameraElement.style.oTransform = style;\n\t\t\tcameraElement.style.transform = style;\n\n\t\t\tcache.camera.style = style;\n\n\t\t}\n\n\t\trenderObject( scene, camera );\n\n\t};\n\n};\n\nexport {CSS3DObject as CSS3DObject};\nexport {CSS3DSprite as CSS3DSprite};\nexport {CSS3DRenderer as CSS3DRenderer};\n\nTHREE.CSS3DObject = CSS3DObject;\nTHREE.CSS3DSprite = CSS3DSprite;\nTHREE.CSS3DRenderer = CSS3DRenderer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/CSS3DRenderer.js\n **/","// jscs:disable\n/* eslint-disable */\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nimport THREE from 'three';\n\nvar CSS2DObject = function ( element ) {\n\n\tTHREE.Object3D.call( this );\n\n\tthis.element = element;\n\tthis.element.style.position = 'absolute';\n\n\tthis.addEventListener( 'removed', function ( event ) {\n\n\t\tif ( this.element.parentNode !== null ) {\n\n\t\t\tthis.element.parentNode.removeChild( this.element );\n\n\t\t}\n\n\t} );\n\n};\n\nCSS2DObject.prototype = Object.create( THREE.Object3D.prototype );\nCSS2DObject.prototype.constructor = CSS2DObject;\n\n//\n\nvar CSS2DRenderer = function () {\n\n\tconsole.log( 'THREE.CSS2DRenderer', THREE.REVISION );\n\n\tvar _width, _height;\n\tvar _widthHalf, _heightHalf;\n\n\tvar vector = new THREE.Vector3();\n\tvar viewMatrix = new THREE.Matrix4();\n\tvar viewProjectionMatrix = new THREE.Matrix4();\n\n\tvar frustum = new THREE.Frustum();\n\n\tvar domElement = document.createElement( 'div' );\n\tdomElement.style.overflow = 'hidden';\n\n\tthis.domElement = domElement;\n\n\tthis.setSize = function ( width, height ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_widthHalf = _width / 2;\n\t\t_heightHalf = _height / 2;\n\n\t\tdomElement.style.width = width + 'px';\n\t\tdomElement.style.height = height + 'px';\n\n\t};\n\n\tvar renderObject = function ( object, camera ) {\n\n\t\tif ( object instanceof CSS2DObject ) {\n\n\t\t\tvector.setFromMatrixPosition( object.matrixWorld );\n\t\t\tvector.applyProjection( viewProjectionMatrix );\n\n\t\t\tvar element = object.element;\n\t\t\tvar style = 'translate(-50%,-50%) translate(' + ( vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\telement.style.WebkitTransform = style;\n\t\t\telement.style.MozTransform = style;\n\t\t\telement.style.oTransform = style;\n\t\t\telement.style.transform = style;\n\n\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t}\n\n\t\t\t// Hide if outside view frustum\n\t\t\tif (!frustum.containsPoint(object.position)) {\n\t\t\t\telement.style.display = 'none';\n\t\t\t} else {\n\t\t\t\telement.style.display = 'block';\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( object.children[ i ], camera );\n\n\t\t}\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\tviewMatrix.copy( camera.matrixWorldInverse.getInverse( camera.matrixWorld ) );\n\t\tviewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, viewMatrix );\n\n\t\tfrustum.setFromMatrix( new THREE.Matrix4().multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ) );\n\n\t\trenderObject( scene, camera );\n\n\t};\n\n};\n\nexport {CSS2DObject as CSS2DObject};\nexport {CSS2DRenderer as CSS2DRenderer};\n\nTHREE.CSS2DObject = CSS2DObject;\nTHREE.CSS2DRenderer = CSS2DRenderer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/CSS2DRenderer.js\n **/","import Layer from './Layer';\nimport extend from 'lodash.assign';\nimport reqwest from 'reqwest';\nimport GeoJSON from '../util/GeoJSON';\nimport Worker from '../util/Worker';\nimport Buffer from '../util/Buffer';\nimport Stringify from '../util/Stringify';\nimport PolygonLayer from './geometry/PolygonLayer';\nimport PolylineLayer from './geometry/PolylineLayer';\nimport PointLayer from './geometry/PointLayer';\nimport {latLon as LatLon} from '../geo/LatLon';\nimport {point as Point} from '../geo/Point';\nimport Geo from '../geo/Geo';\nimport PickingMaterial from '../engine/PickingMaterial';\n\n// TODO: Allow filter method to be run inside a worker to improve performance\n// TODO: Allow onEachFeature method to be run inside a worker to improve performance\n\nclass GeoJSONWorkerLayer extends Layer {\n constructor(geojson, options) {\n var defaults = {\n topojson: false,\n style: GeoJSON.defaultStyle,\n onEachFeature: null,\n onEachFeatureWorker: null,\n onAddAttributes: null,\n interactive: false,\n pointGeometry: null,\n onClick: null,\n headers: {}\n };\n\n var _options = extend({}, defaults, options);\n\n if (typeof options.style === 'object') {\n _options.style = extend({}, defaults.style, options.style);\n }\n\n super(_options);\n\n this._aborted = false;\n this._geojson = geojson;\n }\n\n _onAdd(world) {\n if (this._options.interactive) {\n // Worker layer always controls output to add a picking mesh\n this._pickingMesh = new THREE.Object3D();\n }\n\n // Process GeoJSON\n return this._process(this._geojson);\n }\n\n // Use workers to request and process GeoJSON, returning data structure\n // containing geometry and any supplementary data for output\n _process(_geojson) {\n return new Promise((resolve, reject) => {\n var style = this._options.style;\n\n // TODO: Convert to buffer and use transferrable objects\n if (typeof this._options.style === 'function') {\n style = Stringify.functionToString(this._options.style);\n }\n\n var pointGeometry = this._options.pointGeometry;\n\n // TODO: Convert to buffer and use transferrable objects\n if (typeof this._options.pointGeometry === 'function') {\n pointGeometry = Stringify.functionToString(this._options.pointGeometry);\n }\n\n var geojson = _geojson;\n var transferrables = [];\n\n if (typeof geojson !== 'string') {\n this._geojson = geojson = Buffer.stringToUint8Array(JSON.stringify(geojson));\n transferrables.push(geojson.buffer);\n this._execWorker(geojson, this._options.topojson, this._world._originPoint, style, this._options.interactive, pointGeometry, transferrables).then(() => {\n resolve();\n }).catch(reject);\n } else if (typeof this._options.filter === 'function' || typeof this._options.onEachFeature === 'function') {\n GeoJSONWorkerLayer.RequestGeoJSON(geojson).then((res) => {\n // if (this._aborted) {\n // resolve();\n // return;\n // }\n\n var fc = GeoJSON.collectFeatures(res, this._options.topojson);\n var features = fc.features;\n\n // Run filter, if provided\n if (this._options.filter) {\n fc.features = features.filter(this._options.filter);\n }\n\n if (this._options.onEachFeature) {\n var feature;\n for (var i = 0; i < features.length; i++) {\n feature = features[i];\n this._options.onEachFeature(feature);\n };\n }\n\n this._geojson = geojson = Buffer.stringToUint8Array(JSON.stringify(fc));\n transferrables.push(geojson.buffer);\n\n this._execWorker(geojson, false, this._options.headers, this._world._originPoint, style, this._options.interactive, pointGeometry, transferrables).then(() => {\n resolve();\n }).catch(reject);\n });\n } else {\n this._execWorker(geojson, this._options.topojson, this._options.headers, this._world._originPoint, style, this._options.interactive, pointGeometry, transferrables).then(() => {\n resolve();\n }).catch(reject);\n }\n });\n }\n\n _execWorker(geojson, topojson, headers, originPoint, style, interactive, pointGeometry, transferrables) {\n return new Promise((resolve, reject) => {\n console.time('Worker round trip');\n\n Worker.exec('GeoJSONWorkerLayer.Process', [geojson, topojson, headers, originPoint, style, interactive, pointGeometry], transferrables).then((results) => {\n console.timeEnd('Worker round trip');\n\n // if (this._aborted) {\n // resolve();\n // return;\n // }\n\n var processPromises = [];\n\n if (results.polygons) {\n processPromises.push(this._processPolygonResults(results.polygons));\n }\n\n if (results.polylines) {\n processPromises.push(this._processPolylineResults(results.polylines));\n }\n\n if (results.points) {\n processPromises.push(this._processPointResults(results.points));\n }\n\n if (processPromises.length > 0) {\n Promise.all(processPromises).then(() => {\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n });\n });\n }\n\n // TODO: Dedupe with polyline method\n _processPolygonResults(results) {\n return new Promise((resolve, reject) => {\n var splitPositions = Buffer.splitFloat32Array(results.attributes.positions);\n var splitNormals = Buffer.splitFloat32Array(results.attributes.normals);\n var splitColors = Buffer.splitFloat32Array(results.attributes.colors);\n var splitTops = Buffer.splitFloat32Array(results.attributes.tops);\n\n var splitOutlinePositions;\n var splitOutlineColors;\n\n if (results.outlineAttributes) {\n splitOutlinePositions = Buffer.splitFloat32Array(results.outlineAttributes.positions);\n splitOutlineColors = Buffer.splitFloat32Array(results.outlineAttributes.colors);\n }\n\n var splitProperties;\n if (results.properties) {\n splitProperties = Buffer.splitUint8Array(results.properties);\n }\n\n var flats = results.flats;\n\n var objects = [];\n var outlineObjects = [];\n\n var obj;\n var pickingId;\n var pickingIds;\n var properties;\n\n var polygonAttributeLengths = {\n positions: 3,\n normals: 3,\n colors: 3,\n tops: 1\n };\n\n var polygonOutlineAttributeLengths = {\n positions: 3,\n colors: 3\n };\n\n for (var i = 0; i < splitPositions.length; i++) {\n if (splitProperties && splitProperties[i]) {\n properties = JSON.parse(Buffer.uint8ArrayToString(splitProperties[i]));\n } else {\n properties = {};\n }\n\n // WORKERS: obj.attributes should actually an array of polygons for\n // the feature, though the current logic isn't aware of that\n obj = {\n attributes: [{\n positions: splitPositions[i],\n normals: splitNormals[i],\n colors: splitColors[i],\n tops: splitTops[i]\n }],\n properties: properties,\n flat: flats[i]\n };\n\n // WORKERS: If interactive, generate unique ID for each feature, create\n // the buffer attributes and set up event listeners\n if (this._options.interactive) {\n pickingId = this.getPickingId();\n\n pickingIds = new Float32Array(splitPositions[i].length / 3);\n pickingIds.fill(pickingId);\n\n obj.attributes[0].pickingIds = pickingIds;\n\n polygonAttributeLengths.pickingIds = 1;\n\n this._addPicking(pickingId, properties);\n }\n\n // TODO: Make this specific to polygon attributes\n if (typeof this._options.onAddAttributes === 'function') {\n var customAttributes = this._options.onAddAttributes(obj.attributes[0], properties);\n var customAttribute;\n for (var key in customAttributes) {\n customAttribute = customAttributes[key];\n obj.attributes[0][key] = customAttribute.value;\n polygonAttributeLengths[key] = customAttribute.length;\n }\n }\n\n objects.push(obj);\n }\n\n for (var i = 0; i < splitOutlinePositions.length; i++) {\n obj = {\n attributes: [{\n positions: splitOutlinePositions[i],\n colors: splitOutlineColors[i]\n }],\n flat: true\n };\n\n outlineObjects.push(obj);\n }\n\n var polygonAttributes = [];\n var polygonOutlineAttributes = [];\n\n var polygonFlat = true;\n\n for (var i = 0; i < objects.length; i++) {\n obj = objects[i];\n\n // TODO: Work out why obj.flat is rarely set to something other than\n // true or false. Potentially undefined.\n if (polygonFlat && obj.flat === false) {\n polygonFlat = false;\n }\n\n var bufferAttributes = Buffer.mergeAttributes(obj.attributes);\n polygonAttributes.push(bufferAttributes);\n };\n\n for (var i = 0; i < outlineObjects.length; i++) {\n obj = outlineObjects[i];\n\n var bufferAttributes = Buffer.mergeAttributes(obj.attributes);\n polygonOutlineAttributes.push(bufferAttributes);\n };\n\n var outputPromises = [];\n\n var style;\n\n if (polygonAttributes.length > 0) {\n var mergedPolygonAttributes = Buffer.mergeAttributes(polygonAttributes);\n\n // TODO: Make this work when style is a function per feature\n style = (typeof this._options.style === 'function') ? this._options.style(objects[0]) : this._options.style;\n style = extend({}, GeoJSON.defaultStyle, style);\n\n outputPromises.push(this._setPolygonMesh(mergedPolygonAttributes, polygonAttributeLengths, style, polygonFlat));\n }\n\n if (polygonOutlineAttributes.length > 0) {\n var mergedPolygonOutlineAttributes = Buffer.mergeAttributes(polygonOutlineAttributes);\n\n style = (typeof this._options.style === 'function') ? this._options.style(objects[0]) : this._options.style;\n style = extend({}, GeoJSON.defaultStyle, style);\n\n if (style.outlineRenderOrder !== undefined) {\n style.lineRenderOrder = style.outlineRenderOrder;\n } else {\n style.lineRenderOrder = (style.renderOrder) ? style.renderOrder + 1 : 4;\n }\n\n if (style.outlineWidth) {\n style.lineWidth = style.outlineWidth;\n }\n\n outputPromises.push(this._setPolylineMesh(mergedPolygonOutlineAttributes, polygonOutlineAttributeLengths, style, true));\n }\n\n Promise.all(outputPromises).then((results) => {\n var [polygonResult, outlineResult] = results;\n\n if (polygonResult) {\n this._polygonMesh = polygonResult.mesh;\n this.add(this._polygonMesh);\n\n if (polygonResult.pickingMesh) {\n this._pickingMesh.add(polygonResult.pickingMesh);\n }\n }\n\n if (outlineResult) {\n this.add(outlineResult.mesh);\n }\n\n resolve();\n }).catch(reject);\n });\n }\n\n // TODO: Dedupe with polygon method\n _processPolylineResults(results) {\n return new Promise((resolve, reject) => {\n var splitPositions = Buffer.splitFloat32Array(results.attributes.positions);\n var splitColors = Buffer.splitFloat32Array(results.attributes.colors);\n\n var splitProperties;\n if (results.properties) {\n splitProperties = Buffer.splitUint8Array(results.properties);\n }\n\n var flats = results.flats;\n\n var objects = [];\n var obj;\n var pickingId;\n var pickingIds;\n var properties;\n\n var polylineAttributeLengths = {\n positions: 3,\n colors: 3\n };\n\n for (var i = 0; i < splitPositions.length; i++) {\n if (splitProperties && splitProperties[i]) {\n properties = JSON.parse(Buffer.uint8ArrayToString(splitProperties[i]));\n } else {\n properties = {};\n }\n\n // WORKERS: obj.attributes should actually an array of polygons for\n // the feature, though the current logic isn't aware of that\n obj = {\n attributes: [{\n positions: splitPositions[i],\n colors: splitColors[i]\n }],\n properties: properties,\n flat: flats[i]\n };\n\n // WORKERS: If interactive, generate unique ID for each feature, create\n // the buffer attributes and set up event listeners\n if (this._options.interactive) {\n pickingId = this.getPickingId();\n\n pickingIds = new Float32Array(splitPositions[i].length / 3);\n pickingIds.fill(pickingId);\n\n obj.attributes[0].pickingIds = pickingIds;\n\n polylineAttributeLengths.pickingIds = 1;\n\n this._addPicking(pickingId, properties);\n }\n\n // TODO: Make this specific to polyline attributes\n if (typeof this._options.onAddAttributes === 'function') {\n var customAttributes = this._options.onAddAttributes(obj.attributes[0], properties);\n var customAttribute;\n for (var key in customAttributes) {\n customAttribute = customAttributes[key];\n obj.attributes[0][key] = customAttribute.value;\n polylineAttributeLengths[key] = customAttribute.length;\n }\n }\n\n objects.push(obj);\n }\n\n var polylineAttributes = [];\n\n var polylineFlat = true;\n\n for (var i = 0; i < objects.length; i++) {\n obj = objects[i];\n\n if (polylineFlat && !obj.flat) {\n polylineFlat = false;\n }\n\n var bufferAttributes = Buffer.mergeAttributes(obj.attributes);\n polylineAttributes.push(bufferAttributes);\n };\n\n if (polylineAttributes.length > 0) {\n var mergedPolylineAttributes = Buffer.mergeAttributes(polylineAttributes);\n\n // TODO: Make this work when style is a function per feature\n var style = (typeof this._options.style === 'function') ? this._options.style(objects[0]) : this._options.style;\n style = extend({}, GeoJSON.defaultStyle, style);\n\n this._setPolylineMesh(mergedPolylineAttributes, polylineAttributeLengths, style, polylineFlat).then((result) => {\n this._polylineMesh = result.mesh;\n this.add(this._polylineMesh);\n\n if (result.pickingMesh) {\n this._pickingMesh.add(result.pickingMesh);\n }\n\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n });\n }\n\n _processPointResults(results) {\n return new Promise((resolve, reject) => {\n var splitPositions = Buffer.splitFloat32Array(results.attributes.positions);\n var splitNormals = Buffer.splitFloat32Array(results.attributes.normals);\n var splitColors = Buffer.splitFloat32Array(results.attributes.colors);\n\n var splitProperties;\n if (results.properties) {\n splitProperties = Buffer.splitUint8Array(results.properties);\n }\n\n var flats = results.flats;\n\n var objects = [];\n var obj;\n var pickingId;\n var pickingIds;\n var properties;\n\n var pointAttributeLengths = {\n positions: 3,\n normals: 3,\n colors: 3\n };\n\n for (var i = 0; i < splitPositions.length; i++) {\n if (splitProperties && splitProperties[i]) {\n properties = JSON.parse(Buffer.uint8ArrayToString(splitProperties[i]));\n } else {\n properties = {};\n }\n\n // WORKERS: obj.attributes should actually an array of polygons for\n // the feature, though the current logic isn't aware of that\n obj = {\n attributes: [{\n positions: splitPositions[i],\n normals: splitNormals[i],\n colors: splitColors[i]\n }],\n properties: properties,\n flat: flats[i]\n };\n\n // WORKERS: If interactive, generate unique ID for each feature, create\n // the buffer attributes and set up event listeners\n if (this._options.interactive) {\n pickingId = this.getPickingId();\n\n pickingIds = new Float32Array(splitPositions[i].length / 3);\n pickingIds.fill(pickingId);\n\n obj.attributes[0].pickingIds = pickingIds;\n\n pointAttributeLengths.pickingIds = 1;\n\n this._addPicking(pickingId, properties);\n }\n\n // TODO: Make this specific to polygon attributes\n if (typeof this._options.onAddAttributes === 'function') {\n var customAttributes = this._options.onAddAttributes(obj.attributes[0], properties);\n var customAttribute;\n for (var key in customAttributes) {\n customAttribute = customAttributes[key];\n obj.attributes[0][key] = customAttribute.value;\n pointAttributeLengths[key] = customAttribute.length;\n }\n }\n\n objects.push(obj);\n }\n\n var pointAttributes = [];\n\n var pointFlat = true;\n\n for (var i = 0; i < objects.length; i++) {\n obj = objects[i];\n\n if (pointFlat && !obj.flat) {\n pointFlat = false;\n }\n\n var bufferAttributes = Buffer.mergeAttributes(obj.attributes);\n pointAttributes.push(bufferAttributes);\n };\n\n if (pointAttributes.length > 0) {\n var mergedPointAttributes = Buffer.mergeAttributes(pointAttributes);\n\n // TODO: Make this work when style is a function per feature\n var style = (typeof this._options.style === 'function') ? this._options.style(objects[0]) : this._options.style;\n style = extend({}, GeoJSON.defaultStyle, style);\n\n this._setPointMesh(mergedPointAttributes, pointAttributeLengths, style, pointFlat).then((result) => {\n this._pointMesh = result.mesh;\n this.add(this._pointMesh);\n\n if (result.pickingMesh) {\n this._pickingMesh.add(result.pickingMesh);\n }\n\n resolve();\n }).catch(reject);\n } else {\n resolve();\n }\n });\n }\n\n // TODO: At some point this needs to return all the features to the main thread\n // so it can generate meshes and output to the scene, as well as perhaps creating\n // individual layers / components for each feature to track things like picking\n // and properties\n //\n // TODO: Find a way so the origin point isn't needed to be passed in as it\n // feels a bit messy and against the idea of a static Geo class\n //\n // TODO: Support passing custom geometry for point layers\n static Process(geojson, topojson, headers, originPoint, _style, _properties, _pointGeometry) {\n return new Promise((resolve, reject) => {\n GeoJSONWorkerLayer.ProcessGeoJSON(geojson, headers).then((res) => {\n // Collects features into a single FeatureCollection\n //\n // Also converts TopoJSON to GeoJSON if instructed\n var geojson = GeoJSON.collectFeatures(res, topojson);\n\n // TODO: Check that GeoJSON is valid / usable\n\n var features = geojson.features;\n\n // TODO: Run filter, if provided (must be static)\n\n var pointScale;\n var polygons = [];\n var polylines = [];\n var points = [];\n\n // Deserialise style function if provided\n if (typeof _style === 'string') {\n _style = Stringify.stringToFunction(_style);\n }\n\n // Assume that a style won't be set per feature\n var style = _style;\n\n var pointGeometry;\n // Deserialise pointGeometry function if provided\n if (typeof _pointGeometry === 'string') {\n pointGeometry = Stringify.stringToFunction(_pointGeometry);\n }\n\n var feature;\n for (var i = 0; i < features.length; i++) {\n feature = features[i];\n\n var geometry = feature.geometry;\n var coordinates = (geometry.coordinates) ? geometry.coordinates : null;\n\n if (!coordinates || !geometry) {\n return;\n }\n\n // Get per-feature style object, if provided\n if (typeof _style === 'function') {\n style = extend({}, GeoJSON.defaultStyle, _style(feature));\n // console.log(feature, style);\n }\n\n if (geometry.type === 'Polygon' || geometry.type === 'MultiPolygon') {\n coordinates = (PolygonLayer.isSingle(coordinates)) ? [coordinates] : coordinates;\n\n var converted = coordinates.map(_coordinates => {\n return _coordinates.map(ring => {\n return ring.map(coordinate => {\n return LatLon(coordinate[1], coordinate[0]);\n });\n });\n });\n\n var point;\n var projected = converted.map((_coordinates) => {\n return _coordinates.map((ring) => {\n return ring.map((latlon) => {\n point = Geo.latLonToPoint(latlon)._subtract(originPoint);\n\n if (!pointScale) {\n pointScale = Geo.pointScale(latlon);\n }\n\n return point;\n });\n });\n });\n\n var polygon = {\n projected: projected,\n options: {\n pointScale: pointScale,\n style: style\n }\n };\n\n if (_properties) {\n polygon.properties = feature.properties;\n }\n\n polygons.push(polygon);\n }\n\n if (geometry.type === 'LineString' || geometry.type === 'MultiLineString') {\n coordinates = (PolylineLayer.isSingle(coordinates)) ? [coordinates] : coordinates;\n\n var converted = coordinates.map(_coordinates => {\n return _coordinates.map(coordinate => {\n return LatLon(coordinate[1], coordinate[0]);\n });\n });\n\n var point;\n var projected = converted.map((_coordinates) => {\n return _coordinates.map((latlon) => {\n point = Geo.latLonToPoint(latlon)._subtract(originPoint);\n\n if (!pointScale) {\n pointScale = Geo.pointScale(latlon);\n }\n\n return point;\n });\n });\n\n var polyline = {\n projected: projected,\n options: {\n pointScale: pointScale,\n style: style\n }\n };\n\n if (_properties) {\n polyline.properties = feature.properties;\n }\n\n polylines.push(polyline);\n }\n\n if (geometry.type === 'Point' || geometry.type === 'MultiPoint') {\n coordinates = (PointLayer.isSingle(coordinates)) ? [coordinates] : coordinates;\n\n var converted = coordinates.map(coordinate => {\n return LatLon(coordinate[1], coordinate[0]);\n });\n\n var point;\n var projected = converted.map((latlon) => {\n point = Geo.latLonToPoint(latlon)._subtract(originPoint);\n\n if (!pointScale) {\n pointScale = Geo.pointScale(latlon);\n }\n\n return point;\n });\n\n var point = {\n projected: projected,\n options: {\n pointGeometry: pointGeometry(feature),\n pointScale: pointScale,\n style: style\n }\n };\n\n if (_properties) {\n point.properties = feature.properties;\n }\n\n points.push(point);\n }\n };\n\n var polygonBufferPromises = [];\n var polylineBufferPromises = [];\n var pointBufferPromises = [];\n\n var polygon;\n for (var i = 0; i < polygons.length; i++) {\n polygon = polygons[i];\n polygonBufferPromises.push(PolygonLayer.SetBufferAttributes(polygon.projected, polygon.options));\n };\n\n var polyline;\n for (var i = 0; i < polylines.length; i++) {\n polyline = polylines[i];\n polylineBufferPromises.push(PolylineLayer.SetBufferAttributes(polyline.projected, polyline.options));\n };\n\n var point;\n for (var i = 0; i < points.length; i++) {\n point = points[i];\n pointBufferPromises.push(PointLayer.SetBufferAttributes(point.projected, point.options));\n };\n\n var data = {};\n var transferrables = [];\n\n // TODO: Make this work with polylines too\n // TODO: Make this so it's not a nest of promises\n GeoJSONWorkerLayer.ProcessPolygons(polygonBufferPromises, polygons, _properties).then((result) => {\n data.polygons = result.data;\n transferrables = transferrables.concat(result.transferrables);\n\n GeoJSONWorkerLayer.ProcessPolylines(polylineBufferPromises, polylines, _properties).then((result) => {\n data.polylines = result.data;\n transferrables = transferrables.concat(result.transferrables);\n\n GeoJSONWorkerLayer.ProcessPoints(pointBufferPromises, points, _properties).then((result) => {\n data.points = result.data;\n transferrables = transferrables.concat(result.transferrables);\n\n resolve({\n data: data,\n transferrables: transferrables\n });\n });\n });\n });\n });\n });\n }\n\n static ProcessPolygons(polygonPromises, polygons, _properties) {\n return new Promise((resolve, reject) => {\n Promise.all(polygonPromises).then((results) => {\n var transferrables = [];\n\n var positions = [];\n var normals = [];\n var colors = [];\n var tops = [];\n\n var outlinePositions = [];\n var outlineColors = [];\n\n var properties = [];\n\n var flats = [];\n var polygon;\n\n var result;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n polygon = polygons[i];\n\n // WORKERS: Making this a typed array will speed up transfer time\n // As things stand this adds on a few milliseconds\n flats.push(result.flat);\n\n // WORKERS: result.attributes is actually an array of polygons for each\n // feature, though the current logic isn't keeping these all together\n\n var attributes;\n for (var j = 0; j < result.attributes.length; j++) {\n attributes = result.attributes[j];\n\n positions.push(attributes.positions);\n normals.push(attributes.normals);\n colors.push(attributes.colors);\n tops.push(attributes.tops);\n\n if (_properties) {\n properties.push(Buffer.stringToUint8Array(JSON.stringify(polygon.properties)));\n }\n };\n\n var outlineAttributes;\n for (var j = 0; j < result.outlineAttributes.length; j++) {\n outlineAttributes = result.outlineAttributes[j];\n\n outlinePositions.push(outlineAttributes.positions);\n outlineColors.push(outlineAttributes.colors);\n };\n };\n\n var mergedAttributes = {\n positions: Buffer.mergeFloat32Arrays(positions),\n normals: Buffer.mergeFloat32Arrays(normals),\n colors: Buffer.mergeFloat32Arrays(colors),\n tops: Buffer.mergeFloat32Arrays(tops)\n };\n\n var mergedOutlineAttributes = {\n positions: Buffer.mergeFloat32Arrays(outlinePositions),\n colors: Buffer.mergeFloat32Arrays(outlineColors)\n };\n\n transferrables.push(mergedAttributes.positions[0].buffer);\n transferrables.push(mergedAttributes.positions[1].buffer);\n\n transferrables.push(mergedAttributes.normals[0].buffer);\n transferrables.push(mergedAttributes.normals[1].buffer);\n\n transferrables.push(mergedAttributes.colors[0].buffer);\n transferrables.push(mergedAttributes.colors[1].buffer);\n\n transferrables.push(mergedAttributes.tops[0].buffer);\n transferrables.push(mergedAttributes.tops[1].buffer);\n\n transferrables.push(mergedOutlineAttributes.positions[0].buffer);\n transferrables.push(mergedOutlineAttributes.positions[1].buffer);\n\n transferrables.push(mergedOutlineAttributes.colors[0].buffer);\n transferrables.push(mergedOutlineAttributes.colors[1].buffer);\n\n var mergedProperties;\n if (_properties) {\n mergedProperties = Buffer.mergeUint8Arrays(properties);\n\n transferrables.push(mergedProperties[0].buffer);\n transferrables.push(mergedProperties[1].buffer);\n }\n\n var output = {\n attributes: mergedAttributes,\n outlineAttributes: mergedOutlineAttributes,\n flats: flats\n };\n\n if (_properties) {\n output.properties = mergedProperties;\n }\n\n // TODO: Also return GeoJSON features that can be mapped to objects on\n // the main thread. Allow user to provide filter / toggles to only return\n // properties from the GeoJSON that they need (eg. don't return geometry,\n // or don't return properties.height)\n resolve({\n data: output,\n transferrables: transferrables\n });\n }).catch(reject);\n });\n }\n\n static ProcessPolylines(polylinePromises, polylines, _properties) {\n return new Promise((resolve, reject) => {\n Promise.all(polylinePromises).then((results) => {\n var transferrables = [];\n\n var positions = [];\n var colors = [];\n\n var properties = [];\n\n var flats = [];\n var polyline;\n\n var result;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n polyline = polylines[i];\n\n // WORKERS: Making this a typed array will speed up transfer time\n // As things stand this adds on a few milliseconds\n flats.push(result.flat);\n\n // WORKERS: result.attributes is actually an array of polygons for each\n // feature, though the current logic isn't keeping these all together\n\n var attributes;\n for (var j = 0; j < result.attributes.length; j++) {\n attributes = result.attributes[j];\n\n positions.push(attributes.positions);\n colors.push(attributes.colors);\n\n if (_properties) {\n properties.push(Buffer.stringToUint8Array(JSON.stringify(polyline.properties)));\n }\n };\n };\n\n var mergedAttributes = {\n positions: Buffer.mergeFloat32Arrays(positions),\n colors: Buffer.mergeFloat32Arrays(colors)\n };\n\n transferrables.push(mergedAttributes.positions[0].buffer);\n transferrables.push(mergedAttributes.positions[1].buffer);\n\n transferrables.push(mergedAttributes.colors[0].buffer);\n transferrables.push(mergedAttributes.colors[1].buffer);\n\n var mergedProperties;\n if (_properties) {\n mergedProperties = Buffer.mergeUint8Arrays(properties);\n\n transferrables.push(mergedProperties[0].buffer);\n transferrables.push(mergedProperties[1].buffer);\n }\n\n var output = {\n attributes: mergedAttributes,\n flats: flats\n };\n\n if (_properties) {\n output.properties = mergedProperties;\n }\n\n // TODO: Also return GeoJSON features that can be mapped to objects on\n // the main thread. Allow user to provide filter / toggles to only return\n // properties from the GeoJSON that they need (eg. don't return geometry,\n // or don't return properties.height)\n resolve({\n data: output,\n transferrables: transferrables\n });\n }).catch(reject);\n });\n }\n\n // TODO: Dedupe with ProcessPolygons as they are identical\n static ProcessPoints(pointPromises, points, _properties) {\n return new Promise((resolve, reject) => {\n Promise.all(pointPromises).then((results) => {\n var transferrables = [];\n\n var positions = [];\n var normals = [];\n var colors = [];\n\n var properties = [];\n\n var flats = [];\n var point;\n\n var result;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n point = points[i];\n\n // WORKERS: Making this a typed array will speed up transfer time\n // As things stand this adds on a few milliseconds\n flats.push(result.flat);\n\n // WORKERS: result.attributes is actually an array of polygons for each\n // feature, though the current logic isn't keeping these all together\n\n var attributes;\n for (var j = 0; j < result.attributes.length; j++) {\n attributes = result.attributes[j];\n\n positions.push(attributes.positions);\n normals.push(attributes.normals);\n colors.push(attributes.colors);\n\n if (_properties) {\n properties.push(Buffer.stringToUint8Array(JSON.stringify(polygon.properties)));\n }\n };\n };\n\n var mergedAttributes = {\n positions: Buffer.mergeFloat32Arrays(positions),\n normals: Buffer.mergeFloat32Arrays(normals),\n colors: Buffer.mergeFloat32Arrays(colors)\n };\n\n transferrables.push(mergedAttributes.positions[0].buffer);\n transferrables.push(mergedAttributes.positions[1].buffer);\n\n transferrables.push(mergedAttributes.normals[0].buffer);\n transferrables.push(mergedAttributes.normals[1].buffer);\n\n transferrables.push(mergedAttributes.colors[0].buffer);\n transferrables.push(mergedAttributes.colors[1].buffer);\n\n var mergedProperties;\n if (_properties) {\n mergedProperties = Buffer.mergeUint8Arrays(properties);\n\n transferrables.push(mergedProperties[0].buffer);\n transferrables.push(mergedProperties[1].buffer);\n }\n\n var output = {\n attributes: mergedAttributes,\n flats: flats\n };\n\n if (_properties) {\n output.properties = mergedProperties;\n }\n\n // TODO: Also return GeoJSON features that can be mapped to objects on\n // the main thread. Allow user to provide filter / toggles to only return\n // properties from the GeoJSON that they need (eg. don't return geometry,\n // or don't return properties.height)\n resolve({\n data: output,\n transferrables: transferrables\n });\n }).catch(reject);\n });\n }\n\n static ProcessGeoJSON(geojson, headers) {\n if (typeof geojson === 'string') {\n return GeoJSONWorkerLayer.RequestGeoJSON(geojson, headers);\n } else {\n return Promise.resolve(JSON.parse(Buffer.uint8ArrayToString(geojson)));\n }\n }\n\n static RequestGeoJSON(path, headers) {\n return reqwest({\n url: path,\n type: 'json',\n crossOrigin: true,\n headers: headers\n });\n }\n\n // Create and store mesh from buffer attributes\n //\n // Could make this an abstract method for each geometry layer\n _setPolygonMesh(attributes, attributeLengths, style, flat) {\n if (!this._world) {\n return Promise.reject();\n }\n\n return PolygonLayer.SetMesh(attributes, attributeLengths, flat, style, this._options, this._world._environment._skybox);\n }\n\n _setPolylineMesh(attributes, attributeLengths, style, flat) {\n if (!this._world) {\n return Promise.reject();\n }\n\n return PolylineLayer.SetMesh(attributes, attributeLengths, flat, style, this._options);\n }\n\n _setPointMesh(attributes, attributeLengths, style, flat) {\n if (!this._world) {\n return Promise.reject();\n }\n\n return PointLayer.SetMesh(attributes, attributeLengths, flat, style, this._options, this._world._environment._skybox);\n }\n\n // Set up and re-emit interaction events\n _addPicking(pickingId, properties) {\n this._world.on('pick-click-' + pickingId, (pickingId, point2d, point3d, intersects) => {\n this._world.emit('click', this, properties, point2d, point3d);\n });\n\n this._world.on('pick-hover-' + pickingId, (pickingId, point2d, point3d, intersects) => {\n this._world.emit('hover', this, properties, point2d, point3d);\n });\n }\n\n // TODO: Finish cleanup\n destroy() {\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\nexport default GeoJSONWorkerLayer;\n\nvar noNew = function(geojson, options) {\n return new GeoJSONWorkerLayer(geojson, options);\n};\n\nexport {noNew as geoJSONWorkerLayer};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/GeoJSONWorkerLayer.js\n **/","/*!\n * Reqwest! A general purpose XHR connection manager\n * license MIT (c) Dustin Diaz 2015\n * https://github.com/ded/reqwest\n */\n\n!function (name, context, definition) {\n if (typeof module != 'undefined' && module.exports) module.exports = definition()\n else if (typeof define == 'function' && define.amd) define(definition)\n else context[name] = definition()\n}('reqwest', this, function () {\n\n var context = this\n\n if ('window' in context) {\n var doc = document\n , byTag = 'getElementsByTagName'\n , head = doc[byTag]('head')[0]\n } else {\n var XHR2\n try {\n XHR2 = require('xhr2')\n } catch (ex) {\n throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n }\n }\n\n\n var httpsRe = /^http/\n , protocolRe = /(^\\w+):\\/\\//\n , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n , readyState = 'readyState'\n , contentType = 'Content-Type'\n , requestedWith = 'X-Requested-With'\n , uniqid = 0\n , callbackPrefix = 'reqwest_' + (+new Date())\n , lastValue // data stored by the most recent JSONP callback\n , xmlHttpRequest = 'XMLHttpRequest'\n , xDomainRequest = 'XDomainRequest'\n , noop = function () {}\n\n , isArray = typeof Array.isArray == 'function'\n ? Array.isArray\n : function (a) {\n return a instanceof Array\n }\n\n , defaultHeaders = {\n 'contentType': 'application/x-www-form-urlencoded'\n , 'requestedWith': xmlHttpRequest\n , 'accept': {\n '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n , 'xml': 'application/xml, text/xml'\n , 'html': 'text/html'\n , 'text': 'text/plain'\n , 'json': 'application/json, text/javascript'\n , 'js': 'application/javascript, text/javascript'\n }\n }\n\n , xhr = function(o) {\n // is it x-domain\n if (o['crossOrigin'] === true) {\n var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n if (xhr && 'withCredentials' in xhr) {\n return xhr\n } else if (context[xDomainRequest]) {\n return new XDomainRequest()\n } else {\n throw new Error('Browser does not support cross-origin requests')\n }\n } else if (context[xmlHttpRequest]) {\n return new XMLHttpRequest()\n } else if (XHR2) {\n return new XHR2()\n } else {\n return new ActiveXObject('Microsoft.XMLHTTP')\n }\n }\n , globalSetupOptions = {\n dataFilter: function (data) {\n return data\n }\n }\n\n function succeed(r) {\n var protocol = protocolRe.exec(r.url)\n protocol = (protocol && protocol[1]) || context.location.protocol\n return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n }\n\n function handleReadyState(r, success, error) {\n return function () {\n // use _aborted to mitigate against IE err c00c023f\n // (can't read props on aborted request objects)\n if (r._aborted) return error(r.request)\n if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n if (r.request && r.request[readyState] == 4) {\n r.request.onreadystatechange = noop\n if (succeed(r)) success(r.request)\n else\n error(r.request)\n }\n }\n }\n\n function setHeaders(http, o) {\n var headers = o['headers'] || {}\n , h\n\n headers['Accept'] = headers['Accept']\n || defaultHeaders['accept'][o['type']]\n || defaultHeaders['accept']['*']\n\n var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n // breaks cross-origin requests with legacy browsers\n if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n for (h in headers)\n headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n }\n\n function setCredentials(http, o) {\n if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n http.withCredentials = !!o['withCredentials']\n }\n }\n\n function generalCallback(data) {\n lastValue = data\n }\n\n function urlappend (url, s) {\n return url + (/\\?/.test(url) ? '&' : '?') + s\n }\n\n function handleJsonp(o, fn, err, url) {\n var reqId = uniqid++\n , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n , match = url.match(cbreg)\n , script = doc.createElement('script')\n , loaded = 0\n , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\n if (match) {\n if (match[3] === '?') {\n url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n } else {\n cbval = match[3] // provided callback func name\n }\n } else {\n url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n }\n\n context[cbval] = generalCallback\n\n script.type = 'text/javascript'\n script.src = url\n script.async = true\n if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n // need this for IE due to out-of-order onreadystatechange(), binding script\n // execution to an event listener gives us control over when the script\n // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n script.htmlFor = script.id = '_reqwest_' + reqId\n }\n\n script.onload = script.onreadystatechange = function () {\n if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n return false\n }\n script.onload = script.onreadystatechange = null\n script.onclick && script.onclick()\n // Call the user callback with the last value stored and clean up values and scripts.\n fn(lastValue)\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n\n // Add the script to the DOM head\n head.appendChild(script)\n\n // Enable JSONP timeout\n return {\n abort: function () {\n script.onload = script.onreadystatechange = null\n err({}, 'Request is aborted: timeout', {})\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n }\n }\n\n function getRequest(fn, err) {\n var o = this.o\n , method = (o['method'] || 'GET').toUpperCase()\n , url = typeof o === 'string' ? o : o['url']\n // convert non-string objects to query-string form unless o['processData'] is false\n , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n ? reqwest.toQueryString(o['data'])\n : (o['data'] || null)\n , http\n , sendWait = false\n\n // if we're working on a GET request and we have data then we should append\n // query string to end of URL and not post data\n if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n url = urlappend(url, data)\n data = null\n }\n\n if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\n // get the xhr from the factory if passed\n // if the factory returns null, fall-back to ours\n http = (o.xhr && o.xhr(o)) || xhr(o)\n\n http.open(method, url, o['async'] === false ? false : true)\n setHeaders(http, o)\n setCredentials(http, o)\n if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n http.onload = fn\n http.onerror = err\n // NOTE: see\n // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n http.onprogress = function() {}\n sendWait = true\n } else {\n http.onreadystatechange = handleReadyState(this, fn, err)\n }\n o['before'] && o['before'](http)\n if (sendWait) {\n setTimeout(function () {\n http.send(data)\n }, 200)\n } else {\n http.send(data)\n }\n return http\n }\n\n function Reqwest(o, fn) {\n this.o = o\n this.fn = fn\n\n init.apply(this, arguments)\n }\n\n function setType(header) {\n // json, javascript, text/plain, text/html, xml\n if (header === null) return undefined; //In case of no content-type.\n if (header.match('json')) return 'json'\n if (header.match('javascript')) return 'js'\n if (header.match('text')) return 'html'\n if (header.match('xml')) return 'xml'\n }\n\n function init(o, fn) {\n\n this.url = typeof o == 'string' ? o : o['url']\n this.timeout = null\n\n // whether request has been fulfilled for purpose\n // of tracking the Promises\n this._fulfilled = false\n // success handlers\n this._successHandler = function(){}\n this._fulfillmentHandlers = []\n // error handlers\n this._errorHandlers = []\n // complete (both success and fail) handlers\n this._completeHandlers = []\n this._erred = false\n this._responseArgs = {}\n\n var self = this\n\n fn = fn || function () {}\n\n if (o['timeout']) {\n this.timeout = setTimeout(function () {\n timedOut()\n }, o['timeout'])\n }\n\n if (o['success']) {\n this._successHandler = function () {\n o['success'].apply(o, arguments)\n }\n }\n\n if (o['error']) {\n this._errorHandlers.push(function () {\n o['error'].apply(o, arguments)\n })\n }\n\n if (o['complete']) {\n this._completeHandlers.push(function () {\n o['complete'].apply(o, arguments)\n })\n }\n\n function complete (resp) {\n o['timeout'] && clearTimeout(self.timeout)\n self.timeout = null\n while (self._completeHandlers.length > 0) {\n self._completeHandlers.shift()(resp)\n }\n }\n\n function success (resp) {\n var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n resp = (type !== 'jsonp') ? self.request : resp\n // use global data filter on response text\n var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n , r = filteredResponse\n try {\n resp.responseText = r\n } catch (e) {\n // can't assign this in IE<=8, just ignore\n }\n if (r) {\n switch (type) {\n case 'json':\n try {\n resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n } catch (err) {\n return error(resp, 'Could not parse JSON in response', err)\n }\n break\n case 'js':\n resp = eval(r)\n break\n case 'html':\n resp = r\n break\n case 'xml':\n resp = resp.responseXML\n && resp.responseXML.parseError // IE trololo\n && resp.responseXML.parseError.errorCode\n && resp.responseXML.parseError.reason\n ? null\n : resp.responseXML\n break\n }\n }\n\n self._responseArgs.resp = resp\n self._fulfilled = true\n fn(resp)\n self._successHandler(resp)\n while (self._fulfillmentHandlers.length > 0) {\n resp = self._fulfillmentHandlers.shift()(resp)\n }\n\n complete(resp)\n }\n\n function timedOut() {\n self._timedOut = true\n self.request.abort()\n }\n\n function error(resp, msg, t) {\n resp = self.request\n self._responseArgs.resp = resp\n self._responseArgs.msg = msg\n self._responseArgs.t = t\n self._erred = true\n while (self._errorHandlers.length > 0) {\n self._errorHandlers.shift()(resp, msg, t)\n }\n complete(resp)\n }\n\n this.request = getRequest.call(this, success, error)\n }\n\n Reqwest.prototype = {\n abort: function () {\n this._aborted = true\n this.request.abort()\n }\n\n , retry: function () {\n init.call(this, this.o, this.fn)\n }\n\n /**\n * Small deviation from the Promises A CommonJs specification\n * http://wiki.commonjs.org/wiki/Promises/A\n */\n\n /**\n * `then` will execute upon successful requests\n */\n , then: function (success, fail) {\n success = success || function () {}\n fail = fail || function () {}\n if (this._fulfilled) {\n this._responseArgs.resp = success(this._responseArgs.resp)\n } else if (this._erred) {\n fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._fulfillmentHandlers.push(success)\n this._errorHandlers.push(fail)\n }\n return this\n }\n\n /**\n * `always` will execute whether the request succeeds or fails\n */\n , always: function (fn) {\n if (this._fulfilled || this._erred) {\n fn(this._responseArgs.resp)\n } else {\n this._completeHandlers.push(fn)\n }\n return this\n }\n\n /**\n * `fail` will execute when the request fails\n */\n , fail: function (fn) {\n if (this._erred) {\n fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._errorHandlers.push(fn)\n }\n return this\n }\n , 'catch': function (fn) {\n return this.fail(fn)\n }\n }\n\n function reqwest(o, fn) {\n return new Reqwest(o, fn)\n }\n\n // normalize newline variants according to spec -> CRLF\n function normalize(s) {\n return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n }\n\n function serial(el, cb) {\n var n = el.name\n , t = el.tagName.toLowerCase()\n , optCb = function (o) {\n // IE gives value=\"\" even where there is no value attribute\n // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n if (o && !o['disabled'])\n cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n }\n , ch, ra, val, i\n\n // don't serialize elements that are disabled or without a name\n if (el.disabled || !n) return\n\n switch (t) {\n case 'input':\n if (!/reset|button|image|file/i.test(el.type)) {\n ch = /checkbox/i.test(el.type)\n ra = /radio/i.test(el.type)\n val = el.value\n // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n }\n break\n case 'textarea':\n cb(n, normalize(el.value))\n break\n case 'select':\n if (el.type.toLowerCase() === 'select-one') {\n optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n } else {\n for (i = 0; el.length && i < el.length; i++) {\n el.options[i].selected && optCb(el.options[i])\n }\n }\n break\n }\n }\n\n // collect up all form elements found from the passed argument elements all\n // the way down to child elements; pass a '' or form fields.\n // called with 'this'=callback to use for serial() on each element\n function eachFormElement() {\n var cb = this\n , e, i\n , serializeSubtags = function (e, tags) {\n var i, j, fa\n for (i = 0; i < tags.length; i++) {\n fa = e[byTag](tags[i])\n for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n }\n }\n\n for (i = 0; i < arguments.length; i++) {\n e = arguments[i]\n if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n }\n }\n\n // standard query string style serialization\n function serializeQueryString() {\n return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n }\n\n // { 'name': 'value', ... } style serialization\n function serializeHash() {\n var hash = {}\n eachFormElement.apply(function (name, value) {\n if (name in hash) {\n hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n hash[name].push(value)\n } else hash[name] = value\n }, arguments)\n return hash\n }\n\n // [ { name: 'name', value: 'value' }, ... ] style serialization\n reqwest.serializeArray = function () {\n var arr = []\n eachFormElement.apply(function (name, value) {\n arr.push({name: name, value: value})\n }, arguments)\n return arr\n }\n\n reqwest.serialize = function () {\n if (arguments.length === 0) return ''\n var opt, fn\n , args = Array.prototype.slice.call(arguments, 0)\n\n opt = args.pop()\n opt && opt.nodeType && args.push(opt) && (opt = null)\n opt && (opt = opt.type)\n\n if (opt == 'map') fn = serializeHash\n else if (opt == 'array') fn = reqwest.serializeArray\n else fn = serializeQueryString\n\n return fn.apply(null, args)\n }\n\n reqwest.toQueryString = function (o, trad) {\n var prefix, i\n , traditional = trad || false\n , s = []\n , enc = encodeURIComponent\n , add = function (key, value) {\n // If value is a function, invoke it and return its value\n value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n s[s.length] = enc(key) + '=' + enc(value)\n }\n // If an array was passed in, assume that it is an array of form elements.\n if (isArray(o)) {\n for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n } else {\n // If traditional, encode the \"old\" way (the way 1.3.2 or older\n // did it), otherwise encode params recursively.\n for (prefix in o) {\n if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n }\n }\n\n // spaces should be + according to spec\n return s.join('&').replace(/%20/g, '+')\n }\n\n function buildParams(prefix, obj, traditional, add) {\n var name, i, v\n , rbracket = /\\[\\]$/\n\n if (isArray(obj)) {\n // Serialize array item.\n for (i = 0; obj && i < obj.length; i++) {\n v = obj[i]\n if (traditional || rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v)\n } else {\n buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n }\n }\n } else if (obj && obj.toString() === '[object Object]') {\n // Serialize object item.\n for (name in obj) {\n buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n }\n\n } else {\n // Serialize scalar item.\n add(prefix, obj)\n }\n }\n\n reqwest.getcallbackPrefix = function () {\n return callbackPrefix\n }\n\n // jQuery and Zepto compatibility, differences can be remapped here so you can call\n // .ajax.compat(options, callback)\n reqwest.compat = function (o, fn) {\n if (o) {\n o['type'] && (o['method'] = o['type']) && delete o['type']\n o['dataType'] && (o['type'] = o['dataType'])\n o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n }\n return new Reqwest(o, fn)\n }\n\n reqwest.ajaxSetup = function (options) {\n options = options || {}\n for (var k in options) {\n globalSetupOptions[k] = options[k]\n }\n }\n\n return reqwest\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/reqwest/reqwest.js\n ** module id = 23\n ** module chunks = 0\n **/","/*\n * GeoJSON helpers for handling data and generating objects\n */\n\nimport THREE from 'three';\nimport * as topojson from 'topojson';\nimport geojsonMerge from 'geojson-merge';\nimport earcut from 'earcut';\nimport extrudePolygon from './extrudePolygon';\n\n// TODO: Make it so height can be per-coordinate / point but connected together\n// as a linestring (eg. GPS points with an elevation at each point)\n//\n// This isn't really valid GeoJSON so perhaps something best left to an external\n// component for now, until a better approach can be considered\n//\n// See: http://lists.geojson.org/pipermail/geojson-geojson.org/2009-June/000489.html\n\n// Light and dark colours used for poor-mans AO gradient on object sides\nvar light = new THREE.Color(0xffffff);\nvar shadow = new THREE.Color(0x666666);\n\nvar GeoJSON = (function() {\n var defaultStyle = {\n color: '#ffffff',\n outline: false,\n outlineColor: '#000000',\n transparent: false,\n opacity: 1,\n blending: THREE.NormalBlending,\n height: 0,\n lineOpacity: 1,\n lineTransparent: false,\n lineColor: '#ffffff',\n lineWidth: 1,\n lineBlending: THREE.NormalBlending\n };\n\n // Attempts to merge together multiple GeoJSON Features or FeatureCollections\n // into a single FeatureCollection\n var collectFeatures = function(data, _topojson) {\n var collections = [];\n\n if (_topojson) {\n // TODO: Allow TopoJSON objects to be overridden as an option\n\n // If not overridden, merge all features from all objects\n for (var tk in data.objects) {\n collections.push(topojson.feature(data, data.objects[tk]));\n }\n\n return geojsonMerge(collections);\n } else {\n // If root doesn't have a type then let's see if there are features in the\n // next step down\n if (!data.type) {\n // TODO: Allow GeoJSON objects to be overridden as an option\n\n // If not overridden, merge all features from all objects\n for (var gk in data) {\n if (!data[gk].type) {\n continue;\n }\n\n collections.push(data[gk]);\n }\n\n return geojsonMerge(collections);\n } else if (Array.isArray(data)) {\n return geojsonMerge(data);\n } else {\n return data;\n }\n }\n };\n\n // TODO: This is only used by GeoJSONTile so either roll it into that or\n // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n var lineStringAttributes = function(coordinates, colour, height) {\n var _coords = [];\n var _colours = [];\n\n var nextCoord;\n\n // Connect coordinate with the next to make a pair\n //\n // LineSegments requires pairs of vertices so repeat the last point if\n // there's an odd number of vertices\n coordinates.forEach((coordinate, index) => {\n _colours.push([colour.r, colour.g, colour.b]);\n _coords.push([coordinate[0], height, coordinate[1]]);\n\n nextCoord = (coordinates[index + 1]) ? coordinates[index + 1] : coordinate;\n\n _colours.push([colour.r, colour.g, colour.b]);\n _coords.push([nextCoord[0], height, nextCoord[1]]);\n });\n\n return {\n vertices: _coords,\n colours: _colours\n };\n };\n\n // TODO: This is only used by GeoJSONTile so either roll it into that or\n // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n var multiLineStringAttributes = function(coordinates, colour, height) {\n var _coords = [];\n var _colours = [];\n\n var result;\n coordinates.forEach(coordinate => {\n result = lineStringAttributes(coordinate, colour, height);\n\n result.vertices.forEach(coord => {\n _coords.push(coord);\n });\n\n result.colours.forEach(colour => {\n _colours.push(colour);\n });\n });\n\n return {\n vertices: _coords,\n colours: _colours\n };\n };\n\n // TODO: This is only used by GeoJSONTile so either roll it into that or\n // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n var polygonAttributes = function(coordinates, colour, height) {\n var earcutData = _toEarcut(coordinates);\n\n var faces = _triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\n var groupedVertices = [];\n for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) {\n groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions));\n }\n\n var extruded = extrudePolygon(groupedVertices, faces, {\n bottom: 0,\n top: height\n });\n\n var topColor = colour.clone().multiply(light);\n var bottomColor = colour.clone().multiply(shadow);\n\n var _vertices = extruded.positions;\n var _faces = [];\n var _colours = [];\n\n var _colour;\n extruded.top.forEach((face, fi) => {\n _colour = [];\n\n _colour.push([colour.r, colour.g, colour.b]);\n _colour.push([colour.r, colour.g, colour.b]);\n _colour.push([colour.r, colour.g, colour.b]);\n\n _faces.push(face);\n _colours.push(_colour);\n });\n\n var allFlat = true;\n\n if (extruded.sides) {\n if (allFlat) {\n allFlat = false;\n }\n\n // Set up colours for every vertex with poor-mans AO on the sides\n extruded.sides.forEach((face, fi) => {\n _colour = [];\n\n // First face is always bottom-bottom-top\n if (fi % 2 === 0) {\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n _colour.push([topColor.r, topColor.g, topColor.b]);\n // Reverse winding for the second face\n // top-top-bottom\n } else {\n _colour.push([topColor.r, topColor.g, topColor.b]);\n _colour.push([topColor.r, topColor.g, topColor.b]);\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n }\n\n _faces.push(face);\n _colours.push(_colour);\n });\n }\n\n // Skip bottom as there's no point rendering it\n // allFaces.push(extruded.faces);\n\n return {\n vertices: _vertices,\n faces: _faces,\n colours: _colours,\n flat: allFlat\n };\n };\n\n // TODO: This is only used by GeoJSONTile so either roll it into that or\n // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n var _toEarcut = function(data) {\n var dim = data[0][0].length;\n var result = {vertices: [], holes: [], dimensions: dim};\n var holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) {\n result.vertices.push(data[i][j][d]);\n }\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n\n return result;\n };\n\n // TODO: This is only used by GeoJSONTile so either roll it into that or\n // update GeoJSONTile to use the new GeoJSONLayer or geometry layers\n var _triangulate = function(contour, holes, dim) {\n // console.time('earcut');\n\n var faces = earcut(contour, holes, dim);\n var result = [];\n\n for (i = 0, il = faces.length; i < il; i += 3) {\n result.push(faces.slice(i, i + 3));\n }\n\n // console.timeEnd('earcut');\n\n return result;\n };\n\n return {\n defaultStyle: defaultStyle,\n collectFeatures: collectFeatures,\n lineStringAttributes: lineStringAttributes,\n multiLineStringAttributes: multiLineStringAttributes,\n polygonAttributes: polygonAttributes\n };\n})();\n\nexport default GeoJSON;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/GeoJSON.js\n **/","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.topojson = global.topojson || {})));\n}(this, (function (exports) { 'use strict';\n\nfunction noop() {}\n\nfunction transformAbsolute(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n point[0] = (x0 += point[0]) * kx + dx;\n point[1] = (y0 += point[1]) * ky + dy;\n };\n}\n\nfunction transformRelative(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n var x1 = Math.round((point[0] - dx) / kx),\n y1 = Math.round((point[1] - dy) / ky);\n point[0] = x1 - x0;\n point[1] = y1 - y0;\n x0 = x1;\n y0 = y1;\n };\n}\n\nfunction reverse(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n}\n\nfunction bisect(a, x) {\n var lo = 0, hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (a[mid] < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nfunction feature(topology, o) {\n return o.type === \"GeometryCollection\" ? {\n type: \"FeatureCollection\",\n features: o.geometries.map(function(o) { return feature$1(topology, o); })\n } : feature$1(topology, o);\n}\n\nfunction feature$1(topology, o) {\n var f = {\n type: \"Feature\",\n id: o.id,\n properties: o.properties || {},\n geometry: object(topology, o)\n };\n if (o.id == null) delete f.id;\n return f;\n}\n\nfunction object(topology, o) {\n var absolute = transformAbsolute(topology.transform),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) points.pop();\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n points.push(p = a[k].slice());\n absolute(p, k);\n }\n if (i < 0) reverse(points, n);\n }\n\n function point(p) {\n p = p.slice();\n absolute(p, 0);\n return p;\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n if (points.length < 2) points.push(points[0].slice());\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) points.push(points[0].slice());\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var t = o.type;\n return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n : null;\n }\n\n var geometryType = {\n Point: function(o) { return point(o.coordinates); },\n MultiPoint: function(o) { return o.coordinates.map(point); },\n LineString: function(o) { return line(o.arcs); },\n MultiLineString: function(o) { return o.arcs.map(line); },\n Polygon: function(o) { return polygon(o.arcs); },\n MultiPolygon: function(o) { return o.arcs.map(polygon); }\n };\n\n return geometry(o);\n}\n\nfunction stitchArcs(topology, arcs) {\n var stitchedArcs = {},\n fragmentByStart = {},\n fragmentByEnd = {},\n fragments = [],\n emptyIndex = -1;\n\n // Stitch empty arcs first, since they may be subsumed by other arcs.\n arcs.forEach(function(i, j) {\n var arc = topology.arcs[i < 0 ? ~i : i], t;\n if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n }\n });\n\n arcs.forEach(function(i) {\n var e = ends(i),\n start = e[0],\n end = e[1],\n f, g;\n\n if (f = fragmentByEnd[start]) {\n delete fragmentByEnd[f.end];\n f.push(i);\n f.end = end;\n if (g = fragmentByStart[end]) {\n delete fragmentByStart[g.start];\n var fg = g === f ? f : f.concat(g);\n fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else if (f = fragmentByStart[end]) {\n delete fragmentByStart[f.start];\n f.unshift(i);\n f.start = start;\n if (g = fragmentByEnd[start]) {\n delete fragmentByEnd[g.end];\n var gf = g === f ? f : g.concat(f);\n fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else {\n f = [i];\n fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n }\n });\n\n function ends(i) {\n var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n else p1 = arc[arc.length - 1];\n return i < 0 ? [p1, p0] : [p0, p1];\n }\n\n function flush(fragmentByEnd, fragmentByStart) {\n for (var k in fragmentByEnd) {\n var f = fragmentByEnd[k];\n delete fragmentByStart[f.start];\n delete f.start;\n delete f.end;\n f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n fragments.push(f);\n }\n }\n\n flush(fragmentByEnd, fragmentByStart);\n flush(fragmentByStart, fragmentByEnd);\n arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\n return fragments;\n}\n\nfunction mesh(topology) {\n return object(topology, meshArcs.apply(this, arguments));\n}\n\nfunction meshArcs(topology, o, filter) {\n var arcs = [];\n\n function arc(i) {\n var j = i < 0 ? ~i : i;\n (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n }\n\n function line(arcs) {\n arcs.forEach(arc);\n }\n\n function polygon(arcs) {\n arcs.forEach(line);\n }\n\n function geometry(o) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n }\n\n if (arguments.length > 1) {\n var geomsByArc = [],\n geom;\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n };\n\n geometry(o);\n\n geomsByArc.forEach(arguments.length < 3\n ? function(geoms) { arcs.push(geoms[0].i); }\n : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n } else {\n for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n }\n\n return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n}\n\nfunction cartesianTriangleArea(triangle) {\n var a = triangle[0], b = triangle[1], c = triangle[2];\n return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n}\n\nfunction ring(ring) {\n var i = -1,\n n = ring.length,\n a,\n b = ring[n - 1],\n area = 0;\n\n while (++i < n) {\n a = b;\n b = ring[i];\n area += a[0] * b[1] - a[1] * b[0];\n }\n\n return area / 2;\n}\n\nfunction merge(topology) {\n return object(topology, mergeArcs.apply(this, arguments));\n}\n\nfunction mergeArcs(topology, objects) {\n var polygonsByArc = {},\n polygons = [],\n components = [];\n\n objects.forEach(function(o) {\n if (o.type === \"Polygon\") register(o.arcs);\n else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n });\n\n function register(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n });\n });\n polygons.push(polygon);\n }\n\n function area(ring$$) {\n return Math.abs(ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]));\n }\n\n polygons.forEach(function(polygon) {\n if (!polygon._) {\n var component = [],\n neighbors = [polygon];\n polygon._ = 1;\n components.push(component);\n while (polygon = neighbors.pop()) {\n component.push(polygon);\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n if (!polygon._) {\n polygon._ = 1;\n neighbors.push(polygon);\n }\n });\n });\n });\n }\n }\n });\n\n polygons.forEach(function(polygon) {\n delete polygon._;\n });\n\n return {\n type: \"MultiPolygon\",\n arcs: components.map(function(polygons) {\n var arcs = [], n;\n\n // Extract the exterior (unique) arcs.\n polygons.forEach(function(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n arcs.push(arc);\n }\n });\n });\n });\n\n // Stitch the arcs into one or more rings.\n arcs = stitchArcs(topology, arcs);\n\n // If more than one ring is returned,\n // at most one of these rings can be the exterior;\n // choose the one with the greatest absolute area.\n if ((n = arcs.length) > 1) {\n for (var i = 1, k = area(arcs[0]), ki, t; i < n; ++i) {\n if ((ki = area(arcs[i])) > k) {\n t = arcs[0], arcs[0] = arcs[i], arcs[i] = t, k = ki;\n }\n }\n }\n\n return arcs;\n })\n };\n}\n\nfunction neighbors(objects) {\n var indexesByArc = {}, // arc index -> array of object indexes\n neighbors = objects.map(function() { return []; });\n\n function line(arcs, i) {\n arcs.forEach(function(a) {\n if (a < 0) a = ~a;\n var o = indexesByArc[a];\n if (o) o.push(i);\n else indexesByArc[a] = [i];\n });\n }\n\n function polygon(arcs, i) {\n arcs.forEach(function(arc) { line(arc, i); });\n }\n\n function geometry(o, i) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n }\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n };\n\n objects.forEach(geometry);\n\n for (var i in indexesByArc) {\n for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n for (var k = j + 1; k < m; ++k) {\n var ij = indexes[j], ik = indexes[k], n;\n if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n }\n }\n }\n\n return neighbors;\n}\n\nfunction compareArea(a, b) {\n return a[1][2] - b[1][2];\n}\n\nfunction minAreaHeap() {\n var heap = {},\n array = [],\n size = 0;\n\n heap.push = function(object) {\n up(array[object._ = size] = object, size++);\n return size;\n };\n\n heap.pop = function() {\n if (size <= 0) return;\n var removed = array[0], object;\n if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n return removed;\n };\n\n heap.remove = function(removed) {\n var i = removed._, object;\n if (array[i] !== removed) return; // invalid request\n if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n return i;\n };\n\n function up(object, i) {\n while (i > 0) {\n var j = ((i + 1) >> 1) - 1,\n parent = array[j];\n if (compareArea(object, parent) >= 0) break;\n array[parent._ = i] = parent;\n array[object._ = i = j] = object;\n }\n }\n\n function down(object, i) {\n while (true) {\n var r = (i + 1) << 1,\n l = r - 1,\n j = i,\n child = array[j];\n if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n if (j === i) break;\n array[child._ = i] = child;\n array[object._ = i = j] = object;\n }\n }\n\n return heap;\n}\n\nfunction presimplify(topology, triangleArea) {\n var absolute = transformAbsolute(topology.transform),\n relative = transformRelative(topology.transform),\n heap = minAreaHeap();\n\n if (!triangleArea) triangleArea = cartesianTriangleArea;\n\n topology.arcs.forEach(function(arc) {\n var triangles = [],\n maxArea = 0,\n triangle,\n i,\n n,\n p;\n\n // To store each point’s effective area, we create a new array rather than\n // extending the passed-in point to workaround a Chrome/V8 bug (getting\n // stuck in smi mode). For midpoints, the initial effective area of\n // Infinity will be computed in the next step.\n for (i = 0, n = arc.length; i < n; ++i) {\n p = arc[i];\n absolute(arc[i] = [p[0], p[1], Infinity], i);\n }\n\n for (i = 1, n = arc.length - 1; i < n; ++i) {\n triangle = arc.slice(i - 1, i + 2);\n triangle[1][2] = triangleArea(triangle);\n triangles.push(triangle);\n heap.push(triangle);\n }\n\n for (i = 0, n = triangles.length; i < n; ++i) {\n triangle = triangles[i];\n triangle.previous = triangles[i - 1];\n triangle.next = triangles[i + 1];\n }\n\n while (triangle = heap.pop()) {\n var previous = triangle.previous,\n next = triangle.next;\n\n // If the area of the current point is less than that of the previous point\n // to be eliminated, use the latter's area instead. This ensures that the\n // current point cannot be eliminated without eliminating previously-\n // eliminated points.\n if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n else maxArea = triangle[1][2];\n\n if (previous) {\n previous.next = next;\n previous[2] = triangle[2];\n update(previous);\n }\n\n if (next) {\n next.previous = previous;\n next[0] = triangle[0];\n update(next);\n }\n }\n\n arc.forEach(relative);\n });\n\n function update(triangle) {\n heap.remove(triangle);\n triangle[1][2] = triangleArea(triangle);\n heap.push(triangle);\n }\n\n return topology;\n}\n\nvar version = \"1.6.27\";\n\nexports.version = version;\nexports.mesh = mesh;\nexports.meshArcs = meshArcs;\nexports.merge = merge;\nexports.mergeArcs = mergeArcs;\nexports.feature = feature;\nexports.neighbors = neighbors;\nexports.presimplify = presimplify;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/topojson/build/topojson.js\n ** module id = 26\n ** module chunks = 0\n **/","var normalize = require('geojson-normalize');\n\nmodule.exports = function(inputs) {\n return {\n type: 'FeatureCollection',\n features: inputs.reduce(function(memo, input) {\n return memo.concat(normalize(input).features);\n }, [])\n };\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/geojson-merge/index.js\n ** module id = 27\n ** module chunks = 0\n **/","module.exports = normalize;\n\nvar types = {\n Point: 'geometry',\n MultiPoint: 'geometry',\n LineString: 'geometry',\n MultiLineString: 'geometry',\n Polygon: 'geometry',\n MultiPolygon: 'geometry',\n GeometryCollection: 'geometry',\n Feature: 'feature',\n FeatureCollection: 'featurecollection'\n};\n\n/**\n * Normalize a GeoJSON feature into a FeatureCollection.\n *\n * @param {object} gj geojson data\n * @returns {object} normalized geojson data\n */\nfunction normalize(gj) {\n if (!gj || !gj.type) return null;\n var type = types[gj.type];\n if (!type) return null;\n\n if (type === 'geometry') {\n return {\n type: 'FeatureCollection',\n features: [{\n type: 'Feature',\n properties: {},\n geometry: gj\n }]\n };\n } else if (type === 'feature') {\n return {\n type: 'FeatureCollection',\n features: [gj]\n };\n } else if (type === 'featurecollection') {\n return gj;\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/geojson-normalize/index.js\n ** module id = 28\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode) return triangles;\n\n var minX, minY, maxX, maxY, x, y, size;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and size are later used to transform coords into integers for z-order calculation\n size = Math.max(maxX - minX, maxY - minY);\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n var i, last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) return null;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && size) indexCurve(ear, minX, minY, size);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim);\n triangles.push(ear.i / dim);\n triangles.push(next.i / dim);\n\n removeNode(ear);\n\n // skipping the next vertice leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(ear, triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, size);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n\n while (p !== ear.prev) {\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, size) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, size),\n maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\n // first look for points inside the triangle in increasing z-order\n var p = ear.nextZ;\n\n while (p && p.z <= maxZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.nextZ;\n }\n\n // then look for points in decreasing z-order\n p = ear.prevZ;\n\n while (p && p.z >= minZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim);\n triangles.push(p.i / dim);\n triangles.push(b.i / dim);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return p;\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, size);\n earcutLinked(c, triangles, dim, minX, minY, size);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n filterPoints(b, b.next);\n }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n if (x === hx) {\n if (hy === p.y) return p;\n if (hy === p.next.y) return p.next;\n }\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n mx = m.x,\n my = m.y,\n tanMin = Infinity,\n tan;\n\n p = m.next;\n\n while (p !== stop) {\n if (hx >= p.x && p.x >= mx &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n }\n\n return m;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, size) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize === 0) {\n e = q;\n q = q.nextZ;\n qSize--;\n } else if (qSize === 0 || !q) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else if (p.z <= q.z) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and size of the data bounding box\nfunction zOrder(x, y, minX, minY, size) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) / size;\n y = 32767 * (y - minY) / size;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n if ((equals(p1, q1) && equals(p2, q2)) ||\n (equals(p1, q2) && equals(p2, q1))) return true;\n return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertice index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertice nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = null;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n// return a percentage difference between the polygon area and its triangulation area;\n// used to verify correctness of triangulation\nearcut.deviation = function (data, holeIndices, dim, triangles) {\n var hasHoles = holeIndices && holeIndices.length;\n var outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n\n var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));\n if (hasHoles) {\n for (var i = 0, len = holeIndices.length; i < len; i++) {\n var start = holeIndices[i] * dim;\n var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n polygonArea -= Math.abs(signedArea(data, start, end, dim));\n }\n }\n\n var trianglesArea = 0;\n for (i = 0; i < triangles.length; i += 3) {\n var a = triangles[i] * dim;\n var b = triangles[i + 1] * dim;\n var c = triangles[i + 2] * dim;\n trianglesArea += Math.abs(\n (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -\n (data[a] - data[b]) * (data[c + 1] - data[a + 1]));\n }\n\n return polygonArea === 0 && trianglesArea === 0 ? 0 :\n Math.abs((trianglesArea - polygonArea) / polygonArea);\n};\n\nfunction signedArea(data, start, end, dim) {\n var sum = 0;\n for (var i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts\nearcut.flatten = function (data) {\n var dim = data[0][0].length,\n result = {vertices: [], holes: [], dimensions: dim},\n holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n return result;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/earcut/src/earcut.js\n ** module id = 29\n ** module chunks = 0\n **/","/*\n * Extrude a polygon given its vertices and triangulated faces\n *\n * Based on:\n * https://github.com/freeman-lab/extrude\n */\n\nimport extend from 'lodash.assign';\n\nvar extrudePolygon = function(points, faces, _options) {\n var defaults = {\n top: 1,\n bottom: 0,\n closed: true\n };\n\n var options = extend({}, defaults, _options);\n\n var n = points.length;\n var positions;\n var cells;\n var topCells;\n var bottomCells;\n var sideCells;\n\n // If bottom and top values are identical then return the flat shape\n (options.top === options.bottom) ? flat() : full();\n\n function flat() {\n positions = points.map(function(p) { return [p[0], options.top, p[1]]; });\n cells = faces;\n topCells = faces;\n }\n\n function full() {\n positions = [];\n points.forEach(function(p) { positions.push([p[0], options.top, p[1]]); });\n points.forEach(function(p) { positions.push([p[0], options.bottom, p[1]]); });\n\n cells = [];\n for (var i = 0; i < n; i++) {\n if (i === (n - 1)) {\n cells.push([i + n, n, i]);\n cells.push([0, i, n]);\n } else {\n cells.push([i + n, i + n + 1, i]);\n cells.push([i + 1, i, i + n + 1]);\n }\n }\n\n sideCells = [].concat(cells);\n\n if (options.closed) {\n var top = faces;\n var bottom = top.map(function(p) { return p.map(function(v) { return v + n; }); });\n bottom = bottom.map(function(p) { return [p[0], p[2], p[1]]; });\n cells = cells.concat(top).concat(bottom);\n\n topCells = top;\n bottomCells = bottom;\n }\n }\n\n return {\n positions: positions,\n faces: cells,\n top: topCells,\n bottom: bottomCells,\n sides: sideCells\n };\n};\n\nexport default extrudePolygon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/extrudePolygon.js\n **/","import WorkerPool from './WorkerPool';\n\nvar Worker = (function() {\n var _maxWorkers = 2;\n var pool;\n\n var createWorkers = function(maxWorkers, workerScript) {\n pool = new WorkerPool({\n numThreads: (maxWorkers) ? maxWorkers : _maxWorkers,\n workerScript: (workerScript) ? workerScript : 'vizicities-worker.js'\n });\n\n return pool.createWorkers();\n };\n\n var exec = function(method, args, transferrables) {\n return pool.exec(method, args, transferrables);\n };\n\n return {\n createWorkers: createWorkers,\n exec: exec\n };\n})();\n\nexport default Worker;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Worker.js\n **/","import WorkerPoolWorker from './WorkerPoolWorker';\n\nconst DEBUG = false;\n\nclass WorkerPool {\n constructor(options) {\n this.numThreads = options.numThreads || 2;\n this.workerScript = options.workerScript;\n\n this.workers = [];\n this.tasks = [];\n }\n\n createWorkers() {\n return new Promise((resolve, reject) => {\n var workerPromises = [];\n\n for (var i = 0; i < this.numThreads; i++) {\n workerPromises.push(this.createWorker());\n }\n\n Promise.all(workerPromises).then(() => {\n if (DEBUG) { console.log('All workers ready', performance.now()); }\n resolve();\n }).catch(reject);\n });\n }\n\n createWorker() {\n return new Promise((resolve, reject) => {\n // Initialise worker\n var worker = new WorkerPoolWorker({\n workerScript: this.workerScript\n });\n\n // Start worker and wait for it to be ready\n return worker.start().then(() => {\n if (DEBUG) { console.log('Worker ready', performance.now()); }\n\n // Add worker to pool\n this.workers.push(worker);\n\n resolve();\n }).catch(reject);\n });\n }\n\n getFreeWorker() {\n return this.workers.find((worker) => {\n return !worker.busy;\n });\n }\n\n // Execute task on a worker\n exec(method, args, transferrables) {\n var deferred = Promise.deferred();\n\n // Create task\n var task = {\n method: method,\n args: args,\n transferrables: transferrables,\n deferred: deferred\n };\n\n // Add task to queue\n this.tasks.push(task);\n\n // Trigger task processing\n this.processTasks();\n\n // Return task promise\n return task.deferred.promise;\n }\n\n processTasks() {\n if (DEBUG) { console.log('Processing tasks'); }\n\n if (this.tasks.length === 0) {\n return;\n }\n\n // Find free worker\n var worker = this.getFreeWorker();\n\n if (!worker) {\n if (DEBUG) { console.log('No workers free'); }\n return;\n }\n\n // Get oldest task\n var task = this.tasks.shift();\n\n // Execute task on worker\n worker.exec(task.method, task.args, task.transferrables).then((result) => {\n // Trigger task processing\n this.processTasks();\n\n // Return result in deferred task promise\n task.deferred.resolve(result);\n });\n }\n}\n\nexport default WorkerPool;\n\n// Quick shim to create deferred native promises\nPromise.deferred = function() {\n var result = {};\n\n result.promise = new Promise((resolve, reject) => {\n result.resolve = resolve;\n result.reject = reject;\n });\n\n return result;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/WorkerPool.js\n **/","const DEBUG = false;\n\nclass WorkerPoolWorker {\n constructor(options) {\n this.workerScript = options.workerScript;\n\n this.ready = false;\n this.busy = false;\n this.deferred = null;\n }\n\n start() {\n return new Promise((resolve, reject) => {\n this.worker = new Worker(this.workerScript);\n\n var onStartup = (event) => {\n if (!event.data || event.data.type !== 'startup') {\n reject();\n return;\n }\n\n this.ready = true;\n\n // Remove temporary message handler\n this.worker.removeEventListener('message', onStartup);\n\n // Set up listener to respond to normal events now\n this.worker.addEventListener('message', (event) => {\n this.onMessage(event);\n });\n\n // Resolve once worker is ready\n resolve();\n };\n\n // Set up temporary event listener for warmup\n this.worker.addEventListener('message', onStartup);\n });\n }\n\n exec(method, args, transferrables) {\n if (DEBUG) { console.log('Execute', method, args, transferrables); }\n\n var deferred = Promise.deferred();\n\n this.busy = true;\n this.deferred = deferred;\n\n this.worker.postMessage({\n method: method,\n args: args\n }, transferrables);\n\n return deferred.promise;\n }\n\n onMessage(event) {\n console.log('Message received from worker', performance.now());\n\n this.busy = false;\n\n if (!event.data || event.data.type === 'error' || event.data.type !== 'result') {\n this.deferred.reject(event.data.payload);\n return;\n }\n\n this.deferred.resolve(event.data.payload);\n }\n}\n\nexport default WorkerPoolWorker;\n\n// Quick shim to create deferred native promises\nPromise.deferred = function() {\n var result = {};\n\n result.promise = new Promise((resolve, reject) => {\n result.resolve = resolve;\n result.reject = reject;\n });\n\n return result;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/WorkerPoolWorker.js\n **/","/*\n * BufferGeometry helpers\n */\n\nimport THREE from 'three';\n\nvar Buffer = (function() {\n // Merge TypedArrays of the same type\n // Returns merged array as well as indexes for splitting the array\n var mergeFloat32Arrays = function(arrays) {\n var size = 0;\n var map = new Int32Array(arrays.length * 2);\n\n var lastIndex = 0;\n var length;\n\n // Find size of each array\n arrays.forEach((_array, index) => {\n length = _array.length;\n size += length;\n map.set([lastIndex, lastIndex + length], index * 2);\n lastIndex += length;\n });\n\n // Create a new array of total size\n var mergedArray = new Float32Array(size);\n\n // Add each array to the new array\n arrays.forEach((_array, index) => {\n mergedArray.set(_array, map[index * 2]);\n });\n\n return [\n mergedArray,\n map\n ];\n };\n\n var splitFloat32Array = function(data) {\n var arr = data[0];\n var map = data[1];\n\n var start;\n var arrays = [];\n\n // Iterate over map\n for (var i = 0; i < map.length / 2; i++) {\n start = i * 2;\n arrays.push(arr.subarray(map[start], map[start + 1]));\n }\n\n return arrays;\n };\n\n // TODO: Create a generic method that can work for any typed array\n var mergeUint8Arrays = function(arrays) {\n var size = 0;\n var map = new Int32Array(arrays.length * 2);\n\n var lastIndex = 0;\n var length;\n\n // Find size of each array\n arrays.forEach((_array, index) => {\n length = _array.length;\n size += length;\n map.set([lastIndex, lastIndex + length], index * 2);\n lastIndex += length;\n });\n\n // Create a new array of total size\n var mergedArray = new Uint8Array(size);\n\n // Add each array to the new array\n arrays.forEach((_array, index) => {\n mergedArray.set(_array, map[index * 2]);\n });\n\n return [\n mergedArray,\n map\n ];\n };\n\n // TODO: Dedupe with splitFloat32Array\n var splitUint8Array = function(data) {\n var arr = data[0];\n var map = data[1];\n\n var start;\n var arrays = [];\n\n // Iterate over map\n for (var i = 0; i < map.length / 2; i++) {\n start = i * 2;\n arrays.push(arr.subarray(map[start], map[start + 1]));\n }\n\n return arrays;\n };\n\n // Merge multiple attribute objects into a single attribute object\n //\n // Attribute objects must all use the same attribute keys\n var mergeAttributes = function(attributes) {\n var lengths = {};\n\n // Find array lengths\n attributes.forEach(_attributes => {\n for (var k in _attributes) {\n if (!lengths[k]) {\n lengths[k] = 0;\n }\n\n lengths[k] += _attributes[k].length;\n }\n });\n\n var mergedAttributes = {};\n\n // Set up arrays to merge into\n for (var k in lengths) {\n mergedAttributes[k] = new Float32Array(lengths[k]);\n }\n\n var lastLengths = {};\n\n attributes.forEach(_attributes => {\n for (var k in _attributes) {\n if (!lastLengths[k]) {\n lastLengths[k] = 0;\n }\n\n mergedAttributes[k].set(_attributes[k], lastLengths[k]);\n\n lastLengths[k] += _attributes[k].length;\n }\n });\n\n return mergedAttributes;\n };\n\n var createLineGeometry = function(lines, offset) {\n var geometry = new THREE.BufferGeometry();\n\n var vertices = new Float32Array(lines.verticesCount * 3);\n var colours = new Float32Array(lines.verticesCount * 3);\n\n var pickingIds;\n if (lines.pickingIds) {\n // One component per vertex (1)\n pickingIds = new Float32Array(lines.verticesCount);\n }\n\n var _vertices;\n var _colour;\n var _pickingId;\n\n var lastIndex = 0;\n\n for (var i = 0; i < lines.vertices.length; i++) {\n _vertices = lines.vertices[i];\n _colour = lines.colours[i];\n\n if (pickingIds) {\n _pickingId = lines.pickingIds[i];\n }\n\n for (var j = 0; j < _vertices.length; j++) {\n var ax = _vertices[j][0] + offset.x;\n var ay = _vertices[j][1];\n var az = _vertices[j][2] + offset.y;\n\n var c1 = _colour[j];\n\n vertices[lastIndex * 3 + 0] = ax;\n vertices[lastIndex * 3 + 1] = ay;\n vertices[lastIndex * 3 + 2] = az;\n\n colours[lastIndex * 3 + 0] = c1[0];\n colours[lastIndex * 3 + 1] = c1[1];\n colours[lastIndex * 3 + 2] = c1[2];\n\n if (pickingIds) {\n pickingIds[lastIndex] = _pickingId;\n }\n\n lastIndex++;\n }\n }\n\n // itemSize = 3 because there are 3 values (components) per vertex\n geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));\n geometry.addAttribute('color', new THREE.BufferAttribute(colours, 3));\n\n if (pickingIds) {\n geometry.addAttribute('pickingId', new THREE.BufferAttribute(pickingIds, 1));\n }\n\n geometry.computeBoundingBox();\n\n return geometry;\n };\n\n // TODO: Make picking IDs optional\n var createGeometry = function(attributes, offset) {\n var geometry = new THREE.BufferGeometry();\n\n // Three components per vertex per face (3 x 3 = 9)\n var vertices = new Float32Array(attributes.facesCount * 9);\n var normals = new Float32Array(attributes.facesCount * 9);\n var colours = new Float32Array(attributes.facesCount * 9);\n\n var pickingIds;\n if (attributes.pickingIds) {\n // One component per vertex per face (1 x 3 = 3)\n pickingIds = new Float32Array(attributes.facesCount * 3);\n }\n\n var pA = new THREE.Vector3();\n var pB = new THREE.Vector3();\n var pC = new THREE.Vector3();\n\n var cb = new THREE.Vector3();\n var ab = new THREE.Vector3();\n\n var index;\n var _faces;\n var _vertices;\n var _colour;\n var _pickingId;\n var lastIndex = 0;\n for (var i = 0; i < attributes.faces.length; i++) {\n _faces = attributes.faces[i];\n _vertices = attributes.vertices[i];\n _colour = attributes.colours[i];\n\n if (pickingIds) {\n _pickingId = attributes.pickingIds[i];\n }\n\n for (var j = 0; j < _faces.length; j++) {\n // Array of vertex indexes for the face\n index = _faces[j][0];\n\n var ax = _vertices[index][0] + offset.x;\n var ay = _vertices[index][1];\n var az = _vertices[index][2] + offset.y;\n\n var c1 = _colour[j][0];\n\n index = _faces[j][1];\n\n var bx = _vertices[index][0] + offset.x;\n var by = _vertices[index][1];\n var bz = _vertices[index][2] + offset.y;\n\n var c2 = _colour[j][1];\n\n index = _faces[j][2];\n\n var cx = _vertices[index][0] + offset.x;\n var cy = _vertices[index][1];\n var cz = _vertices[index][2] + offset.y;\n\n var c3 = _colour[j][2];\n\n // Flat face normals\n // From: http://threejs.org/examples/webgl_buffergeometry.html\n pA.set(ax, ay, az);\n pB.set(bx, by, bz);\n pC.set(cx, cy, cz);\n\n cb.subVectors(pC, pB);\n ab.subVectors(pA, pB);\n cb.cross(ab);\n\n cb.normalize();\n\n var nx = cb.x;\n var ny = cb.y;\n var nz = cb.z;\n\n vertices[lastIndex * 9 + 0] = ax;\n vertices[lastIndex * 9 + 1] = ay;\n vertices[lastIndex * 9 + 2] = az;\n\n normals[lastIndex * 9 + 0] = nx;\n normals[lastIndex * 9 + 1] = ny;\n normals[lastIndex * 9 + 2] = nz;\n\n colours[lastIndex * 9 + 0] = c1[0];\n colours[lastIndex * 9 + 1] = c1[1];\n colours[lastIndex * 9 + 2] = c1[2];\n\n vertices[lastIndex * 9 + 3] = bx;\n vertices[lastIndex * 9 + 4] = by;\n vertices[lastIndex * 9 + 5] = bz;\n\n normals[lastIndex * 9 + 3] = nx;\n normals[lastIndex * 9 + 4] = ny;\n normals[lastIndex * 9 + 5] = nz;\n\n colours[lastIndex * 9 + 3] = c2[0];\n colours[lastIndex * 9 + 4] = c2[1];\n colours[lastIndex * 9 + 5] = c2[2];\n\n vertices[lastIndex * 9 + 6] = cx;\n vertices[lastIndex * 9 + 7] = cy;\n vertices[lastIndex * 9 + 8] = cz;\n\n normals[lastIndex * 9 + 6] = nx;\n normals[lastIndex * 9 + 7] = ny;\n normals[lastIndex * 9 + 8] = nz;\n\n colours[lastIndex * 9 + 6] = c3[0];\n colours[lastIndex * 9 + 7] = c3[1];\n colours[lastIndex * 9 + 8] = c3[2];\n\n if (pickingIds) {\n pickingIds[lastIndex * 3 + 0] = _pickingId;\n pickingIds[lastIndex * 3 + 1] = _pickingId;\n pickingIds[lastIndex * 3 + 2] = _pickingId;\n }\n\n lastIndex++;\n }\n }\n\n // itemSize = 3 because there are 3 values (components) per vertex\n geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));\n geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3));\n geometry.addAttribute('color', new THREE.BufferAttribute(colours, 3));\n\n if (pickingIds) {\n geometry.addAttribute('pickingId', new THREE.BufferAttribute(pickingIds, 1));\n }\n\n geometry.computeBoundingBox();\n\n return geometry;\n };\n\n var textEncoder = new TextEncoder('utf-8');\n var textDecoder = new TextDecoder('utf-8');\n\n var stringToUint8Array = function(str) {\n return textEncoder.encode(str);\n };\n\n var uint8ArrayToString = function(ab) {\n return textDecoder.decode(ab);\n };\n\n return {\n mergeFloat32Arrays: mergeFloat32Arrays,\n splitFloat32Array: splitFloat32Array,\n mergeUint8Arrays: mergeUint8Arrays,\n splitUint8Array: splitUint8Array,\n mergeAttributes: mergeAttributes,\n createLineGeometry: createLineGeometry,\n createGeometry: createGeometry,\n stringToUint8Array: stringToUint8Array,\n uint8ArrayToString: uint8ArrayToString\n };\n})();\n\nexport default Buffer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Buffer.js\n **/","var Stringify = (function() {\n var functionToString = function(f) {\n return f.toString();\n };\n\n // Based on https://github.com/tangrams/tangram/blob/2a31893c814cf15d5077f87ffa10af20160716b9/src/utils/utils.js#L245\n var stringToFunction = function(str) {\n if (typeof str === 'string' && str.match(/^\\s*function\\s*\\w*\\s*\\([\\s\\S]*\\)\\s*\\{[\\s\\S]*\\}/m) != null) {\n var f;\n\n try {\n eval('f = ' + str);\n return f;\n } catch (err) {\n return str;\n }\n }\n };\n\n return {\n functionToString: functionToString,\n stringToFunction: stringToFunction\n };\n})();\n\nexport default Stringify;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Stringify.js\n **/","// TODO: Move duplicated logic between geometry layrs into GeometryLayer\n\n// TODO: Look at ways to drop unneeded references to array buffers, etc to\n// reduce memory footprint\n\n// TODO: Support dynamic updating / hiding / animation of geometry\n//\n// This could be pretty hard as it's all packed away within BufferGeometry and\n// may even be merged by another layer (eg. GeoJSONLayer)\n//\n// How much control should this layer support? Perhaps a different or custom\n// layer would be better suited for animation, for example.\n\n// TODO: Allow _setBufferAttributes to use a custom function passed in to\n// generate a custom mesh\n\nimport Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport THREE from 'three';\nimport Geo from '../../geo/Geo';\nimport {latLon as LatLon} from '../../geo/LatLon';\nimport {point as Point} from '../../geo/Point';\nimport earcut from 'earcut';\nimport extrudePolygon from '../../util/extrudePolygon';\nimport PickingMaterial from '../../engine/PickingMaterial';\nimport Buffer from '../../util/Buffer';\n\nclass PolygonLayer extends Layer {\n constructor(coordinates, options) {\n var defaults = {\n output: true,\n interactive: false,\n // Custom material override\n //\n // TODO: Should this be in the style object?\n polygonMaterial: null,\n onPolygonMesh: null,\n onBufferAttributes: null,\n // This default style is separate to Util.GeoJSON.defaultStyle\n style: {\n color: '#ffffff',\n transparent: false,\n opacity: 1,\n blending: THREE.NormalBlending,\n height: 0\n }\n };\n\n var _options = extend({}, defaults, options);\n\n super(_options);\n\n // Return coordinates as array of polygons so it's easy to support\n // MultiPolygon features (a single polygon would be a MultiPolygon with a\n // single polygon in the array)\n this._coordinates = (PolygonLayer.isSingle(coordinates)) ? [coordinates] : coordinates;\n }\n\n _onAdd(world) {\n return new Promise((resolve, reject) => {\n this._setCoordinates();\n\n if (this._options.interactive) {\n // Only add to picking mesh if this layer is controlling output\n //\n // Otherwise, assume another component will eventually add a mesh to\n // the picking scene\n if (this.isOutput()) {\n this._pickingMesh = new THREE.Object3D();\n this.addToPicking(this._pickingMesh);\n }\n\n this._setPickingId();\n this._addPickingEvents();\n }\n\n PolygonLayer.SetBufferAttributes(this._projectedCoordinates, this._options).then((result) => {\n this._bufferAttributes = Buffer.mergeAttributes(result.attributes);\n\n if (result.outlineAttributes.length > 0) {\n this._outlineBufferAttributes = Buffer.mergeAttributes(result.outlineAttributes);\n }\n\n this._flat = result.flat;\n\n if (this.isOutput()) {\n var attributeLengths = {\n positions: 3,\n normals: 3,\n colors: 3,\n tops: 1\n };\n\n if (this._options.interactive) {\n attributeLengths.pickingIds = 1;\n }\n\n var style = this._options.style;\n\n // Set mesh if not merging elsewhere\n PolygonLayer.SetMesh(this._bufferAttributes, attributeLengths, this._flat, style, this._options, this._world._environment._skybox).then((result) => {\n // Output mesh\n this.add(result.mesh);\n\n if (result.pickingMesh) {\n this._pickingMesh.add(result.pickingMesh);\n }\n });\n }\n\n result.attributes = null;\n result.outlineAttributes = null;\n result = null;\n\n resolve(this);\n }).catch(reject);\n });\n }\n\n // Return center of polygon as a LatLon\n //\n // This is used for things like placing popups / UI elements on the layer\n //\n // TODO: Find proper center position instead of returning first coordinate\n // SEE: https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Polygon.js#L15\n getCenter() {\n return this._center;\n }\n\n // Return polygon bounds in geographic coordinates\n //\n // TODO: Implement getBounds()\n getBounds() {}\n\n // Get unique ID for picking interaction\n _setPickingId() {\n this._pickingId = this.getPickingId();\n }\n\n // Set up and re-emit interaction events\n _addPickingEvents() {\n // TODO: Find a way to properly remove this listener on destroy\n this._world.on('pick-' + this._pickingId, (point2d, point3d, intersects) => {\n // Re-emit click event from the layer\n this.emit('click', this, point2d, point3d, intersects);\n });\n }\n\n // Create and store reference to THREE.BufferAttribute data for this layer\n static SetBufferAttributes(coordinates, options) {\n return new Promise((resolve) => {\n var height = 0;\n\n // Convert height into world units\n if (options.style.height && options.style.height !== 0) {\n height = Geo.metresToWorld(options.style.height, options.pointScale);\n }\n\n var colour = new THREE.Color();\n colour.set(options.style.color);\n\n // Light and dark colours used for poor-mans AO gradient on object sides\n var light = new THREE.Color(0xffffff);\n var shadow = new THREE.Color(0x666666);\n\n var flat = true;\n\n var outlineAttributes = [];\n\n // For each polygon\n var attributes = coordinates.map(_coordinates => {\n // Convert coordinates to earcut format\n var _earcut = PolygonLayer.ToEarcut(_coordinates);\n\n // Triangulate faces using earcut\n var faces = PolygonLayer.Triangulate(_earcut.vertices, _earcut.holes, _earcut.dimensions);\n\n var groupedVertices = [];\n for (i = 0, il = _earcut.vertices.length; i < il; i += _earcut.dimensions) {\n groupedVertices.push(_earcut.vertices.slice(i, i + _earcut.dimensions));\n }\n\n var extruded = extrudePolygon(groupedVertices, faces, {\n bottom: 0,\n top: height\n });\n\n var topColor = colour.clone().multiply(light);\n var bottomColor = colour.clone().multiply(shadow);\n\n var _vertices = extruded.positions;\n var _faces = [];\n var _colours = [];\n var _tops = [];\n\n var _colour;\n extruded.top.forEach((face, fi) => {\n _colour = [];\n\n _colour.push([colour.r, colour.g, colour.b]);\n _colour.push([colour.r, colour.g, colour.b]);\n _colour.push([colour.r, colour.g, colour.b]);\n\n _tops.push([true, true, true]);\n\n _faces.push(face);\n _colours.push(_colour);\n });\n\n if (extruded.sides) {\n flat = false;\n\n // Set up colours for every vertex with poor-mans AO on the sides\n extruded.sides.forEach((face, fi) => {\n _colour = [];\n\n // First face is always bottom-bottom-top\n if (fi % 2 === 0) {\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n _colour.push([topColor.r, topColor.g, topColor.b]);\n\n _tops.push([false, false, true]);\n // Reverse winding for the second face\n // top-top-bottom\n } else {\n _colour.push([topColor.r, topColor.g, topColor.b]);\n _colour.push([topColor.r, topColor.g, topColor.b]);\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\n _tops.push([true, true, false]);\n }\n\n _faces.push(face);\n _colours.push(_colour);\n });\n }\n\n // Skip bottom as there's no point rendering it\n // allFaces.push(extruded.faces);\n\n var polygon = {\n vertices: _vertices,\n faces: _faces,\n colours: _colours,\n tops: _tops,\n facesCount: _faces.length\n };\n\n if (options.style.outline) {\n var outlineColour = new THREE.Color();\n outlineColour.set(options.style.outlineColor || 0x000000);\n\n outlineAttributes.push(PolygonLayer.Set2DOutline(_coordinates, outlineColour));\n }\n\n if (options.interactive && options.pickingId) {\n // Inject picking ID\n polygon.pickingId = options.pickingId;\n }\n\n // Convert polygon representation to proper attribute arrays\n return PolygonLayer.ToAttributes(polygon);\n });\n\n resolve({\n attributes: attributes,\n outlineAttributes: outlineAttributes,\n flat: flat\n });\n });\n }\n\n getBufferAttributes() {\n return this._bufferAttributes;\n }\n\n getOutlineBufferAttributes() {\n return this._outlineBufferAttributes;\n }\n\n // Used by external components to clear some memory when the attributes\n // are no longer required to be stored in this layer\n //\n // For example, you would want to clear the attributes here after merging them\n // using something like the GeoJSONLayer\n clearBufferAttributes() {\n this._bufferAttributes = null;\n this._outlineBufferAttributes = null;\n }\n\n // Threshold angle is currently in rads\n static Set2DOutline(coordinates, colour) {\n var _vertices = [];\n\n coordinates.forEach((ring) => {\n var _ring = ring.map((coordinate) => {\n return [coordinate.x, 0, coordinate.y];\n });\n\n // Add in duplicate vertices for line segments to work\n var verticeCount = _ring.length;\n var first = true;\n while (--verticeCount) {\n if (first || verticeCount === 0) {\n first = false;\n continue;\n }\n\n _ring.splice(verticeCount + 1, 0, _ring[verticeCount]);\n }\n\n _vertices = _vertices.concat(_ring);\n });\n\n _colour = [colour.r, colour.g, colour.b];\n\n var vertices = new Float32Array(_vertices.length * 3);\n var colours = new Float32Array(_vertices.length * 3);\n\n var lastIndex = 0;\n\n for (var i = 0; i < _vertices.length; i++) {\n var ax = _vertices[i][0];\n var ay = _vertices[i][1];\n var az = _vertices[i][2];\n\n var c1 = _colour;\n\n vertices[lastIndex * 3 + 0] = ax;\n vertices[lastIndex * 3 + 1] = ay;\n vertices[lastIndex * 3 + 2] = az;\n\n colours[lastIndex * 3 + 0] = c1[0];\n colours[lastIndex * 3 + 1] = c1[1];\n colours[lastIndex * 3 + 2] = c1[2];\n\n lastIndex++;\n }\n\n var attributes = {\n positions: vertices,\n colors: colours\n };\n\n return attributes;\n }\n\n // Used by external components to clear some memory when the coordinates\n // are no longer required to be stored in this layer\n //\n // For example, you would want to clear the coordinates here after this\n // layer is merged in something like the GeoJSONLayer\n clearCoordinates() {\n this._coordinates = null;\n this._projectedCoordinates = null;\n }\n\n static SetMesh(attributes, attributeLengths, flat, style, options, skybox) {\n var geometry = new THREE.BufferGeometry();\n\n for (var key in attributes) {\n geometry.addAttribute(key.slice(0, -1), new THREE.BufferAttribute(attributes[key], attributeLengths[key]));\n }\n\n geometry.computeBoundingBox();\n\n var material;\n if (options.polygonMaterial && options.polygonMaterial instanceof THREE.Material) {\n material = options.polygonMaterial;\n } else if (!skybox) {\n material = new THREE.MeshPhongMaterial({\n vertexColors: THREE.VertexColors,\n side: THREE.BackSide,\n transparent: style.transparent,\n opacity: style.opacity,\n blending: style.blending\n });\n } else {\n material = new THREE.MeshStandardMaterial({\n vertexColors: THREE.VertexColors,\n side: THREE.BackSide,\n transparent: style.transparent,\n opacity: style.opacity,\n blending: style.blending\n });\n material.roughness = 1;\n material.metalness = 0.1;\n material.envMapIntensity = 3;\n material.envMap = skybox.getRenderTarget();\n }\n\n var mesh;\n\n // Pass mesh through callback, if defined\n if (typeof options.onPolygonMesh === 'function') {\n mesh = options.onPolygonMesh(geometry, material);\n } else {\n mesh = new THREE.Mesh(geometry, material);\n\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n }\n\n if (flat) {\n material.depthWrite = false;\n\n var renderOrder = (style.renderOrder !== undefined) ? style.renderOrder : 3;\n mesh.renderOrder = renderOrder;\n }\n\n if (options.interactive) {\n material = new PickingMaterial();\n material.side = THREE.BackSide;\n\n var pickingMesh = new THREE.Mesh(geometry, material);\n }\n\n return Promise.resolve({\n mesh: mesh,\n pickingMesh: pickingMesh\n });\n }\n\n // Convert and project coordinates\n //\n // TODO: Calculate bounds\n _setCoordinates() {\n this._bounds = [];\n this._coordinates = this._convertCoordinates(this._coordinates);\n\n this._projectedBounds = [];\n this._projectedCoordinates = this._projectCoordinates();\n\n this._center = this._coordinates[0][0][0];\n }\n\n // Recursively convert input coordinates into LatLon objects\n //\n // Calculate geographic bounds at the same time\n //\n // TODO: Calculate geographic bounds\n _convertCoordinates(coordinates) {\n return coordinates.map(_coordinates => {\n return _coordinates.map(ring => {\n return ring.map(coordinate => {\n return LatLon(coordinate[1], coordinate[0]);\n });\n });\n });\n }\n\n // Recursively project coordinates into world positions\n //\n // Calculate world bounds, offset and pointScale at the same time\n //\n // TODO: Calculate world bounds\n _projectCoordinates() {\n var point;\n return this._coordinates.map(_coordinates => {\n return _coordinates.map(ring => {\n return ring.map(latlon => {\n point = this._world.latLonToPoint(latlon);\n\n // TODO: Is offset ever being used or needed?\n if (!this._offset) {\n this._offset = Point(0, 0);\n this._offset.x = -1 * point.x;\n this._offset.y = -1 * point.y;\n\n this._options.pointScale = this._world.pointScale(latlon);\n }\n\n return point;\n });\n });\n });\n }\n\n // Convert coordinates array to something earcut can understand\n static ToEarcut(coordinates) {\n var dim = 2;\n var result = {vertices: [], holes: [], dimensions: dim};\n var holeIndex = 0;\n\n for (var i = 0; i < coordinates.length; i++) {\n for (var j = 0; j < coordinates[i].length; j++) {\n // for (var d = 0; d < dim; d++) {\n result.vertices.push(coordinates[i][j].x);\n result.vertices.push(coordinates[i][j].y);\n // }\n }\n if (i > 0) {\n holeIndex += coordinates[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n\n return result;\n }\n\n // Triangulate earcut-based input using earcut\n static Triangulate(contour, holes, dim) {\n // console.time('earcut');\n\n var faces = earcut(contour, holes, dim);\n var result = [];\n\n for (i = 0, il = faces.length; i < il; i += 3) {\n result.push(faces.slice(i, i + 3));\n }\n\n // console.timeEnd('earcut');\n\n return result;\n }\n\n // Transform polygon representation into attribute arrays that can be used by\n // THREE.BufferGeometry\n //\n // TODO: Can this be simplified? It's messy and huge\n static ToAttributes(polygon) {\n // Three components per vertex per face (3 x 3 = 9)\n var positions = new Float32Array(polygon.facesCount * 9);\n var normals = new Float32Array(polygon.facesCount * 9);\n var colours = new Float32Array(polygon.facesCount * 9);\n\n // One component per vertex per face (1 x 3 = 3)\n var tops = new Float32Array(polygon.facesCount * 3);\n\n var pickingIds;\n if (polygon.pickingId) {\n // One component per vertex per face (1 x 3 = 3)\n pickingIds = new Float32Array(polygon.facesCount * 3);\n }\n\n var pA = new THREE.Vector3();\n var pB = new THREE.Vector3();\n var pC = new THREE.Vector3();\n\n var cb = new THREE.Vector3();\n var ab = new THREE.Vector3();\n\n var index;\n\n var _faces = polygon.faces;\n var _vertices = polygon.vertices;\n var _colour = polygon.colours;\n var _tops = polygon.tops;\n\n var _pickingId;\n if (pickingIds) {\n _pickingId = polygon.pickingId;\n }\n\n var lastIndex = 0;\n\n for (var i = 0; i < _faces.length; i++) {\n // Array of vertex indexes for the face\n index = _faces[i][0];\n\n var ax = _vertices[index][0];\n var ay = _vertices[index][1];\n var az = _vertices[index][2];\n\n var c1 = _colour[i][0];\n var t1 = _tops[i][0];\n\n index = _faces[i][1];\n\n var bx = _vertices[index][0];\n var by = _vertices[index][1];\n var bz = _vertices[index][2];\n\n var c2 = _colour[i][1];\n var t2 = _tops[i][1];\n\n index = _faces[i][2];\n\n var cx = _vertices[index][0];\n var cy = _vertices[index][1];\n var cz = _vertices[index][2];\n\n var c3 = _colour[i][2];\n var t3 = _tops[i][2];\n\n // Flat face normals\n // From: http://threejs.org/examples/webgl_buffergeometry.html\n pA.set(ax, ay, az);\n pB.set(bx, by, bz);\n pC.set(cx, cy, cz);\n\n cb.subVectors(pC, pB);\n ab.subVectors(pA, pB);\n cb.cross(ab);\n\n cb.normalize();\n\n var nx = cb.x;\n var ny = cb.y;\n var nz = cb.z;\n\n positions[lastIndex * 9 + 0] = ax;\n positions[lastIndex * 9 + 1] = ay;\n positions[lastIndex * 9 + 2] = az;\n\n normals[lastIndex * 9 + 0] = nx;\n normals[lastIndex * 9 + 1] = ny;\n normals[lastIndex * 9 + 2] = nz;\n\n colours[lastIndex * 9 + 0] = c1[0];\n colours[lastIndex * 9 + 1] = c1[1];\n colours[lastIndex * 9 + 2] = c1[2];\n\n positions[lastIndex * 9 + 3] = bx;\n positions[lastIndex * 9 + 4] = by;\n positions[lastIndex * 9 + 5] = bz;\n\n normals[lastIndex * 9 + 3] = nx;\n normals[lastIndex * 9 + 4] = ny;\n normals[lastIndex * 9 + 5] = nz;\n\n colours[lastIndex * 9 + 3] = c2[0];\n colours[lastIndex * 9 + 4] = c2[1];\n colours[lastIndex * 9 + 5] = c2[2];\n\n positions[lastIndex * 9 + 6] = cx;\n positions[lastIndex * 9 + 7] = cy;\n positions[lastIndex * 9 + 8] = cz;\n\n normals[lastIndex * 9 + 6] = nx;\n normals[lastIndex * 9 + 7] = ny;\n normals[lastIndex * 9 + 8] = nz;\n\n colours[lastIndex * 9 + 6] = c3[0];\n colours[lastIndex * 9 + 7] = c3[1];\n colours[lastIndex * 9 + 8] = c3[2];\n\n tops[lastIndex * 3 + 0] = t1;\n tops[lastIndex * 3 + 1] = t2;\n tops[lastIndex * 3 + 2] = t3;\n\n if (pickingIds) {\n pickingIds[lastIndex * 3 + 0] = _pickingId;\n pickingIds[lastIndex * 3 + 1] = _pickingId;\n pickingIds[lastIndex * 3 + 2] = _pickingId;\n }\n\n lastIndex++;\n }\n\n var attributes = {\n positions: positions,\n normals: normals,\n colors: colours,\n tops: tops\n };\n\n if (pickingIds) {\n attributes.pickingIds = pickingIds;\n }\n\n return attributes;\n }\n\n // Returns true if the polygon is flat (has no height)\n isFlat() {\n return this._flat;\n }\n\n // Returns true if coordinates refer to a single geometry\n //\n // For example, not coordinates for a MultiPolygon GeoJSON feature\n static isSingle(coordinates) {\n return !Array.isArray(coordinates[0][0][0]);\n }\n\n // TODO: Make sure this is cleaning everything\n destroy() {\n if (this._pickingMesh) {\n // TODO: Properly dispose of picking mesh\n this._pickingMesh = null;\n }\n\n this.clearCoordinates();\n this.clearBufferAttributes();\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\nexport default PolygonLayer;\n\nvar noNew = function(coordinates, options) {\n return new PolygonLayer(coordinates, options);\n};\n\nexport {noNew as polygonLayer};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/geometry/PolygonLayer.js\n **/","import THREE from 'three';\nimport PickingShader from './PickingShader';\n\n// FROM: https://github.com/brianxu/GPUPicker/blob/master/GPUPicker.js\n\nvar PickingMaterial = function() {\n THREE.ShaderMaterial.call(this, {\n uniforms: {\n size: {\n type: 'f',\n value: 0.01,\n },\n scale: {\n type: 'f',\n value: 400,\n }\n },\n // attributes: ['position', 'id'],\n vertexShader: PickingShader.vertexShader,\n fragmentShader: PickingShader.fragmentShader\n });\n\n this.linePadding = 2;\n};\n\nPickingMaterial.prototype = Object.create(THREE.ShaderMaterial.prototype);\n\nPickingMaterial.prototype.constructor = PickingMaterial;\n\nPickingMaterial.prototype.setPointSize = function(size) {\n this.uniforms.size.value = size;\n};\n\nPickingMaterial.prototype.setPointScale = function(scale) {\n this.uniforms.scale.value = scale;\n};\n\nexport default PickingMaterial;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/PickingMaterial.js\n **/","// FROM: https://github.com/brianxu/GPUPicker/blob/master/GPUPicker.js\n\nvar PickingShader = {\n vertexShader: [\n\t\t'attribute float pickingId;',\n\t\t// '',\n\t\t// 'uniform float size;',\n\t\t// 'uniform float scale;',\n\t\t'',\n\t\t'varying vec4 worldId;',\n\t\t'',\n\t\t'void main() {',\n\t\t' vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );',\n\t\t// ' gl_PointSize = size * ( scale / length( mvPosition.xyz ) );',\n\t\t' vec3 a = fract(vec3(1.0/255.0, 1.0/(255.0*255.0), 1.0/(255.0*255.0*255.0)) * pickingId);',\n\t\t' a -= a.xxy * vec3(0.0, 1.0/255.0, 1.0/255.0);',\n\t\t' worldId = vec4(a,1);',\n\t\t' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\t\t'}'\n\t].join('\\n'),\n\n fragmentShader: [\n\t\t'#ifdef GL_ES\\n',\n\t\t'precision highp float;\\n',\n\t\t'#endif\\n',\n\t\t'',\n\t\t'varying vec4 worldId;',\n\t\t'',\n\t\t'void main() {',\n\t\t' gl_FragColor = worldId;',\n\t\t'}'\n\t].join('\\n')\n};\n\nexport default PickingShader;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/PickingShader.js\n **/","// TODO: Move duplicated logic between geometry layrs into GeometryLayer\n\n// TODO: Look at ways to drop unneeded references to array buffers, etc to\n// reduce memory footprint\n\n// TODO: Provide alternative output using tubes and splines / curves\n\n// TODO: Support dynamic updating / hiding / animation of geometry\n//\n// This could be pretty hard as it's all packed away within BufferGeometry and\n// may even be merged by another layer (eg. GeoJSONLayer)\n//\n// How much control should this layer support? Perhaps a different or custom\n// layer would be better suited for animation, for example.\n\n// TODO: Allow _setBufferAttributes to use a custom function passed in to\n// generate a custom mesh\n\nimport Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport THREE from 'three';\nimport Geo from '../../geo/Geo';\nimport {latLon as LatLon} from '../../geo/LatLon';\nimport {point as Point} from '../../geo/Point';\nimport PickingMaterial from '../../engine/PickingMaterial';\nimport Buffer from '../../util/Buffer';\n\nclass PolylineLayer extends Layer {\n constructor(coordinates, options) {\n var defaults = {\n output: true,\n interactive: false,\n // Custom material override\n //\n // TODO: Should this be in the style object?\n polylineMaterial: null,\n onPolylineMesh: null,\n onBufferAttributes: null,\n // This default style is separate to Util.GeoJSON.defaultStyle\n style: {\n lineOpacity: 1,\n lineTransparent: false,\n lineColor: '#ffffff',\n lineWidth: 1,\n lineBlending: THREE.NormalBlending\n }\n };\n\n var _options = extend({}, defaults, options);\n\n super(_options);\n\n // Return coordinates as array of lines so it's easy to support\n // MultiLineString features (a single line would be a MultiLineString with a\n // single line in the array)\n this._coordinates = (PolylineLayer.isSingle(coordinates)) ? [coordinates] : coordinates;\n\n // Polyline features are always flat (for now at least)\n this._flat = true;\n }\n\n _onAdd(world) {\n return new Promise((resolve, reject) => {\n this._setCoordinates();\n\n if (this._options.interactive) {\n // Only add to picking mesh if this layer is controlling output\n //\n // Otherwise, assume another component will eventually add a mesh to\n // the picking scene\n if (this.isOutput()) {\n this._pickingMesh = new THREE.Object3D();\n this.addToPicking(this._pickingMesh);\n }\n\n this._setPickingId();\n this._addPickingEvents();\n }\n\n // Store geometry representation as instances of THREE.BufferAttribute\n PolylineLayer.SetBufferAttributes(this._projectedCoordinates, this._options).then((result) => {\n this._bufferAttributes = Buffer.mergeAttributes(result.attributes);\n this._flat = result.flat;\n\n var attributeLengths = {\n positions: 3,\n colors: 3\n };\n\n if (this._options.interactive) {\n attributeLengths.pickingIds = 1;\n }\n\n if (this.isOutput()) {\n var style = this._options.style;\n\n // Set mesh if not merging elsewhere\n PolylineLayer.SetMesh(this._bufferAttributes, attributeLengths, this._flat, style, this._options).then((result) => {\n // Output mesh\n this.add(result.mesh);\n\n if (result.pickingMesh) {\n this._pickingMesh.add(result.pickingMesh);\n }\n });\n }\n\n result.attributes = null;\n result = null;\n\n resolve(this);\n });\n });\n }\n\n // Return center of polyline as a LatLon\n //\n // This is used for things like placing popups / UI elements on the layer\n //\n // TODO: Find proper center position instead of returning first coordinate\n // SEE: https://github.com/Leaflet/Leaflet/blob/master/src/layer/vector/Polyline.js#L59\n getCenter() {\n return this._center;\n }\n\n // Return line bounds in geographic coordinates\n //\n // TODO: Implement getBounds()\n getBounds() {}\n\n // Get unique ID for picking interaction\n _setPickingId() {\n this._pickingId = this.getPickingId();\n }\n\n // Set up and re-emit interaction events\n _addPickingEvents() {\n // TODO: Find a way to properly remove this listener on destroy\n this._world.on('pick-' + this._pickingId, (point2d, point3d, intersects) => {\n // Re-emit click event from the layer\n this.emit('click', this, point2d, point3d, intersects);\n });\n }\n\n static SetBufferAttributes(coordinates, options) {\n return new Promise((resolve) => {\n var height = 0;\n\n // Convert height into world units\n if (options.style.lineHeight) {\n height = Geo.metresToWorld(options.style.lineHeight, options.pointScale);\n }\n\n var colour = new THREE.Color();\n colour.set(options.style.lineColor);\n\n var flat = true;\n\n // For each line\n var attributes = coordinates.map(_projectedCoordinates => {\n var _vertices = [];\n var _colours = [];\n\n // Connect coordinate with the next to make a pair\n //\n // LineSegments requires pairs of vertices so repeat the last point if\n // there's an odd number of vertices\n var nextCoord;\n _projectedCoordinates.forEach((coordinate, index) => {\n _colours.push([colour.r, colour.g, colour.b]);\n _vertices.push([coordinate.x, height, coordinate.y]);\n\n nextCoord = (_projectedCoordinates[index + 1]) ? _projectedCoordinates[index + 1] : coordinate;\n\n _colours.push([colour.r, colour.g, colour.b]);\n _vertices.push([nextCoord.x, height, nextCoord.y]);\n });\n\n var line = {\n vertices: _vertices,\n colours: _colours,\n verticesCount: _vertices.length\n };\n\n if (options.interactive && options.pickingId) {\n // Inject picking ID\n line.pickingId = options.pickingId;\n }\n\n // Convert line representation to proper attribute arrays\n return PolylineLayer.ToAttributes(line);\n });\n\n resolve({\n attributes: attributes,\n flat: flat\n });\n });\n }\n\n getBufferAttributes() {\n return this._bufferAttributes;\n }\n\n // Used by external components to clear some memory when the attributes\n // are no longer required to be stored in this layer\n //\n // For example, you would want to clear the attributes here after merging them\n // using something like the GeoJSONLayer\n clearBufferAttributes() {\n this._bufferAttributes = null;\n }\n\n // Used by external components to clear some memory when the coordinates\n // are no longer required to be stored in this layer\n //\n // For example, you would want to clear the coordinates here after this\n // layer is merged in something like the GeoJSONLayer\n clearCoordinates() {\n this._coordinates = null;\n this._projectedCoordinates = null;\n }\n\n static SetMesh(attributes, attributeLengths, flat, style, options) {\n var geometry = new THREE.BufferGeometry();\n\n for (var key in attributes) {\n geometry.addAttribute(key.slice(0, -1), new THREE.BufferAttribute(attributes[key], attributeLengths[key]));\n }\n\n geometry.computeBoundingBox();\n\n var material;\n if (options.polylineMaterial && options.polylineMaterial instanceof THREE.Material) {\n material = options.polylineMaterial;\n } else {\n material = new THREE.LineBasicMaterial({\n vertexColors: THREE.VertexColors,\n linewidth: style.lineWidth,\n transparent: style.lineTransparent,\n opacity: style.lineOpacity,\n blending: style.lineBlending\n });\n }\n\n var mesh;\n\n // Pass mesh through callback, if defined\n if (typeof options.onPolylineMesh === 'function') {\n mesh = options.onPolylineMesh(geometry, material);\n } else {\n mesh = new THREE.LineSegments(geometry, material);\n\n if (style.lineRenderOrder !== undefined) {\n material.depthWrite = false;\n mesh.renderOrder = style.lineRenderOrder;\n }\n\n mesh.castShadow = true;\n // mesh.receiveShadow = true;\n }\n\n if (options.interactive) {\n material = new PickingMaterial();\n // material.side = THREE.BackSide;\n\n // Make the line wider / easier to pick\n material.linewidth = style.lineWidth + material.linePadding;\n\n var pickingMesh = new THREE.LineSegments(geometry, material);\n }\n\n return Promise.resolve({\n mesh: mesh,\n pickingMesh: pickingMesh\n });\n }\n\n // Convert and project coordinates\n //\n // TODO: Calculate bounds\n _setCoordinates() {\n this._bounds = [];\n this._coordinates = this._convertCoordinates(this._coordinates);\n\n this._projectedBounds = [];\n this._projectedCoordinates = this._projectCoordinates();\n\n this._center = this._coordinates[0][0];\n }\n\n // Recursively convert input coordinates into LatLon objects\n //\n // Calculate geographic bounds at the same time\n //\n // TODO: Calculate geographic bounds\n _convertCoordinates(coordinates) {\n return coordinates.map(_coordinates => {\n return _coordinates.map(coordinate => {\n return LatLon(coordinate[1], coordinate[0]);\n });\n });\n }\n\n // Recursively project coordinates into world positions\n //\n // Calculate world bounds, offset and pointScale at the same time\n //\n // TODO: Calculate world bounds\n _projectCoordinates() {\n var point;\n return this._coordinates.map(_coordinates => {\n return _coordinates.map(latlon => {\n point = this._world.latLonToPoint(latlon);\n\n // TODO: Is offset ever being used or needed?\n if (!this._offset) {\n this._offset = Point(0, 0);\n this._offset.x = -1 * point.x;\n this._offset.y = -1 * point.y;\n\n this._options.pointScale = this._world.pointScale(latlon);\n }\n\n return point;\n });\n });\n }\n\n static ToAttributes(line) {\n // Three components per vertex\n var vertices = new Float32Array(line.verticesCount * 3);\n var colours = new Float32Array(line.verticesCount * 3);\n\n var pickingIds;\n if (line.pickingId) {\n // One component per vertex\n pickingIds = new Float32Array(line.verticesCount);\n }\n\n var _vertices = line.vertices;\n var _colour = line.colours;\n\n var _pickingId;\n if (pickingIds) {\n _pickingId = line.pickingId;\n }\n\n var lastIndex = 0;\n\n for (var i = 0; i < _vertices.length; i++) {\n var ax = _vertices[i][0];\n var ay = _vertices[i][1];\n var az = _vertices[i][2];\n\n var c1 = _colour[i];\n\n vertices[lastIndex * 3 + 0] = ax;\n vertices[lastIndex * 3 + 1] = ay;\n vertices[lastIndex * 3 + 2] = az;\n\n colours[lastIndex * 3 + 0] = c1[0];\n colours[lastIndex * 3 + 1] = c1[1];\n colours[lastIndex * 3 + 2] = c1[2];\n\n if (pickingIds) {\n pickingIds[lastIndex] = _pickingId;\n }\n\n lastIndex++;\n }\n\n var attributes = {\n positions: vertices,\n colors: colours\n };\n\n if (pickingIds) {\n attributes.pickingIds = pickingIds;\n }\n\n return attributes;\n }\n\n // Returns true if the line is flat (has no height)\n isFlat() {\n return this._flat;\n }\n\n // Returns true if coordinates refer to a single geometry\n //\n // For example, not coordinates for a MultiLineString GeoJSON feature\n static isSingle(coordinates) {\n return !Array.isArray(coordinates[0][0]);\n }\n\n destroy() {\n if (this._pickingMesh) {\n // TODO: Properly dispose of picking mesh\n this._pickingMesh = null;\n }\n\n this.clearCoordinates();\n this.clearBufferAttributes();\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\nexport default PolylineLayer;\n\nvar noNew = function(coordinates, options) {\n return new PolylineLayer(coordinates, options);\n};\n\nexport {noNew as polylineLayer};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/geometry/PolylineLayer.js\n **/","// TODO: Move duplicated logic between geometry layrs into GeometryLayer\n\n// TODO: Look at ways to drop unneeded references to array buffers, etc to\n// reduce memory footprint\n\n// TODO: Point features may be using custom models / meshes and so an approach\n// needs to be found to allow these to be brokwn down into buffer attributes for\n// merging\n//\n// Can probably use fromGeometry() or setFromObject() from THREE.BufferGeometry\n// and pull out the attributes\n\n// TODO: Support sprite objects using textures\n\n// TODO: Provide option to billboard geometry so it always faces the camera\n\n// TODO: Support dynamic updating / hiding / animation of geometry\n//\n// This could be pretty hard as it's all packed away within BufferGeometry and\n// may even be merged by another layer (eg. GeoJSONLayer)\n//\n// How much control should this layer support? Perhaps a different or custom\n// layer would be better suited for animation, for example.\n\nimport Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport THREE from 'three';\nimport Geo from '../../geo/Geo';\nimport {latLon as LatLon} from '../../geo/LatLon';\nimport {point as Point} from '../../geo/Point';\nimport PickingMaterial from '../../engine/PickingMaterial';\nimport Buffer from '../../util/Buffer';\nimport PolygonLayer from './PolygonLayer';\n\nclass PointLayer extends Layer {\n constructor(coordinates, options) {\n var defaults = {\n output: true,\n interactive: false,\n // THREE.Geometry or THREE.BufferGeometry to use for point output\n pointGeometry: null,\n // Custom material override\n //\n // TODO: Should this be in the style object?\n pointMaterial: null,\n onPointMesh: null,\n // This default style is separate to Util.GeoJSON.defaultStyle\n style: {\n pointColor: '#ff0000'\n }\n };\n\n var _options = extend({}, defaults, options);\n\n super(_options);\n\n // Return coordinates as array of points so it's easy to support\n // MultiPoint features (a single point would be a MultiPoint with a\n // single point in the array)\n this._coordinates = (PointLayer.isSingle(coordinates)) ? [coordinates] : coordinates;\n\n this._flat = false;\n }\n\n _onAdd(world) {\n return new Promise((resolve, reject) => {\n this._setCoordinates();\n\n if (this._options.interactive) {\n // Only add to picking mesh if this layer is controlling output\n //\n // Otherwise, assume another component will eventually add a mesh to\n // the picking scene\n if (this.isOutput()) {\n this._pickingMesh = new THREE.Object3D();\n this.addToPicking(this._pickingMesh);\n }\n\n this._setPickingId();\n this._addPickingEvents();\n }\n\n // Store geometry representation as instances of THREE.BufferAttribute\n PointLayer.SetBufferAttributes(this._projectedCoordinates, this._options).then((result) => {\n this._bufferAttributes = Buffer.mergeAttributes(result.attributes);\n this._flat = result.flat;\n\n var attributeLengths = {\n positions: 3,\n normals: 3,\n colors: 3\n };\n\n if (this._options.interactive) {\n attributeLengths.pickingIds = 1;\n }\n\n if (this.isOutput()) {\n var style = this._options.style;\n\n // Set mesh if not merging elsewhere\n // TODO: Dedupe with PolygonLayer as they are identical\n PointLayer.SetMesh(this._bufferAttributes, attributeLengths, this._flat, style, this._options, this._world._environment._skybox).then((result) => {\n // Output mesh\n this.add(result.mesh);\n\n if (result.pickingMesh) {\n this._pickingMesh.add(result.pickingMesh);\n }\n });\n }\n\n result.attributes = null;\n result = null;\n\n resolve(this);\n }).catch(reject);\n });\n }\n\n // Return center of point as a LatLon\n //\n // This is used for things like placing popups / UI elements on the layer\n getCenter() {\n return this._center;\n }\n\n // Return point bounds in geographic coordinates\n //\n // While not useful for single points, it could be useful for MultiPoint\n //\n // TODO: Implement getBounds()\n getBounds() {}\n\n // Get unique ID for picking interaction\n _setPickingId() {\n this._pickingId = this.getPickingId();\n }\n\n // Set up and re-emit interaction events\n _addPickingEvents() {\n // TODO: Find a way to properly remove this listener on destroy\n this._world.on('pick-' + this._pickingId, (point2d, point3d, intersects) => {\n // Re-emit click event from the layer\n this.emit('click', this, point2d, point3d, intersects);\n });\n }\n\n static SetBufferAttributes(coordinates, options) {\n return new Promise((resolve) => {\n var height = 0;\n\n // Convert height into world units\n if (options.style.pointHeight) {\n height = Geo.metresToWorld(options.style.pointHeight, options.pointScale);\n }\n\n var colour = new THREE.Color();\n colour.set(options.style.pointColor);\n\n // Use default geometry if none has been provided or the provided geometry\n // isn't valid\n if (!options.pointGeometry || (!options.pointGeometry instanceof THREE.Geometry || !options.pointGeometry instanceof THREE.BufferGeometry)) {\n // Debug geometry for points is a thin bar\n //\n // TODO: Allow point geometry to be customised / overridden\n var geometryWidth = Geo.metresToWorld(25, options.pointScale);\n var geometryHeight = Geo.metresToWorld(200, options.pointScale);\n var _geometry = new THREE.BoxGeometry(geometryWidth, geometryHeight, geometryWidth);\n\n // Shift geometry up so it sits on the ground\n _geometry.translate(0, geometryHeight * 0.5, 0);\n\n // Pull attributes out of debug geometry\n geometry = new THREE.BufferGeometry().fromGeometry(_geometry);\n } else {\n if (options.geometry instanceof THREE.BufferGeometry) {\n geometry = options.pointGeometry;\n } else {\n geometry = new THREE.BufferGeometry().fromGeometry(options.pointGeometry);\n }\n }\n\n var attributes = coordinates.map((coordinate) => {\n var _vertices = [];\n var _normals = [];\n var _colours = [];\n\n var _geometry = geometry.clone();\n _geometry.translate(coordinate.x, height, coordinate.y);\n\n var _vertices = _geometry.attributes.position.clone().array;\n var _normals = _geometry.attributes.normal.clone().array;\n var _colours = _geometry.attributes.color.clone().array;\n\n for (var i = 0; i < _colours.length; i += 3) {\n _colours[i] = colour.r;\n _colours[i + 1] = colour.g;\n _colours[i + 2] = colour.b;\n }\n\n var _point = {\n positions: _vertices,\n normals: _normals,\n colors: _colours\n };\n\n if (options.interactive && options.pickingId) {\n // Inject picking ID\n _point.pickingId = options.pickingId;\n }\n\n return _point;\n });\n\n resolve({\n attributes: attributes,\n flat: false\n });\n });\n }\n\n getBufferAttributes() {\n return this._bufferAttributes;\n }\n\n // Used by external components to clear some memory when the attributes\n // are no longer required to be stored in this layer\n //\n // For example, you would want to clear the attributes here after merging them\n // using something like the GeoJSONLayer\n clearBufferAttributes() {\n this._bufferAttributes = null;\n }\n\n // Used by external components to clear some memory when the coordinates\n // are no longer required to be stored in this layer\n //\n // For example, you would want to clear the coordinates here after this\n // layer is merged in something like the GeoJSONLayer\n clearCoordinates() {\n this._coordinates = null;\n this._projectedCoordinates = null;\n }\n\n static SetMesh(attributes, attributeLengths, flat, style, options, skybox) {\n var geometry = new THREE.BufferGeometry();\n\n for (var key in attributes) {\n geometry.addAttribute(key.slice(0, -1), new THREE.BufferAttribute(attributes[key], attributeLengths[key]));\n }\n\n geometry.computeBoundingBox();\n\n var material;\n if (options.pointMaterial && options.pointMaterial instanceof THREE.Material) {\n material = options.pointMaterial;\n } else if (!skybox) {\n material = new THREE.MeshPhongMaterial({\n vertexColors: THREE.VertexColors,\n // side: THREE.BackSide,\n transparent: style.transparent,\n opacity: style.opacity,\n blending: style.blending\n });\n } else {\n material = new THREE.MeshStandardMaterial({\n vertexColors: THREE.VertexColors,\n // side: THREE.BackSide,\n transparent: style.transparent,\n opacity: style.opacity,\n blending: style.blending\n });\n material.roughness = 1;\n material.metalness = 0.1;\n material.envMapIntensity = 3;\n material.envMap = skybox.getRenderTarget();\n }\n\n var mesh;\n\n // Pass mesh through callback, if defined\n if (typeof options.onPolygonMesh === 'function') {\n mesh = options.onPolygonMesh(geometry, material);\n } else {\n mesh = new THREE.Mesh(geometry, material);\n\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n }\n\n if (flat) {\n material.depthWrite = false;\n mesh.renderOrder = 4;\n }\n\n if (options.interactive) {\n material = new PickingMaterial();\n material.side = THREE.BackSide;\n\n var pickingMesh = new THREE.Mesh(geometry, material);\n }\n\n return Promise.resolve({\n mesh: mesh,\n pickingMesh: pickingMesh\n });\n }\n\n // Convert and project coordinates\n //\n // TODO: Calculate bounds\n _setCoordinates() {\n this._bounds = [];\n this._coordinates = this._convertCoordinates(this._coordinates);\n\n this._projectedBounds = [];\n this._projectedCoordinates = this._projectCoordinates();\n\n this._center = this._coordinates;\n }\n\n // Recursively convert input coordinates into LatLon objects\n //\n // Calculate geographic bounds at the same time\n //\n // TODO: Calculate geographic bounds\n _convertCoordinates(coordinates) {\n return coordinates.map(coordinate => {\n return LatLon(coordinate[1], coordinate[0]);\n });\n }\n\n // Recursively project coordinates into world positions\n //\n // Calculate world bounds, offset and pointScale at the same time\n //\n // TODO: Calculate world bounds\n _projectCoordinates() {\n var _point;\n return this._coordinates.map(latlon => {\n _point = this._world.latLonToPoint(latlon);\n\n // TODO: Is offset ever being used or needed?\n if (!this._offset) {\n this._offset = Point(0, 0);\n this._offset.x = -1 * _point.x;\n this._offset.y = -1 * _point.y;\n\n this._options.pointScale = this._world.pointScale(latlon);\n }\n\n return _point;\n });\n }\n\n // Returns true if the line is flat (has no height)\n isFlat() {\n return this._flat;\n }\n\n // Returns true if coordinates refer to a single geometry\n //\n // For example, not coordinates for a MultiPoint GeoJSON feature\n static isSingle(coordinates) {\n return !Array.isArray(coordinates[0]);\n }\n\n destroy() {\n if (this._pickingMesh) {\n // TODO: Properly dispose of picking mesh\n this._pickingMesh = null;\n }\n\n this.clearCoordinates();\n this.clearBufferAttributes();\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\nexport default PointLayer;\n\nvar noNew = function(coordinates, options) {\n return new PointLayer(coordinates, options);\n};\n\nexport {noNew as pointLayer};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/geometry/PointLayer.js\n **/","// TODO: A lot of these utils don't need to be in separate, tiny files\n\nimport wrapNum from './wrapNum';\nimport extrudePolygon from './extrudePolygon';\nimport GeoJSON from './GeoJSON';\nimport Buffer from './Buffer';\nimport Worker from './Worker';\nimport Stringify from './Stringify';\n\nconst Util = {};\n\nUtil.wrapNum = wrapNum;\nUtil.extrudePolygon = extrudePolygon;\nUtil.GeoJSON = GeoJSON;\nUtil.Buffer = Buffer;\nUtil.Worker = Worker;\nUtil.Stringify = Stringify;\n\nexport default Util;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/index.js\n **/","/*\n * Wrap the given number to lie within a certain range (eg. longitude)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n */\n\nvar wrapNum = function(x, range, includeMax) {\n var max = range[1];\n var min = range[0];\n var d = max - min;\n return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n};\n\nexport default wrapNum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/wrapNum.js\n **/"],"sourceRoot":"/source/"}